Kaggle　～タイタニック沈没事故の生存予測～　決定木#1

こんにちは!　初投稿です!
kaggleのタイタニック沈没事故の生存予測を実施してみたので投稿します!:frowning2:
分かりやすくするためにプログラムの記述と結果を細かく記載しています。
今回は決定木を使いました!


```ruby:ライブラリをインポート
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import missingno as msno
from sklearn.tree import DecisionTreeClassifier
```

```ruby:データを取得
train = pd.read_csv('train.csv')　#学習用データ
test = pd.read_csv('test.csv')　　#予測データ
```

```ruby:trainデータを確認
train.head()
```
結果↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/14b15b60-9bd8-6842-e69d-47d0f7d11fa4.png)

変数の解説↓
"Survived"：生死(0:死亡　1:生存)
"Pclass"：チケットのランク
"Name"：名前
"Sex"：性別
"Age"：年齢
"SibSp"：同乗している兄弟・配偶者の数
"Parch"：同乗している親・子供の数
"Ticket"：チケット番号
"Fare"：料金
"Cabin"：客室番号
"Embarked"：出港地

```ruby:trainデータの欠損を確認
msno.bar(train)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/e080c4c8-69eb-baea-13b4-d06dc7f51363.png)

データ数を見ると、Age・Cabinのデータ数が少ないようです。

```ruby:trainデータの前処理1
#Ageの欠損部分に中央値を代入します。
train["Age"] = train["Age"].fillna(train["Age"].median())
msno.bar(train)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/d0c04bd7-ad92-7ddf-2b08-9f914542f616.png)
Ageのデータが埋まったのを確認できましたね。

```ruby:trainデータの前処理2
#Sexを数値化　「male」→0　「female」→1
train.replace({"male":0,"female":1},inplace=True)
#出港場所を質的変換
train = pd.concat([train, pd.get_dummies(train["Embarked"], prefix="Embarked")], axis=1).drop(columns=["Embarked"])
#不要な列を削除
train = train.drop(columns=["Name", "Ticket", "Cabin"])
train.head()
```
結果↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/51e87a62-0365-85c0-0686-3940752b0300.png)
データが数値化されて見やすくなりました。これでtrainデータの前処理は終了です。
続いてtestデータを見てみましょう!

```ruby:testデータを確認
test.head()
```
結果↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/4a59b4a2-81db-f86b-9d59-29d2f9da4ef6.png)
テストデータなので目的変数のSurvivedがありませんね。
次にtrainデータと同じようにtestデータの欠損を確認してみましょう。

```ruby:testデータの欠損を確認
msno.bar(test)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/7b32f3a9-5783-f4e4-1e1c-45cc10fcec66.png)
Age・Fare・Cabinのデータ数が少ないことが分かります。

```ruby:testデータの前処理1
#Age・Fareの欠損部分に中央値を代入します。
test['Age'] = test['Age'].fillna(test['Age'].median())
test['Fare'] = test['Fare'].fillna(test['Fare'].median())
msno.bar(test)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/7e5b5731-cc60-6f87-7ffc-158ab2f6b4c2.png)
Age・Fareのデータが埋まったのを確認できましたね。

```ruby:testデータの前処理2
#Sexを数値化　「male」→0　「female」→1
test.replace({"male":0,"female":1},inplace=True)
#出港場所を質的変換
test = pd.concat([test, pd.get_dummies(test["Embarked"], prefix="Embarked")], axis=1).drop(columns=["Embarked"])
#不要な列を削除
test = test.drop(columns=["Name", "Ticket", "Cabin"])
test.head()
```
結果↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/eec1c009-8b32-a86b-5008-fd60067c7290.png)

```ruby:予測モデルの作成と予測の実施
#「Pclass(チケットのランク)」、「Sex(性別)」、「Age(年齢)」、「Fare(料金)」を元に、目的変数「Survived（生死のフラグ）」を予測するモデルを作成
train_features = train[['Pclass', 'Sex', 'Age', 'Fare', 'Embarked_C', 'Embarked_Q', 'Embarked_S']].values
train_target = train['Survived'].values

#モデルを作成の上、学習を実施
model = DecisionTreeClassifier(max_depth = 5, class_weight = 'balanced', random_state=0)
model.fit(train_features, train_target)

#テストデータの特徴量を取得して、上記で作成したモデルで目的変数を予測
test_features = test[['Pclass', 'Sex', 'Age', 'Fare', 'Embarked_C', 'Embarked_Q', 'Embarked_S']].values
predict_test_target = model.predict(test_features)
```

```ruby:予測データをcsv化
submission = pd.DataFrame({'PassengerId': test['PassengerId'], 'Survived': predict_test_target})
submission.to_csv('submission_Titanic_DecisionTreeClassifier.csv', index = False )
```
これで決定木の機械学習は終了です。
さて、今回の予測結果をkaggleに提出してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/4a0c77a0-6c18-f786-c9a9-e0249ec924e4.png)
スコアは0.73でした。まだまだ改善の余地がありそうです。前処理に標準化・正規化などをするとスコアが上がるかもしれません。
今後もkaggleのタイタニックコンペに関する投稿をしていきます!:relaxed:
ありがとうございました!