Microsoftのデータサイエンス初心者向けコースをやってみるDay3チャレンジ：Visualizing Distributions

# はじめに

本記事では、Microsoftのデータサイエンス初心者向けコースDay3の"Visualizing Distibutions"のPython関連をつまみ食いする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/2c3b6eae-bd47-0871-425f-51d708e0bcfe.png)


# 対象読者

　Pythonとデータサイエンスに興味があって、英語が苦手な人（英語が得意な人は、[参考文献](#参考文献)を直接解いてね。

## データ用意＆散布図を表示

鳥の順番ごとの体長の一般的な分布の概要を示すものですが、真の分布を表示するには最適な方法ではない。

```Python

import pandas as pd

birds = pd.read_csv("https://raw.githubusercontent.com/microsoft/Data-Science-For-Beginners/main/data/birds.csv")

import matplotlib.pyplot as plt


birds.plot(kind="scatter", x="MaxLength", y="Order", figsize=(12, 8))
plt.title("Max Length per Order")
plt.ylabel("Order")
plt.xlabel("Max Length")
plt.show()

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/b2f1c57d-a591-166b-5932-2986c350bf04.png)



## ヒストグラム

Matplotlibで数値データの範囲全体に対するMaxBodyMassの分布を描画する。与えられたデータの配列をより小さなビンに分割することで、データの値の分布を表示することができます。


```Python

birds['MaxBodyMass'].plot(kind = 'hist', bins = 10, figsize = (12,12))
plt.show()

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/6143e4a1-2f6e-65cf-089c-0bad4a45b2d5.png)

## bin-sizeを変えて粒度を細かく見る。

```Python

birds['MaxBodyMass'].plot(kind = 'hist', bins = 30, figsize = (12,12))
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/38319dc1-8dab-863c-41b8-0b618caad010.png)


## 体重でフィルタ

```Python

filteredBirds = birds[(birds['MaxBodyMass'] > 1) & (birds['MaxBodyMass'] < 60)]      
filteredBirds['MaxBodyMass'].plot(kind = 'hist',bins = 40,figsize = (12,12))
plt.show()  
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/f70b7204-0bfb-002d-80a2-f16bb1c2ca3b.png)

## 2D-histogram

2つの分布の関係を比較するために2Dヒストグラムを作成する。MaxBodyMassとMaxLengthを比較してみよう。

```Python

x = filteredBirds['MaxBodyMass']
y = filteredBirds['MaxLength']

fig, ax = plt.subplots(tight_layout=True)
hist = ax.hist2d(x, y)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/6cf0cc9e-21f2-5384-d4d2-aa0af1b7284e.png)


## 鳥の保護状態と最小翼幅の関係をヒストグラムで

```Python

x1 = filteredBirds.loc[filteredBirds.ConservationStatus=='EX', 'MinWingspan']
x2 = filteredBirds.loc[filteredBirds.ConservationStatus=='CR', 'MinWingspan']
x3 = filteredBirds.loc[filteredBirds.ConservationStatus=='EN', 'MinWingspan']
x4 = filteredBirds.loc[filteredBirds.ConservationStatus=='NT', 'MinWingspan']
x5 = filteredBirds.loc[filteredBirds.ConservationStatus=='VU', 'MinWingspan']
x6 = filteredBirds.loc[filteredBirds.ConservationStatus=='LC', 'MinWingspan']

kwargs = dict(alpha=0.5, bins=20)

plt.hist(x1, **kwargs, color='red', label='Extinct')
plt.hist(x2, **kwargs, color='orange', label='Critically Endangered')
plt.hist(x3, **kwargs, color='yellow', label='Endangered')
plt.hist(x4, **kwargs, color='green', label='Near Threatened')
plt.hist(x5, **kwargs, color='blue', label='Vulnerable')
plt.hist(x6, **kwargs, color='gray', label='Least Concern')

plt.gca().set(title='Conservation Status', ylabel='Min Wingspan')
plt.legend();
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/18b405e6-317d-edbd-9207-76ad20ffd788.png)

あまり相関関係は見られない。

## 最大体重のヒストグラム（保護状態別）

他に相関の見られそうなものがないかを軽く探って見たが、
最大体重が少し関係ありそうな程度で決定的なものはなかった。


```Python

attributes = "MaxBodyMass"
x1 = filteredBirds.loc[filteredBirds.ConservationStatus=='EX', attributes]
x2 = filteredBirds.loc[filteredBirds.ConservationStatus=='CR', attributes]
x3 = filteredBirds.loc[filteredBirds.ConservationStatus=='EN', attributes]
x4 = filteredBirds.loc[filteredBirds.ConservationStatus=='NT', attributes]
x5 = filteredBirds.loc[filteredBirds.ConservationStatus=='VU', attributes]
x6 = filteredBirds.loc[filteredBirds.ConservationStatus=='LC', attributes]

kwargs = dict(alpha=0.5, bins=20)

plt.hist(x1, **kwargs, color='red', label='Extinct')
plt.hist(x2, **kwargs, color='orange', label='Critically Endangered')
plt.hist(x3, **kwargs, color='yellow', label='Endangered')
plt.hist(x4, **kwargs, color='green', label='Near Threatened')
plt.hist(x5, **kwargs, color='blue', label='Vulnerable')
plt.hist(x6, **kwargs, color='gray', label='Least Concern')

plt.gca().set(title='Conservation Status', ylabel=attributes)
plt.legend();

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/2004d4fc-5d0c-06c2-d327-d7c32d9db014.png)



## seaborn使って密度プロット

```Python

import seaborn as sns
import matplotlib.pyplot as plt
sns.kdeplot(filteredBirds['MinWingspan'])
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/bf1d7d45-552e-d0cb-2520-78f0073a72d3.png)


## 鳥別の最大体格密度をseabornで表示

```Python

sns.kdeplot(
   data=filteredBirds, x="MaxBodyMass", hue="Order",
   fill=True, common_norm=False, palette="crest",
   alpha=.5, linewidth=0,
)

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/0570779f-a4d3-aa6d-0c8b-9820e855a3ec.png)



## seabornで鳥のMaxLengthとMinLengthを保護状態と比較して可視化。

また、複数の変数の密度を1つのグラフにマッピングすることも可能。鳥のMaxLengthとMinLengthを保護状態と比較して可視化します。

```Python

sns.kdeplot(data=filteredBirds, x="MinLength", y="MaxLength", hue="ConservationStatus")

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/de5286bf-b675-8573-8b9a-dcdf0246bf8f.png)

　おしゃれなseabornグラフの出来上がり。デザイナの人が作ったのかな。すごく綺麗なグラフが数行で描けて便利なライブラリでした。


# 著者のTWITTERアカウント

@keiji_dl

# ホームページ（pytorch/python/nlp）

https://deeplearning.sakura.ne.jp/hp


# 参考文献

https://github.com/microsoft/Data-Science-For-Beginners