반응형
EDA - Titanic Dataset
Copyright(c) 2018-2021 Daniel Park All rights reserved.
1912년 타이타닉 사고 데이터 EDA
탐색적 데이터 분석 (EDA)를 통해 아래 목표를 달성해봅시다
주어진 각 feature들의 분포 살펴보기, 생존자/사망자 별로 데이터 분리하여 살펴보기
어떤 정보를 통해 생존율을 예측할 수 있을 지, 가설을 세우고 실제 그래프로 검증해봅시다.
[ 데이터 설명 ]
891명의 승객에 대한 데이터. 생존여부 / 좌석 등급 / 성별 / 나이 / 일행 / 자녀 / 운임 등의 feature
# 라이브러리 임포트
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
plt.rcParams['font.family'] = 'Malgun Gothic' # (Windows 용) 한글 출력을 위한 글꼴 설정
plt.rcParams['font.family'] = 'Apple Gothic' # (MAC, 리눅스 용)
plt.rcParams['axes.unicode_minus'] = False # 문자 - (마이너스) 정상 출력을 위한 코드
데이터 불러오기
titanic_df = sns.load_dataset('titanic')
titanic_df
# EDA 탐색적 데이터 분석 수행하기
.info() 함수로 데이터 컬럼별 타입(자료형), 값이 있는 행(Non-Null)의 갯수 등을 알 수 있습니다.
titanic_df.info()
# 범주형 컬럼과, 수치형 컬럼으로 나누어서 리스트를 만듭니다. (추후 분석 시 반복되는 코드를 줄일 수 있어요)
category_cols = ["sex","embarked","class","who","adult_male","deck","embark_town"]
numerical_cols = ["age","sibsp","parch","fare"]
# 데이터의 통계량 살펴보기
.describe() 함수로 각 열에 대한 대략적인 통계 값들을 볼 수 있습니다. (평균, 상위 25/50/75% 값, 최대/ 최소 값 등)
범주형 데이터은 값이 [1, 2, 3], ["내부", "외부"]와 같이 몇 가지 분류로 한정되는 데이터 입니다. 수치형 데이터는 값이 1,2,3,5,..., 1.2, 4.51, 3.1415와 같이 숫자 축으로 무한히 위치할 수 있는 데이터 입니다.
# .value_counts()를 통해 각 컬럼별로 몇 개의 row가 있는지 셀 수 있습니다
for col in category_cols:
print(col + " 카운트::")
print(titanic_df.loc[:, col].value_counts())
print()
# 데이터의 분포 눈으로 살펴보기
수치형 컬럼들의 분포를 그려봅시다. 통계량은 boxplot으로 살펴보고, 분포는 histplot으로 그립니다.
본격적으로 반복문을 사용해 볼까요? 이 코드에서는 반복문을 이용하여 여러개의 차트를 그립니다. plt.subplots를 통해 여러 개의 도화지를 생성합니다. (nrows × ncols)
for문 안에서는 각 도화지(ax)에 seaborn으로 차트를 그립니다. figure는 그림 전체를 의미합니다.
numerical_cols
figure, ax_list = plt.subplots(nrows=1, ncols=4)
figure.set_size_inches(12,5)
for i in range(4):
col = numerical_cols[i]
sns.boxplot(data=titanic_df, y=col, showfliers=True, ax=ax_list[i])
ax_list[i].set_title(f"distribution '{col}'")
figure, ax_list = plt.subplots(nrows=1, ncols=4)
figure.set_size_inches(12,3)
for i in range(4):
sns.histplot(data=titanic_df.loc[:, numerical_cols[i]], ax=ax_list[i])
ax_list[i].set_title(f"distribution '{numerical_cols[i]}'")
# 범주형 컬럼들의 분포를 그려봅니다. 범주형이므로 countplot을 통해 각 범주별로 개수를 셀 수 있습니다.
범주형 컬럼이 총 9개 이므로, 3x3 도화지 레이아웃으로 하나씩 그래프를 그려봅니다. ax_list_list는 [[], []] 형태의 2차원 리스트 입니다. for 문으로 반복하기 위해 1차원 리스트로 풀어줍 니다.
1차원 리스트 ax_list가 9개의 도화지 (ax)를 갖도록 풀어서 할당하는데, .reshape() 라는 numpy 함수를 사용합니다.
figure, ax_list_list = plt.subplots(nrows=3, ncols=3);
figure.set_size_inches(10,10)
ax_list = ax_list_list.reshape(9) # 다차원 행렬의 차원을 원하는 모양으로 변경합니다. print(ax_list_list.shape)
print(ax_list.shape)
for i in range(len(category_cols)):
col = category_cols[i]
sns.countplot(data=titanic_df, x=col, ax=ax_list[i])
ax_list[i].set_title(col)
plt.tight_layout()
plt.show()
# 데이터로부터 유의미한 정보 발굴하기
사실, 여기서부터는 EDA의 범위를 넘어섭니다. 그래도 탑승객의 '생존'에 어떤 것들이 영향을 미치는지 궁금 하시죠?
몇 가지 가설을 세우고 그래프를 그려 '생존'에 영향을 미치는 요인이 무엇인지 살펴봅시다
titanic_df
# 성별과 생존 여부
sns.countplot(data=titanic_df, x='sex', hue='survived');
# 좌석등급과생존여부
sns.countplot(data=titanic_df, x='pclass', hue='survived');
# 9개의 범주형 분류에 대해, 생존 여부로 그래프 그리기
# hue 인자로 'survived' 컬럼을 입력, 각 분류형 데이터별로 생존/사망 분리하여 살펴보기figure, ax_list_list = plt.subplots(nrows=3, ncols=3);
figure.set_size_inches(10,10)
ax_list = ax_list_list.reshape(9)
print(ax_list_list.shape)
print(ax_list.shape)
for i in range(len(category_cols)):
col = category_cols[i]
sns.countplot(data=titanic_df, x=col, ax=ax_list[i], hue='survived')
ax_list[i].set_title(col)
plt.tight_layout()
# 남성보다 여성의 생존률이 더 높습니다 (남성 > 여성 > 아이)
탑승지(embarked)가 C인 경우 생존율이 높습니다
1등석 > 2등석 > 3등석 순으로 생존율이 높습니다
B,D,E 덱 위치의 승객들이 생존율이 높습니다
나홀로 승객은 생존율이 낮습니다
# 생존 여부별로 나이의 히스토그램 그려보기
sns.histplot(data=titanic_df, x='age', hue='survived', bins=100, alpha=0.5);
# 성별과 좌석 등급에 따라, 나이의 boxplot 그려보기
sns.boxplot(data=titanic_df, x='sex', y='age', hue='pclass');
# <연습문제 EDA 1>
성별과 좌석 등급에 따라, 운임료의 boxplot을 그려보세요 (극단 이상치 제외)
sns.boxplot(data=titanic_df, x='pclass', y='fare', hue='sex', showfliers=False);
배우자+형제자매의 수, 생존 여부 별 나이의 boxplot
sns.boxplot(data=titanic_df, x="sibsp", y="age", hue='survived');
titanic_df
# <연습문제 EDA 2>
부모+자녀의 수, 생존 여부 별 나이의 boxplot을 그려보세요
sns.boxplot(data=titanic_df, x="parch", y="age", hue='survived');
# (심화) 출항지, 좌석 등급, 생존 여부 별 운임의 boxplot
titanic_df.survived.iloc[0]
0
g = sns.FacetGrid(titanic_df, col='pclass', height=6, aspect=0.5)
g.map(sns.boxplot, 'alone', 'fare', 'survived', order=[True, False], hue_order=[
g.add_legend();
# <연습문제 EDA 3>
(심화) 좌석 등급, 사람 구분, 생존 여부 별 나이의 boxplot을 그려보세요
g = sns.FacetGrid(titanic_df, col='pclass', height=6, aspect=0.5)
g.map(sns.boxplot, 'alone', 'fare', 'survived', order=[True, False], hue_order=[
g.add_legend();
728x90
LIST
'Python' 카테고리의 다른 글
HuggingFace의 pre-trained 모형 (1) | 2025.06.28 |
---|---|
word2vec 실습 (0) | 2025.05.24 |
Seaborn 실습(2) (0) | 2025.05.06 |
Sentiment Analysis (0) | 2025.05.06 |
Seaborn 라이브러리 (0) | 2025.05.04 |