【高等学校情報科 情報Ⅰ】教員研修用教材：データの形式と可視化（python）

#はじめに
今回は文部科学省のページで公開されている情報Ⅰの教員研修用教材の「第4章情報通信ネットワークとデータの活用・巻末」内の「データの形式と可視化」について、pythonでの実装と及び若干の補足考察をしていきたいと思います。

#教材
[高等学校情報科「情報Ⅰ」教員研修用教材（本編）：文部科学省](https://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1416756.htm "高等学校情報科「情報Ⅰ」教員研修用教材（本編）：文部科学省")
[第4章情報通信ネットワークとデータの活用・巻末 （PDF:10284KB）](https://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/09/24/1416758_006_1.pdf "第4章情報通信ネットワークとデータの活用・巻末 （PDF:10284KB）")

#環境
- ipython
- [Colaboratory - Google Colab](https://colab.research.google.com/notebooks/welcome.ipynb "Colaboratory - Google Colab")

#今回やること
教材の学習24「データの形式と可視化」(p202-)内のRで示されている実装例をpythonに書き換えていきたいと思います。

# 前提
教材には

> 総務省統計局の身体測定のサンプルデータから，箱ひげ図とヴァイオリンプロットを作成した。

と書いてあるが、Rで読み込んでいるデータファイルが50m走の男女の結果っぽいので、こちらで適当に用意した以下のデータを使用しました。
[high_male_data.csv](https://drive.google.com/file/d/1cjb6M7Gf-ECbp8-5eXNE3oiD_lD35iAI/view?usp=sharing)

また、後半のpython実装版にて使用している"diamonds.csv"はkaggleのサイト上のものを使われていただきました。
[Diamonds - Kaggle](https://www.kaggle.com/shivam2503/diamonds "Diamonds - Kaggle")

# 質的データとその種類

## 箱ひげ図とヴァイオリンプロット

### python実装版のソースコード

```python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

gen_50 = pd.read_csv('/content/gen_50.csv')

plt.subplots_adjust(wspace=0.5)

sns.boxplot(x = 'gender', y = 'run50m', data = gen_50)
plt.show()
sns.violinplot(x = "gender", y = "run50m", data = gen_50)
plt.show()
```

ヴァイオリンプロットの描画にseabornモジュールを使ったので、箱ひげ図の描画にもseabornモジュールを使いました。

### python実装版の出力結果
![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/2e4e1e07-49d7-22fc-5e1a-a46e0a75087e.png)

![ダウンロード (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/3121710e-e1c1-0ee4-1f72-bf55c973149a.png)


### [参考]R実装版のソースコード(教材より)

```R
library( ggplot2 )
# データの読み込み
gen_50 <- read.csv("gen_50.csv")
boxplot(run50m~gender, data=gen_50)
ggplot(data=gen_50, aes(x=gender, y=run50m, color=gender)) + geom_violin()
```

ちなみに、実際の教材に書かれているソースコードは以下のようになっております。
> ![SnapCrab_NoName_2020-7-27_20-45-53_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/1c60bc3b-26b7-7090-55fa-a2b37f46b3bf.png)

ここにバグがあるのでご注意ください。
誤：boxplot(run50m~gender.data=gen_50)
正：boxplot(run50m~gender,data=gen_50)

### [参考]R実装版の出力結果
<!-- 
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/2e3d7395-f257-f707-9568-f1449b09092d.png)
-->
<img width="480" alt="ダウンロード (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/2e3d7395-f257-f707-9568-f1449b09092d.png">

<!-- 
![ダウンロード (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/bac8d0db-5625-6079-27bd-0aa0927e02f2.png)
-->
<img width="480" alt="ダウンロード (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/bac8d0db-5625-6079-27bd-0aa0927e02f2.png">

## ヒストグラムと散布図と箱ひげ図

> 　データの可視化は何のために行うのだろうか。可視化することによって，問題を発見することができ，それに対して詳細な分析や解釈，解決策を考えることができるからである。ここでは，統計解析ソフトウェア R の ggplot2 というパッケージに含まれている diamonds サンプルデータを用いて説明しよう。このデータは，実際に米国で流通したダイアモンドのカラット，カット，透明度，大きさ，価格などを含んだ数万件の大きなデータである。

### python実装版のソースコード
```python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('/content/diamonds.csv')

df_carat_lt3 = df[df['carat'] < 3]

# x軸にcarat、y軸にcount
plt.xlabel('carat')
plt.ylabel('count')

# ヒストグラムを描画する
df_carat_lt3['carat'].hist(bins=250)
plt.show()

# 散布図を描画
df_carat_lt3.plot.scatter(x = 'carat', y = 'price')
plt.show()

sns.boxplot(x = 'cut', y = 'price', data = df_carat_lt3)
plt.show()
```

### python実装版の出力結果
![ダウンロード (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/13c3724d-b91f-a4bf-edb1-e8ea053d3883.png)
![ダウンロード (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/3b32ae28-af3c-a873-ffba-ce5d49cf65de.png)

カラット数が大きくなるほど、価格もあがることがわかる。

![ダウンロード (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/f575be0b-3ae2-464d-919a-ae96c9407f05.png)

最後の図のx軸の順番があまり良い形ではないですがカットの質の順番はIdeal>Premium>Very Good>Good>Fairです。

### コメント
教材には、以下のように書かれています。
> これは不思議な現象に見えるだろう。カットの質が上がるほど，価格が下がっている。色や透明度の高さなどでも同様の逆転現象が起こる。ヒントは「交絡因子」である。交絡因子とは，対象としている 2変数と相互に相関の高い隠れた変数（因子）のことである。


これまでの結果からカラット数が高いほど価格も高いことがわかってます。
ここから考えられるのは、カラット数の大きいダイヤモンドは、カットの質が悪いものが多いということが推測されます。
（すなわちカットの質が上がるほど価格が下がっているのは、交絡因子であるカラット数等による影響があるのではないかということです）

### python実装版のソースコード(cut vs carat)
```python

sns.boxplot(x = 'cut', y = 'carat', data = df_carat_lt3)
plt.show()
```

### python実装版の出力結果(cut vs carat)
![ダウンロード (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/472f9e9f-200c-21a7-c51c-fa2f8aec2e60.png)

想定した通りであり、特に中央値をみるとカットの質が一番高いIdealのカラット数は一番低くカットの質が一番低いFairのカラット数は一番低いことがわかりました。　

このダイアモンドに関するデータ分析でもっと詳しく分析したものが見たい場合は、以下のサイト等を確認すると良いと思います。
https://www.kaggle.com/fuzzywizard/diamonds-in-depth-analysis

####ダイアモンドのカットの質について(補足)
- カットの質が上がるほど、カラットあたりのコストが増加する。
- カラット数の大きいダイヤモンド原石はより良い対称性とプロポーションを達成するためにより多くの材料が必要となり大きな無駄ができてしまう。

### [参考]R実装版のソースコード(教材より)

```R
library(ggplot2)
diamonds

smaller <- diamonds %>% filter(carat < 3)
ggplot(data = smaller, mapping = aes(x = carat)) + geom_histogram(binwidth = 0.01)

ggplot(data = diamonds) + geom_point(mapping = aes(x = carat, y = price))

ggplot(diamonds, aes(cut, price)) + geom_boxplot()
```
ちなみに、実際の教材に書かれているソースコードは以下のようになっております。

>![SnapCrab_NoName_2020-7-27_21-16-22_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/e0301c7a-5432-b7fd-7901-b29dd5663f39.png)

ここにバグがあるのでご注意ください。
誤：smaller <- diamonds %>% + filter(carat < 3)
正：smaller <- diamonds %>% filter(carat < 3)


### [参考]R実装版の出力結果

```console
A tibble: 53940 × 10
carat	cut	color	clarity	depth	table	price	x	y	z
<dbl>	<ord>	<ord>	<ord>	<dbl>	<dbl>	<int>	<dbl>	<dbl>	<dbl>
0.23	Ideal	E	SI2	61.5	55	326	3.95	3.98	2.43
0.21	Premium	E	SI1	59.8	61	326	3.89	3.84	2.31
⋮	⋮	⋮	⋮	⋮	⋮	⋮	⋮	⋮	⋮
（省略）
⋮	⋮	⋮	⋮	⋮	⋮	⋮	⋮	⋮	⋮
0.86	Premium	H	SI2	61.0	58	2757	6.15	6.12	3.74
0.75	Ideal	D	SI2	62.2	55	2757	5.83	5.87	3.64
```

<!-- 
![ダウンロード (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/d3476c5e-e167-0b06-76c3-1d439069dce0.png)
-->
<img width="480" alt="ダウンロード (5).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/d3476c5e-e167-0b06-76c3-1d439069dce0.png">

<!-- 
![ダウンロード (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/efa729dd-8c7c-7747-f404-feb02dde344e.png)
-->

<img width="480" alt="ダウンロード (6).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/efa729dd-8c7c-7747-f404-feb02dde344e.png">

<!-- 
![ダウンロード (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/91204ea8-6ded-9027-a7d1-581f38fbaab6.png)
-->

<img width="480" alt="ダウンロード (7).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677025/91204ea8-6ded-9027-a7d1-581f38fbaab6.png">

# ソースコード
python版
https://gist.github.com/ereyester/68b781bd6668005c157b300c5bf22905

R版
https://gist.github.com/ereyester/737207c4c99556850950c5b5a49dbfcc