Contents
Kaggleとは
Kaggle(カグル)は、端的に言うと機械学習をやる人たちのコミュニティサイトです。それだけではなくデータ分析のコンペが開催されているので、参加して賞金を得たり、世の中にいるトップクラスの人のプログラムを見て勉強することができたりトップサイエンティストとディスカッションをしたりできるサイトです。世界中のデータサイエンティストが切磋琢磨して分析力を競っています。ちなみに参加している人のことをKaggler(カグラー)と呼びます。
Titanicとは
そもそもTitanicとは
Titanic(タイタニック)号は、処女航海中の1912年に北大西洋上で氷山に接触、翌日未明にかけて沈没した。未曾有の人災で有名となってしまった20世紀初頭に建造された豪華客船です。何度も悲劇として映画化されたりしているので知っている方も多いかと思います。
KaggleにおけるTitanicとは
先のTitanic号を題材にしたKaggle初心者向けにチュートリアルも兼ねて行われている「タイタニックの生存者予測」を行うコンペをKagglerたちはTitanicと呼んでます。
いきなりコンペに参加するのもいいですが、まずは肩慣らしとしてやってみようというものですね。Kaggleと言ったらまずはTitanicというぐらい有名な題材みたいです。
何をする?
実際のTitanicの乗客リストに生死についての情報が追記されている学習用データ(train.csv)を与えられます。このデータで機械学習を行い、コンペ提出用の生死がわからない(実際には答えがあるが提供されていない)テストデータ(test.csv)について生存者予測を行いどれぐらい正答率が高いかを競うコンペです。
Competitionへの参加
コンペへの参加方法からデータセットの設定までを知りたい方はリンクを参照してください。
データを視る
前回は、特に何も考えずデータを補修してニューラルネットワークにかけました。その結果0.55023
という何とも情けない結果になりました。多分勘の鋭い人にも負けるレベルでした。もうちょっと精度を上げるために説明変数の的を絞ろうとデータを可視化していこうと思います。
何を使うのか?
Pythonチャートを描く場合の定番は「matplotlib」です。プログラムの書き方などは、別の記事で簡単にご紹介をしていますのでmatplotlibから見ていただければと思います。
ただ、matplotlibは一枚ずつグラフを描画するにはいろんな設定ができたりで便利ですが、一連のデータセットをイイ感じに描画するためにはデータを抽出したり、グラフを並べたりなど結構手間が必要になります。そこで、今回はより簡単にデータアナライズに適した形で描画してくれるラッパー的存在である「Seaborn」を使ってみたいと思います。
事前準備
事前準備としてライブラリのインポートを行います。今回もKaggleのKernelでJupyterを使ってます。
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import os %matplotlib inline
データを確認する
まずは、どんなデータが入っているのかを確認します。
# Reading file train_base = pd.read_csv("../input/train.csv") test_base = pd.read_csv("../input/test.csv") train.head()
次に欠損値がないかどうかを確認します。
# check missing rate for Train data null_count = train_base.isnull().sum() null_rate = null_count / len(train_base) null_table = pd.DataFrame({ 'null_couunt': null_count, 'null_rate': null_rate }) print(null_table.sort_values(by='null_rate', ascending=False))
あとは、それぞれのデータの型を調べておきます。
train_base.dtypes
【pairplot
】欠損,文字列以外で相関図を視る
データセットの各変数同士の相関分析を簡単に実施できる関数としてpairplot
があります。まずは、これで何か相関を見つけられないかやってみます。
sns.pairplot(train_base[["Survived", "Pclass", "SibSp", "Parch", "Age", "Fare"]]) plt.show()
さすがに、何が何だかわからないので色分けします。hue=**
というキーワード引数に色分けしたいフィールドを書くとグループごとに色分けてくれます。とりあえずSurvived
で色分けしましょう。0が死亡で1が生存なので青が死亡、オレンジが生存となります。
sns.pairplot(train_base[["Survived", "Pclass", "SibSp", "Parch", "Age", "Fare"]], hue="Survived") plt.show()
私は統計学のエキスパートではないのでこれを見てもParch
のグラフを見るとParch
が0の人は生存率が高そう…かな?ぐらいであとはさっぱりです。
【factorplot
】性別と生存率を可視化する
一つずつ見ていくことにします。まずは性別と生存に相関があるかどうかを確認していきます。離散している変数と1つ以下の連続変数の分布を可視化するグラフで見てみるのが可視化にいいと思うので、factorplot
関数を使います。
s_s = sns.factorplot(x="Sex",y="Survived", data=train_base, kind="bar", size = 6 ) s_s = s_s.set_ylabels("survival prob") plt.show()
性別で見ると男性の生存率は結構低いことがわかりますね。レディーファーストだったのでしょうか?とにかく重要な特徴変数になりそうな気がします。
【countplot
】性別ごとの生存者数を可視化する
重要な要素になるかわかりませんが一応、性別と生存者数で分けてカウントしてみたいと思います。男性の生存率は低いことはわかりますが、乗客の男の数がめちゃくちゃ多くてカウントしてみると助かっている人数は同じかもしれませんし。あと、正直なところcountplot
関数を使ってみたかったというのもあります。
count_s = sns.countplot(x="Sex", hue="Survived", data=train_base) plt.show()
これを見ると絶対数的にも女性の方が多く助かっているんですね。
【factorplot
】チケットクラスと生存率を可視化する
次にチケットクラス(飛行機で言うビジネスとかエコノミーのようなやつ)と生存に相関があるかどうかを確認してみます。こちらもfactorplot
関数を使います。
c_s = sns.factorplot(x="Pclass",y="Survived", data=train_base, kind="bar", size = 6 ) c_s = c_s.set_ylabels("survival prob") plt.show()
チケットクラスは1から順に高い等級になっているようなので、やはり1から順に生存率は下がっていますね。では、この情報に性別を組み合わせてみてみます。
c_s = sns.factorplot(x="Pclass",y="Survived", hue="Sex", data=train_base, kind="bar", size = 6 ) c_s = c_s.set_ylabels("survival prob") plt.show()
これを見るとチケットクラスが高くて女性であればかなりの生存率になっていることがわかりますね。
【factorplot
】同乗した兄弟や配偶者の数と生存率を可視化する
さらに同乗した兄弟や配偶者の数と生存に相関があるかどうかを確認してみます。こちらもfactorplot
関数を使います。
sib_s = sns.factorplot(x="SibSp",y="Survived", data=train_base, kind="bar", size = 6 ) sib_s = sib_s.set_ylabels("survival prob") plt.show()
あまり大家族だと生存率は高くないようです。救命ボートに全員で乗りたいが空きがなかったとかが原因なのでしょうか?
ちなみに、Parch
が同乗している親や子供の数なのですが、似たような感じになったので割愛します。
【FacetGrid
】年齢と生存率を可視化する
次は年齢と生存率です。年齢は今までみたいに離散的に数値が分かれていないのでfactorplot
ではうまく可視化できません(してもなにがなんだかわからないが正確かな)。よって、別の方法で確認します。
FacetGrid
関数は、データセットのグループ化できるフィールドで分けてグループごとにグラフを描画してくれるものです。これを使います。
Fg = sns.FacetGrid(train_base, col='Survived') Fg = Fg.map(sns.distplot, "Age")
個人的にはちょっと見づらいので性別で分けて生死で色分けした形で再度描画します。
Fg = sns.FacetGrid(train, col='Sex', hue="Survived") Fg = Fg.map(sns.distplot, "Age").add_legend()
ここから言えることは女性だけでなく子供が結構助かっているようですね。前項以前で女性が多かったのも子供とその母親がセットで助かったというのもあるかもしれません。
結果
色々可視化してみて性別はかなり重要そうであることと家族がいて幼い子供がいる母親は生存率が高いことがわかりました。男である場合はチケットのクラスに依存して生存率が変わってくる。年齢をヒストグラムで表示したことでレンジ分けした方が良い結果が出そうな気がしました。
そのあたりを踏まえて欠損したデータの埋め方と家族がいることなどをうまくデータをクレンジングすることでわかるようにしてあげる必要そうなので、次はどうやってデータをクレンジングしていくかを書いていきます。