Python データの可視化(1) Fisherのアヤメデータの可視化

# Fisherのアヤメデータの可視化
機械学習の勉強をしているのですが、データを把握しないままサンプルコードを写経してなんとなくうまくいく、といったことが多かったため、扱うデータがどのような性質を持っているかを可視化したく思いました。
初心者のため汚いコードになっていますがご了承ください。もっとスマートなやり方を見つけ次第、内容を更新できればと思います。

## Fisherのアヤメデータとは
アヤメの品種分類データです。
CSV形式のデータであり、`SepalLength`、`SepalWidth`、`PetalLength`、`PetalWidth`、`Name`の5種のカラムが存在します。
`Name'はアヤメの品種を指しており、以下の3つがあります。

| アヤメの品種       |
|:-----------------|
| Iris-Setosa             |
| Iris-Vesicolor           |
| Iris-Virginica             |

## Fisherのアヤメデータのダウンロード

Jupyter Notebookを使用して、以下のプログラムを実行すると`iris.csv`という名前のファイルが保存されます。

```Python:
import urllib.request as req
import pandas as pd

url = "https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv"
savefile = "iris.csv"
req.urlretrieve(url, savefile)
```

## CSVデータの確認

`iris.csv`のダウンロード後、以下のプログラムを実行してCSVの内容を確認します。

```Python:
import matplotlib.pyplot as plt
import pandas as pd

iris_data = pd.read_csv('iris.csv')
iris_data
```
![iris_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476387/00a82c01-9a04-cd83-6e98-d0cd3f624298.jpeg)

## アヤメの品種の種類とそのデータ数の確認
CSVファイルの`Name`にどのような種類があるか確認します(前述で3種とネタバレさせていますが)。また、それぞれの品種に関するデータがいくつずつ存在するかも確認します。

```Python:
count_data = iris_data.groupby('Name')["Name"].count()
print(count_data)
```
![iris_02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476387/33983ef4-fa4a-6986-d1af-bd8627eadd1b.jpeg)

3つの品種がそれぞれ50ずつあることがわかります。

## データ可視化
品種情報を除くと`SepalLength`、`SepalWidth`、`PetalLength`、`PetalWidth`の4種の情報が存在するため、今回は散布図を2つ並べて確認しようと思います。
まずは、品種ごとにデータを分割します。

```Python:
iris_data_1 = iris_data[iris_data['Name'] == 'Iris-setosa']
iris_data_2 = iris_data[iris_data['Name'] == 'Iris-versicolor']
iris_data_3 = iris_data[iris_data['Name'] == 'Iris-virginica']
```

散布図を2つ作成するため、その配置を定義します。

```Python:
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
```

1つ目の散布図は、`SepalLength`を横軸、`SepalWidth`縦軸にします。品種ごとに色とマーカを分けることで、見やすくしようと試みています。

```Python:
ax[0].scatter(iris_data_1['SepalLength'], iris_data_1['SepalWidth'], c='red', marker='.', label='Iris-setosa')
ax[0].scatter(iris_data_2['SepalLength'], iris_data_2['SepalWidth'], c='blue', marker='^', label='Iris-versicolor')
ax[0].scatter(iris_data_3['SepalLength'], iris_data_3['SepalWidth'], c='green', marker='*', label='Iris-virginica')
ax[0].legend(loc='upper left')
ax[0].set_xlabel('Length')
ax[0].set_ylabel('Width')
ax[0].set_title('Sepal')
```

2つ目の散布図は、`PetalLength`を横軸、`PetalWidth`を縦軸にします。色とマーカは1つ目の散布図に合わせます。

```Python:
ax[1].scatter(iris_data_1['PetalLength'], iris_data_1['PetalWidth'], c='red', marker='.', label='Iris-setosa')
ax[1].scatter(iris_data_2['PetalLength'], iris_data_2['PetalWidth'], c='blue', marker='^', label='Iris-versicolor')
ax[1].scatter(iris_data_3['PetalLength'], iris_data_3['PetalWidth'], c='green', marker='*', label='Iris-virginica')
ax[1].legend(loc='upper left')
ax[1].set_xlabel('Length')
ax[1].set_ylabel('Width')
ax[1].set_title('Petal')
```

最後にグラフを表示します。

```Python:
plt.show()
```
![iris_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476387/48eebe72-90b0-a0ab-b87f-1c5a2df4987a.png)

`Iris-setosa`は特にPetalの方で他の2つと明確な違いがあるので判別できそうですが、`Iris-versicolor`と`Iris-virginica`はSepalでもPetalでも一部領域が重なっていることがわかります。

## 全組み合わせを試す

4つのカラムの全組み合わせ(6通り)を試します。

```Python:
import matplotlib.pyplot as plt
import pandas as pd

iris_data = pd.read_csv('iris.csv')

iris_data_1 = iris_data[iris_data['Name'] == 'Iris-setosa']
iris_data_2 = iris_data[iris_data['Name'] == 'Iris-versicolor']
iris_data_3 = iris_data[iris_data['Name'] == 'Iris-virginica']

fig, ax = plt.subplots(3, 2, figsize=(10, 15))

def set_scatter(ax_, data1, data2):
    ax_.scatter(iris_data_1[data1], iris_data_1[data2], c='red', marker='.', label='Iris-setosa')
    ax_.scatter(iris_data_2[data1], iris_data_2[data2], c='blue', marker='^', label='Iris-versicolor')
    ax_.scatter(iris_data_3[data1], iris_data_3[data2], c='green', marker='*', label='Iris-virginica')
    ax_.legend(loc='upper left')
    ax_.set_xlabel(data1)
    ax_.set_ylabel(data2)
    ax_.set_title(data1 + '+' + data2)
    
set_scatter(ax[0][0], 'SepalLength', 'SepalWidth')
set_scatter(ax[0][1], 'PetalLength', 'PetalWidth')
set_scatter(ax[1][0], 'SepalLength', 'PetalWidth')
set_scatter(ax[1][1], 'PetalLength', 'SepalWidth')
set_scatter(ax[2][0], 'SepalLength', 'PetalLength')
set_scatter(ax[2][1], 'SepalWidth', 'PetalWidth')

plt.show()
```

![iris_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476387/c8ca2bd4-a328-b69f-668b-4607d20118d8.png)

どの2種でも、`Iris-versicolor`と`Iris-virginica`は一部重なっていることがわかります。