Kaggleで初心者向けの練習用コンペはTitanicHouse Prices。この2つのコンペを試してながら、Pythonで分類問題と回帰問題を解ける手法を身に付けていきたい。

参考図書は『Pythonで動かして学ぶ!Kaggleデータ分析入門

参考オンラインページはKaggleチュートリアル『Titanic生存者予測』をやってみよう!

 

こちらはTitanicについて記録していく。

 

 Titanicコンペの目的

 

公式サイトではこのように書いてある。

"The competition is simple: use machine learning to create a model that predicts which passengers survived the Titanic shipwreck."

日本語に訳すと、機械学習を利用して乗客の生死を予測するモデルを作成することは本コンペの目的。

 

 全体の流れ

以下のように進めていくと考えている

  • ①データの整備
  • ②モデルの構築
  • ③学習データで訓練
  • ④検証データで検証

 

 ①データの整備

公式サイトでは、提供しているデータを早速ダウンロードして中身を確認してみる。

実施環境:Win11、VS Code

0.必要なライブラリー読み込み

import pandas as pd

import numpy as np

%matplotlib inline

import matplotlib.pyplot as plt

import seaborn as sns

 

1.データの読み込み

train_df=pd.read_csv('../train.csv')
test_df=pd.read_csv('../test.csv')
submission=pd.read_csv('../gender_submission.csv')

*VS codeで実施した為、アンダーラインの部分はPCで対象データを保存しているパスを記入。

*Google Colabratoryで行う場合は、私はデータを自分のGoogle Driveに保存していたので、Google ColabratoryがGoogle Driveからデータを取得できるように、Google Driveでの保存パスを明示して、コードを下記のように修正。

train_df=pd.read_csv("/content/drive/MyDrive/Colab Notebooks/240228 Titanic/train.csv")
test_df=pd.read_csv("/content/drive/MyDrive/Colab Notebooks/240228 Titanic/test.csv")
submission=pd.read_csv("/content/drive/MyDrive/Colab Notebooks/240228 Titanic/gender_submission.csv")

 

2.データの中身を確認

Kaggleでの説明はこちら参照。

読み込んだデータの中身を確認してみよう。

train_df.head()

では、どの項目(変数)を利用してモデルを訓練していくか?一度考えてみよう。

  • Survivedは予測の目標の為、学習の答えとしては必要。
  • Titanic事故の時、当時の船長は「Women and children first」に従っていたので、Sex・Ageも関係あると考えられる。
  • 事故当時、船は下から浸水し始めたので、船の上の人(クラス・乗船料金が高い)が生存する可能性が高い。その為、Pclass・Fareも生存状況を影響すると考えられる。
  • Name・Ticketは関係がないような気がする。
  • Sibsp・Parch・Embarkedは関係ないといえないので、一旦保留する。後ほど実際に関係あるかどうかを検証してみたいと思う。

3.各変数間の相関関係を確認

目的変数Survivedを予測するための説明変数を選ぶため、各変数間の相関関係を確認してみたい。

その前に、一度欠損値はあるかどうかを確認する。

train_df.isnull().sum()

やはりAge・Cabin・Embarkedには欠損値があった。のちほどモデルを構築する際に、これらのデータをどのように埋めるか後で考えておく。

話を戻ると、ここでは、Sex・Embarkedは文字列の為、一度ダミー変数化が必要。

train_df_corr=pd.get_dummies(train_df,columns=["Sex"],drop_first=True)

train_df_corr=pd.get_dummies(train_df_corr,columns=["Embarked"])

こうして、One-Hot Encoding手法を利用して、Sex・Embarkedの値をダミー変数にした。

その結果を見てみると、

train_df_corr.head()

ここでは

①SexがSex_maleになった。1がMale、0がFemaleと意味している。

②EmbarkedはEmbarked_C、Embarked_Q、Embarked_Sになった。それぞれの列では、1がその港から搭乗した、0はその港から搭乗していないと意味している。

次、各変数間の相関係数を計算してみる。

train_corr=train_df_corr.corr()
train_corr

数値で見にくいので、Heatmapで可視化にしてみた。

plt.figure(figsize=(9,9))
sns.heatmap(train_corr,vmax=1,vmin=-1,center=0,annot=True)

この図から、各変数と目的変数Survivedとの関係を以下のように整理できる。

①Sex_Male:一番相関している。負の相関である為、男性のほうがが生存率が低く、女性のほうが生存率が高い傾向が見える。

②Pclass:Sex_maleと同じく負相関している。チケットの階級が高いほど(数値的に小さいほど)、生存しやすいように見える。

③Fare:他の変数より、関係があるように見える。

ただ、ここではAgeは関係なさそうに見えるようになっているが、実際の年代ごとの生存率を確認していみると、

plt.hist((train_df[train_df["Survived"]==0]["Age"].values, train_df[train_df["Survived"]==1]["Age"].values),histtype="barstacked", bins=8, label=("Death", "Survived"))

plt.legend()

全体的には関係ないかもしれないが、10代以下の生存率は他の年齢層より比較的に高く見えるので、完全に関係ないとは言えない。その為、相関係数はあくまで参考で、実際のモデリングでは他の変数の予測重要度を確認しながら、モデルを改善していくのは重要だね。

次回から欠損データの補完などデータの前処理に進めていきたいと思う。