主成分分析などのプロットを見せられて「この２つのデータは分布が大きく違わない」？


主成分分析などでのプロットを見せられて、「この２つのデータの分布は大きく違わない」という説明を受けて「ホントか？」と思う機会があったので、そうじゃないデータを作ってみました。

# データの作成

x, y, z の３次元からなる２種類のデータ data1 と data2 を次のようにして作成します。


```python
import numpy as np

x = np.random.normal(50,10, size=(500)) 
y = np.random.normal(50,10, size=(500)) 
z = np.random.normal(50, 1, size=(500))

x1 = x[np.where(z > 51, True, False)]
y1 = y[np.where(z > 51, True, False)]
z1 = z[np.where(z > 51, True, False)]

x2 = x[np.where(z < 49, True, False)]
y2 = y[np.where(z < 49, True, False)]
z2 = z[np.where(z < 49, True, False)]

data1 = np.concatenate([x1, y1, z1]).reshape(3, (len(x1))).transpose(1, 0)
data2 = np.concatenate([x2, y2, z2]).reshape(3, (len(x2))).transpose(1, 0)

data = np.concatenate([data1, data2])

colors = ["red" if i >len(data1) else "blue" for i in range(len(data1)+len(data2))]
```

# 主成分分析

主成分分析して、「ほうら、この２つのデータセットは、分布が大きく違わないでしょう？」（ドヤ顔）


```python
%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA #主成分分析器

#主成分分析の実行
pca = PCA()
pca.fit(data)
# データを主成分空間に写像 = 次元圧縮
feature = pca.transform(data)
# 第一主成分と第二主成分でプロットする
plt.figure(figsize=(8, 8))
plt.scatter(feature[:len(data1), 0], feature[:len(data1), 1], alpha=0.8)
plt.scatter(feature[len(data1):, 0], feature[len(data1):, 1], alpha=0.8)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.grid()
plt.show()
```

![output_3_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/904b5f59-15a3-dae1-f671-b5f69f996420.png)



# 累積寄与率

「なんなら、累積寄与率も見せちゃいますよ。第二主成分（PC2）までで累積寄与率ほぼ１００％でしょう？」（ドヤ顔）


```python
# 累積寄与率を図示する
import matplotlib.ticker as ticker
import numpy as np
plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
plt.plot([0] + list( np.cumsum(pca.explained_variance_ratio_)), "-o")
plt.xlabel("Number of principal components")
plt.ylabel("Cumulative contribution ratio")
plt.grid()
plt.show()
```

![output_5_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/f7eb6b4a-e830-8912-bd99-44dc5bfaa268.png)



# 散布図行列

「散布図行列も見せてもらえませんか？」

（ドッキーン！！）


```python
import pandas as pd
from pandas.tools import plotting 
plotting.scatter_matrix(pd.DataFrame(feature, columns=['PC1', 'PC2', 'PC3']), figsize=(8, 8), color=colors) 
plt.show()
```

![output_7_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/92713013-c1ae-76fb-17b0-ae2257bcb312.png)



「ぜんぜん別物じゃあないかーッ！！ 元データの散布図行列も見せろーッ！！」

「すすすすみませーん」


```python
import pandas as pd
from pandas.tools import plotting 
plotting.scatter_matrix(pd.DataFrame(data,  columns=['x', 'y', 'z']), figsize=(8, 8), color=colors) 
plt.show()
```

![output_9_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/d8147a45-3b78-adb1-e600-b33c9064a2af.png)



# データの標準化

データは多角的に眺めなければいけませんね。その方法の一つがデータの標準化です。それをするだけでデータの見え方がだいぶ変わります。


```python
import numpy as np
def zscore(x, axis = None):
    xmean = x.mean(axis=axis, keepdims=True)
    xstd  = np.std(x, axis=axis, keepdims=True)
    zscore = (x-xmean)/xstd
    return zscore
```


```python
%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA #主成分分析器

#主成分分析の実行
pca = PCA()
pca.fit(zscore(data, axis=0))
# データを主成分空間に写像 = 次元圧縮
feature = pca.transform(zscore(data, axis=0))
# 第一主成分と第二主成分でプロットする
plt.figure(figsize=(8, 8))
plt.scatter(feature[:len(data1), 0], feature[:len(data1), 1], alpha=0.8)
plt.scatter(feature[len(data1):, 0], feature[len(data1):, 1], alpha=0.8)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.grid()
plt.show()
```

![output_12_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/6055e57e-f82b-05ae-beea-e5b5a03ab92d.png)



```python
# 累積寄与率を図示する
import matplotlib.ticker as ticker
import numpy as np
plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
plt.plot([0] + list( np.cumsum(pca.explained_variance_ratio_)), "-o")
plt.xlabel("Number of principal components")
plt.ylabel("Cumulative contribution ratio")
plt.grid()
plt.show()
```

![output_13_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/d6906118-8793-1184-7f4e-1c50d25e4cb0.png)



```python
import pandas as pd
from pandas.tools import plotting 
plotting.scatter_matrix(pd.DataFrame(feature, columns=['PC1', 'PC2', 'PC3']), figsize=(8, 8), color=colors) 
plt.show()
```

![output_14_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/b5e1891e-424f-914d-240b-eb1377431331.png)





```python
import pandas as pd
from pandas.tools import plotting 
plotting.scatter_matrix(pd.DataFrame(zscore(data, axis=0),  columns=['x', 'y', 'z']), figsize=(8, 8), color=colors) 
plt.show()
```

    /Users/kot/miniconda3/envs/py3new/lib/python3.6/site-packages/ipykernel_launcher.py:3: FutureWarning: 'pandas.tools.plotting.scatter_matrix' is deprecated, import 'pandas.plotting.scatter_matrix' instead.
      This is separate from the ipykernel package so we can avoid doing imports until


![output_15_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/9782fac6-4942-67c5-b720-128669da5425.png)