Titanicデータを前処理ライブラリDataLinerで処理してみる(変換編)

# はじめに
Pythonの前処理ライブラリDataLinerの各処理を紹介する記事3回目です。
今回は変換系について紹介したいと思います。

リリース記事:
https://qiita.com/shallowdf20/items/36727c9a18f5be365b37

# インストール
```
! pip install -U dataliner
```

# データ準備
いつも通りTitanicのデータを準備します。

```python
import pandas as pd
import dataliner as dl

df = pd.read_csv('train.csv')
target_col = 'Survived'

X = df.drop(target_col, axis=1)
y = df[target_col]
```

|PassengerId|Pclass|                       Name                        | Sex  |Age|SibSp|Parch|     Ticket     | Fare |Cabin|Embarked|
|----------:|-----:|---------------------------------------------------|------|--:|----:|----:|----------------|-----:|-----|--------|
|          1|     3|Braund, Mr. Owen Harris                            |male  | 22|    1|    0|A/5 21171       | 7.250|NaN  |S       |
|          2|     1|Cumings, Mrs. John Bradley (Florence Briggs Thayer)|female| 38|    1|    0|PC 17599        |71.283|C85  |C       |
|          3|     3|Heikkinen, Miss. Laina                             |female| 26|    0|    0|STON/O2. 3101282| 7.925|NaN  |S       |
|          4|     1|Futrelle, Mrs. Jacques Heath (Lily May Peel)       |female| 35|    1|    0|113803          |53.100|C123 |S       |
|          5|     3|Allen, Mr. William Henry                           |male  | 35|    0|    0|373450          | 8.050|NaN  |S       |

## StandardScaling / StandardizeData(deprecated)
データを平均0分散1となるよう変換します。
Sklearnなどのライブラリと違い、カテゴリ列が含まれていても自動で数値列のみを判別する他、pandas DataFrameで返却されるのでその後の処理が楽です。
StandardizeDataは名前をStandardScalingに変更したのでdeprecationの警告が出る他、ver.1.3.0では削除予定です。

```python
trans = dl.StandardScaling() 
Xt = trans.fit_transform(X)
```
|PassengerId|Pclass |                       Name                        | Sex  |  Age  | SibSp | Parch |     Ticket     | Fare  |Cabin|Embarked|
|----------:|------:|---------------------------------------------------|------|------:|------:|------:|----------------|------:|-----|--------|
|     -1.729| 0.8269|Braund, Mr. Owen Harris                            |male  |-0.5300| 0.4326|-0.4734|A/5 21171       |-0.5022|NaN  |S       |
|     -1.725|-1.5652|Cumings, Mrs. John Bradley (Florence Briggs Thayer)|female| 0.5714| 0.4326|-0.4734|PC 17599        | 0.7864|C85  |C       |
|     -1.721| 0.8269|Heikkinen, Miss. Laina                             |female|-0.2546|-0.4743|-0.4734|STON/O2. 3101282|-0.4886|NaN  |S       |
|     -1.717|-1.5652|Futrelle, Mrs. Jacques Heath (Lily May Peel)       |female| 0.3649| 0.4326|-0.4734|113803          | 0.4205|C123 |S       |
|     -1.714| 0.8269|Allen, Mr. William Henry                           |male  | 0.3649|-0.4743|-0.4734|373450          |-0.4861|NaN  |S       |


## MinMaxScaling
データを0と1の間に収まるよう変換をかけます。

```python
trans = dl.MinMaxScaling() 
Xt = trans.fit_transform(X)
```
|PassengerId|Pclass|                       Name                        | Sex  | Age  |SibSp|Parch|     Ticket     | Fare  |Cabin|Embarked|
|----------:|-----:|---------------------------------------------------|------|-----:|----:|----:|----------------|------:|-----|--------|
|   0.000000|     1|Braund, Mr. Owen Harris                            |male  |0.2712|0.125|    0|A/5 21171       |0.01415|NaN  |S       |
|   0.001124|     0|Cumings, Mrs. John Bradley (Florence Briggs Thayer)|female|0.4722|0.125|    0|PC 17599        |0.13914|C85  |C       |
|   0.002247|     1|Heikkinen, Miss. Laina                             |female|0.3214|0.000|    0|STON/O2. 3101282|0.01547|NaN  |S       |
|   0.003371|     0|Futrelle, Mrs. Jacques Heath (Lily May Peel)       |female|0.4345|0.125|    0|113803          |0.10364|C123 |S       |
|   0.004494|     1|Allen, Mr. William Henry                           |male  |0.4345|0.000|    0|373450          |0.01571|NaN  |S       |

## BinarizeNaN
欠損値が含まれる列を検索し、その列が欠損していたかどうかという2値の新しい列を作成します。

```python
trans = dl.BinarizeNaN() 
Xt = trans.fit_transform(X)
```
|PassengerId|Pclass|                       Name                        | Sex  |Age|SibSp|Parch|     Ticket     | Fare |Cabin|Embarked|Age_NaNFlag|Cabin_NaNFlag|Embarked_NaNFlag|
|----------:|-----:|---------------------------------------------------|------|--:|----:|----:|----------------|-----:|-----|--------|----------:|------------:|---------------:|
|          1|     3|Braund, Mr. Owen Harris                            |male  | 22|    1|    0|A/5 21171       | 7.250|NaN  |S       |          0|            1|               0|
|          2|     1|Cumings, Mrs. John Bradley (Florence Briggs Thayer)|female| 38|    1|    0|PC 17599        |71.283|C85  |C       |          0|            0|               0|
|          3|     3|Heikkinen, Miss. Laina                             |female| 26|    0|    0|STON/O2. 3101282| 7.925|NaN  |S       |          0|            1|               0|
|          4|     1|Futrelle, Mrs. Jacques Heath (Lily May Peel)       |female| 35|    1|    0|113803          |53.100|C123 |S       |          0|            0|               0|
|          5|     3|Allen, Mr. William Henry                           |male  | 35|    0|    0|373450          | 8.050|NaN  |S       |          0|            1|               0|

## CountRowNaN
各データ点(行)に対して、欠損値がいくつ含まれるかをカウントし、欠損値の合計を新しい特徴量として追加します。

```python
trans = dl.CountRowNaN() 
Xt = trans.fit_transform(X)
```
|PassengerId|Pclass|                       Name                        | Sex  |Age|SibSp|Parch|     Ticket     | Fare |Cabin|Embarked|NaN_Totals|
|----------:|-----:|---------------------------------------------------|------|--:|----:|----:|----------------|-----:|-----|--------|---------:|
|          1|     3|Braund, Mr. Owen Harris                            |male  | 22|    1|    0|A/5 21171       | 7.250|NaN  |S       |         1|
|          2|     1|Cumings, Mrs. John Bradley (Florence Briggs Thayer)|female| 38|    1|    0|PC 17599        |71.283|C85  |C       |         0|
|          3|     3|Heikkinen, Miss. Laina                             |female| 26|    0|    0|STON/O2. 3101282| 7.925|NaN  |S       |         1|
|          4|     1|Futrelle, Mrs. Jacques Heath (Lily May Peel)       |female| 35|    1|    0|113803          |53.100|C123 |S       |         0|
|          5|     3|Allen, Mr. William Henry                           |male  | 35|    0|    0|373450          | 8.050|NaN  |S       |         1|

## ImputeNaN
欠損値を補完します。デフォルトの引数では数値列は平均、カテゴリ列は最頻値で補完するようになっています。
num_strategy及びcat_strategyで変更することが可能です。

```python
trans = dl.ImputeNaN() 
Xt = trans.fit_transform(X)
```
|PassengerId|Pclass|                       Name                        | Sex  |Age|SibSp|Parch|     Ticket     | Fare | Cabin |Embarked|
|----------:|-----:|---------------------------------------------------|------|--:|----:|----:|----------------|-----:|-------|--------|
|          1|     3|Braund, Mr. Owen Harris                            |male  | 22|    1|    0|A/5 21171       | 7.250|B96 B98|S       |
|          2|     1|Cumings, Mrs. John Bradley (Florence Briggs Thayer)|female| 38|    1|    0|PC 17599        |71.283|C85    |C       |
|          3|     3|Heikkinen, Miss. Laina                             |female| 26|    0|    0|STON/O2. 3101282| 7.925|B96 B98|S       |
|          4|     1|Futrelle, Mrs. Jacques Heath (Lily May Peel)       |female| 35|    1|    0|113803          |53.100|C123   |S       |
|          5|     3|Allen, Mr. William Henry                           |male  | 35|    0|    0|373450          | 8.050|B96 B98|S       |


## ClipData
X分位数を定義し、上限以上と下限以下のデータを上限値と下限値で置き換えます。
引数thresholdでどの程度でクリップするかど調整することができ、デフォルトでは1% : 99%となっています。

```python
trans = dl.ClipData() 
Xt = trans.fit_transform(X)
```
|PassengerId|Pclass|                       Name                        | Sex  |Age|SibSp|Parch|     Ticket     | Fare |Cabin|Embarked|
|----------:|-----:|---------------------------------------------------|------|--:|----:|----:|----------------|-----:|-----|--------|
|        9.9|     3|Braund, Mr. Owen Harris                            |male  | 22|    1|    0|A/5 21171       | 7.250|NaN  |S       |
|        9.9|     1|Cumings, Mrs. John Bradley (Florence Briggs Thayer)|female| 38|    1|    0|PC 17599        |71.283|C85  |C       |
|        9.9|     3|Heikkinen, Miss. Laina                             |female| 26|    0|    0|STON/O2. 3101282| 7.925|NaN  |S       |
|        9.9|     1|Futrelle, Mrs. Jacques Heath (Lily May Peel)       |female| 35|    1|    0|113803          |53.100|C123 |S       |
|        9.9|     3|Allen, Mr. William Henry                           |male  | 35|    0|    0|373450          | 8.050|NaN  |S       |


## GroupRareCategory
カテゴリ変数の中で、出現頻度の低いカテゴリをまとめて"RareCategory"という文字列で置き換えてしまいます。
カーディナリティを下げるのに役立ちます。OneHotEncodingをかける前に使用すると効果的です。
引数thresholdで、データ数の何%以下を置き換えるか変更することができます。デフォルトでは1%。

```python
trans = dl.GroupRareCategory() 
Xt = trans.fit_transform(X)
```
|PassengerId|Pclass|    Name    | Sex  |Age|SibSp|Parch|   Ticket   | Fare |   Cabin    |Embarked|
|----------:|-----:|------------|------|--:|----:|----:|------------|-----:|------------|--------|
|          1|     3|RareCategory|male  | 22|    1|    0|RareCategory| 7.250|NaN         |S       |
|          2|     1|RareCategory|female| 38|    1|    0|RareCategory|71.283|RareCategory|C       |
|          3|     3|RareCategory|female| 26|    0|    0|RareCategory| 7.925|NaN         |S       |
|          4|     1|RareCategory|female| 35|    1|    0|RareCategory|53.100|RareCategory|S       |
|          5|     3|RareCategory|male  | 35|    0|    0|RareCategory| 8.050|NaN         |S       |


# おわりに
ということで今回はDataLinerの変換系の項目を紹介しました。
現時点(ver.1.1.6)で実装されている前処理としては、次回紹介するAppend系で最後となります。

Datalinerリリース記事: https://qiita.com/shallowdf20/items/36727c9a18f5be365b37
GitHub: https://github.com/shallowdf20/dataliner
PyPI: https://pypi.org/project/dataliner/