머신러닝과 딥러닝/머신러닝

Titanic 데이터 파이썬으로 분석하기 - 2 (Data Cleaning, Feature Engineering)

Stat_in_KNU 2020. 6. 9. 21:38

[ADP대비, 데이터 분석 PT면접 대비]

 

학부시절부터 수도 없이 만났던 타이타닉 데이터, 주먹구구식으로 분석하지말고 Kaggle Kernel을 따라 차근차근 따라가보자.

 

참고 커널

https://www.kaggle.com/ash316/eda-to-prediction-dietanic

 

EDA To Prediction(DieTanic)

Explore and run machine learning code with Kaggle Notebooks | Using data from Titanic: Machine Learning from Disaster

www.kaggle.com

https://www.kaggle.com/startupsci/titanic-data-science-solutions

 

Titanic Data Science Solutions

Explore and run machine learning code with Kaggle Notebooks | Using data from Titanic: Machine Learning from Disaster

www.kaggle.com

데이터 소개

타이타닉호는 역사상 가장 악명 높은 재난이었다. 1912년 4월 15일 타이타닉호의 첫 항해 도중 빙산과 충돌하여 총 2224명 중 1502명이 사망했다. 

타이타닉호를 만드는데는 약 750만 달러가 들었다, (과거의 화폐가치를 따졌을때나, 현재의 가치 그대로나 엄청난 돈)  지금은 타이타닉데이터는 기계학습 분류 데이터셋으로 데이터 분석가/사이언티스트들이 많이 쓰고있다.

 

 

변수설명

survival Survival (0 = No; 1 = Yes)
pclass Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd)
name Name
sex Sex
age Age
sibsp Number of Siblings/Spouses Aboard
parch Number of Parents/Children Aboard
ticket Ticket Number
fare Passenger Fare
cabin Cabin
embarked Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton)

조금 해석이 어려운것들

Sibsp : 동반한 배우자/형제자매 수라고 보면됨

Parch : 부모/자식 수라고 보면됨

Cabin : 객실번호

Embarked : 탑승지

 

분석과정

1. EDA

2. 데이터 전처리(Feature Engineering, Data Cleaning)

3. 데이터 모델링 (ML modeling)

4. 모델 평가


지난 포스팅에 이어서 데이터 전처리를 해보자..

 

2. 데이터 전처리 (Feature Engineering, Data Cleaning)

연속형 변수 Age를 밴등 처리해주자.

 

왜 밴딩 처리를 해줘야할까?

Machine Learning Model에서 연속형 변수는 문제를 가지고 있다.

예를 들면 만약 어떤 Group한테 운동선수를 성별에 따라 분류하라하면 쉽게 분류할 수 있다.

만약에 나이를 분류하라하면 어떻게 할 수 있을까?

30명이 있다면 30개의 나이 값이 나올것.... 이것은 문제를 일으킬 수 있음

그래서 연속형 변수를 범주형으로 바꾸어 줄 필요가 있다 (Binning, Normalizing)

다섯개의 구간으로 나누어보자!

 

data['Age_band']=0
data.loc[data['Age']<=16,'Age_band']=0
data.loc[(data['Age']>16)&(data['Age']<=32),'Age_band']=1
data.loc[(data['Age']>32)&(data['Age']<=48),'Age_band']=2
data.loc[(data['Age']>48)&(data['Age']<=64),'Age_band']=3
data.loc[data['Age']>64,'Age_band']=4
data.head(2)

Age_band에 밴딩이 잘됐다!

data['Age_band'].value_counts().to_frame().style.background_gradient(cmap='summer')#checking the number of passenegers in each band

SIbSp과 Parch로 Family Size를 만들어보자!

 

data['Family_Size']=0
data['Family_Size']=data['Parch']+data['SibSp']#family size
data['Alone']=0
data.loc[data.Family_Size==0,'Alone']=1#Alone

f,ax=plt.subplots(1,2,figsize=(18,6))
sns.factorplot('Family_Size','Survived',data=data,ax=ax[0])
ax[0].set_title('Family_Size vs Survived')
sns.factorplot('Alone','Survived',data=data,ax=ax[1])
ax[1].set_title('Alone vs Survived')
plt.close(2)
plt.close(3)
plt.show()

 

sns.factorplot('Alone','Survived',data=data,hue='Sex',col='Pclass')
plt.show()

 

가족이 없으면 명백하게 생존 확률이 낮다...

 

Fare Range

- pandas.qcut이용

data['Fare_Range']=pd.qcut(data['Fare'],4) #4개의 범위로 분리
data.groupby(['Fare_Range'])['Survived'].mean().to_frame().style.background_gradient(cmap='summer_r')

딱 보니, 운임료가 올라갈수록 생존율도 올라갔다.

 

data['Fare_cat']=0
data.loc[data['Fare']<=7.91,'Fare_cat']=0
data.loc[(data['Fare']>7.91)&(data['Fare']<=14.454),'Fare_cat']=1
data.loc[(data['Fare']>14.454)&(data['Fare']<=31),'Fare_cat']=2
data.loc[(data['Fare']>31)&(data['Fare']<=513),'Fare_cat']=3

각 범위를 0,1,2,3 범주화

sns.factorplot('Fare_cat','Survived',data=data,hue='Sex')
plt.show()

확실히 Fare이 올라 갈수록 생존율이 올라갔다.

 

String Value를 Numeric으로 바꿔주자.

 

ML모델이 잘 알아듣게끔 Numeric으로 바꿔주자는데.. 솔직히 잘 모르겠음 sklearn에서 알아서 해주지않나..

data['Sex'].replace(['male','female'],[0,1],inplace=True)
data['Embarked'].replace(['S','C','Q'],[0,1,2],inplace=True)
data['Initial'].replace(['Mr','Mrs','Miss','Master','Other'],[0,1,2,3,4],inplace=True)

 

필요없는 놈들을 Drop시키자,

data.drop(['Name','Age','Ticket','Fare','Cabin','Fare_Range','PassengerId'],axis=1,inplace=True)
sns.heatmap(data.corr(),annot=True,cmap='RdYlGn',linewidths=0.2,annot_kws={'size':20})
fig=plt.gcf()
fig.set_size_inches(18,15)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()

범주화를 완료했거나 y에 영향을 주지않는 데이터들은 모두 drop해주었다.

 

 

 

corr plot을 보면 양, 음의 상관관계가 짙어 보이는 것들도 있고 아닌 것도 있드..

 

 

 

Part 3에서 계속..