マルチクラス分類のラベルエンコーディングと相関係数の分析

## はじめに
データ分析の勉強をしています。
分類先が複数あるマルチクラス分類の問題に取り掛かる際、まず相関関係が知りたくなるのでその方法を記載しました。

## 対象の試験データ
対象はこのようなデータです。
自動車のclassを分類する課題で、class以外の情報からclassの情報を判定する必要があります。

``` python:in
print(train_data)
```
``` text:out
       id  class buying  maint  doors persons lug_boot safety
0       0  unacc    low    med      3       2    small    low
1       3    acc    low   high      3    more    small    med
2       7  unacc  vhigh   high  5more       2    small    med
3      11    acc   high   high      3    more      big    med
4      12  unacc   high   high      3       2      med   high
..    ...    ...    ...    ...    ...     ...      ...    ...
```

## 要素の種類の調査
ユニークなものを集めて、データがどんな要素で構成されているのかを調査します。
これをすると欠損値や特異点の有無も確認できそうです。今回は無さそうです。

``` python:in
#調査対処の要素の定義
columns = ['class', 'buying', 'maint', 'doors', 'persons', 'lug_boot', 'safety']

#要素を収集してパターンを確認
unique_elements = {}
for col in columns:
    unique_elements[col] = train_data[col].unique()
    print(unique_elements[col])
```

``` text:out
['unacc' 'acc' 'vgood' 'good']
['low' 'vhigh' 'high' 'med']
['med' 'high' 'low' 'vhigh']
['3' '5more' '2' '4']
['2' 'more' '4']
['small' 'big' 'med']
['low' 'med' 'high']
```

## 要素に対してマッピングを作成
数値に置き換える際、相関係数を見るには順序性も大事なので、classに対して影響がありそうな順に並び変えて番号を振ります。

``` python:in
# 各カラムに対するマッピングを定義する
mapping = {
    'class': {'unacc': 0, 'acc': 1, 'good': 2, 'vgood': 3},
    'buying': {'vhigh': 0, 'high': 1, 'med': 2, 'low': 3},
    'maint': {'vhigh': 0, 'high': 1, 'med': 2, 'low': 3},
    'doors': {'2': 0, '3': 1, '4': 2, '5more': 3},
    'persons': {'2': 0, '4': 1, 'more': 2},
    'lug_boot': {'small': 0, 'med': 1, 'big': 2},
    'safety': {'low': 0, 'med': 1, 'high': 2}
}
```
## ラベルエンコーディング
要素を数値に置き換えます。
元のデータを残しつつデータの変換をします。表示させて確認します。

``` python:in
# マッピングを元にデータを数値に変換する
mapped_train_data = train_data.copy()
for col in mapping:
    mapped_train_data[col] = train_data[col].map(mapping[col])

print(train_data)
print(mapped_train_data)
```

``` text:out
       id  class buying  maint  doors persons lug_boot safety
0       0  unacc    low    med      3       2    small    low
1       3    acc    low   high      3    more    small    med
2       7  unacc  vhigh   high  5more       2    small    med
3      11    acc   high   high      3    more      big    med
4      12  unacc   high   high      3       2      med   high
..    ...    ...    ...    ...    ...     ...      ...    ...

       id  class  buying  maint  doors  persons  lug_boot  safety
0       0      0       3      2      1        0         0       0
1       3      1       3      1      1        2         0       1
2       7      0       0      1      3        0         0       1
3      11      1       1      1      1        2         2       1
4      12      0       1      1      1        0         1       2
..    ...    ...     ...    ...    ...      ...       ...     ...
```

## 相関係数の出力と分析
相関関係の強さを調べます。
相関係数は絶対値が1に近いほど相関関係が強いので、結果からsafetyの相関関係が強く、doorsの相関関係は弱いように見えます。

``` python:in
# id列とclass列を除いた特徴量列のみを選択
features = mapped_train_data.drop(['id', 'class'], axis=1)
# class列と各特徴量列との相関係数を計算する
correlations = features.corrwith(mapped_train_data['class'])

print("class列との相関係数:")
print(correlations)
```

``` text:out
class列との相関係数:
buying      0.292611
maint       0.235106
doors       0.031257
persons     0.351530
lug_boot    0.163265
safety      0.444428
```

## おわりに
データ分析について少しは勉強していたつもりでしたが、いざ課題に取り組むと手も足も出なくて悲しくなりました。
まず関係性を見て、そこから考えるのがいいかなと思いました。