www.crosshyou.info

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

Kaggle の Titanic の Competition に参加してみました。正解率は 71.77% でした。

今回は、Kaggle の Titanic の Competition に参加してみたので、その報告です。

f:id:cross_hyou:20181222103105j:plain

https://www.kaggle.com/c/titanic

とうもので、簡単に言うと、タイタニック号の乗客のデータを使って誰が生存して、誰が死亡したかを判別するというものですね。

マシンラーニングとか高度なテクニックは、私はまだ無いので、簡単なカイ二乗検定を応用して判別式を作ってみました。

それでは、具体的にどのようにしたかを報告します。

まずは、訓練用のデータファイルを読み込んで、R言語に読込ませます。summary関数でどんなデータがあるかを確認しました。

f:id:cross_hyou:20181222103623j:plain

1番目の変数:PassengerId は乗客番号ですね。最大値が 891 ですから、891人のデータです。
2番目の変数:Survivedというのが、生存=1, 死亡=0 となっていて平均値が 0.3838 となっているので、生存率は 38% とわかります。

Survived をもう少し細かくみてみましょう。まず、str関数でデータ型を確認し、そのあとに、hist関数でヒストグラム、plot関数とdensity関数でカーネル密度グラフ、plot関数とsort関数で小さい順グラフ(この小さい順グラフって正式にはなんて言うのでしょうか?)を描いてみます。

f:id:cross_hyou:20181222104237j:plain

 

データ型は、int(整数)ですね。

hist関数でヒストグラムを描きます。

f:id:cross_hyou:20181222104409j:plain

f:id:cross_hyou:20181222104422j:plain

0 と 1 に分かれています。カーネル密度グラフはどうでしょうか?

f:id:cross_hyou:20181222104547j:plain

 

f:id:cross_hyou:20181222104558j:plain

 

山が 0 と 1 のところに2つあります。小さい順グラフを描きます。

f:id:cross_hyou:20181222104809j:plain

f:id:cross_hyou:20181222104829j:plain


0 と 1 の値しかないことが確認できます。なので、データ型を factor型に変換して、0 を dead, 1 を arrive と名付けます。

f:id:cross_hyou:20181222105026j:plain

次に、Pclass のデータ型を str関数を使って確認します。

f:id:cross_hyou:20181222105228j:plain

整数ですね。三つのグラフで様子を視覚化しましょう。

f:id:cross_hyou:20181222105356j:plain

f:id:cross_hyou:20181222105408j:plain

f:id:cross_hyou:20181222105507j:plain

f:id:cross_hyou:20181222105521j:plain

f:id:cross_hyou:20181222105616j:plain

f:id:cross_hyou:20181222105627j:plain

Pclass は 1, 2, 3 の3つの値しかとらず、3 が一番多いことがわかりました。そこで、Pclass を 3 と non-3 の2つのグループの factor に変換します。

f:id:cross_hyou:20181222105852j:plain

3 が 491人、non-3 が400人です。

Name のデータ型を確認します。

f:id:cross_hyou:20181222110037j:plain

Name は乗客の名前ですよね。データ型は factor で level が 891 もあります。これは分析に使わないと判断しました。

Sex を調べましょう。

f:id:cross_hyou:20181222110332j:plain

Sex は factor で、female が314人、male が577人です。

Age を調べます。

f:id:cross_hyou:20181222110520j:plain

Age は number型ですね。年齢ですからね。int(整数)でないのが以外です。ヒストグラムカーネル密度グラフ、小さい順グラフを描きます。

f:id:cross_hyou:20181222110920j:plain

f:id:cross_hyou:20181222111011j:plain

f:id:cross_hyou:20181222110932j:plain

f:id:cross_hyou:20181222111032j:plain

f:id:cross_hyou:20181222111048j:plain

f:id:cross_hyou:20181222111105j:plain

abline(h = 16) というコマンドを追加して、16歳 の水準に水平線を入れてみました。ちょうどこの年齢ぐらいから曲線の傾きが変わっています。そこで、年齢を16歳以下と16歳より上の2つのグループにわけました。数値データを factor にするには、cut関数を使います。

f:id:cross_hyou:20181222111422j:plain

NA, 年齢が分からない乗客が 177人いたのですね。

SibSpを調べます。これは、兄弟姉妹、配偶者の人数です。

f:id:cross_hyou:20181222111738j:plain

データ型は int(整数) です。ヒストグラムカーネル密度グラフ、小さい順グラフの基本3グラフでデータの散らばり具合を見てみましょう。

f:id:cross_hyou:20181222112009j:plain

f:id:cross_hyou:20181222112019j:plain

0 の人がほとんどのようです。

f:id:cross_hyou:20181222112132j:plain

f:id:cross_hyou:20181222112143j:plain

f:id:cross_hyou:20181222112241j:plain

f:id:cross_hyou:20181222112252j:plain

SibSp は大半が 0 だとわかりましたので、0 か 0 でないかの2つのファクターに変換します。

f:id:cross_hyou:20181222112442j:plain

0 が 608人、0 でないのが 283人です。

Parchを調べましょう。これは子供、両親の人数です。

f:id:cross_hyou:20181222112736j:plain

整数型ですね。基本3グラフでデータを視覚化します。

f:id:cross_hyou:20181222112904j:plain

f:id:cross_hyou:20181222112918j:plain

f:id:cross_hyou:20181222113024j:plain

f:id:cross_hyou:20181222113036j:plain

f:id:cross_hyou:20181222113128j:plain

f:id:cross_hyou:20181222113140j:plain

大半の人が 0 ですね。この Parch も 0 か 0 でないかの2つのファクターにします。

f:id:cross_hyou:20181222113352j:plain

0 の人は 678人です。

Ticket を調べましょう。str関数でデータ型を確認します。

f:id:cross_hyou:20181222113517j:plain

データ型は factor で、level が 681 もあります。これも分析には使わないことにします。

Fare, 料金はどうでしょうか?

f:id:cross_hyou:20181222113659j:plain

データ型は number ですね。基本3グラフで視覚化します。

f:id:cross_hyou:20181222113817j:plain

f:id:cross_hyou:20181222113828j:plain

f:id:cross_hyou:20181222113933j:plain

f:id:cross_hyou:20181222113947j:plain

f:id:cross_hyou:20181222114055j:plain

f:id:cross_hyou:20181222114107j:plain

abline関数で 50 の水準に水平線を引きました。ほとんどが 50 以下の運賃だとわかります。なので、50以下、50より大きいの2つのファクターに変換します。

f:id:cross_hyou:20181222114259j:plain

50より高い運賃の人は160人です。

Cabin はどんな感じでしょうか?

f:id:cross_hyou:20181222114427j:plain

Cabin は factor で 148もレベルがあります。手に負えないので、分析には使わないことにします。

最後の変数は、Embarked です。寄港地という意味だと思います。

f:id:cross_hyou:20181222114832j:plain

大半が S です。なので、S と S以外の2つのグループに二分します。

f:id:cross_hyou:20181222115001j:plain

以上で各変数の様子がわかり、分析に使う変数は2つのファクターに変換しました。

次のステップは Survived と各変数のクロス表をカイ自乗検定し、関連性があれば、標準化残差を計算しましょう。

まずは、Pclass です。

f:id:cross_hyou:20181222115624j:plain


p-value < 2.2e-16 < 0.05 なので、Pclass は Survived に関連しています。具体的には non-3 だと生存に有利です。3 は3等客ですから、1等客と2等客が生存確率が高いということです。。現実を感じます。3等客でない場合は、9.62点を付与しましょう。

次は、Sex です。

f:id:cross_hyou:20181222120011j:plain

p-value < 2.2e-16 < 0.05 ですから、Sex は Survived と関連があります。femail, つまり女性のほうが生存しやすいです。女性には、16.2点を付与しましょう。

次は、Age です。

f:id:cross_hyou:20181222120226j:plain

p-value < 0.0023 ですから、年齢も生死に関連あります。子供だと生存する確率が高いですね。子供、16歳以下には 3.16点を付与しましょう。

次は、SibSp, 兄弟姉妹・配偶者です。

f:id:cross_hyou:20181222120521j:plain

p-value < 0.0007128 なので SibSp もSurvived と関連あります。0 でないほうが有利です。SibSp が 0 でない乗客に 3.46点を付与しましょう。

次は、Parch です。

f:id:cross_hyou:20181222120814j:plain

p-value < 1.565e-05 ですから 0.05 より小さく、Parch は Survived と関連があります。non-zero のほうが生存に有利です。non-zero の乗客に 4.40点を付与しましょう。

SibSp, Parch ともに 0 でないと生存に有利でした。家族と一緒に乗ってた乗客のほうが生存に有利だったということですね。家族で助け合って避難したのでしょうね。

次は、Fare です。

f:id:cross_hyou:20181222121202j:plain

p-value < 2.2e-16 ですので Fare と Survived は関連があり、運賃が高いほうが生存率が高くなります。運賃が高い乗客は、1等、2等の乗客でしょうからね。50ドル以上の運賃の乗客に 8.54点を付与することにします。

最後は Embarked です。

f:id:cross_hyou:20181222121501j:plain

p-value = 4.89e-06 ですから Embarked と Survived は関連がありました。S でないと生存に有利でした。S でない乗客に 4.65点を付与することにしましょう。

まとめると、

Pclass は non-3 が 9.62点
Sex は female が 16.2点
Age は child(16歳以下)が 3.16点
SibSp は non-zero が 3.46点
Parch は non-zero が 4.40点
Fare は high が 8.54点
Embarked は non-S が 4.65点

という加点方法です。この加点方法に基づいて各乗客に点数を付与して、総合得点、Score を計算してみます。

f:id:cross_hyou:20181222122040j:plain

総合得点、 Score は最小が 0.00, 最大が 46.87, 中央値が 12.51, 平均値が 15.36 です。基本3グラフで Score のバラツキ具合を視覚化しましょう。

f:id:cross_hyou:20181222122213j:plain

f:id:cross_hyou:20181222122321j:plain

f:id:cross_hyou:20181222122509j:plain

f:id:cross_hyou:20181222122521j:plain

f:id:cross_hyou:20181222122625j:plain

f:id:cross_hyou:20181222122636j:plain

Survived と Score の関係を plot関数で視覚化しましょう。

f:id:cross_hyou:20181222122803j:plain

f:id:cross_hyou:20181222122817j:plain

Dead と Alive で箱ひげ図が描かれます。15.9点ぐらいで Dead の第3分位、Alive の第1分位が分かれるようなので、15.9以下なら死亡、それより高い点数ならば生存を判断しました。

こうして Score を test.csv ファイルのデータを使って計算して Kaggle に submit します。結果は、、

f:id:cross_hyou:20181222125408j:plain

Score が 0.71770 ということで、正解率が 71.77% だったということです。

これは、

f:id:cross_hyou:20181222125756j:plain

10100 / 10858 ということですので、全然ダメですね。。。

Age や Fare などの連続数値を強引に2つのグループにしたり、SibSp, Parch, Embarked など 2つ以上の値をとるものも2つのグループにしたり、変数どうしの相互作用を考慮していなかったりなどと改善の余地はまだまだ多くあります。

ランダムフォレストやその他の手法をマスターしたら、再度チャレンジしたいと思います。

今回の分析を通じて、女性や子ども、1等客、2等客、家族がいる者などの生存率が高いことがわかりました。そして、映画、タイタニックをまたみようかな、と思いました。

 

 

 次回は

 

www.crosshyou.info

 

です。