はじめに
いきなりですが皆さん、Kaggleってご存じですか?
世界中のデータサイエンティストたちが、寝る間も惜しんでしのぎを削り、最強のアルゴリズムという名の武器で殴り合う知の闘技,コロシアムのことです。
...というのは半分冗談で、半分本当です。
Google傘下の、世界最大の機械学習コンペティションプラットフォーム。それがKaggleです。
今日は、Python初心者の私がこの修羅の国に足を踏み入れ、最初の登竜門である「タイタニック」に挑むまでの記録を残します。
そもそもKaggleとは?
ただの勉強サイトではありません。ここはスポーツの世界です。
企業が「このデータから予測モデル作ってくれたら賞金あげるよ!」とお題を出し、世界中の猛者(Kaggler)たちが精度を競います。
賞金: 数百万〜数千万円の案件もザラ。夢があるね!
ランク: 勝ち進むと「Grandmaster」などの称号が貰える。神扱いされる。
学び: 世界トップレベルのコード(Notebook)が公開されており、無料で盗める(学習できる)。
つまり、勉強できて、運が良ければお小遣いも稼げて、就職にも有利という、やらない理由が見つからない沼なのです。
アカウント登録(入場手続き)
戦場に行くには、まず入場手続きが必要です。
これに関しては、カップラーメンを作るより簡単です。
Kaggle公式サイトにアクセス。
右上の 「Register」 をクリック。
「Register with Google」 をポチー。
はい、終了。これであなたも今日からKagglerです。
プロフィール画像をカッコいいものに変えておきましょう。これだけで強そうに見えます。
今回の戦場:Titanic(タイタニック)
登録して最初に挑むべきクエスト、それがTitanic - Machine Learning from Disasterです。
どんなコンペ?
映画でも有名なあのタイタニック号の乗客データ(年齢、性別、チケット代など)をもとに、「誰が生存し、誰が亡くなったか」を予測するというものです。
「人の命を予測するなんて...」と神妙な気持ちになるのは最初だけです。
すぐにくそっ、この欠損値さえなければと、データのことしか考えられなくなります。
データのダウンロード
コンペページの「Data」タブからデータをダウンロードしましょう。これを手に入れた瞬間、戦いのゴングが鳴ります。
いざ、モデル作成!
ではありません!!!!
いきなり予測モデルを作るのではなく、まずは敵(データ)を知るためのEDAを行います。
EDA
EDAとは、Exploratory Data Analysisの略で、日本語では探索的データ解析と呼ばれます。
一言でいうと、本格的な統計モデルを作ったり機械学習にかけたりする前に、まずはデータをじっくり眺めて、その特徴やクセをつかもうというステップのことです。
という事で実際にやっていきましょう
環境はなんでもいいですがkaggleのノートブックがおすすめです。
まあおすすめしておいて私はVSコードですが(笑)
自分が使いやすいものを使ってください
何にもわからないって人はこれ使いましょう
てことで必要なライブラリ入れていきましょう
この as~の書き方最近知ったんですが便利ですね
でもフルネームで書くのに慣れすぎてsnsってなんだっけってなります(笑)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
ファイル三つとも読み込みます。pands便利ですね
パスのコピーで張り付けると\(←これなんていうの(笑))になるのでなぜかエスケープシーケンスに勘違いされるんだけどVSコードだけ?
とりあえず先頭にr入れておけばバックスラッシュ認定してくれます
data_train = pd.read_csv(r"C:\**************************************************")
data_test = pd.read_csv(r"C:\**************************************************")
gender = pd.read_csv(r"**************************************************")
データ読み込んだので早速のぞいてみましょう
()の中空欄だとデフォルトで5行、今回みたいに指定したら指定行出力されるよ
data_train.head(10)
そしたらこんな表だったよ
少し見にくいけど何となくどんな変数があるのか理解しよう
| PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
| 1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
| 2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
| 3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
| 4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
| 5 | 6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
| 6 | 7 | 0 | 1 | McCarthy, Mr. Timothy J | male | 54.0 | 0 | 0 | 17463 | 51.8625 | E46 | S |
| 7 | 8 | 0 | 3 | Palsson, Master. Gosta Leonard | male | 2.0 | 3 | 1 | 349909 | 21.0750 | NaN | S |
| 8 | 9 | 1 | 3 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) | female | 27.0 | 0 | 2 | 347742 | 11.1333 | NaN | S |
| 9 | 10 | 1 | 2 | Nasser, Mrs. Nicholas (Adele Achem) | female | 14.0 | 1 | 0 | 237736 | 30.0708 | NaN | C |
10行のデータ見たくらいじゃデータのことわからないからもう少し統計量を見てみましょう
というか、まずは脳死でこれやったらいいと思います
最強呪文だよ
data_train.describe()
出力結果がこれ
| PassengerId | Survived | Pclass | Age | SibSp | Parch | Fare | |
|---|---|---|---|---|---|---|---|
| count | 891.000000 | 891.000000 | 891.000000 | 714.000000 | 891.000000 | 891.000000 | 891.000000 |
| mean | 446.000000 | 0.383838 | 2.308642 | 29.699118 | 0.523008 | 0.381594 | 32.204208 |
| std | 257.353842 | 0.486592 | 0.836071 | 14.526497 | 1.102743 | 0.806057 | 49.693429 |
| min | 1.000000 | 0.000000 | 1.000000 | 0.420000 | 0.000000 | 0.000000 | 0.000000 |
| 25% | 223.500000 | 0.000000 | 2.000000 | 20.125000 | 0.000000 | 0.000000 | 7.910400 |
| 50% | 446.000000 | 0.000000 | 3.000000 | 28.000000 | 0.000000 | 0.000000 | 14.454200 |
| 75% | 668.500000 | 1.000000 | 3.000000 | 38.000000 | 1.000000 | 0.000000 | 31.000000 |
| max | 891.000000 | 1.000000 | 3.000000 | 80.000000 | 8.000000 | 6.000000 | 512.329200 |
それぞれの意味はこんな感じ
count:データ件数
mean:平均値
std:標準偏差(数値のバラつき)これが多いほど、いろんな境遇の人が混ざっていることを示す
min:最小値
25%:第1四分位数,全員を並べて下から25%目の値
50%:中央値,真ん中の人の値。平均値と大きく離れている場合、データが極端に偏っている
75%:第3四分位数,全員を並べて上から25%目の値
max:最大値
こうやって見るといろいろ気になるよね
・年齢だけ欠損おおすぎ
・生存率38.4%は低すぎ
・なぜか0歳4か月の赤ちゃんが乗ってる
・75%の人の運賃が31ドル以下なのに最大値は512ドル
もっとあるけどまだ脳死でみないといけないやつあるんだ
それがこれ
また魔法の呪文ね
もちろん最初にimportしてもいいからね
from ydata_profiling import ProfileReport
data_train.profile_report()
これは本当にすごい、ただでかすぎて乗せれないから一部抜粋
Survivedと相関高そうなグラフ見てみよう
sns.countplot(x="Survived", hue="Sex", data=data_train)
plt.show()
女性の方が生存率高いから女性が優先的に助けられたのかな?
次はこれ
sns.countplot(x="Survived", hue="Pclass", data=data_train)
plt.show()
次はこれ
細かくなりすぎるから幅引いてる
bins = [-1, 10, 20, 50, 100, 200, data_train['Fare'].max()]
labels = ['0-10','10-20','20-50','50-100','100-200','200+']
data_train['FareBin'] = pd.cut(data_train['Fare'].fillna(0), bins=bins, labels=labels)
plt.figure(figsize=(8,5))
sns.countplot(x='FareBin', hue='Survived', data=data_train, order=labels)
plt.xlabel('Fare (bin)')
plt.ylabel('count')
plt.legend(title='Survived', labels=['Dead','Survived'])
plt.tight_layout()
plt.show()
こうやってデータをこちょこちょして
どうかなーこうかなーって考えるのがEDAです
今回は大丈夫そうだったけど多重共線性とかもこの段階で確認しておいた方がいいね
次回は欠損地処理・特徴量エンジニアリング+出来たらモデル作成までやるよ
まとめ:戦いはこれからだ
今回は登録からEDA(データの確認)までを行いました。
わかったことは以下の通りです。
Kaggleは怖くない。 むしろゲーム感覚で楽しい。
データには穴(欠損)がある。 現実は甘くない。
女性は生き残りやすく、男性は厳しい。
自動化ツールは神。
次回は、このデータをもとに「欠損値の穴埋め」や「特徴量エンジニアリング」を行い、実際にAIに生存予測をさせてみたいと思います。
目指せ、Kaggle Grandmaster!(の卵の卵)
余談
実は来週名古屋に旅行しにいくのでお勧めスポットがあれば教えてね
あとITパスポート試験2回目の試験で受かりました
一回目は免許証忘れて受験できず受験料+交通費の約2万円を失いました



