自動車の燃費を予測してみた。【signate練習問題】その４

　こちらの記事をご覧いただきありがとうございます。
　↓の続きです。

https://qiita.com/tomyu/items/7776eaccb39659d644b1

　前回の簡単なまとめをしておきます。

* ward法でクラスタリングをした
* ward法とkmeans法でだいたい同じ結果になった
* ward法のほうが`cylinders`と`origin`をよりきれいに再現した

　クラスタリングの手法でkmeans法とward法（デンドログラム）を試しました。他にもクラスタリング手法はありますが(最近傍法とか)、今回は次元削減との組み合わせの手法を試します。

# 次元削減

　次元削減って何？と思う人もいると思うので、一応簡単に説明しておきます。雑に言えば、元のデータが持っている情報をなるべく減らさずに別の形へと書き換えて、情報量の少ない変数をなかったことにします。
　…テキストで伝えてもいまいち伝わらないと思うので、次の主成分分析を試すときに意識的に補足説明を増やします。

　私が次元削減をするときに↓を参考にしたのでぜひご覧ください。

https://blog.brainpad.co.jp/entry/2022/03/09/160000


## 主成分分析

　たぶん次元削減で一番基本的（だと個人的に思っている）な主成分分析から試します。

### 前処理

　主成分分析でもカテゴリ変数をそのまま使えないので、Gower距離行列に変換します。量的変数だけの場合は標準化が必要です。

### モデルで学習

　（次元削減のモデル適用って学習と呼んでよいのでしょうか？）
　Gower距離行列に変換したデータに主成分分析を適用してデータを変換します。

```python:主成分分析
# 主成分分析で変換
pca = PCA()
pca.fit(df_train_gw)
df_train_pca = pca.transform(df_train_gw)
print(df_train_pca)
print(df_train_pca.shape)
```

__変換前__
<img width=500 alt='主成分分析変換前.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/df0d0068-af88-5aa2-d926-3a9df8eab7a2.png'>

__変換後__
<img width=500 alt='主成分分析変換後.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/7d16646a-7c9e-b419-fb16-f0ba5042e181.png'>

　主成分分析による変換が出来ました。
　先にも書きましたが、主成分分析ではデータの情報量をなるべく減らさずに別の形に書き換えます。行列の形の変化もわかりやすいように`shape`もつけておきました。どちらも199×199ですね。データの形状の変化はありません。中身だけ変わりました。
　この変換の何がうれしいかと言われれば、情報量が一部の変数に凝縮されることです。一番若い(?)変数（コードで書くなら`df_train_pca[0]`）に最も多くの情報を残し、若い順で情報量が多く残ります。最後の方の変数(`df_train_pca[198]`)はカスみたいな情報量しか残っていません（たぶん）。

　その説明として、主成分分析で変換した後の各変数の分散のグラフを載せます。

```python:各変数の分散
# 主成分分析変換後の各変数の分散
var = pd.DataFrame(df_train_pca).var()
plt.plot(np.arange(0,199), var)
plt.show()
```

__横が変数の若い順、縦が分散__
<img width=400 alt='pca_var.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/f1b66cab-fb49-1b17-4bf8-7af882158d2c.png'>

　199個ある変数のうち、それなりに大きい分散を持つ変数はわずかしかありません。
　主成分分析では、分散の大きさを持っている情報量の多さととらえています。多くの情報が最初の数個の変数に凝縮されているのがなんとなくでも感じられていればありがたいです。

　さてもう一つ、主成分分析の各変数が持つ情報量を示すものとして、`pca.explained_variance_ratio_`があります。そのまま和訳すると「説明された分散比」らしいです。各変数が持っている情報量の割合を示してくれます。

　そのまま表示するとこうなります。
```python:情報量の割合
# 各変数の情報量の割合
print(pca.explained_variance_ratio_)
```
__変数の情報量の割合__

<img width=500 alt='各変数の情報量.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/c7023bd5-715c-6e36-c32a-cd12f513a22e.png'>

　最初の 7.05834627e-01 ≒ 0.706 が、一番若い変数の情報量の割合を示しています。つまり、最初の一つの変数だけでおよそ70%の情報を持っていることを表しています。

　これを累積和にするとこうなります。

```python: 累積和
# 累積和
explained_variance = np.cumsum(pca.explained_variance_ratio_)
plt.plot(np.arange(0,199), explained_variance)
plt.show()
```

__情報量割合の累積和__
<img width= alt='pca_explained_variance.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/07b37de9-f585-de83-9ffd-40a4554e75bb.png'>

　さっきの情報量割合を累積和にしています。25の目盛のあたりで1.00近い数値になっていますが、これはつまり変数を25個残せばほぼ100％の情報が残ることを表しています。90％くらいでいいなら変数10個もいりません。

### 主成分分析の変数が持つ意味を調べる

　主成分分析によってどう変わったのかを確認します。確認しやすいように、変数を2つに絞ってグラフ上にプロットします。もちろん、情報量が多い若い変数2つを残します。

```python:若い2変数の散布図
plt.figure(figsize=(8,8))
plt.scatter(df_train_pca[:,0],df_train_pca[:,1])
plt.show()
```
__主成分分析後の散布図__

<img width=500 alt='pca.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/7af2f78d-f0a2-d380-cba7-872146d74f21.png'>

　なんか2次曲線っぽさを感じますね。この散らばりの意味を確認するために、色付けして出力します。　`mpg`の値の大きさに応じて色のグラデーションを付けます。
　グラデーションの付け方は以下を参考にしました。ぜひご覧ください。

https://qiita.com/hokekiyoo/items/cea310b2c36a01b970a6

　先に色の説明をしておくと、黒が小さく、黄色が大きい、赤が中間です。以下の図のようになります。

```python:グラデーション
import matplotlib.cm as cm

x =np.linspace(0,2*np.pi,100)
for i in range(30):   
    plt.plot(x,i*np.sin(x),color=cm.hot(i/30.0))
plt.xlim(0,2*np.pi)
plt.savefig("cm.png")
plt.show()
```
__黒→赤→黄色で大きくなっていく__
<img width=400 alt='cm.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/fdff80dd-8a90-9321-21b4-c34d5b0c7566.png'>

　さて、先ほどの散布図に`mpgの値に応じてグラデーションを付けてみます。

```python:主成分分析とmpg
feature = 'mpg'
max_ = df_train_cy_ye[feature].max()
min_ = df_train_cy_ye[feature].min()
scale = max_-min_

plt.figure(figsize=(8,8))
for value in df_train_cy_ye[feature].unique():
    condition = df_train_cy_ye[feature] == value
    plt.scatter(df_train_pca[condition,0],df_train_pca[condition,1],color=cm.hot((value-min_)/scale))
plt.show()
```

__2次曲線っぽさを感じる__
<img width= alt='pca_mpg.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/67cff8ba-9f64-951a-78f1-2c4368dd8c23.png'>

　先に書いたとおり、2次曲線っぽい変化をしているような印象はあります。特に黒(`mpg`が低い)は右上から下に下るにつれて赤みが出てくるように見えます。左側の黄色や赤は上に行くにつれ色が変わるって感じではないですね。

　`mpg`が2次曲線っぽくなるので、'displacement'とかもそうなるのでしょうか？
　※コードはほぼ同じなので省略します。

__displacement,horsepower,weight__
<img width=400 alt='pca_displacement (2).png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/6981b482-74f3-697b-fa5c-b833b53a3a2a.png'>

<img width=400 alt='pca_horsepower (1).png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/1a59ccc5-5044-c59b-a152-e95d60e66d96.png'>

<img width=400 alt='pca_weight (1).png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/45eaefa7-a224-7773-011e-4139280821a6.png'>


　こんな感じだろうな―と思っていました。`mpg`の逆のグラデーションになるだろうなーは案の定ですね。

　`acceleration`はどうでしょうか？

__acceleration__
<img width=400 alt='pca_acceleration.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/2c851655-6dfc-f28a-28b2-795a524e7462.png'>

　やはり結構色が混ざっていますね。しかし、右ほど黒が多く、左ほど黄色が多いです。全然関係ないって程ではないですね。
　
　`cylinders`と`origin`はどうでしょうか？クラスタリングの時にだいたいこれで分かれていましたが…
　※さっきと同じグラデーションにすると見づらくなったので色を変えました。
　※カテゴリ変数が値の大きさに意味はありませんが、色分けによって違うグループであることが確認できます。黄色だから良いとかそういうことはありません。

__赤が小さい、黄色が大きい__
<img width=400 alt='cm_autumn.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/e1e98ed5-1d8d-a91b-d922-468571c30627.png'>


__cylinders,origin__
<img width=500 alt='pca_cylinders.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/4c067e19-6c55-e0f0-0379-ea68db1d2eba.png'>

<img width=500 alt='pca_origin.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/f1da68c6-4778-1d9f-01dd-cec2f2160a9e.png'>


　なるほど、ザックリまとまっていたのはだいたい`cylinders`による影響だったのですね。`origin`も、左上に2グループとそれ以外で1グループに分かれます。

　最後に`model_year`です。

<img width=500 alt='pca_model_year.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/60fdbb7c-42f1-bbb8-0797-99d6b7b175c1.png'>

　これはだいぶ散らかっているような気がしなくもないです。右側に黄色がいないですね。


### 影響力の高そうなcylindersやoriginを抜いたらどうなるのか？

　クラスタリングの時に影響力が高く、また主成分分析でもザックリ分類してくれていた。'cylinders'や'origin'を変数から外した場合、この主成分分析にどのくらい影響が出るのだろうか？と気になったので調べます。

　量的変数を標準化→`cylinders`と`origin`を外す→Gower距離行列に変える→主成分分析で変換　と処理を行います。
　※やることは以前書いたことと大半同じなのでコードを省略します。

__cylindersとoriginを除くと…？__

<img width=500 alt='pca_without_cylinders_and_origin.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/b735b468-061e-0f05-c14e-9a7bb16610e0.png'>

　さらに2次曲線味が増しましたね。スポーツブランドのロゴにありそう。
　これもどのような意味を持っているのか確認します。

　同じようなグラフをたくさん出しても長いので、個人的に面白い奴だけ出します。
　まずは`mpg`です。

__pca2とmpg__
<img width=500 alt='pca2_mpg.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/dee9caa7-de97-7fb0-f2a2-be1cda70bf7f.png'>

　（pca2とかいうナンバリングのクソ適当な命名なのは気にしないでください）
　これはかなりきれいなグラデーションに見えますね。モデル予測の時にも使えそうな気がします。
　…`mpg`を変数に使っているとモデル分析に使えないのでは？と思ったので、後で`mpg`も除いたバージョンも試します。`displacement`とかの変数でほぼほぼ再現できると思いますが。

　`cylinders`を使っていませんが、`cylinders`で色分けしたらどうなるでしょうか？

__pca2とcylinders__
<img width=500 alt='pca2_cylinders.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/15cd92f5-17b9-d9a1-446a-45e45b0507d9.png'>

　言われてみればそうなるよねーって感じがします。この曲線が`mpg`できれいなグラデーションを作れるので、`cylinders`くんがきれいに3分割できるのもそうだろうなーって感じました。

　関係が薄めと思われてきた`acceleration`だとどうなるでしょうか？

__pca2とacceleration__

<img width=500 alt='pca2_acceleration (1).png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/09fe4a10-45da-7f6c-bc5f-d09fdd3ba115.png'>

　やはり色が混在していますね。もう少し色ごとの違いを見たかったので、色ごとに取り出します。
　
　`acceleration`の値に応じて10段階に分けて、それぞれに色付けをします。10段階の分け方はパーセンタイル（箱ひげ図の分け方とだいたい同じ）です。境界線の値が複数あるときに等分割されませんが気にしないでください。

```python:
 パーセンタイルで10等分してくれる関数
def divide_quantity_to10(samples, feature):
    dividing_point = []
    for i in range(10):
        dividing_point.append(samples[feature].quantile(i * 0.1))

    samples[f'{feature}_divide'] = 0
    for i in range(10):
        samples[f'{feature}_divide'] = samples[f'{feature}_divide'].where(samples[feature] < dividing_point[i], i)

# 色変えしたい変数
feature = 'acceleration'

# 10分割
df_train_divide = copy.copy(df_train_cy_ye)
divide_quantity_to10(df_train_divide,feature)

# 10段階に分けて出力
fig = plt.figure(figsize=(16,6))
plt.title(f'pca2_{feature}')

for i in range(10):
    ax = fig.add_subplot(2,5,i+1)![pca2_acceleration_bycolor (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/14ed85e4-a233-61f0-799d-177c8e1392c7.png)

    condition = df_train_divide[f'{feature}_divide'] == i
    ax.scatter(df_train_pca2[condition,0],df_train_pca2[condition,1],color=cm.hsv(i/10))
    plt.xlim(-2.2,4.2)
    plt.ylim(-1.2,2.2)

plt.show()
```

__pca2とacceleration__
<img width=600 alt='pca2_acceleration_bycolor (1).png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/6fedf860-37b7-86bd-f4ff-3c6db531711c.png'>

　値が小さいと右寄りで、徐々に左に移っている…？一番値が小さいときは右寄りで、値が大きいときは左寄りなのは見て取れますが、間は別に右寄りでも左寄りでもないような…。重量級の時に加速が重い奴が多いってくらいでしょうか？


### 回帰分析の時を考慮してmpgも外す

　先に少し話題に出しましたが、目的変数である`mpg`を使った変換は回帰分析をするときに使えないので、`cylinders`と`origin`に加えて`mpg`も外します。
※やることがほぼ同じなのでコードを省略します。

__mpgも除いてみると…？__
<img width=500 alt='pca3_without_cylinders_origin_and_mpg.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/1077030c-8396-ee5f-fbcc-dd47b7a73af9.png'>

　だいたいひとつ前と同じ曲線ですね。`mpg`と`displacement` `horsepower` `weight`の性質がだいたい同じなので、そんな気がしていました。
　一応色付けもします。だいたい同じ結果になりそうですが。


__pca3とmpg__

<img width=500 alt='pca3_mpg (1).png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/ad7d7a34-3c41-84bd-c6f0-bad26125d5bd.png'>

　`mpg`が入っていない時とだいたい同じ結果になりました。
　少し違うのは、2次曲線の太さがこちらの方が太く、また曲線の内側よりも外側のほうが`mpg`の値が大きくなっている印象があります。外側と内側の違いが分かればかなり役に立ちそうですね。

　外側と内側の違いを作っているのは、どうやら`model_year`っぽいです。

__pca3とmodel_year__
<img width=500 alt='pca3_model_year.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/f4e3c01f-20eb-8568-dea9-1a1a8106bc9b.png'>

　ぱっと見で黒が内側に多く黄色が外側に多い印象です。よく見ると黒と赤は混ざっている部分も多いですね。外側なほど`model_year`が大きいと言ってよいのではないでしょうか？


### ザックリ主成分分析のまとめ

* `mpg`や`displacement`などの値に応じてグラデーションする2次曲線のようなものが出来上がる。
* `cylinders`や`origin`を入れると、その値に応じてまとまりが出る。
* ↑を入れないとより2次曲線っぽさが出る。
* 曲線の内側と外側は'model_year'が作っているっぽい


## T_SNE

　主成分分析で私が感じたことはだいたい書いたので、別の次元削減も試します。
　次はT_SNEです。詳細は割愛しますが、やっていることはだいたい主成分分析と同じです。


### 前処理

　主成分分析と同じです。
　カテゴリ変数をそのまま使えないので、Gower距離行列に変換します。量的変数だけの場合は標準化が必要です。

```python:T_SNEで次元削減
from sklearn.manifold import TSNE

tsne = TSNE(random_state=0)
df_train_tsne = tsne.fit_transform(df_train_gw)
```

### T_SNEで次元削減

　早速2次元に圧縮したものをグラフにプロットします。

<img width=500 alt='tsne.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/5d5a20f4-22bb-163c-fab6-8e251a6745bc.png'>

　きれいに5つの塊に分かれました。
　…5つのグループ？まさか`cylinders`と`origin`か？

__cylindersとoriginだった__

<img width=500 alt='tsne_cylinders (1).png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/b3ad0def-7f37-0c61-7b08-82f4c8002857.png'>

<img width=500 alt='tsne_origin.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/012b0c6a-79f6-71e8-bd95-9bfe62c9b495.png'>

　そんな気がしていましたが、やっぱりそうなんですね。
　（いろいろ終わった後で思ったことですが、たぶんgower距離計算のおかげでカテゴリの違いがハッキリ出るんだと思います。）

　一応`mpg`による色分けも載せます。

<img width=500 alt='tsne_mpg.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/7cc9c4d0-2374-1c33-d172-91202ebb2e67.png'>

　左上の2つのグループは左下に行くほど、下の3グループは右下に行くほど値が大きいみたいですね。


### cylindersとoriginを取り除く

　主成分分析でもやったように、T_SNEでも`cylinders`と`origin`を取り除いてみます。

<img width=500 alt='tsne2.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/f4273cc1-4a53-c509-0547-ca57b592c0ce.png'>

　~~うわ、きっしょ~~
　水の流れのような何かに見えます。これも色分けしてみましょう。

__tsneとmpg__

<img width=500 alt='tsne2_mpg.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/4fc0f47d-d864-0a47-fd7b-ec510dda97ad.png'>

　全体の傾向としては、右下ほど黒、左上に行くほど黄色になる印象です。細かく見ると、左上の赤~黄色の広がりがある部分では、つながりのある小グループごとに左上ほど黄色くなっているような感じがします。（これテキスト表現で伝わっているでしょうか？）

　この広がりは何によって作られているのでしょうか？


__model_yearで広がっているっぽい__
<img width=500 alt='tsne2_model_year.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/014db601-00c8-fd09-e21c-ea3b897176b8.png'>

　`model_year`ごとに色分けすると、細かいグループが`model_year`ごとにくっついていることがわかります。しかし、`model_year`が同じならくっつくというわけでもないようですね。わかりやすいように色ごとに出力します。

<img width=700 alt='tsne2_model_year_bycolor.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/303a1246-3629-0f3b-98b1-676b1ba15667.png'>

　同じ色でも右下～左上に広がっていますね。性能の差でグループが分離しているような感じでしょうか。

### mpgも除いてみる

　主成分分析で`mpg`を取り除きましたが、T_SNEでもやってみます。
　
__cylinders,origin,mpgを取り除く__
![tsne3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/2c1a7aac-df8b-8864-2be2-ba9ea454c459.png)

　mpgありと比べて、画像がひっくり返っただけのような気がします。細かく見れば、広がり方が大きくなっているような印象があります。この微妙に広がったのはもしかしたらありがたいかもしれません。

　色分けもします。`mpg`です。

<img width=500 alt='tsne3_mpg (1).png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/7a152ec1-33a7-b9e1-f083-c202df1ecc0c.png'>


　これもひっくり返せばさっきと同じ感じがしますね。左上が黒で、右下に行くにつれて黄色に変化していきます。グループごとに右下ほど黄色なのも同じですね。
　ほかの色分けもさっきとほぼ同じなので割愛します。細かいグループは`model_year`によって構成されていました。


## UMAP

　UMAPも次元削減の手法の一つです。やっていることはだいたいT_SNEと同じです。（同じって言うと語弊が多いような気がしますが）


### 前処理

　主成分分析と同じです。
　カテゴリ変数をそのまま使えないので、Gower距離行列に変換します。量的変数だけの場合は標準化が必要です。

```python:UMAPで次元削減
import umap

UMAP = umap.UMAP(random_state=0)
df_train_umap = UMAP.fit_transform(df_train_gw)
```

### UMAPで次元削減

　早速プロットします。

__UMAPで次元削減__
<img width=500 alt='umap.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/c9daa352-d1a7-3cf1-d9ca-e278aee696a9.png'>

　5つの塊に分かれました。`cylinders`と`origin`なんだろうなぁ。
　それを確かめるために色分けします。

__cylindersとoriginでした__

<img width=500 alt='umap_cylinders.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/acd4e9ad-b476-0eef-b3c9-1a255996a7ad.png'>

<img width=500 alt='umap_origin.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/7f31dede-f556-0bf1-9095-155c15fb4e44.png'>

　そうだと思いました。次元削減にカテゴリを入れるときにはよく考えたほうがいい気がしてきました。

　やはり`cylinders`と`origin`を除きます。

__cylindersとoriginを除くと…？__
<img width=500 alt='umap2.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/eb938d30-6589-b5f5-5490-ba0d38199367.png'>

　これはいったい何の模様でしょうか？何やら愉快なことになっていますね。ぱっと見では解釈が難しいです。
　色付けをしてどうなっているのか確認してみましょう。

<img width=500 alt='umap_mpg.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/d3129025-d8c5-1ea6-bda2-f290bb1d763e.png'>

　全体的にみると、右上が黒で左下が黄色になっていますね。全体の傾向もうまくグラデーションしていますが、塊ごとに見たほうがグラデーションがキレイです。

　他の傾向もだいたいT_SNEと同じでした。

<img width=500 alt='umap_displacement.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/04ae8bce-8511-a4cd-6d7f-10f0040c4fe9.png'>

<img width=500 alt='umap_model_year.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/ada18c92-ad00-775f-166f-cd74bba380b9.png'>


### mpgも除く

　やはり`mpg`も除いて試します。

<img width=500 alt='umap3.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/81bc5ba2-9e2f-fd2e-2034-7b8c9771de8d.png'>

　なんかすっきりしたような気がします。
　色付けしてみましょう。

<img width=500 alt='umap3_mpg.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/a0cc8a2d-cab6-ea5e-7b15-26ff8da9becb.png'>

　他の手法と違い、きれいなグラデーションとはいかないようです。全体的には、右下が黒、中央が赤、広がると黄色、とかそんな感じでしょうか？そうでもない…？

 他のグラフも見てみます。

__displacement__
<img width=500 alt='umap3_displacement.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/fd918c6a-e282-8a4b-3294-3a7bc8c79398.png'>

__horsepower__
<img width=500 alt='umap3_horsepower.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/5a53dc9c-7e1a-3b21-7719-92a9c32c4393.png'>

__weight__
<img width=500 alt='umap3_weight.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/f91700b7-937b-7ab0-9943-6a2d6f3f5cc0.png'>

__acceleration__
<img width=500 alt='umap3_acceleration.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/b7ff3972-7857-e902-fde8-f7cf8cb5f7a7.png'>

__cylinders__
<img width=500 alt='umap3_cylinders.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/98a1fe73-fbd7-6d6e-7389-c6e4ecea0af4.png'>

__origin__
<img width=500 alt='umap3_origin.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/fe588e62-a60e-77ba-94e2-752e07f46f71.png'>

__model_year__
<img width=500 alt='umap3_model_year.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/eaf39a5e-5c1c-2812-21ca-fa53e9814a46.png'>

　ザックリ傾向は他の手法と同じような気がします。

# 次回に続きます。

　今回は次元削減を使いました。割と面白い結果になったなと個人的に思っています。次元削減をうまく使えば回帰予測にも役立ちそうです。
　次回はようやく本題の回帰分析です。線形回帰とか、RandomForestとか、LightGBMとかを使って燃費を予測します。その中に今回の次元削減を取り入れたりとか、やれそうなことはいろいろあります。全部終わるまでまだしばらくありそうです。