PCA with Breast Cancer Datasets

# 初めに
scikit learnのbreast cancer datasetsを利用しPCAをやってみます。
これはそのコードを保存するために作成しました。

# 予備知識
 Scalingについて理解しましょう。まず、mglearnをインストールします。

```python
pip install mglearn
pip install joblib==1.1.0
```

```python
import mglearn
mglearn.plots.plot_scaling()
```
結果
良く使うのは、1. StandardScaler と　2. MinMax Scalerです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/9a0715d1-0c3b-5d85-066b-2c46dd96ef20.png)

# Breast Cancer Datasets

Datasetsを入手し、Scalingしてみましょう。

```python
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()

```
中身
```python
print(type(cancer))
<class 'sklearn.utils.Bunch'>
```

可視化してみましょう。 axes.ravel()には注目してください。これを使うとnested loopを使わなくてもいいです。便利です。

```python
import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(6,5, figsize = (30,30))

malignant = cancer.data[cancer.target==0]
benign = cancer.data[cancer.target==1]

ax = axes.ravel()

from numpy import histogram
for i in range(30):
    _, bins = np.histogram(cancer.data[:,i], bins=50)
    ax[i].hist(malignant[:,i], bins=bins, color='red',alpha=0.5)
    ax[i].hist(benign[:,i], bins=bins, color='blue',alpha=0.5)
    ax[i].set_title(cancer.feature_names[i])
    ax[i].legend(['malignant', 'benign'], loc='best')
    ax[i].set_yticks(())
   

fig.tight_layout()
plt.show()

```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/0e489292-1f8a-2812-c8f6-ed152c2bfff5.png)

# Scaling

cancer dataをスケールしましょう。

```python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(cancer.data)
X_scaled = scaler.transform(cancer.data)
```

# PCA
それではPCAを始めます。

```python
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X_scaled)
```

```python
X_pca = pca.transform(X_scaled)

```
結果


```python
print(f'original data: {X_scaled.shape}')
print(f'after PCA data: {X_pca.shape}')
print(f' Explaiend variance ratio : {pca.explained_variance_ratio_}')
```

PCAの後、次元が30から2に削減されています。そして、説明可能な分散の比は、PCA1が44.2%, PCA2が18.9%で、合計63.1%です。

結果
```python
original data: (569, 30)
after PCA data: (569, 2)
 Explaiend variance ratio : [0.44272026 0.18971182]
```

可視化のために、pandasを利用し、dataframeの操作を行います。
ガンの陰性と陽性に関する別々のdataframeを作ります。これは最後の散布図で陰性と陽性の色分けをしたいからです。

```python
import pandas as pd
df_X_pca = pd.DataFrame(X_pca, columns=['PC1','PC2'])
df_target = pd.DataFrame(cancer.target, columns=['target'])

df_X_pca = pd.concat([df_X_pca, df_target] , axis=1)
df_X_pca_malignant = df_X_pca[df_X_pca['target'] ==0]
df_X_pca_benign = df_X_pca[df_X_pca['target'] ==1]

```
可視化のコードです。


```python
fig, ax = plt.subplots( figsize = (10,10))

ax.scatter(x = df_X_pca_malignant['PC1'], y = df_X_pca_malignant['PC2'], color='blue')
ax.scatter(x = df_X_pca_benign['PC1'], marker='^',y = df_X_pca_benign['PC2'], color='red')

ax.legend(['malignant', 'benign'], loc='best')
ax.set_title('PCA')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid()

fig.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/921ac2c3-cfbd-81d0-fe7e-1bb1c3404d1c.png)

# 感想

PCA、教師なし学習として、なかなか良さそうですね。ロジックも確かでシンプルであることが気に入ります。

# 参考資料
2017年の本ですが、自分の中で機械学習ベスト１の教材です。
https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E2%80%95scikit-learn%E3%81%A7%E5%AD%A6%E3%81%B6%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9F%BA%E7%A4%8E-Andreas-C-Muller/dp/4873117984
![muller.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/c4ad0cd5-b037-e7ca-e93b-846d0f437926.jpeg)