pyhaya’s diary

機械学習系の記事をメインで書きます

Kaggleのデータセットで遊んでみた 2 

前回の続きで、Titanicのデータセットで分析の基礎を学びます。

年齢と生存の関係を見てみる

前回の記事の最後に見たヒストグラムでは、Ageのデータがきれいな正規分布のような形をしているのが印象的でした。果たしてこの変数がSurviveに影響してくるのか、Survivedで分けてプロットしなおしてみます。

f,ax=plt.subplots(1,2,figsize=(20,10))
train[train['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)
train[train['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()

f:id:pyhaya:20181116000547p:plain
分布の形状に大きな差はありません。しかし、低年齢に注目してみると死者よりも明らかに生存者が多いことがわかります。

コードの説明

コード 動作
plt.subplots(1,2,figsize=(20,10)) プロット領域の用意。1行2列で、大きさは(20, 10)
train[train['Survived']==0].Age trainからSurvivedが0のものを抽出し、そのAgeカラムを取り出す
plot.hist(ax=ax[0], bins=20,...) 最初のプロット領域にヒストグラムをプロット。ビンは20個用意

性別と生存率の関係

性別と生存率の関係はどのようになっているでしょうか?

f,ax=plt.subplots(1,2,figsize=(18,8))
train[['Sex','Survived']].groupby(['Sex']).mean().plot.bar(ax=ax[0])
ax[0].set_title('Survived vs Sex')
sns.countplot('Sex',hue='Survived',data=train,ax=ax[1])
ax[1].set_title('Sex:Survived vs Dead')
plt.show()

f:id:pyhaya:20181116072422p:plain
今度は明確な差が出てきました。男性に比べると女性のほうが生存率が明らかに高いことがわかります。

コードの説明

コード 動作
.groupby(['Sex']).mean() 'Sex'でデータをまとめる。'Survived'の行の値は平均で置き換える
sns.countplot('Sex',hue='Survived',data=train,ax=ax[1]) trainデータで、横軸'Sex'縦軸'Survive'でプロット

複数の指標を同時に比較してみる

バイオリンプロット

複数の指標を一つのグラフ上にプロットするのはバイオリンプロットが便利です。sns.violinplotで利用できます。

f,ax=plt.subplots(1,2,figsize=(18,8))
sns.violinplot("Pclass","Age", hue="Survived", data=train,split=True,ax=ax[0],
              palette='pastel')
ax[0].set_title('Pclass and Age vs Survived')
ax[0].set_yticks(range(0,110,10))
sns.violinplot("Sex","Age", hue="Survived", data=train,split=True,ax=ax[1],
              palette='pastel')
ax[1].set_title('Sex and Age vs Survived')
ax[1].set_yticks(range(0,110,10))
plt.show()

f:id:pyhaya:20181116073730p:plain
ここから読み取れるのは、生存者数のピークは死者数のものとほぼ一致しているが、生存者数に関しては低年齢領域にもう一つ小さなピークがあるものが多いということです。また、Pclass=1では生存者数は1ピークですが、そのピーク位置は死者数と比較して低年齢側にシフトしています。

ペアプロット

sns.jointplot(x="Age", y="Survived", data=train, size=5,ratio=5, kind='kde', color='green')
plt.show()

f:id:pyhaya:20181116075802p:plain

ヒートマップ

ヒートマップで各変数の相関の強さをざっくりと見ます。

plt.figure(figsize=(7,4)) 
sns.heatmap(train.corr(),annot=True,cmap='Reds')
plt.show()

f:id:pyhaya:20181116080951p:plain
annot=Trueとすることで、相関係数がグラフ中に表示されるようになります。