본문 바로가기

Kaggle/Titanic : Machine Learning from Disaster

② 데이터 분석 및 전처리

Data Analysis & Preprocessing


일단 가지고 있는 데이터를 pandas의 DataFrame을 사용했습니다.


Pandas란?

데이터 분석 및 처리를 쉽게 다룰수 있도록 도구를 제공하는 python 오픈소스 라이브러리


데이터 불러오기


기본적으로 필요한 모듈을 import하고 train.csv와 test.csv을 pandas를 사용해 읽어옵니다.

display() 함수를 사용해서  pandas dataframe을 테이블 형식으로 출력합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#데이터 분석
import numpy as np
import pandas as pd
 
#시각화
import seaborn as sns
import matplotlib.pyplot as plt
 
#csv파일 
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')
# train_df.head()
 
display(train_df)
cs

≫ 결과




데이터 분석

1
2
3
4
5
6
7
8
9
10
11
12
13
fig, ax = plt.subplots(12, figsize=(15,7)) 
# subplot : 한 화면에서 여러 그래프를 나눠서 출력하는 기능 / plt.subplots((행 ,열, 그래프의 크기(가로, 세로)))
train_df['Survived'].value_counts().plot.pie(explode=[0,0.1], autopct='%1.1f%%',ax=ax[0],shadow=True,startangle=90)
# pd.Series.value_counts() : 유일한 값 별로 개수 세기 / .pie (explode = 두 조각간의 거리, autopct = 각 범주가 데이터에서 차지하는 비율, shadow = 그림자, startangle = pie의 시작각도)
ax[0].set_title('Survived'# 파이 그래프 이름
ax[0].set_ylabel(''# 파이 그래프
 
sns.countplot('Survived', data=train_df, ax=ax[1])# countplot : 각 카테고리 값별로 데이터가 얼마나 있는지 표시 / countplot(x='column_name', data=dataframe)
ax[1].set_title('Survived')
plt.show() # 막대 그래프

# 0 = 죽음, 1 = 생존
# 61.6%가 죽음 38.4%가 생존
출처 : https://developers.ascentnet.co.jp/2017/11/24/kaggle-process-review/
cs


≫ 결과



한 화면에 여러 그래프를 나눠서 출력하기 위해서 subplot를 사용해 1행 2열로 그래프를 출력합니다.

그래프의 크기는 가로 15, 세로 7로 설정했습니다.


DataFrame에서 해당 열을 불러오는 방법으로 ① train_df['Survived']② train_df.Survived가 있습니다.

value_count 함수는 유일한 값 별로 개수를 세줍니다. 그래서 Survived 열에 사망과 생존의 갯수를 카운트합니다.


이를 보기 편하게 pie 그래프로 나타냅니다.

pie ( explode = 두 조각간의 거리, autopct = 각 범주가 데이터에서 차지하는 비율, shadow = 그림자, startangle = pie의 시작각도)


이를 막대 그래프로 그려봅니다. 이때 사용한 함수는 countplot로 각 카테고리(사망, 생존) 값 별로 데이터가 얼마나 있는지 표시해줍니다.

countplot ( x = 'column_name', data = dataframe)


Survived열만 분석해본 결과 61.4%가 죽고 38.4%만 생존 했음을 알 수 있습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
f, ax=plt.subplots(1,2,figsize=(15,7))
 
# 남성 생존 확률
train_df['Survived'][train_df['Sex']=='male'].value_counts().plot.pie(explode=[0,0.1], autopct='%1.1f%%', ax=ax[0],shadow=True, startangle=90)
 
# 여성 생존 확률
train_df['Survived'][train_df['Sex']=='female'].value_counts().plot.pie(explode=[0,0.1], autopct='%1.1f%%', ax=ax[1],shadow=True, startangle=90)
 
ax[0].set_title('Survived (male)')
ax[1].set_title('Survived (female)')
 
plt.show()
 
# 남자인 경우 81.1%가 죽음 18.9%가 생존
# 여자인 경우 25.8%가 죽음 74.2%가 생존 
출처 : https://developers.ascentnet.co.jp/2017/11/24/kaggle-process-review/
cs

≫ 결과



성별에 따른 생존율을 구했습니다.
그래프를 보면 남성은 81.1%가 사망하고 18.9%만 생존했고, 여성은 25.8%가 사망하고 74.2%가 생존했습니다.
이를 통해 레이디퍼스트가 이루어졌다는 것을 예상할 수 있습니다.


1
2
3
4
5
6
7
8
# Pclass 별 남성, 여성 생존 확률
pd.crosstab([train_df['Sex'], train_df['Survived']], train_df['Pclass']
            , margins=True).style.background_gradient(cmap='summer_r')
# crosstab : 빈도표 / crosstab(data, margin=True : 교차표의 행합, 열합 추가)
 
# 여자인 경우 1등급인 경우 살 확률 91/94 = 97%  2등급인 경우 70/76 = 92% 3등급인 경우 72/144 = 50%
# 남자인 경우 1등급인 경우 살 확률 45/122 = 37% 2등급인 경우 17/108 = 16% 3등급인 경우 47/347 = 14%
# 낮은 등급일수록 생존률 저하
출처 : https://developers.ascentnet.co.jp/2017/11/24/kaggle-process-review/
cs

≫ 결과


이번에는 Pclass별 남성, 여성 생존 확률을 출력해봤습니다.

crosstab을 사용해 빈도표로 나타냈습니다.


여성인 경우 1등급일때 생존 확률이 91/94 = 97% 2등급인 경우 70/76 = 92% 3등급인 경우 72/144 = 50%

남성인 경우 1등급일때 생존 확률이 45/122 = 37% 2등급인 경우 17/108 = 16% 3등급인 경우 47/347 = 14%


등급이 낮을 수록 생존율 저하 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 각 항구별 탑승 수, 성별 탑승 수, 생존 수, Pclass별 탑승 수  
f, ax = plt.subplots(22, figsize=(20,15))
sns.countplot('Embarked', data=train_df, ax=ax[0,0])
ax[0,0].set_title('No. Of Passengers Boarded')
 
sns.countplot('Embarked', hue='Sex', data=train_df, ax=ax[0,1])
ax[0,1].set_title('Male-Female Split for Embarked')
 
sns.countplot('Embarked', hue='Survived', data=train_df, ax=ax[1,0])
ax[1,0].set_title('Embarked vs Survived')
 
sns.countplot('Embarked', hue='Pclass', data=train_df, ax=ax[1,1])
ax[1,1].set_title('Embarked vs Pclass')
plt.show()
 
# 대부분의 사람들이 Southampton에서 탑승 그중 70%가 남성임 그래서 S에서 사망률이 높음
# Cherbourg에서 탑승한 승객은 1등 객실 승객의 비중 및 생존율이 높음으로 부자동네
출처 : https://developers.ascentnet.co.jp/2017/11/24/kaggle-process-review/
cs


≫ 결과


탑승 항구수, 항구별 성별탑승수, 항구별 생존수, 항구별 등급수를 구해봤습니다.

대부분의 승객들이 Southampton에서 탑승했으며 탑승객중 남성이 75%이상입니다.

Southampton에는 주로 3등급의 승객들이 탑승했고 등급이 낮을 수록 생존율이 낮으므로 Southampton에서 많이 사망함을 알 수 있습니다.



1
2
3
4
5
6
7
8
9
10
fig = plt.figure(figsize=(257))
sns.violinplot(x='Sex', y='Age',                # x축의 의미, y축의 의미
               hue='Survived', data=train_df,   # hue : 카테고리 값을 가지는 변수의 이름을 지정하면 카테고리 값에 따라 다르게 시각화함
               split=True,                      # violin의 절반이 그려짐 => 비교하기 쉬움
               palette={0"blue"1"orange"}
              );
# 어린 남자가 생존
# 남자보다 여자다 더 많이 생존함
# 20대 ~ 40대 사람들이 많이 탐
# * 여성과 어린아이들이 먼저!*
cs


≫ 결과

Sex, Age, Survived를 가지고 바이올린 그래프를 그렸을 때,

대부분의 탑승객은 20대 ~ 40대 사람이고 어린 남성을 생존확률이 높지만 젊은 남성(20~40대)은 많이 사망하였습니다.

이를 보고 여성과 아이들이 먼저 구해졌음을 알 수 있습니다.


이렇게 데이터를 분석해보았습니다. 

나이랑 Pclass의 그래프를 뽑아보는 것도 좋을꺼같다는 생각이 들었습니다.








반응형

'Kaggle > Titanic : Machine Learning from Disaster' 카테고리의 다른 글

① Kaggle 주제 소개  (0) 2018.11.24