Southamptonです。Southamptonから乗った人の割合が最も多いことが分かります。過半数が労働階級です。平民階級と上流階級の人数にそれほど差異はありませんが、若干上流階級の方が多い比率になっています。客室について客室については欠損値が多く、部屋番号はそれぞれ異なる事から、データを可視化することは非常に困難です。その背景を調べることは重要でしょう。こちらのフランス語のサイトに、詳細な船内の見取り図が添付されています。ここから推測できることを幾つか挙げておきます。・デッキに救命ボートが18個設置されている。(船の定員は65名とされている)・A,B,Cとアルファベットが振られているが、これは船の階層を表している。Aが船の上の階で、Gが船の下の階である。Gの階層はエレベータが設置されていないタイタニック号が氷山に衝突したのは船の右側なので、船の右側から下の層または船尾へと水が入り込みます。よって下の階層の部屋番号が奇数の人が生存に不利であることが予想されます。各データにおける生存率の洗い出しそれぞれのデータについて可視化してきましたが、これらがどのように生存率に関わってくるのかが重要です。性別における生存率を調査します。基本的に女性優先で救助されたはずなので、女性の生存率の方が高いはずです。"%"少し冗長ですが関数を組んでみました。それぞれの値を確認します。生存数:342人38.38383838383838%このように女性の生存率の方が高い事が確認できました。上流階級ほど優先的に救助されるので、上流階級の方が助かる確率が高いことが予想されます。"%"同様に出力を見てみましょう。生存数:119人24.236252545824847%上流階級になるほど、生存率が高くなることが確認できました。子供の方が優先的に救助されるので、成人していない年齢の人程助かる確率が高いと予想されます。"%"今回の関数は最小値と最大値を任意に設定できる様に関数を実装しました。詳細なデータを見ていきましょう。率のみを簡易に確認するために、一部関数をコメントアウトしておきます。80))結果は以下の様になります。10歳における生存率がほぼ60%と、他の階級に比べて生存率が高い事が確認できました。5歳における生存率:70.45454545454545%特に乳幼児の生存率がかなり高いです。その他の項目について名前の名称によって家族を推測したりする方法もあるみたいですが、今回は割愛します。スポンサードリンク欠損値の対応さて、色々と視覚化、数値化できた所で本題に入ります。欠損値の処理についてです。欠損値があることで・作業効率が低下する・データ分析作業やデータ加工作業が複雑になる・結果にバイアスが生じる事を理解しておく必要があります。欠損値の対応をしていく前に、欠損メカニズムの理解が必要です。欠損値には3つのタイプがあります。Random)と呼びます。MCARの場合MCARは完全に独立してランダムに欠損しているので、どのような処理を施しても母集団への推定に全く影響しません。よってよく使われるのは「ペアワイズ削除」や「リストワイズ削除」です。欠損が多い時にこの手法を使うのは勿体無いと言われます。本来であればデータを測定しているので、削除すると単純に精度が落ちてしまうからです。欠損値に何を代入すれば良いのでしょうか。平均値などの単一の値を代入した場合、推定値にバイアスが掛かります。ここは様々な要素を考慮しつつ、代入する値は要検討です。MARの場合MARの場合、リストワイズ削除でも推定値にバイアスが生じます。いうのも一部欠損した人の、欠損していないデータ(観測データ)と関連があるため、そのデータを削除してしまうと特定の傾向を持つデータがなくなってしまうからです。推定に必要なデータを無駄に削除してしまうので精度が落ちてしまいます。この対処法としては・観測データ全てを用いた推定方法で欠損値を埋める・多重代入による推定を行うとして解決します。基本的には「最尤法」と呼ばれる推定方法を使うと精度の良い推定結果が得られる様です。MNARの場合MNARの場合、有効な対処法はありません。(ガーン)欠損値の補完これらを踏まえて、(やっと)データの処理をしていきます。必要なモジュールのインポートまず始めに必要なモジュールのインポートを済ませておきます。inlineデータの読み込み必要なデータセットを読み込んでおきます(test.csvとtrain.csvをファイルと同じ階層に置いておきます)。pd.read_csv("test.csv")AgeAgeの欠損値を穴埋めします。何で穴埋めするかが非常に重要です。前回は「全体の乗船客の年齢の観測値の平均」すなわち「全体からの平均」で穴埋めしましたが今回はより細かく分析していきます。英語圏では、敬称によってある程度年齢が推測できるという事が直感的に分かります。未婚か」で呼称が分割されているからです。この情報を元に、それぞれの敬称のデータの年齢の平均値を算出し、欠損値を補完します。train[train['Name'].str.contains('Dr\.')].Age.mean()CabinCabinの欠損値を補完します。データの欠損率が高いのでカラム自体を削除して機械学習には考慮しないという選択肢もあったのですが、今回は「救命ボートと部屋の物理的な距離」が生存率に大きく影響を与えると見て考慮することにします。タイタニック号は上から順にA,B,C,...とデッキ番号が付いています。Cabinのアルファベットは恐らくデッキ階層を示しているので、トレーニングデータから上層階級の人はタイタニック号の上部、下層階級の人はタイタニック号の底部に集まっていることが分かります。上の表は観測値から算出したデータとなっています。Pclass2,3を合体させているのは、1Pclass2,3でデッキ階層が殆ど被っているという理由から、そして2サンプル数を多くしてデータの信頼性を上げる為です。欠損値を埋める方法として、Pclassにおけるデッキ階層の割合を用いて計算する手法を採用します。この割合でデッキ階層のアルファベットをランダムに返す関数を作成します。'G'これを用いて欠損値を補完します。cabin_select_low()さらに、機械学習で扱いやすいようにこのデータを数値に変換します。7ちなみにこのコードでは「Cabin_replaced」というカラムを新しく作成して、そこにデータを格納しています。その他のデータについて欠損値以外にもその他のカラムについて注目し、データを整形していきます。この工程もスコアに響いてきます。性別の数値変換タイタニック号が沈没した当時は、女性が優先されて救出されたという背景があります。上のグラフを見ると確かに、男性は死亡率の方が高く、女性は生存率の方が高いです。性別では機械学習しやすいように、文字列データを数値データに変換します。1maleが0、femaleが1としています。Parchの合計数を代入した「Family」という新しいカラムを作成し、データを分析してみます。ご覧の通り、1人の時(x軸が0の時)に死亡率が比較的高く、また5人(x軸が4の時)以上になっても死亡率が比較的高い事がこのグラフから分かります。[4-]の3グループ(生存比率が類似しているグループ)に分けてデータを整形していきます。低賃金の乗客が殆どであり、これもFamily同様に類似した生存比率に応じて3グループに分割していきます。2必要ないカラムを削除するさて、ここまでできたら必要ないカラムを削除します。axis=1)この時点で(トレーニング)データセットはこのようになっているはずです。ここまでできたら、トレーニングデータについてのデータ整形はおしまいです。テストデータに対して同様の処理を行う上と同様、テストデータにも同じ処理を施します。axis=1)機械学習させる終盤です。今回も前回同様決定木で予測モデルを作成します。このアルゴリズムが最適かどうかと言われればそうでは無いですが、決定木はアルゴリズムが分かりやすく、視覚化した時に何のデータが影響を与えているのかが分かり、その後のデータのチューニングがしやすいので決定木を選択しました。'Family']].values次に、決定木を作成し学習させます。tree.DecisionTreeClassifier(max_depth=4)#fit()で学習させる。target)これを用いてテストデータに予測モデルを適応させます。以下のデータが確認できます。1]この出力をkaggle用に変換させます。["PassengerId"])kaggleでスコアを確認する先ほど出力した「output.csv」をkaggleに提出し、スコアリングしてみます!ドキドキ...おお!前回より割とスコアが上がりました(0.79425)!!しかし80%は超えず...まとめ今回はデータからわかる事以外の要素も考慮して色々データを弄ってみました。結果的にスコアが上がったのですが、複雑な処理をした割には80%は超えずという結果になってしまいました。シンプルな方法でスコアを上げる方法もあると思いますので、各々今回の例を参考にしつつ、独自のデータ選定や整形、欠損値の補完を行い、適した予測モデルで機械学習を行ってみてください。タイタニック号の問題は機械学習初学者にとって非常に勉強になるので、チャレンジした事無い人は是非やってみては如何でしょうか?ちなみに決定木は以下のようになりました。実際にタイタニック号のデータの分析は、機械学習ではよく入門用として使われており、複数のWebページでも入門編として解説がなされています(例1、例2)。いまでは高校の情報の授業でもカバーしている学校もあるそうです。入門にうってつけなのですが、それでも以下のような内容を表面的にでも理解していないと、自力ではデータを読み込んで動かしてみることすらままないんだなぁと感じ、確かに初心者だとハードル高いなと思いました。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。【Rails5】RailsのAPIモードでアプリを作成し、実際に動かしてみよう!【機械学習入門】kaggleでタイタニック号の生存者予測RECOMMENDこちらの記事も人気です。(TECH::CAMP)の無料説明会に行ったら衝撃の事実が発覚した件について【2019年最新】テックキャンプ(TECH::CAMP)の評判と料金、概要まとめ。実際の最新情報を解説します。