본문 바로가기
Tech/MachineLearning

[머신러닝 기초] 타이타닉 생존율 분석 - EDA #2 나이(Age)와 탑승위치(Embarked) 확인

by 타이호 2019. 10. 7.
반응형

타이타닉 데이터 분석 및 머신러닝 적용 목차

 

Age에 Null Data가 많은 것을 이전에 확인을 했고, 해당 Null Data에 데이터를 임의의 값으로 채워 넣기 보다는 근거에 기반하여 나이의 Null값을 채워넣는다. 이름을 확인해보면 다양하게 존재한다.

data['Initial']=0
for i in data:
    data['Initial']=data.Name.str.extract('([A-Za-z]+)\.')
print(data['Initial'])
print(data['Name'])

이름에 Mr, Miss, Master, Rev등등 기입이 되어 있는데, 오타일 가능성이 있다고 판단할 수 있다.

Crosstab으로 전체 이름이 어떤 것들이 있는지 확인하고 몇명이 있는지 확인한다.

pd.crosstab(data.Initial,data.Sex).T.style.background_gradient(cmap='summer_r')

Dr, Don, MIIe 등등 오타로 보이는 이름들이 보인다.

오타로 보이는 것들을 Mr, Mrs, Miss, Other로 변경한다. 참고로 Master는 Mr로 불릴 정도의 나이가 안된 어린 나이 남자에 대한 호칭이다.

data['Initial'].replace(['Mlle','Mme','Ms','Dr','Major','Lady','Countess','Jonkheer','Col','Rev','Capt','Sir','Don'],['Miss','Miss','Miss','Mr','Mr','Mrs','Mrs','Other','Other','Other','Mr','Mr','Mr'],inplace=True)
#print(data.Initial)
pd.crosstab(data.Initial,data.Sex).T.style.background_gradient(cmap='summer_r')

이제 Master, Miss, Mr, Mrs, Other로 이름을 줄여서 분류할 수 있다.

해당 이름별로 나이의 평균을 구해본다.

data.groupby('Initial')['Age'].mean()

어린아이는 4살, Miss는 21세, Mr는 32세, Mrs는 35세로 평균을 구할 수 있다.

위 평균값을 이용하여 Age에 Null인 데이터에 평균값을 넣어준다.

data.loc[(data.Age.isnull())&(data.Initial=='Mr'),'Age']=33
data.loc[(data.Age.isnull())&(data.Initial=='Mrs'),'Age']=36
data.loc[(data.Age.isnull())&(data.Initial=='Master'),'Age']=5
data.loc[(data.Age.isnull())&(data.Initial=='Miss'),'Age']=22
data.loc[(data.Age.isnull())&(data.Initial=='Other'),'Age']=46

Age데이터에 이제 Null이 있는지를 확인한다.

data.Age.isnull().any()
data.Age.isnull().sum()

이제 나이별로 사망자 수와 생존자 수를 그래프로 확인한다.

f,ax=plt.subplots(1,2,figsize=(20,10))
data[data['Survived']==0].Age.plot.hist(ax=ax[0],bins=20,edgecolor='black',color='red')
ax[0].set_title('Survived= 0')
x1=list(range(0,85,5))
ax[0].set_xticks(x1)
data[data['Survived']==1].Age.plot.hist(ax=ax[1],color='green',bins=20,edgecolor='black')
ax[1].set_title('Survived= 1')
x2=list(range(0,85,5))
ax[1].set_xticks(x2)
plt.show()

사망자 중 30대가 제일 많았으며 생존자 중에서는 30대, 20대가 많은 것을 확인 할 수 있다.

 

이제 factorplot으로 객실과 생존율을 이름별로 확인해본다.

sns.factorplot('Pclass','Survived',col='Initial',data=data)
plt.show()

성인남성 중 1등급 객실이 생존율이 높고 기혼여성, 미혼여성 모두 1등급 객실에서 생존율이 높은 것을 확인 할 수 있다.

Crosstab으로 성별, 객실별, 배를 탄곳(Embarked)에서 생존자 수를 확인해본다.

pd.crosstab([data.Embarked,data.Pclass],[data.Sex,data.Survived],margins=True).style.background_gradient(cmap='summer_r')

3등급 객실과 S에서 배를 탄 사람의 사망자 수가 가장 높은 것을 확인 할 수 있다.

factorplot으로 Embarked와 생존율을 확인한다.

sns.factorplot('Embarked','Survived',data=data)
fig=plt.gcf()
fig.set_size_inches(5,3)

C에서 탄 승객의 생존율이 높은것을 확인 할 수 있다.

승선한 곳 별로 승객수, 성별로 승객수, 승선한곳에 대한 생존자 수, 승선한 곳과 객실 등급 별 승객수를 확인한다.

f,ax=plt.subplots(2,2,figsize=(20,15))
sns.countplot('Embarked',data=data,ax=ax[0,0])
ax[0,0].set_title('No. Of Passengers Boarded')
sns.countplot('Embarked',hue='Sex',data=data,ax=ax[0,1])
ax[0,1].set_title('Make-Female Split for Embarked')
sns.countplot('Embarked',hue='Survived',data=data,ax=ax[1,0])
ax[1,0].set_title('Embarked vs Survived')
sns.countplot('Embarked',hue='Pclass',data=data,ax=ax[1,1])
ax[1,1].set_title('Embarked vs Pclass')
plt.subplots_adjust(wspace=0.2,hspace=0.5)

S에서 탄 승객수가 가장 많으며 S에서는 남성이 400명 이상, 여성이 200명 정도, S에서 탄 승객의 사망자수가 가장 높으며, S에서 탄 승객들은 3등급 객실에 가장 많이 탄것을 확인 할 수 있다.

객실등급과 생존자를 성별과 승선한 곳에 따라 비교해본다.

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

S에서 탄 승객 중 1,2등급 객실에 탄 여성 승객은 생존율이 높으며, C에서 탄 승객 중 1,2등급 객실에 탄 여성 승객의 생존율이 높은 것을 알 수 있다. Q에서 탄 여성 승객 역시 마찮가지이다.

많은 승객들이 S에서 승선한것을 알 수 있기 때문에 Embarked에 Null인 데이터는 S에서 승선한것으로 채워넣는다

data['Embarked'].fillna('S',inplace=True)

그리고 나서 Null Data가 있는지 확인해보면

data.Embarked.isnull().any()

 

* 해당 타이타닉 notebook은 Kaggle의https://www.kaggle.com/ash316/eda-to-prediction-dietanic분석을 그대로 따라하면서 나름대로 정리한 부분임을 밝혀둔다.

반응형