初心者がデータ分析コンペにチャレンジしてみた!【SIGNATE】【タイタニック号の生存予測】

コンペ

こんにちは、しゃおろんです。

SIGNATEというサイトで開催されているデータ分析コンペに参加しましたので、そのレポートをしたいと思います。

順位は35/117位(2019/03/10 時点)で、自分の中ではかなり上手くできました。

 

・データ分析コンペに参加してみたいけど、何から始めたらよいか分からない

・データ分析コンペってどんなものなのか、イメージを掴みたい

という方は是非参考にしてみてください。

※注意

  • 主は勉強を始めたばかりの初心者です。考え方など間違っている部分があると思います。もし気づいた方はコメントにて指摘いただけると助かります。
  • 機密情報保持の観点から、提供された生データは記載していません。(グラフ等で実際の数値は分からない形にしています。)
  • コードは全て記載しているわけではありません。

 

テーマの確認

今回参加したのは「タイタニック号の生存予測」です。

【練習問題】タイタニックの生存予測

有名な話なので多くの方はご存知かと思いますが、タイタニック号というのは20世紀に実在した豪華客船であり、航海中に氷山に接触し沈没してしまいました。

 

今回の分析課題は、乗客の情報(性別、年齢、客室のランク、etc…)からその人が生存する確率を予測するというものです。

練習問題と書いてある通り、賞金が出るような問題ではなくデータ分析を体感してみたいという人向けに作られた問題となっています。

 

データは「学習用データ」「評価用データ」「応募用サンプルファイル」の3つが用意されています。

  • 学習用データ:モデルを学習させるために使用するデータ(乗客の情報と、生存したかどうかが記載)
  • 評価用データ:実際に予測をするために使用するデータ(乗客の情報のみ記載)
  • 応募用ファイル:予測した値を記載するためのファイル

 

分析に使う環境とモデル

今回の分析で使用する環境及びモデルは以下です。

言語:Python

実行環境:JupyterNotebook

モデル:ロジスティック回帰

今回は生存確率を予測する問題なので、確率を扱うロジスティック回帰を選択しました。(というより、ロジスティック回帰をコンペで使ってみたいのでこの問題にチャレンジしてみました)

 

JupyterNotebookって何という方は、以下のUdemy講座で環境構築から解説されているので参考にされるとよいと思います。(セール時がおすすめです。)

【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 初級編 –

 

データ読み込み~確認

まず最初に必要なライブラリをインストールします

 

サイトからダウンロードしたデータを読み込みます。

 

きちんと読み込めているかどうかは、head関数で確認します。

 

生データは見せられないのですが、項目は以下の通りです。

survivedが生存したかどうかを表す目的変数で、今回の確率を予測する上で教師となるデータになります。

それ以外が説明変数の候補となるデータで、年齢や性別といった基本的な情報から運賃や乗船した港など様々な項目があることが分かります。

 

仮説を立てる

データを見て雰囲気は掴めたので、次に仮説を立てていきます。

ここでいう仮説とは、「xxという説明変数が、目的変数に正(or負)の影響を与えているのではないか」ということを指します。

ただ闇雲に分析にかけるよりもこうしたほうが結果の解釈をしやすいし、何か分析結果がおかしい時に気が付きやすいと思うので、私の場合は仮説を立てるようにしています。

 

私の場合は、以下のような仮説を立てました。

  1. 客室のクラスによって生存率が変わるのではないか(非常口に遠いところが生存率が低いとか、高級クラスは密度が低いので逃げやすいとか)
  2. 男性の方が体力があるので逃げやすいのではないか(もしくは、レディーファーストで女性を助けたら反対の結果になるかも)
  3. 年齢は中心付近が生存率が高いのではないか(子供と高齢者は体力がないため)
  4. 子供や両親が乗船していると、生存率が低くなるのではないか(気になるため)
  5. 兄弟や配偶者も同様で、見捨てられない人がいると生存率が低くなるのではないか
  6. 運賃が高い=高級クラス = 生存率が高いという関係があるのではないか
  7. 乗船した港によって、乗る位置が変わるのであれば生存率には影響があるのではないか

 

仮説を検証する(データの基礎分析)

仮説を立てたので、仮説を確かめるためにデータの基礎分析を行います。

 

最初に、客室のクラスと生存率の関係を調べます。

客室のクラスと生存確率はともにカテゴリーデータ(質的変数)であるため、クロス集計を行って傾向を探ります。

結果を見ると、明らかに客室のクラス(pclass)ごとに生存率が違います。1の場合は死亡より生存がおおいですが、3の場合は生存の方が遥かに少ないです。

値が小さいほどが高級な客室なので、端的に言うと金持ちが生き残るというある意味残酷な結果になっています。金持ちの方が生き残ったのは、乗務員が優先的に助けようとしたのか、それとも客室の位置等の関係なのか、興味があるところです。

 

次に、性別と生存率の関係についてみてみましょう。

すごい極端な結果が出ています。私が当初立てた仮設とは真逆の結果になっていて驚いたのですが、女性の方がはるかに生存率が高いです。男性が20%程度の生存率に対して、女性は80%近い生存率となっています。

体力的には男性が有利であることを考えると、やはりレディファーストの考えで女性を先に脱出させようとしたのでしょうか。こういう数字を見ると、何だか感傷的な気分になってしまいますね。

 

 

こんな感じで他の変数についても分析を行っていきました。

それぞれの結果を見た上で、以下を説明変数として取り込んで分析することにしました。

・部屋のクラス
・女性ダミー
・年齢
・乗船していた両親、子供の数
・運賃
・乗船した港 ダミー

※ダミーというのは、ダミー変数という意味です。カテゴリデータを変数として使用するときによく使う手法です。

元のデータにあった変数で、唯一「乗船していた兄弟、配偶者の数」は変数として入れませんでした。(傾向が分かりづらかったため)

 

変数も決まったので早速分析と行きたいところですが、もう少し前処理や確認を行っていきます。

 

欠損値の処理

分析にかける前に、欠損値があるかを確認しなければいけません。

info関数を使って調べます。

↓実行結果

ageの欄を見ると分かりますが、データの総数が360となっており、他のデータよりも90個ほど少なくなっています。実際にageの値を見ると「NaN」と表記されているものがいくつかあり、欠損値があることが分かりました。

 

今回は、欠損値を含む行は削除する形で対応しました。

 

多重共線性の確認

次に、多重共線性の確認をします。

多重共線性とは:説明変数同士に強い相関があるときに起こる現象のこと。多重共線性が発生してしまうと分析結果が信用できないものになってしまう。(個々の変数のパラメーターを過小or過大評価してしまう)

 

最初に候補となる変数を取得します。

 

取得できたら、多重共線性の確認をします。(説明変数同士の相関を調べます)

あまり高い数値は出ていないのですが、「pclass(客室のクラス)」と「fare(運賃)」が-0.56と比較的相関が強い結果となりました。

念のため、「fare」を外して分析を行いました。(pclassの方が事前の分析で生存率に関係ありそうだったので、残しました。)

 

モデルの構築~検証

前処理が終わったので、実際にモデルの構築に移っていきます。

 

目的変数をyに代入します。

 

学習用のデータを、訓練データと検証データに分割します。

 

モデルを作成します。

 

検証データを使って、決定係数(モデルの当てはまり具合)を確認してみます。

悪くない数値が出ていますね。

 

訓練データでも試してみましたが、こちらも高い数値が出ています。過学習を起こしている可能性は低いのではないでしょうか。

※訓練データの決定係数に対して検証データの決定係数が著しく低いと、モデルの予測性能が低い可能性が高くなります。このような状態を過学習(オーバーフィッティング)と言います。

 

人により判断基準は様々かと思いますが、私はモデルの性能に問題はないと判断しました。

 

予測値の算出~ファイル出力

モデルが作成できたので、次は予測値の算出です。評価用データにある情報をもとに、それぞれの生存確率を算出します。

 

前処理として、評価用データを加工します。

学習用データと同じく age(年齢)データに欠損値があったので、平均値を代入する形で処理します。

 

予測値を算出し、提出用ファイルに書き込みます。

predには「生存できる確率」と「生存できない確率」が格納されているので、生存できる確率の方を取り出して書き込むように注意してください。

 

提出するにはTSVファイル形式でないといけないのですが、CSVファイル形式での出力方法しか分からなかったので、いったんCSVで出力しています。(後でツールを使って変換しました。)

 

いざ提出!結果は…

出力したファイルを、サイトから提出します。

結果は、35位(117人中)でした!(2019/3/10現在)

想像よりもかなりいい順位で、びっくりしました。過去に取り組んだコンペでは下位30%を抜け出せなかったので、一気にジャンプアップできてすごく嬉しいです。

 

まとめ

いかがでしたでしょうか。

初心者なりに頑張って分析してみました。

正直改善できる余地はたくさんあると思うので、「もっとこうしたほうがいいよ!」というアドバイスやアイデアなどあればコメントに書いてくださると嬉しいです。

以上、しゃおろんでした。

コメント

タイトルとURLをコピーしました