kaggle

機械学習初学者がkaggleをはじめてみた②(データの確認)

前回の記事の続きです。

機械学習初学者がkaggleをはじめてみた①(kaggleとは)今回の記事では、kaggle初心者が実際に順に流れを追いながら挑戦、解説していきたいと思います。 この記事を読むべき人 これからka...

前回では、kaggleのチュートリアルとも言えるタイタニックのコンペに参加、そして画面の見方、タイタニックコンペの目的まで解説しました。

今回の記事では、実際にタイタニックコンペに取り組んでいきたいと思います。

Notebookの作成

まず、新しいNotebookを作っていきたいと思います。
このNotebookにコードを書き、提出するデータを作っていきます。

kaggleのCodeというタブを開き、New Notebookをクリックします。
すると、

このような画面になるかと思います。

Fileというタブから、Language(使用する言語)やEditor Typeを選ぶことができます。
今回はデフォルトのPythonをNotebook形式で使用していきます。

また、一番上に
notebook17a8a4f321
という文字がありますが、これはNotebookの名前です。
わかりやすい名前に変更しておきましょう。
今回は、Titanicとしておきます。

タイタニックデータの概要

これからコードを実装していくのですが、以下の書籍のコードを参照しました。

KAGGLEのチュートリアル 第5版

データの読み込み

Notebookを作成した際に最初に表示されていたコードがあったと思います。
データの概要を確認するために、まずはそれを実行し、必要なライブラリやデータをインポートしておきましょう。
実行はshift+enterでできます。

実行するとnumpyとpandasをインポートでき、train、test、gender_submissionの3種類のcsvファイルを読み込めたと思います。
ちなみに、コードの埋め込みはKaggleが新しく実装した、iframeのコード埋め込みを使ってみました。
スクロールが少し見にくいので、次回からはコードを直接打っていこうかなと思っています。

この3種類のcsvファイルは、それぞれデータフレームとしてpandasのread_csvメソッドで読み込んでおきましょう。

trainデータ、testデータ、サンプルサブミッションデータを読み込む

データフレームの確認

まず、以下のコードでデータフレームの行数と列数を確認します。

これでそれぞれの行と列の数がわかりました。
左の数字が行数、右が列数です。
testの列数が1つ少ないのは、target(生存データ)の列がないためです。

カラムの確認

次のコードで列の名前、カラム名を確認します。

先述の通り、testはtrainと比べ、Survivedの列が無いことがわかります。

欠損値とデータ型の確認

欠損値とデータの型を確認します。

データの型(Dtype)は、
int64、float64、objectの3つに分かれていますね。
それぞれ、int型(整数)、float型(少数)、object型(string型などの文字等)にわかれています。

同様にtestの確認もしてみましょう。

データの中身を少し見てみる。

trian.head()
で最初の5行を表示してみます。
デフォルトは5行ですが、()の中に数字を入れることで、その数字の分行数が出力されます。

それぞれどのような形でデータが入っているのかわかります。
NameにはMr、Mrs、Missが入っている。
Ticketは数字が入っていたりアルファベットが入っていたりすること。
などですね。

欠損値がいくつあるのか

先ほど、.info()でnon-null、すなわち欠損でない値がいくつあるのかは確認しました。
欠損値がある場合、予測をする前に何らかの処理が必要なことが多いです。
ここでは、具体的にわかりやすく欠損をみていきましょう。

isnull()は欠損値に対してTrue、それ以外をFalseを返す。
sum()をつけることで、Trueを1、Falseを0で出力できます。

testについても見てみます。

要約統計量の表示

要約統計量とは、データ数、平均値、標準偏差、最小値、最大値、四分位数のことです。
ここでは、trainとtestを縦方向に連結し、新しいデータフレームを作成してから要約統計量を見てみます。
連結することで、全体的な平均値などが確認できます。

これでわかるのは、主に以下の通りです。
・Survived:生存した人の平均は約4割
・Age:乗客の平均年齢は約30歳
などです。
こうして大まかな分布を把握しておきましょう。

pandas_profiling

ちなみに、pandas_profilingを用いると、先ほどまでの作業をまとめてわかりやすく表示してくれます。

Overviewには概要が表示されます。
866の欠損値があり、それが全体の8.1%であることなどがわかります。

Variablesには以下のように、それぞれの記述統計量やヒストグラム等が表示されます。
Toggle detailsをクリックすると、詳細情報を見ることができます。

Survived

死亡者(0)と生存者(1)の人数と割合がわかります。

Pclass

客室のクラスごとの人数と割合がわかります。
1から3までクラスが分かれているようです。

Sex

男性と女性の人数と割合がわかります。

Age

平均年齢や、年齢の最小値、最大値などがわかります。
欠損値は177です。

Embarked

乗船した港とそれぞれの人数がわかります。
S、C、Qのいずれかにわかれています。

各特徴とtargetの関係を可視化

ここでは、各特徴とtarget(生存者)について可視化していきます。
必要なライブラリをインポートしておきます。

死亡者と生存者

まずは死亡者と生存者。
seabornのcountplot関数を使うと簡単に可視化してくれます。

数値でも表示してみます。
0が死亡者で、1が生存者です。

性別

性別ごとの死亡者と生存者を見ていきます。

クロス集計

正規化しクロス集計

女性の方が生存している割合が男性よりも大きいことがわかります。
女性が男性よりも先に船から脱出しているということですね。

チケットクラス

チケットクラス別の死亡者と生存者をみていきます。

1から3にクラスが変わるにつれ、生存割合が下がっていることがわかります。

年齢の分布

乗船者の年齢の分布をヒストグラムで確認していきます。

全体のヒストグラムから、乳幼児も数十名が乗船していたこと、20代前後の乗船が多かったことがわかります。
また、死亡者と生存者のヒストグラムから、10歳未満の乗客は死亡者よりも生存者の方が多いが、10代後半から30代にかけては生存者より死亡者の方が多いことがわかります。

また、pandasのcutメソッドを用いて、年齢を等間隔に8等分し、生存率を表示してみます。

例えば、1番上の(0.34,10.368]の行は、0.34歳超から10.368歳までのグループを集計すると、死亡者と生存者が26人と38人であり、割合にすると約4割と約6割ということです。
一番上のカテゴリ以外はすべて死亡者の割合が上回っていることがわかります。

タイタニック号に乗っている兄弟・配偶者の数

次に、乗船している兄弟・配偶者の数についてのヒストグラムを見てみます。

兄弟または配偶者1人と乗船していた者は約200人おり、2人以上で同乗している者は少ないことがわかります。

同乗している兄弟・配偶者の数と、生存・死亡との関係を表示してみます。2人以上の同乗している兄弟・配偶者の数が少ないので、まとめてしまいます。

同乗している兄弟・配偶者が1、0、2人以上の順で生存割合が高いことがわかります。

タイタニック号に乗っている両親・子供の数

同様に可視化してみます。

3人以上の同乗は少ないので、まとめて可視化します。

同乗している両親・子供が1人または2人の場合の生存割合が高いことがわかります。

乗船している人数でまとめる

ここまでで、兄弟・配偶者や両親・子供と家族で乗船せず1人の場合に生存率が低いことがわかりました。
そこで、SibSpとParchを合計し1人で乗船しているという特徴量を作ることにします。

1人で乗車している方が2人以上よりも死亡率が高いことがわかります。

運賃の分布

乗船者の運賃を可視化してみます。

多くの人の運賃は0〜100にあることがわかります。

また、運賃が高くなるにつれ、生存者が高くなっていることがわかります。

名前

Nameのカラムを確認するとMr.やMrs.などの敬称が含まれています。

どんな敬称があるのか確認してみます。

17種類の敬称がありました。

敬称の数をそれぞれcountしてみます。

Mr、Miss、Mrsが多いことがわかります。

敬称ごとに年齢の平均値を入れてみます。

Masterは平均年齢が4歳なので、子供に使われる敬称と推測されます。
特徴量として使えそうなので、以下のように特徴量を作成してみます。
Master : 1
Miss : 2
Mr : 3
Mrs : 4
それ以外 : 5

今回の記事では主にデータの可視化を行ない、特徴量を確認しました。
次回からは実際に予測をしていきます。