kaggleのタイタニックチュートリアルをやってみた記録

# kaggle とは

企業等がコンペ形式で課題を提示(Competition)し、賞金と引き換えに最も精度の高い分析モデルを買い取る仕組みがあるサイトです。
サイト上でJupyter-notebookを使ってプログラムを作成することができますのでブラウザのみで参加できます。

----

# kaggle にユーザ登録する

https://www.kaggle.com
にアクセスし、Register から登録する。

----

# タイタニックチュートリアルに参加する

Competitions メニューを選択し、Titanic: Machine Learning from Disaster を選択、Join Competition をクリックする

----

# ノートブックを開く

Notebooks を開き、New Notebook を押し、開発画面を出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/6f2dca04-bab5-7041-3d7e-71aa3569ea4b.png)

----

# 初期表示のコードを実行してみる

画面左の In[]: の部分をクリックすると実行ボタンに変わるのでクリックすると実行され結果が背景黒の枠に表示されます。
\#で始まる行はコメントなので無視するとプログラムの内容は、
numpy, pandas, os の3つのライブラリを読み込んで、
/kaggle/inputディレクトリ内にあるファイルを列挙して表示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/3c3eaced-7cb9-a077-3ff3-609d816e9fc0.png)

----

# csv を読み込んでみる

画面下の空欄部分に以下のコードを入力して実行します。

```
train = pd.read_csv("/kaggle/input/titanic/train.csv")
train.info()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/fe3178c3-1f53-396d-9ab1-456289562cb6.png)
train.csv は学習用のデータのようです。 .info()で列情報を確認できます。

|列名|型|意味|
|----|--|-----|
|PassengerId|int64|乗客を区別するための番号|
|Survived|int64|0：死亡, 1:生存|
|Pclass|int64|ランク(1:上級, 2:中級, 3:下級)|
|Name|object|氏名|
|Sex|object|性別(male:男性, female:女性)|
|Age|float64|年齢|
|SibSp|int64|同乗している配偶者・兄弟人数|
|Parch|int64|同乗している親・子人数|
|Ticket|object|チケット番号|
|Fare|float64|チケット料金|
|Cabin|object|客室番号|
|Embarked|object|出港地(C:シェルブール, Q:クイーンズタウン, S:サウサンプトン)|

----

.head()で先頭から5行分の内容を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/a3d7a2cb-205a-8987-02d8-7edd099c1f3c.png)

----

.describe()で数値列に対する
データ数(count)、
平均(mean)、
標準偏差(std)、
最小(min)(0%の位置にある値)、
最小値から見て25%の位置にある値(25%)、
中央値(50%)、
最小値から見て75%の位置にある値(75%)、
最大(max)(100%の位置にある値)
の統計値が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/4f8fb4f3-bf68-e58e-45ae-8553c31e3b05.png)

----

test.csv は train.csv を使って作成した分析モデルの精度を確認するためのデータ(Survived列がない)、 gender_submission.csv は test.csv のPassengerIdとSurvived列だけのデータ（答え合わせ用）になっているようです。

----

用意されたデータが把握できたので次はデータの整形を行います。
分析モデルを作るには、

- 文字データを数値データに置き換える
- 欠損データをなんとかする

処理が必要なようです。

----

文字データは .describe()で object となっている列が文字データですので使えそうな列は数値データに置き換えます。
object型の Name, Sex, Ticket, Cabin, Embarked のうち、Sex, Embarked を数値データにしてみます。

----

pd.get_dummiesを使うと、指定した列の値の種類ごとに列が追加され、0か1がセットされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/2e182698-6808-0ea4-6bd0-696ff8f70fdd.png)
Sex 列が Sex_female, Sex_male に、
Embarked 列が Embarked_C, Embarked_Q, Embarked_S に変わりました。

----

test の方も同様に処理します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/06dd854a-41ea-7e5d-3340-73416082e116.png)

----

次に欠損データを処理します。
.descibe()のCountを見てどこが欠損しているか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/6eeb5e3f-1d93-4eb7-1add-a5ef0e8f02b8.png)
train は Age 以外は891なので、Age だけ欠損があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/1d03043f-bce5-5290-6c14-c69108061f87.png)
test は Age と Fare に欠損があります。

----

今回は欠損している部分に中央値をセットしてみます。

```
train["Age"] = train["Age"].fillna(train["Age"].median())
test["Age"] = test["Age"].fillna(test["Age"].median())
test["Fare"] = test["Fare"].fillna(test["Fare"].median())
```

----

describe()で欠損値がなくなったか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/417c533e-23b1-177b-1f2e-901b3a035d80.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/4c9a792d-874a-2265-4162-def75eaf96df.png)
大丈夫そうです。

----

train データから分析モデルを作って test データの Survived を予測してみましょう。
今回は sklearn という決定木のライブラリを使いました。

```
from sklearn import tree

# モデル作成
features = train[["Pclass", "Age", "SibSp", "Parch", "Fare", "Sex_female", "Sex_male", "Embarked_C", "Embarked_Q", "Embarked_S"]].values
target = train["Survived"].values 
my_tree = tree.DecisionTreeClassifier().fit(features, target)

# 予測
test_features = test[["Pclass", "Age", "SibSp", "Parch", "Fare", "Sex_female", "Sex_male", "Embarked_C", "Embarked_Q", "Embarked_S"]].values
my_prediction = my_tree.predict(test_features)
```

----

予測結果を見てみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/f1d9f332-39e1-0caa-f63e-41d0762af93e.png)
.shape で要素数を確認できます。

----

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/64e08c40-a073-968e-6a72-8c3275f6267f.png)
print で 418件分の 0:死亡、1:生存 の結果が確認できます。

----

最後に PassengerId と Survived 列の入ったCSVファイルを作成します。

```
PassengerId = np.array(test["PassengerId"]).astype(int)
my_solution = pd.DataFrame(my_prediction, PassengerId, columns = ["Survived"])
my_solution.to_csv("my_solution.csv", index_label = ["PassengerId"])
```

実行すると右側の output 部分に my_solution.csv ファイルができます。ダウンロードアイコンをクリックするとダウンロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/abfb8ff5-5e7c-7b62-cc2f-527753e893ff.png)

----

my_solution.csv の中身は次のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/2168123e-7069-7970-fe1f-edbe5f359db7.png)

----

my_solution.csv を提出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/480140b7-3f8f-dbc9-78b7-6ef3d466e2b7.png)
タイタニックの Competition の画面に行き、Submit Preditctions をクリックします。

----

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/6bfdab68-a6e6-a8a2-821f-a9826ab224ed.png)
Step1 の部分に my_solution.csv をセットし、
Step2 に説明を書きます。 (例: My First Solution)
Make Submission をクリックします。

----
提出が終わると結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/1c979b74-0fc9-d535-1d08-551700bdda50.png)
このScoreを1に近づけるよう改善していくのが目標になります。

----

やってみた感想としては pandas を使うとデータ処理が簡単に行えること。
Jupyter-notebook を使うと実行ソースと実行結果とメモを自由に配置できるところが便利に感じました。