LoginSignup
1
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-27

はじめに

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

教材

高等学校情報科「情報Ⅰ」教員研修用教材(本編):文部科学省
第4章情報通信ネットワークとデータの活用・巻末 (PDF:10284KB)

環境

今回やること

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

前提

教材には

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

と書いてあるが、Rで読み込んでいるデータファイルが50m走の男女の結果っぽいので、こちらで適当に用意した以下のデータを使用しました。
high_male_data.csv

また、後半のpython実装版にて使用している"diamonds.csv"はkaggleのサイト上のものを使われていただきました。
Diamonds - Kaggle

質的データとその種類

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

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

ダウンロード (4).png

[参考]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

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

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

ダウンロード (1).png

ダウンロード (1).png

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

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

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
ダウンロード (9).png

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

ダウンロード (10).png

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

コメント

教材には、以下のように書かれています。

これは不思議な現象に見えるだろう。カットの質が上がるほど,価格が下がっている。色や透明度の高さなどでも同様の逆転現象が起こる。ヒントは「交絡因子」である。交絡因子とは,対象としている 2変数と相互に相関の高い隠れた変数(因子)のことである。

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

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


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

python実装版の出力結果(cut vs carat)

ダウンロード (11).png

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

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

ダイアモンドのカットの質について(補足)

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

[参考]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

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

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

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

ダウンロード (6).png

ダウンロード (7).png

ソースコード

python版
https://gist.github.com/ereyester/68b781bd6668005c157b300c5bf22905

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1