【目的】
初投稿です。Kaggleに挑戦し、データ分析について深く学んでみようと思い、代表的なトレーニングコンペであるタイタニック号の生存予測を行いました。今回は、利用するデータを確認してみたいと思います。
【使用するデータ】
今回の分析で使用したデータは、分析コンペプラットフォームであるKaggleで提供されているデータを利用しました。テストデータから生存者
【分析の流れ】
・データの確認
・データ前処理
・モデル作成
・モデル評価
【データ確認】
1.全体
まずは、trainデータとtestデータを読み込んで、trainデータの先頭を確認した。
import pandas as pd
train = pd.read_csv('train.csv')
train.head()
各columnの詳細は以下のとおり
・Survived/生存確認
・Pclass/チケットのクラス
・Sex/性別
・Age/年齢
・SibSp/タイタニック号に乗船している兄弟・配偶者の数
・Parch/タイタニック号に乗船している
・Ticket/チケット番号
・Fare/旅客運賃
・Cabin/キャビンナンバー
・Embarked/乗船港
データサイズ、データの型、欠損値を確認
- データサイズ
train.shape, test.shape
((891, 12), (418, 11))
学習用データが891個、テスト用データが418個あることが分かります。
それぞれのカラムは、目的変数(Survived)含め12あることがわかります。
-
データの型
データはobjectが5つ(Name, Sex, Ticket, Cabin, Embarked)あり、そのままでは使えないため数値変換するか、特徴量を落とす必要があります。 -
欠損値の数
学習用
テスト用
欠損値が含まれているカラムは3つあり、AgeとCabinはかなり欠損値が含まれていることがわかる。利用するモデルによっては、欠損値を埋める必要があるので考察する。 -
各カラムのユニークな要素数
学習用
テスト用
PassengerIdのように、全てにユニークな値が振られているものは即削除でいいのかなと思ったが、Idの番号とSurvivedに相関があったら特徴量として有用かもしれないと思ったので、相関を調べることにした。
また、NameやTicketなどのようにobject型で多くのデータがユニークであるものは、実際にデータを見ながら考察することにする。 -
相関係数
数値データのみ相関係数を求めたが、「Survived」と相関が比較的強いものは、PClassとFareであり、PClassとFareは負の相関が強く多重共線性を考慮する必要があるかもしれない。
ここからは、それぞれの特徴量を見ながら、考察していく。
2.各特徴量[数値データ]
各特徴量のSuvivedで分けたヒストグラムを確認し、実際どういう関連があるかを考察してみる。ヒストグラムは、以下のコードで作成した。
# データフレームをSurvivedのラベルで分ける
tr_dead = train.query('Survived == 0')
tr_survive = train.query('Survived == 1')
# ヒストグラム作成
def make_hist(name):
plt.hist([tr_dead[name], tr_survive[name]], label=["dead", "survive"])
plt.title(name)
plt.legend(loc="upper left", fontsize=13)
plt.show()
2.1 PClass
Pclassはチケットのクラス(種類)を表している。チケットごとに支払う料金やサービスの内容が異なる可能性がある。ヒストグラムを確認すると、チケット1を購入した人は生存率が高く、チケット3を購入した人は死亡率が高くなっている。以下のようなことを考察した。
- チケットの種類で助ける順番を決めた
- チケットの種類で部屋の場所等が決まり、チケット1の方が救助しやすい場所であった
- チケットの種類ごと見ても生存者、志望者共にいるため救助には他の要因も考えられる(子供等を優先したなど)。
2.2 Age
乗船者の年齢である。10歳以下であると生存者の方が多く、優先して救助されたのではないかと考察できる。
2.3 SibSp
同乗している兄弟や配偶者の数を表している。配偶者や兄弟のいない人の死亡率が高いことがわかった。(共助者の影響?)二人以上だと死亡者の方が多くなるため、人数が多ければ言い訳でもないように思える。親や子供の数も踏まえて考えた方がいいのかもしれない。
2.4 Parch
親もしくは子供の数を表している。親子供ともにいない人は、やはり死亡率が高い。
親子も兄弟・配偶者もいない人や、少なくともどちらかはいるヒストグラムについても調べてみた。
・一人で来ている人の分布
・Parch
一人で来ている人と比較して、二人以上で来ている場合では死亡率が大幅に下がったと言える。
2.5 Fare
その人が支払った料金を表している。チケット以外にも支払いがあるのかは不明。単位が分からないが支払いの少ない人が圧倒的に多く、死亡率も高い。
数値データを確認してきたが、どれも生存率に関連しているところはあると思うが、objectも確認してみる。
3. 各特徴量(oblectデータ)
続いて、objectデータを確認していこうと思う。今回、「Name」、「Ticket」、「Cabin」の3つはユニークな要素が多いため、事前に削除する(時間があるときこれらの特徴量も確認し、前処理手法を検討のうえ精度が向上できるか確認したい)
train_data = train.drop(["PassengerId", "Name", "Ticket", "Cabin"], axis=1)
train_data.head()
3.1 ダミー変数に変換
ダミー変数に変換する前に、まずは欠損値を補完した。欠損値は平均値で補完した。
train_data = train_data.fillna(train_data.mean())
train_data.head()
train_data = pd.get_dummies(train_data)
train_data.head()
今回は、One-hot-Encodingによる数値化を実施したが、今後、カテゴリ変数の数値化手法については検討・考察したい。
3.2 全体
3.3 Sex
乗客の性別を表している。男性は死亡率が高く、女性は反対に生存率が高いことが分かる。女性が優先的に救助された?
3.4 Embarked
4. まとめ
- 今回はタイタニック号の生存予測のデータの確認を行なったが、実際の現場などではもっとしつこくデータと向き合う必要があると思うので、今から慣れていきたい。
- 特徴量選択の方法等今後検討していきたい
- やっていく中でいろんな手法を調べて知ったので、比較してみたい
- 次回は、実際にモデルを用いて学習と評価を行なってみたい
次の記事