{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"markdown","source":"## このカーネルについて\n\n2019/01開催[Kaggleタイタニックハンズオン（サポーターズ勉強会）](https://supporterzcolab.com/event/677/)用のkernelです。  \nハンズオンパートで使います\n\n1. まず一緒に一回やってkernelの操作に慣れる\n2. もくもくタイムで各自試行錯誤（コード片を組み合わせる）"},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","collapsed":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"markdown","source":"## 基本操作\n\nコードが書かれているブロックを **セル** と呼びます。  \n\n1. セルをクリックして選択する（入力できる状態になる）\n2. 選択したセルを実行する\n    - 入力できる状態でShift+Enterキーを押す（こちらに慣れると簡単です）\n    - 左側に表示される再生ボタン▶をクリック"},{"metadata":{"_uuid":"e61a21e29e422d59c393565c5424ab05d5a131db"},"cell_type":"markdown","source":"## このカーネルでやること\n\n1. 学習用データから乗客の生存／死亡を予測するモデルを作る\n    1. 前処理\n    2. モデル作成\n    3. 性能確認\n2. 1で作ったモデルでテスト用データについて予測する（その後、Kaggleに提出する）"},{"metadata":{"_uuid":"bdfaa2b5d850f3353eced7993c025acdd8602c83"},"cell_type":"markdown","source":"## 1-A. 前処理\n\n1. 欠損値\n1. カテゴリ変数\n1. 不要な列を削除"},{"metadata":{"trusted":true,"_uuid":"1cfc40de1ea79f50218d9ad0c978c51594353d01"},"cell_type":"code","source":"# 前処理に必要なモジュールの読み込み\nimport numpy as np\nimport pandas as pd\n# 可視化に必要なモジュールの読み込み\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"15f58440178d2240f490af07ecb4ae57d26100fa"},"cell_type":"markdown","source":"タイタニックコンペでは以下のフォルダ配置となる。これを踏まえて、相対パスでデータを指定する\n\n- ┣ 現在のkernel\n- ┗ input/\n    - ┣ train.csv（学習用データ）\n    - ┣ test.csv（テスト用データ）\n    - ┗ gender_submission.csv（提出練習用データ）"},{"metadata":{"trusted":true,"_uuid":"c51e5fd74bfa4eeb84c1aadfebc8f059190fc596"},"cell_type":"code","source":"# 読み込んだデータはExcelの表のような形式で扱う（行と列がある）\n# 学習用データの読み込み（生存か死亡か知っているデータ）\ntrain_df = pd.read_csv('../input/train.csv')\n# テスト用データの読み込み（生存か死亡か知らないデータ）\ntest_df = pd.read_csv('../input/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f98367e6902032fe3c05b240baceaa85cc8b59e4"},"cell_type":"markdown","source":"`read_csv`  \n解説: https://note.nkmk.me/python-pandas-read-csv-tsv/  \nドキュメント: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html"},{"metadata":{"trusted":true,"_uuid":"a8fce89b69183148bacdad4507f474af93900d01"},"cell_type":"code","source":"# 学習用データのサイズを確認\n# (行数, 列数) で表示される\ntrain_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"31250ea2947935237bcd038686dd3b52fa968c30"},"cell_type":"code","source":"# テスト用データのサイズを確認\n# 学習用データに対して1列少ない\ntest_df.shape","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e492a2390deb2451771e3e9ff856da8a672244ab"},"cell_type":"markdown","source":"`shape`  \nドキュメント: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.shape.html"},{"metadata":{"trusted":true,"_uuid":"0539904b0e0c8ad1f9be69de3288275ff8761e9d"},"cell_type":"code","source":"# 学習用データの上から5行を表示\n# 参考: train_df.head(7) # 上から7行表示\ntrain_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"396149f7b3382de0d4d8de5f21f04d8b2ade66a1"},"cell_type":"code","source":"# テスト用データの上から5行を表示\n# Survivedの列（生存か死亡かを表す）がないことが確認できる\ntest_df.head()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"0e55e984bbaa82fdbdee7c7244162aea0dd4803d"},"cell_type":"markdown","source":"`head`  \nドキュメント: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.head.html"},{"metadata":{"trusted":true,"_uuid":"8fee68e0970b6d1d8f8363fec7032694c05876e9"},"cell_type":"code","source":"# 学習用データの情報を確認\ntrain_df.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5313cd4db853ceb6f5e09e9bfb8a37df278f16a0"},"cell_type":"code","source":"# テスト用データの情報を確認\ntest_df.info()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9b86455b77dfbfdb8f5905e61a4227e37c914a3b"},"cell_type":"markdown","source":"`info`  \n解説: https://note.nkmk.me/python-pandas-len-shape-size/  \nドキュメント: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.info.html"},{"metadata":{"_uuid":"167716b1debadbf441c33bd89f478243130e1a38"},"cell_type":"markdown","source":"| infoによる情報 | 意味 |\n| ----|---- | \n| int | 整数 |\n| float | 浮動小数点数 |\n| object | 文字列 |"},{"metadata":{"_uuid":"e24224735ca20796ab15c84f5984cda34a107f53"},"cell_type":"markdown","source":"| データの情報 | 列名 |　意味 | モデル作成に使う | \n| ----- | ----- | ----- | ----- |\n| int | PassengerId | 乗客ID | |\n| int | Pclass | チケットの等級 (1, 2, 3) | ◯ |\n| int | SibSp | 同乗した兄弟姉妹/配偶者の人数 | ◯ |\n| int | Parch | 同乗した両親/子供の人数 | ◯ |\n| int | Survived | 0：死亡、1：生存 | 予測したい |\n| float | Age | 年齢（推測があるため、浮動小数点数） | ◯ |\n| float | Fare | 運賃 | ◯ |\n| object | Name | 氏名 | |\n| object | Sex | 性別 | ◯ |\n| object | Ticket | チケット番号 | |\n| object | Cabin | 船室番号　| |\n| object | Embarked | 乗船した港の頭文字(S, Q, C) | ◯ |\n\n**注**: モデル作成に使う列は、ハンズオン進行の都合により、こちらで決めました（本来はデータを分析してから決めます）  \nref: https://www.kaggle.com/c/titanic/data"},{"metadata":{"trusted":true,"_uuid":"d3de1be1c2d424e946be557575c3fc51a577ee5c"},"cell_type":"code","source":"# 学習データについて欠けたデータがある列を確認（infoの情報に、891よりも少ない数の列があった）\ntrain_df.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"24cb53ce65dbd52ccef2a9d92102f5233e0a4279"},"cell_type":"code","source":"# テスト用データについて欠けたデータがある列を確認\ntest_df.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4aee0885b58eb27f8dda60e788047a7d6639d94d"},"cell_type":"markdown","source":"`isnull().sum()`  \n参考: https://note.nkmk.me/python-pandas-nan-judge-count/"},{"metadata":{"_uuid":"4a5cca3fbad874c92e1912dd1f7d3531a0f899b9"},"cell_type":"markdown","source":"欠けたデータがある列\n\n| データ種別 | 列名 | 欠け具合 |\n| ----- | ----- | ----- |\n| 学習用・テスト用 | Age | 20%程度 |\n| 学習用 | Embarked | 数件 |\n| テスト用 | Fare | 数件 |\n| 学習用・テスト用 | Cabin | 78%程度 |"},{"metadata":{"_uuid":"6f6ce29051148dfdadc14814b43d8bf6a9d12f33"},"cell_type":"markdown","source":"- 欠けたデータ＝**欠損値**（missing value、欠測値とも呼ばれる）  \n- 欠損の要因：データの収集過程で抜けてしまったなど\n- 機械学習のツールは **一般に欠損値に対処できない**（そのためデータを前処理する）\n- 削除すると貴重なデータが減るので、**埋める**"},{"metadata":{"_uuid":"46f9342245cd114b8ea266e1b4041ea698875741"},"cell_type":"markdown","source":"### 1-A 1.欠損値を埋める\n\n- Age\n- Fare\n- Embarked\n\n注: Cabinは欠損が多いため、使わないという選択をしました（そのため埋めません）"},{"metadata":{"_uuid":"97a3d9f7ec887bd5d9890a2aec7d0240e1677d08"},"cell_type":"markdown","source":"埋めるのに使うデータ\n\n- Age: 学習用データの平均値（=年齢の総和/個数）\n- Fare: 学習用データの中央値（運賃を小さい順に並べて真ん中に来る値）\n- Embarked: 学習用データで一番多く登場する値（一番多くの人が乗っている港）"},{"metadata":{"trusted":true,"_uuid":"52d18c05598f55d0881aa7825c8d1adb46cae8ce"},"cell_type":"code","source":"# 学習用データの値を使って欠損を埋めるために使う値を表示\ntrain_df[['Age', 'Fare', 'Embarked']].describe([.5], 'all')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ac8752d938b72d257edbbfdb24c96e7104cf59dc"},"cell_type":"markdown","source":"- Age: 学習用データの平均値(mean) → 29.69... → 30歳で埋める\n- Fare: 学習用データの中央値（50%） → 14.4542\n- Embarked: 学習用データで一番多く登場する値（top） → S"},{"metadata":{"_uuid":"71e8b334833adfba13614f781ac8c61b69d72fef"},"cell_type":"markdown","source":"`describe`  \n参考: https://note.nkmk.me/python-pandas-describe/  \nドキュメント: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html"},{"metadata":{"trusted":true,"_uuid":"482cd50ce38eed1383eff601016a9780cb85a055"},"cell_type":"code","source":"# 参考: Ageの分布（欠損値を除いて描画）\nsns.distplot(train_df['Age'].dropna(), kde=False, bins=20)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f4277c9894fc583966fe71d3e876918d4bf8a979"},"cell_type":"code","source":"# 参考: Fareの分布\nsns.distplot(train_df['Fare'], kde=False, bins=50)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1e392cdb9284ead55663b4f96ff6364d05552768"},"cell_type":"code","source":"# Ageの欠損を平均値 30歳 で埋める\n# **Note**: モクモクタイムで他の埋め方を試す際は、このセルを置き換えます\ntrain_df['Age'] = train_df['Age'].fillna(30)\ntest_df['Age'] = test_df['Age'].fillna(30)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"825dcf1903d21d104df11497a71c0274b533d33d"},"cell_type":"code","source":"# Embarkedの欠損を、一番多い乗船港 S で埋める\ntrain_df['Embarked'] = train_df['Embarked'].fillna('S')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"423b580d23784f9312dad0e17bc6d853948c9d8e"},"cell_type":"code","source":"# Fareの欠損を 中央値 14.4542 で埋める\ntest_df['Fare'] = test_df['Fare'].fillna(14.4542)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b41dcdfdad508bb5c66c62861eae104c87ef3cb6"},"cell_type":"markdown","source":"`fillna`  \n参考: https://note.nkmk.me/python-pandas-nan-dropna-fillna/  \nドキュメント: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html"},{"metadata":{"trusted":true,"_uuid":"e6be4a7e4ab1dda2d633cd2777b2b45e56371ddc"},"cell_type":"code","source":"# 学習用データの欠損値が埋まったことを確認\ntrain_df.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cc7b658bc09beaf8fa1fc2ea0fa8ca058720c596"},"cell_type":"code","source":"# テスト用データの欠損値が埋まったことを確認\ntest_df.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"1e94db06aa65e16f583114bf512928a946445c4b"},"cell_type":"markdown","source":"### 1-A 2.カテゴリ変数を数値化する\n\n- Sex（male, female）\n- Embarked(S, Q, C)"},{"metadata":{"_uuid":"aaf0f66e132db42d17086c89d6eb083dcac5d0fa"},"cell_type":"markdown","source":"- カテゴリ変数とは、いくつかの文字列の値を取る変数\n    - Sex: male, female\n    - Embarked: S, Q, C　（乗船した港の頭文字）\n- 文字列を整数に変換する\n    - Sex: male=0, female=1として置き換え\n    - Embarked: ダミー変数化（後述）"},{"metadata":{"trusted":true,"_uuid":"95b3433b43833efb0683217f03d8bac661437124"},"cell_type":"code","source":"# カテゴリを整数に置き換えるための辞書を用意\ngender_map = {'female': 1, 'male': 0}\n# 引数の辞書のキーに一致する要素が、辞書の値に置き換わる（femaleが1に置き換わり、maleが0に置き換わる）\n# 注: Sexの取りうる値はfemaleかmale\ntrain_df['Sex'] = train_df['Sex'].map(gender_map)\ntest_df['Sex'] = test_df['Sex'].map(gender_map)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"fe3ce2c3f8fea59b861ffda21c900921975b2014"},"cell_type":"markdown","source":"`map`  \n参考: https://note.nkmk.me/python-pandas-map-replace/  \nドキュメント: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.map.html"},{"metadata":{"_uuid":"a9c09d0c92a076202a75212cbbb8adfe6448cb89"},"cell_type":"markdown","source":"Embarkedのダミー変数化について\n\n- S=1, Q=2, C=3と整数に置き換える\n    - **本来なかった大小関係が想定されてしまう**\n- (S, Q, C)という形式で整数に置き換える\n\n| Embarkedの値 | 置き換えたあと |\n| ----- | ----- |\n| S | (1, 0, 0) |\n| Q | (0, 1, 0) |\n| C | (0, 0, 1) |"},{"metadata":{"trusted":true,"_uuid":"ad483a345f9bda629b262fd57032c223caa13e4d"},"cell_type":"code","source":"# Embarked（S, Q, Cという3カテゴリ）をダミー変数にする\ntrain_df = pd.get_dummies(train_df, columns=['Embarked'])\ntest_df = pd.get_dummies(test_df, columns=['Embarked'])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ccf7610fcfbe42ec74414db5337a2f26420dd39d"},"cell_type":"markdown","source":"`get_dummies`  \n参考: https://note.nkmk.me/python-pandas-get-dummies/  \nドキュメント: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html"},{"metadata":{"_uuid":"e12668662f40a1903ff80faa2920918ffb5dd2a0"},"cell_type":"markdown","source":"### 1-A 3.不要な列を削除"},{"metadata":{"trusted":true,"_uuid":"0707d0e2e546d57e4c5ac737b4f100f99e52a72f"},"cell_type":"code","source":"# 取り除く列のリスト\nnot_use_columns = ['Name', 'Ticket', 'Cabin']\n# 学習用データから列を削除する（PassengerIdは後ほど取り除く）\ntrain_df.drop(not_use_columns, axis=1, inplace=True)\n# テスト用データから列を削除する\ntest_df.drop(not_use_columns, axis=1, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9e2f9ee52cb9088a6ad9f6857a2e46fd939b3e84"},"cell_type":"markdown","source":"`drop`  \n参考: https://note.nkmk.me/python-pandas-drop/  \nドキュメント: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html"},{"metadata":{"trusted":true,"_uuid":"7f74d6042e6a98f95c7886b3e8b3f089aed82f20"},"cell_type":"code","source":"# 前処理した学習用データの確認\ntrain_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ae4c0d70c4b4f639a5066dfa0d3488bd6ff31bf7"},"cell_type":"code","source":"# 前処理したテスト用データの確認\ntest_df.head()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ad9750cdad36be1b0569bbbf46d7e123fccef64d"},"cell_type":"markdown","source":"## 1-B. モデル作成\n\nモデルは学習用データにアルゴリズムを適用して作成する。  \n今回はアルゴリズムにロジスティック回帰を使う（後ほど変更も試せます）  \n\nドキュメント(ロジスティック関数): https://scikit-learn.org/stable/auto_examples/linear_model/plot_logistic.html"},{"metadata":{"trusted":true,"_uuid":"be0f79324212932276ad8066d59f3d9f77894fda"},"cell_type":"code","source":"# 慣例にのっとり、モデルが予測に使うデータをX, モデルが予測するデータをyとする\nX = train_df.drop(['PassengerId', 'Survived'], axis=1)\ny = train_df['Survived']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2fadac5efca744f9aab968d1b51ab7591cbed06f"},"cell_type":"code","source":"# モデル作成・性能評価に使うモジュールの読み込み\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.tree import DecisionTreeClassifier ","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a07a42f98a6585bddaed7f062fbd56f852faf03b"},"cell_type":"markdown","source":"このあとモデルを作成するが、テスト用データについて生死を予測する前に、  \nどの程度の性能のモデルなのか確認したい。  \n→学習用データをランダムに2つに分ける（`train_test_split`）\n\n- 学習用データのうち、例えば7割でモデルを作る\n- 残りの3割でモデルの性能を評価する\n\n参考情報\n\n- ランダムに分けているが、`random_state`引数の値が同じなら、**何回実行しても同じ** ようにランダムに分かれる"},{"metadata":{"trusted":true,"_uuid":"2e265192a98cecd770899eeb223b768e25b736ae"},"cell_type":"code","source":"# 今回のハンズオンは7:3に分けて進める\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.3, random_state=1)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d81fe7d9e0e5e18b34f62ac72bf04466b694ea42"},"cell_type":"markdown","source":"`train_test_split`  \n参考: https://docs.pyq.jp/python/machine_learning/tips/train_test_split.html  \nドキュメント: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html"},{"metadata":{"_uuid":"f0568ada7f8aada0ff02000fe944a8a136fdaad6"},"cell_type":"markdown","source":"| 変数名 | 用途 |\n| ----- | ----- |\n| X_train | モデル作成用のデータ（乗客の属性） |\n| y_train | モデル作成用のデータ（生死） |\n| X_val | モデルの性能確認用のデータ（乗客の属性） |\n| y_val | モデルの性能確認用のデータ（生死） |"},{"metadata":{"trusted":true,"_uuid":"7d837f2e0c8d24f6640d759c80b63e3c468924e0"},"cell_type":"code","source":"# モデル作成用のデータの数の確認\nlen(y_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8d393db840989c0bb5262bc821122421bf8b522f"},"cell_type":"code","source":"# モデル性能確認用のデータの数の確認\nlen(y_val)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cdf685a0444a5412229e394ee1a11ce854114b63"},"cell_type":"code","source":"# ロジスティック回帰というアルゴリズムを使ったモデルを用意\nmodel = LogisticRegression(random_state=1, solver='liblinear')\n# モデル作成は以下の1行（ここまでの前処理に対してたった1行！）で完了する\nmodel.fit(X_train, y_train)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e652b8a1ea66c81b23bdf494b1e9047e4a9865db"},"cell_type":"markdown","source":"## 1-C. 性能確認\n\nタイタニックの場合、モデルの性能はaccuracyというスコアで評価される  \n（**注**：性能を表すスコアは他にもある）\n\n- 418名のうち生死を正しく予想できたものの割合\n- 1に近いほど性能がよい\n\n| ケース | 正解／誤り |\n| ----- | ----- |\n| 生存した乗客を生存と予測 | 正解 |\n| 生存した乗客を死亡と予測 | 誤り |\n| 死亡した乗客を生存と予測 | 誤り |\n| 死亡した乗客を死亡と予測 | 正解 |\n\naccuracy = (正解の総数) / (正解の総数 + 誤りの総数)\n\n>Your score is the percentage of passengers you correctly predict. This is known simply as \"accuracy”.\n\nref: https://www.kaggle.com/c/titanic#evaluation"},{"metadata":{"trusted":true,"_uuid":"a063293d2167961907aa65fe4cc2f504bdc86a16"},"cell_type":"code","source":"# モデル性能確認用データについて生死を予測\npred = model.predict(X_val)\n# accuracyを算出して表示\naccuracy_score(y_val, pred)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"abdf38022a47dee4890ca7e5d692972ca1bdf570"},"cell_type":"markdown","source":"`accuracy_score`  \nドキュメント: https://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html"},{"metadata":{"_uuid":"9da8b7d4bdd7c0a45b244dd5489bb5b074304dfc"},"cell_type":"markdown","source":"初回はすぐ提出。  \n別のモデルを作ったときに、以前に作ったモデルよりスコアが低ければ、提出しないという判断ができる  \n（Kaggleに提出しなくても試行錯誤が進められる）"},{"metadata":{"_uuid":"3db5d5be38078c0947737831b895af5e25a4c9c4"},"cell_type":"markdown","source":"## 2. テスト用データの生死を予測\n\n- テスト用データ（418件）について予測したあと、提出用データを作る\n- 提出用データは以下の形式のCSVとするように指定されている（1が生存、0が死亡）\n\nPassengerId | Survived\n----- | -----\n892 | 0\n: | :\n1309|1\n\n- ref: https://www.kaggle.com/c/titanic#evaluation"},{"metadata":{"trusted":true,"_uuid":"6f8f1f89df8a2845df1840288c04a8cc51213e0c"},"cell_type":"code","source":"# テスト用データからPassengerId列を除く\nX_test = test_df.drop(['PassengerId'], axis=1)\n# テスト用データについて生死を予測\npred = model.predict(X_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"048198f3fda1818008d2e7b20b6bacce37109c53"},"cell_type":"code","source":"# 提出用データの形式に変換\nsubmission = pd.DataFrame({\n    'PassengerId': test_df['PassengerId'],\n    'Survived': pred\n})\n# 提出用データ作成\nsubmission.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"3f70e884b01eef5bc942a5ca73a8c17a8f7f6b27"},"cell_type":"markdown","source":"## 参考: 提出練習データを提出してみる"},{"metadata":{"trusted":true,"_uuid":"0ffee8e8d4f95d220255ed8d6a0a6d21cbaa9ab9"},"cell_type":"code","source":"# 以下のコードはお手元では実行不要です\n# import pandas as pd\n# gender_submission_df = pd.read_csv('../input/gender_submission.csv')\n# gender_submission_df.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f01462b982b057daa411cd90db965dda2efb1ebd"},"cell_type":"markdown","source":"## 精度を上げるために\n\n精度が変わる方法（上がらない場合もあります）\n\n- Ageの欠損の埋め方を見直す\n- モデルのアルゴリズムを変える"},{"metadata":{"trusted":true,"_uuid":"666d99e0c21a6fbbe17a9d22e8a295fd63f738be"},"cell_type":"markdown","source":"### Ageの欠損の埋め方を見直す\n\n- （案1） 中央値 28歳 で埋める\n- （案2） Sexに応じて年齢を埋める\n- （案3） Pclassに応じて年齢を埋める\n\nKernelをEditする際、平均値で埋めた部分を以下のいずれかに置き換えてみてください。  \n現状コメント扱いにしているため、コードとして実行するには、始めと終わりの`\"\"\"`を削除する必要があります"},{"metadata":{"trusted":true,"_uuid":"38666dabde97e6a087663d5db4232fbc38e6a808"},"cell_type":"code","source":"# （案1） 中央値 28歳 で埋める\n\"\"\"\ntrain_df['Age'] = train_df['Age'].fillna(28)\ntest_df['Age'] = test_df['Age'].fillna(28)\n\"\"\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0cca156daf48b448aacf8daec7b0aea460c424b9"},"cell_type":"code","source":"# (案2) 仮説: 年齢の平均値は性別ごとに違うのでは？\n# 性別ごとの年齢の平均値を確認\n# train_df[['Sex', 'Age']].groupby('Sex').mean()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4af4a488e030532e9a9787e942a9c0103c1b7427"},"cell_type":"code","source":"# （案2）確認すると、男性の平均年齢 31歳、女性の平均年齢 28歳\n\"\"\"\ndef age_by_sex(col):\n    '''col: [age, sex]と想定'''\n    age, sex = col\n    if pd.isna(age): # Ageが欠損の場合の処理\n        if sex == 'male':\n            return 31\n        elif sex == 'female':\n            return 28\n        else: # 整数に変更したsexが含まれる場合など\n            print('Sexがmale/female以外の値をとっています')\n            return -1\n    else: # Ageが欠損していない場合の処理\n        return age\n# train_dfからAgeとSexの2列を取り出し、各行についてage_by_sex関数を適用\n# age_by_sex関数の返り値でAge列の値を上書きする（欠損の場合は、値が埋められる）\ntrain_df['Age'] = train_df[['Age', 'Sex']].apply(age_by_sex, axis=1)\ntest_df['Age'] = test_df[['Age', 'Sex']].apply(age_by_sex, axis=1)\n\"\"\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"bbec728562b5f602a840736a3d2b019a4baad84c"},"cell_type":"code","source":"# (案3) 仮説: 年齢の平均値はチケットの階級ごとに違うのでは？（年齢高い→お金持っている→いいチケット）\n# チケットの等級ごとの年齢の平均値を確認\n# train_df[['Pclass', 'Age']].groupby('Pclass').mean()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c1384752245acf87fa5cc66206f5476b5e629dea"},"cell_type":"code","source":"# （案3） pclass==1 38歳、pclass==2 30歳、pclass==3 25歳\n\"\"\"\ndef age_by_pclass(col):\n    '''col: [age, pclass]と想定'''\n    age, pclass = col\n    if pd.isna(age): # Ageが欠損の場合の処理\n        if pclass == 1:\n            return 38\n        elif pclass == 2:\n            return 30\n        else: # pclass == 3に相当する\n            return 25\n    else: # Ageが欠損していない場合の処理\n        return age\ntrain_df['Age'] = train_df[['Age', 'Pclass']].apply(age_by_pclass, axis=1)\ntest_df['Age'] = test_df[['Age', 'Pclass']].apply(age_by_pclass, axis=1)\n\"\"\"","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a8b3f0f18912c4586baf0b709db4643639860f86"},"cell_type":"markdown","source":"`groupby`  \n参考: https://note.nkmk.me/python-pandas-groupby-statistics/  \nドキュメント: http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html"},{"metadata":{"_uuid":"4633a8ce8588d46256f0d59f0b966064dcfa7a11"},"cell_type":"markdown","source":"`isna`  \nドキュメント: http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.isna.html"},{"metadata":{"_uuid":"08b39652efed0955d8c9f5d87a61b1759bdb4b08"},"cell_type":"markdown","source":"`apply`  \n参考: https://note.nkmk.me/python-pandas-map-applymap-apply/  \nドキュメント: http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html"},{"metadata":{"_uuid":"fb14c6ccea642a356204e659b6ea68c89373ac5d"},"cell_type":"markdown","source":"### モデルのアルゴリズムを変える\n\n決定木を試す  \n\n参考: https://scikit-learn.org/stable/modules/tree.html#classification  \nドキュメント: https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html"},{"metadata":{"trusted":true,"_uuid":"765434988edc3415024a1324bfebaa98e2591c89"},"cell_type":"code","source":"\"\"\"\n# 決定木というアルゴリズムを使ったモデルを用意\nmodel = DecisionTreeClassifier(random_state=1)\n# モデル作成は以下の1行（ここまでの前処理に対してたった1行！）で完了する\nmodel.fit(X_train, y_train)\n\"\"\"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}