Udemy「みんなのKaggle講座」の特徴量エンジニアリングをまとめてみた

## はじめに
Udemyの我妻先生の[「みんなのKaggle講座」](https://www.udemy.com/course/learning-kaggle/) を受講させていただきました。
大変わかりやすかったので、Kaggleに取り組んでみたいと思われているみなさんにおすすめです。
その中での特徴量エンジニアリングについて勉強になったところをアウトプットさせていただきます。
この記事を見て、少しでも気になった方はぜひ購入を検討してみてください。

## 特徴量エンジニアリングとは
* データを機械学習が扱える形に変換すること
* モデル精度向上に有効な新たな特徴量を作成すること


## 事前準備
### データの読み込み
今回はタイタニックのデータを用いています。

```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

train_data.info()
test_data.info()
```



## データの傾向を把握する
どういう傾向の人がタイタニック号で生き残りやすかったのかを把握することがタイタニックのコンペの目的です。
なので、生存したかどうかと他の特徴量それぞれの関係性を見ていきます。
seabornを利用して、データの傾向を把握します。

### 兄弟、配偶者の数

```
sns.countplot(x = 'SibSp', hue = 'Survived', data = train_data)
plt.legend()
plt.show()
```
出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201104/5c18fd7f-3405-dc08-d26d-bf517a18d18e.png)


### 両親、子供の数
```
sns.countplot(x = 'Parch', hue = 'Survived', data = train_data)
plt.legend()
plt.show()
```
出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201104/e9058dd7-3150-51fe-1ddf-46faf9551968.png)

### チケットのクラス
```
sns.countplot(x = 'Pclass', hue = 'Survived', data = train_data)
plt.show()
```
出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201104/a12a7077-454d-a145-463d-87add10bcd93.png)

### 性別
```
sns.countplot(x = 'Sex', hue = 'Survived', data = train_data)
plt.show()
```

出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201104/0967896d-9e30-a993-fb06-e01a9832f9e4.png)


### 出港地
```
sns.countplot(x = "Embarked", hue = "Survived", data = train_data)
plt.show()
```

出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201104/0435dded-1104-0e88-0308-7c565e21f0b0.png)


### 年齢の分布
```
bins = 25
alpha = 0.6

# loc関数で行と列を指定。
plt.hist(x = train_data.loc[train_data["Survived"] == 0, "Age"].dropna(),bins = bins, alpha = alpha, label = "0")
plt.hist(x = train_data.loc[train_data["Survived"] == 1, "Age"].dropna(),bins = bins, alpha = alpha, label = "1")

# 軸ラベル
plt.xlabel(xlabel = "Age")
plt.ylabel(ylabel = "Count")

plt.legend()
plt.show()
```

出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201104/6e35ae57-44d8-1528-5630-22488629f052.png)


### 料金の分布
```
bins = 25
alpha = 0.6

plt.hist(x = train_data.loc[train_data["Survived"] == 0, "Fare"].dropna(), bins = bins, alpha = alpha, label = "0")
plt.hist(x = train_data.loc[train_data["Survived"] == 1, "Fare"].dropna(), bins = bins, alpha = alpha, label = "1")

plt.xlabel(xlabel = "Fare")
plt.ylabel(ylabel = "Count")

plt.legend()
plt.show()
```

出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201104/24532cbe-e932-2c7e-3d68-776ed1822251.png)


## 特徴量エンジニアリング

### データを機械学習に扱える形(数字)に変換する
性別がmaleやfemaleのままだと、ランダムフォレストでは扱えないので
数字に変換する。

```
data = pd.concat(objs = [train_data, test_data], sort = False) #sortをfalseにしてそのまま結合

data.replace(to_replace = ["male", "female"], value = [0,1], inplace = True)

data["Embarked"].fillna(value = ("S"), inplace = True)
data["Embarked"] = data["Embarked"].map({"S": 0, "C": 1, "Q": 2})

data["Fare"].fillna(value = data["Fare"].mean(), inplace = True)
data["Age"].fillna(value = data["Age"].mean(), inplace = True)

data.head()
```
### 新しい特徴量「Family」を作成

SibSp(兄弟、配偶者の数)とParch(親、子供の数)を組み合わせてFamilyという特徴量を新たに作成する。

```
data["Family"] = data["Parch"] + data["SibSp"]

train_data["Family"] = data["Family"][:len(train_data)]
test_data["Family"] = data["Family"][len(train_data):]

sns.countplot(x = "Family", data = train_data, hue = "Survived")
plt.legend()
plt.show()
```



### 必要な特徴量だけで、機械学習モデルへの入力を作成する。

```
# 列を削除
data.drop(labels = ["Name", "PassengerId", "SibSp", "Parch", "Ticket", "Cabin"],
          axis = 1, inplace = True) # axis = 1を設定して、column(列)を削除

# [始点:終点]の形で、データを分ける
train_data = data[:len(train_data)]
test_data = data[len(train_data):]

t = train_data["Survived"]
x_train = train_data.drop(labels = "Survived", axis = 1)
x_test = test_data.drop(labels = "Survived", axis = 1)

x_train.head()
```

## まとめ
いかがだったでしょうか。
今回の記事はUdemyの我妻先生の[「みんなのKaggle講座」](https://www.udemy.com/course/learning-kaggle/) の特徴量エンジニアリングについてをまとめさせていただきました。
今年中に自分はKaggle Exeprtになることを目指して、頑張っていますのでもし誤りなどあればご指摘いただけると助かります。
お読みいただいてありがとうございました。