目的
機械学習の一連の流れをタイタニック号の乗客の生存予測モデル作成を通して体験する。
先駆者の残してくれた記事に習い、どういう思考プロセスで開発しているのかを知る。
わからない関数、処理があれば調べてコメントとして残しておく。
参考元
以下の「キヨシの命題」様の記事を参考にさせていただきます。
タイタニック号の乗客の生存予測〜80%以上の予測精度を超える方法(探索的データ解析編)
https://yolo-kiyoshi.com/2018/12/16/post-951/
探索的データ解析編 をやってみる
「キヨシの命題」様のサイトには複数のタイタニック号の乗客の生存予測の記事が存在していた。
私はその中でも副題に「80%以上の予測精度を超える方法」がついている2記事を体験してみることにした。
2記事と言っても前編と後編に別れている。
「探索的データ解析編」と「モデル構築&推論編」である。
本記事では前編の「探索的データ解析編」を体験する。
その前に探索的データ解析のことを理解しておく必要があるので以下復習。
探索的データ解析
英語ではExplanatory Data Analysis(略してEDA)データの特徴を探求し、構造を理解することを目的としたデータサイエンスの最初の一歩です。
探索的データ解析は機械学習のタスクの一番最初のフェーズで、まずはデータに触れてみて、データを視覚化したり、データのパターンを探したり、特徴量やターゲットの関係性/相関性を感じるとるのが目的です。
環境
- Pythonでバージョンは3.7
- Colaboratory
環境準備
紹介されていたkaggleのサイトからデータ(csvファイル3つ)をダウンロードした。
https://www.kaggle.com/c/titanic/data
- gender_submission.csv
- test.csv
- train.csv
ダウンロードしたファイルをColaboratoryにアップロードする。
参考サイトに習いtrain.csvとtest.csvを/data/rawを作成後、配下に格納した。
データ準備
inputの通り入力し、outputの通り出力されることを確認した。
わからない関数、ぱっと説明ができないライブラリに関しては調べてメモを書いた。
結合できました。
indexを振り直すところは他のやり方もあるみたいなのでちょっと脱線してお試しもしてみた。
変数につけた「mid」は何の略何だろうか? 分かる人いたら教えて欲しいです。
![スクリーンショット 2020-04-28 15.04.05.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F1d7b9c99-5e6c-55c4-0636-905f209e99b1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c5ae817e8ea9690e3511701ea6284740)
#探索的データ解析
判断基準が「生存率約0.38」というのがキモであることがわかった。
##Pclass に着目
pandasやseabornを使ってデータの解析をする。
平均を取ったり、グラフ化してデータを客観的にみる。
![スクリーンショット 2020-04-28 16.17.06.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F18121eee-1427-b319-5c5f-450ead5e81cb.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=0a49e96a8f7ed4e710487e15b6334cb5)
![スクリーンショット 2020-04-28 16.14.02.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F7e5eb3d4-5b78-1363-b5f0-e1912b43351c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=4e13166cf2e178a2f444be9853d7ceea)
##Name に着目
ミドルネームに着目する。
Nameからミドルネームだけ抽出。
テストに関係ないものは除外。
少数レコードは統合。(抽象化?)
![スクリーンショット 2020-04-28 20.22.09.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2Fafaede12-625a-8c72-1a59-8457e26e6eca.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=6416662319fb728ba7d49b9e9ad55501)
![スクリーンショット 2020-04-28 20.23.09.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2Ff64013b9-0561-bc49-2f72-71db88b1bb85.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=dfece5cbea8befafa393f12ea82fc0d5)
![スクリーンショット 2020-04-28 20.23.40.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F95381e37-5b5d-84c6-00b4-197f62d0a5c0.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=61edf1eb5612f6a085023d1c426dbfaa)
![スクリーンショット 2020-04-28 20.24.34.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F03740100-f306-4e6d-a6e4-49e3f8a0fdbe.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=836499e622ec6e0060738773b5f42786)
この数値から関係がありそう。。。とは自分は見えない。
数学的知見からだとそう見えるのだろうか。
##Fare に注目
distplot関数をちょいちょいいじって遊んでみたが、
デフォルト設定に頼り切ってしまうと痛い目にあいそうと理解した。
log1p関数については今の段階では何をしているのか理解できなかった。掘り下げが必要。
![スクリーンショット 2020-04-30 11.25.43.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2Fecb0d462-ae36-4c93-f994-a5f39e13b741.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=906f0f3c76895b1f96bea3accb7d0c89)
![スクリーンショット 2020-04-30 11.26.17.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F0f464ea2-eb08-4cd4-2375-d601afe381bb.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=23d01f00e21378d5e1ed2563b26ab82f)
##Age に注目
欠損値は除外して考えているがどうにかして推定できないか。。。
![スクリーンショット 2020-05-01 9.08.22.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F058e3015-1e53-3645-8535-711009ea4d14.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a17548b0067ef77061d1a77d60a4aac1)
##Family に注目
「家族数」の列を新たに作成する。
参考記事の後述リンク先にもあるが「家族単位で行動していた可能性が高い」という点から、この変数を作成するに至っているらしい。
ビニング処理のやりたいことはわかった!
![スクリーンショット 2020-04-30 14.59.55.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F7e08752e-9a03-9e09-40db-0735d6510cb0.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=05edab344254a41aacc638bd06c54ddf)
##Cabin に注目
「Cabinの頭文字は部屋がどの階層にあったのかを示すものなので、、、」
こう言った前情報を把握する能力もであることが分かる。
単に数字だけみていてもわからない。
テストで使用しない"T"を排除することも忘れずに行う。(この後にするのかな?)
![スクリーンショット 2020-05-01 8.37.02.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F89ed4818-4bd6-96dd-6623-51381b2de41e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a55fba55e3e2dd484fde69703005ee16)
![スクリーンショット 2020-05-01 8.35.03.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F559e908c-ad39-6feb-ae92-63cb4bbeb1d0.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f8b838218dff955789658877b4c50a3e)
##Ticket に着目
「発想を転換し、Ticketに重複カウントがないのかを調べてみます。」
ここがミソですね。
一見規則性の見えない情報から関連関連性を見出すことが重要。
「とりあえず重複ないか見てみよう」というスタンスを持ってみる。
「そこから生存率と関連ある?」という黄金パターンで見ていく流れをつくる。
![スクリーンショット 2020-05-01 8.44.40.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2Fc9f460fe-93d9-fe9e-4ebf-1c1ea217bcf2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=af73d73ac87d84a6ee2b4624e7d0085a)
![スクリーンショット 2020-05-01 8.45.23.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F4679c7f1-c0fb-3799-e803-669b9ed08875.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=4bf16f3e9e744c9a66516b7ee35ce9cc)
![スクリーンショット 2020-05-01 8.46.23.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2F34b2beae-2d00-1e31-bdff-d90d32300b75.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=15dd649328c5b8513ace1929076466b1)
![スクリーンショット 2020-05-01 8.47.26.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F557349%2Fd3ed5805-973b-0960-d4b3-d4b9479c0aa0.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c80de303951233acc32ee6b6e20e494d)
前編は以上です。
前編を終えて
- 手を動かしながらは楽しいです。
- わからない関数も調べながら、値を変えて試しながら学べているので、一つひとつを「当事者」の目線で勉強できている。
- 参考書を買って「この関数いつ使うねん!」って思いながら勉強するよりも身についている気がする。
- mapとlambdaを使う場面でも実践で使えるコーディングを学べている。
成果物
Colaboratryのノート(titanic_EDA.ipynb)
https://colab.research.google.com/drive/1EUikceUGYfmkED5Pa3YFh9IAEr3fntjW
後編に続きます。