데이터 분석

타이타닉 데이터 분석하기

temporubato108 2024. 8. 28. 14:43

사용데이터

Titanic - Machine Learning from Disaster

https://www.kaggle.com/competitions/titanic

 

Titanic - Machine Learning from Disaster | Kaggle

 

www.kaggle.com

 

 

 

 

1. train.csv파일의 survived 데이터 시각화

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 한글 폰트 설정
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'  # 폰트 경로
font_prop = fm.FontProperties(fname=font_path, size=14)

# 데이터 로드
data = pd.read_csv('train.csv')

# Survived 데이터 시각화
plt.figure(figsize=(8, 6))
data['Survived'].value_counts().plot(kind='bar', color=['skyblue', 'salmon'])
plt.title('타이타닉 생존자 수', fontproperties=font_prop)
plt.xlabel('생존 여부 (0 = 사망, 1 = 생존)', fontproperties=font_prop)
plt.ylabel('승객 수', fontproperties=font_prop)
plt.xticks(ticks=[0, 1], labels=['사망', '생존'], rotation=0, fontproperties=font_prop)
plt.grid(axis='y')
plt.show()

 

 

 

 

2. 생존여부(Survived)와 객실등급(Pclass)의 상관관계

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 한글 폰트 설정
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'  # 폰트 경로
font_prop = fm.FontProperties(fname=font_path, size=14)

# 데이터 로드
data = pd.read_csv('train.csv')

# Survived와 Pclass 데이터 간의 관계 시각화
plt.figure(figsize=(10, 6))
data.groupby(['Pclass', 'Survived']).size().unstack().plot(kind='bar', color=['salmon', 'lightblue'], width=0.8)

plt.title('타이타닉 승객 생존 여부와 객실 등급(Pclass) 관계', fontproperties=font_prop)
plt.xlabel('객실 등급 (Pclass)', fontproperties=font_prop)
plt.ylabel('승객 수', fontproperties=font_prop)
plt.xticks(ticks=[0, 1, 2], labels=['1등급', '2등급', '3등급'], rotation=0, fontproperties=font_prop)

# 범례 설정
plt.legend(['사망', '생존'], title='생존 여부', prop=font_prop, title_fontproperties=font_prop, loc='upper right')
plt.grid(axis='y')
plt.show()

 

 

 

 

3. 생존여부(Survived)와 성별(Sex)의 상관관계

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 한글 폰트 설정
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'  # 폰트 경로
font_prop = fm.FontProperties(fname=font_path, size=14)

# 데이터 로드
data = pd.read_csv('train.csv')

# Survived와 Sex 데이터 간의 관계 시각화
plt.figure(figsize=(10, 6))
data.groupby(['Sex', 'Survived']).size().unstack().plot(kind='bar', color=['salmon', 'lightblue'], width=0.8)

plt.title('타이타닉 승객 생존 여부와 성별(Sex) 관계', fontproperties=font_prop)
plt.xlabel('성별', fontproperties=font_prop)
plt.ylabel('승객 수', fontproperties=font_prop)
plt.xticks(ticks=[0, 1], labels=['여성', '남성'], rotation=0, fontproperties=font_prop)

# 범례 설정
plt.legend(['사망', '생존'], title='생존 여부', prop=font_prop, title_fontproperties=font_prop, loc='upper right')
plt.grid(axis='y')
plt.show()

 

 

 

 

4. 생존여부(Survived)와 나이(Age)의 상관관계

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.font_manager as fm

# 한글 폰트 설정
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'  # 폰트 경로
font_prop = fm.FontProperties(fname=font_path, size=14)

# 데이터 로드
data = pd.read_csv('train.csv')

# 나이가 결측값인 경우 제거
data = data.dropna(subset=['Age'])

# 나이에 따른 생존 여부 시각화
plt.figure(figsize=(12, 6))
sns.histplot(data=data, x='Age', hue='Survived', multiple='stack', bins=40, palette={0: 'salmon', 1: 'lightblue'}, kde = True, alpha=0.7)

plt.title('타이타닉 승객 생존 여부와 나이(Age) 관계', fontproperties=font_prop)
plt.xlabel('나이', fontproperties=font_prop)
plt.ylabel('승객 수', fontproperties=font_prop)
plt.legend(['생존', '사망'], title='생존 여부', prop=font_prop, title_fontproperties=font_prop)
plt.grid(axis='y')
plt.show()

 

 

 

 

5. 생존여부(Survived)와 가족 수(SibSp + Parch)의 상관관계

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 한글 폰트 설정
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'  # 폰트 경로
font_prop = fm.FontProperties(fname=font_path, size=14)

# 데이터 불러오기
data = pd.read_csv('train.csv')

# 가족 수(SibSp + Parch) 계산
data['FamilySize'] = data['SibSp'] + data['Parch']

# 생존률 계산
survival_rate = data.groupby('FamilySize')['Survived'].mean().reset_index()

# 시각화
plt.figure(figsize=(10, 6))
sns.barplot(data=survival_rate, x='FamilySize', y='Survived', palette='Set1')
plt.title('가족 수에 따른 생존률', fontproperties=font_prop)
plt.xlabel('가족 수 (SibSp + Parch)', fontproperties=font_prop)
plt.ylabel('생존률', fontproperties=font_prop)
plt.xticks(rotation=0)
plt.ylim(0, 1)  # 생존률은 0에서 1 사이의 값으로 설정
plt.axhline(0.5, ls='--', color='red')  # 50% 생존률 기준선 추가
plt.show()

 

 

 

 

6. 생존여부(Survived)와 요금(Fare)의 상관관계

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 한글 폰트 설정
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'  # 폰트 경로
font_prop = fm.FontProperties(fname=font_path, size=14)

# 데이터 불러오기
data = pd.read_csv('train.csv')

# Fare 데이터 로그 변환
data['Fare_log'] = np.log1p(data['Fare'])  # log1p는 log(1+x)를 계산하는 함수

# 시각화
plt.figure(figsize=(10, 6))
sns.boxplot(x='Survived', y='Fare_log', data=data, palette='Set1').set(ylim=(0,10))
plt.title('생존 여부에 따른 요금(Fare) 로그 변환 분포', fontproperties=font_prop)
plt.xlabel('생존 여부 (0: 사망, 1: 생존)', fontproperties=font_prop)
plt.ylabel('로그 변환된 요금 (Fare_log)', fontproperties=font_prop)
plt.xticks(rotation=0)
plt.grid(True)
plt.show()

 

 

 

 

7. 생존여부(Survived)와 선실번호(Cabin)의 상관관계

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 한글 폰트 설정
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'  # 폰트 경로
font_prop = fm.FontProperties(fname=font_path, size=14)

# 데이터 불러오기
data = pd.read_csv('train.csv')

# Cabin 데이터 전처리: 결측치 제거 및 첫 글자만 추출
data = data.dropna(subset=['Cabin'])  # 결측치 제거
data['Cabin'] = data['Cabin'].str[0]  # 각 Cabin의 첫 글자만 추출

# 생존률 계산
survival_rate = data.groupby('Cabin')['Survived'].mean().reset_index()  # Cabin 별 생존률 계산

# 시각화
plt.figure(figsize=(10, 6))
sns.barplot(x='Cabin', y='Survived', data=survival_rate, palette='Set1')  # 생존률을 y축으로 설정
plt.title('선실 번호(Cabin) 별 생존률', fontproperties=font_prop)
plt.xlabel('선실 번호(Cabin)', fontproperties=font_prop)
plt.ylabel('생존률', fontproperties=font_prop)
plt.xticks(rotation=0)
plt.grid(True)
plt.ylim(0, 1)  # y축 범위를 0에서 1로 설정
plt.show()

 

 

 

 

8. 생존여부(Survived)와 승선 항구(Embarked)의 상관관계

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 한글 폰트 설정
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'  # 폰트 경로
font_prop = fm.FontProperties(fname=font_path, size=14)

# 데이터 불러오기
data = pd.read_csv('train.csv')

# Embarked 데이터 전처리: 결측치 제거
data = data.dropna(subset=['Embarked'])  # 결측치 제거

# 생존률 계산
survival_rate = data.groupby('Embarked')['Survived'].mean().reset_index()  # Embarked 별 생존률 계산

# 시각화
plt.figure(figsize=(10, 6))
sns.barplot(x='Embarked', y='Survived', data=survival_rate, palette='Set1')  # 생존률을 y축으로 설정
plt.title('승선 항구(Embarked) 별 생존률', fontproperties=font_prop)
plt.xlabel('승선 항구(Embarked)', fontproperties=font_prop)
plt.ylabel('생존률', fontproperties=font_prop)
plt.xticks(ticks=[0, 1, 2], labels=['Cherbourg', 'Queenstown', 'Southampton'], rotation=0)  # x축 레이블 수정
plt.grid(True)
plt.ylim(0, 1)  # y축 범위를 0에서 1로 설정
plt.show()