[타이타닉 생존자 분류] - 1
타이타닉 데이터를 가지고 데이터 분석을 진행해보려고 한다.
타이타닉 데이터는 데이터 분석이나 머신러닝, 캐글에 대해 알고 있다면 여러 번 들어봤을 법한 입문자용 데이터셋이다.
이 데이터를 가지고 공부한다면 데이터 분석의 전반적인 지식을 쌓는데 많은 도움이 될 것이라고 생각한다.
탐색 : 타이타닉 데이터 살펴보기
- pclass : Passenger Class, 승객 등급
- survived : 생존 여부(생존은 1, 아닌 경우는 0)
- name : 승객 이름
- sex : 승객 성별
- age : 승객 나이
- sibsp : 동승한 형제 또는 배우자 수
- parch : 동승한 부모 또는 자녀 수
- ticket : 티켓 번호
- fare : 승객 지불 요금
- cabin : 선실 이름
- embarked : 승선항 (C = 쉘 부르크, Q = 퀸즈타운, S = 사우스햄튼)
- body : 사망자 확인 번호
- home.dest : 고향 / 목적지
데이터셋 불러오기
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
df_train = pd.read_csv('data/titanic_train.csv')
df_test = pd.read_csv('data/titanic_test.csv')
df_train.head()
데이터에 대한 정보를 살펴보자.
print(df_train.info())
print('---------------------------------')
print(df_test.info())
데이터를 살펴보면 cabin, age에 대해 Null 값이 많이 나타났다. Null 값이 존재하면 모델 학습에 문제가 생기기 때문에 결측치를 대체해야 한다.
불필요한 피처 제거
# 데이터셋에서 name, ticket, body, cabin, home.dest 피처 제거
df_train = df_train.drop(['name', 'ticket', 'body', 'cabin', 'home.dest'], axis = 1)
df_test = df_test.drop(['name', 'ticket', 'body', 'cabin', 'home.dest'], axis = 1)
EDA(탐색적 자료 분석)
print(df_train['survived'].value_counts())
df_train['survived'].value_counts().plot.bar()
생존 여부인 survived를 분포를 나타낸다.
생존 여부를 그룹으로 하여 pclass 피처의 그룹별 분포를 그래프로 출력해보자.
print(df_train['pclass'].value_counts())
ax = sns.countplot(x = 'pclass', hue = 'survived', data = df_train)
데이터를 살펴보면 등급이 높을수록 많은 사람이 생존한 것을 알 수 있다.
print(df_train['embarked'].value_counts())
ax = sns.countplot(x = 'embarked', hue = 'survived', data = df_train)
탑승객 중 많은 사람이 Southampton에서 탑승하였고, 약 60%가 사망한 것을 알 수 있다.
변수 탐색작업 자동화
- age, sibsp와 같은 수치형 피처들에 대한 탐색 진행
- 피처들을 탐색할 수 있는 자동화 함수 valid_features()을 진행
- 두 그룹 간의 분포를 비교하는 그래프 출력
- 두 그룹 각각의 표준편차 출력
- 두 그룹 간의 T-test 검정을 실시
- 두 그룹 각각의 Shapiro-wilk 검정 실시
- Shapiro-wilk 검정 : 주어진 데이터가 얼마나 정규성을 따르는지, 즉 얼마나 정규분포에 가까운지를 측정하는 검정
from scipy import stats
# 두 집단의 피처를 비교해주며 탐색작업을 자동화하는 함수 정의
def valid_features(df, col_name, distribution_check = True):
# 두 집단 (survived = 1, survived = 0)의 분포 그래프 출력
g = sns.FacetGrid(df, col = 'survived')
g.map(plt.hist, col_name, bins = 30)
# 두 집단 (survived = 1, survived = 0)의 표준편차를 출력
titanic_survived = df[df['survived'] == 1]
titanic_survived_static = np.array(titanic_survived[col_name])
print('data std is', '%.2f' % np.std(titanic_survived_static))
titanic_n_survived = df[df['survived'] == 0]
titanic_n_survived_static = np.array(titanic_n_survived[col_name])
print('data std is', '%.2f' % np.std(titanic_n_survived_static))
# T-test로 두 집단의 평균 차이 검정
tTestResult = stats.ttest_ind(titanic_survived[col_name], titanic_n_survived[col_name], equal_var = False)
tTestResultDiffVar = stats.ttest_ind(titanic_survived[col_name], titanic_n_survived[col_name], equal_var = False)
print('The t-statistic and p-value aauming equal variances is %.3f and %.3f.' % tTestResult)
print('The t-statistic and p-value not assuming equal variances is %.3f and %.3f' % tTestResultDiffVar)
if distribution_check:
#Shapiro-Wilf 검정 : 분포의 정규성 정도 검증
print('The w-statistic and p-value in Survived %.3f and %.3f' % stats.shapiro(titanic_survived[col_name]))
print('The w-statistic and p-value in Non-Survived %.3f and %.3f' % stats.shapiro(titanic_n_survived[col_name]))
# valid_features 함수 실행, age 피처와 sibsp 피처 탐색
valid_features(df_train[df_train['age'] > 0], 'age', distribution_check=True)
valid_features(df_train, 'sibsp', distribution_check=False)
분석 결과, age 피처는 두 그룹 간의 평균 차이가 없기 때문에 생존자 분류에 미치는 영향력이 낮을 것이라고 가정할 수 있다. 반면 sibsp 피처에서는 두 그룹 간의 평균 차이가 어느 정도 존재한다는 것을 알 수 있다.
parch, fare, sex 피처에 대해 생존자 / 비 생존자 간의 차이 탐색
지금까지 탐색한 피처의 내용은 다음과 같다.
탐색 대상 피처 | 두 그룹 간의 분포 혹은 평균의 차이가 있는가? |
pclass | O |
age | X |
sibsp, parch | △ |
fare | O |
sex | O |
embarked | △ |
여기까지 pclass, embarked, sex, age 피처를 통한 EDA를 진행해보았다. 다음으로 로지스틱 회귀 모델을 이용해 생존자 분류 모델을 만들어 볼 것이다.
- 출처 : 이것이 데이터 분석이다 with 파이썬
'Kaggle' 카테고리의 다른 글
[샌프란시스코 범죄 분류] - 1 (0) | 2021.10.05 |
---|---|
[진짜 재난 뉴스 판별기] - 2 (0) | 2021.10.04 |
[진짜 재난 뉴스 판별기] - 1 (0) | 2021.10.01 |
[자전거 수요 예측] - 1 (0) | 2021.09.10 |
[타이타닉 생존자 분류] - 2 (0) | 2021.09.09 |