1 グラフ
以下に、ヒストグラム、棒グラフ、折れ線グラフ、散布図のPythonスクリプト例を示す。スクリプトファイルは圧縮ファイルchap1_files.zipにまとめた。ダウンロード・展開すれば自由に利用できる。Jupyter Notebook用にまとめたものは、圧縮ファイルchap1_prgs.zipとして用意した。ダウンロード展開して利用されたい。
なお、Pythonによるグラフ描画例はこのウェブサイト、あるいはこのウェブサイトでも扱っている。
本書の表1.1.1のデータの度数分布は、次のリスト1.1のスクリプトで得ることができる。
リスト1.1 度数分布を求めるスクリプト(s1_table1_1_2.py)
import numpy as np
data = [
66,
59, 62, 64, 63, 68, 65, 59, 68, 64,
65,
51, 67, 64, 83, 59, 61, 62, 57, 72,
65,
64, 54, 60, 53, 65, 67, 60, 53, 79,
74,
53, 61, 68, 75, 50, 57, 55, 66, 56,
55,
61, 70, 71, 49, 69, 70, 80, 73, 72]
def category(v):
return int((v - 44.5) / 5.0)
table = np.zeros(8, dtype = int)
for v in data:
table[category(v)] += 1
print(table)
リスト1.1のスクリプトを実行すると、以下の出力が得られる。
[ 1 6
8 12 12 7 2
2]
これは、表1.1.2に示されているものと同じである。
本書の表1.1.1のデータのヒストグラムは、次のリスト1.2のスクリプトで描くことができる。
リスト1,2ヒストグラム描画スクリプト例(s1_figure1_1_1a.py)
import matplotlib.pyplot as plt
data = [
66,
59, 62, 64, 63, 68, 65, 59, 68, 64,
65,
51, 67, 64, 83, 59, 61, 62, 57, 72,
65,
64, 54, 60, 53, 65, 67, 60, 53, 79,
74,
53, 61, 68, 75, 50, 57, 55, 66, 56,
55, 61,
70, 71, 49, 69, 70, 80, 73, 72]
plt.hist(data)
plt.show()
リスト1.2を実行すると、図1.1のグラフが表示される。
図1.1
本書の図1.1.1のようなグラフを得るために、リスト1.2のスクリプトをリスト1.3のように書き変えた。
リスト1.3 ヒストグラム描画スクリプト例(s1_figure1_1_1.py)
import numpy as np
import matplotlib.pyplot as plt
data = [
66,
59, 62, 64, 63, 68, 65, 59, 68, 64,
65,
51, 67, 64, 83, 59, 61, 62, 57, 72,
65,
64, 54, 60, 53, 65, 67, 60, 53, 79,
74,
53, 61, 68, 75, 50, 57, 55, 66, 56,
55,
61, 70, 71, 49, 69, 70, 80, 73, 72]
# 日本語表記のための設定
plt.rcParams['font.family'] = ['Yu
Gothic', 'Noto Sans CJK JP',
'Hiragino Maru Gothic Pro']
bins_v = np.linspace(45, 85, 9) # 境界値(級限界)の設定
results = plt.hist(data, bins =
bins_v)
plt.xlabel('テストの点数', fontsize = 14)
plt.ylabel('度\n数',
fontsize = 14, rotation = 0)
plt.show()
print('最小値 =', min(data), ' 最大値
=', max(data))
print('境界値;', results[1])
print('度数:', results[0])
上のスクリプトでは、グラフにおいて日本語表記をするために、コード
plt.rcParams['font.family'] = ['Yu
Gothic', 'Noto Sans CJK JP',
'Hiragino Maru Gothic Pro']
を実行している。
また、本書の図1.1.1に合わせたヒストグラムを得るために、境界値を次のコードで求めている。
bins_v = np.linspace(45, 85, 9) # 境界値(級限界)の設定
ヒストグラムを次のコード
results = plt.hist(data, bins =
bins_v)
で描くと図1.2のグラフが描かれる。
図1.2
変数resultsにより、ヒストグラム描画における境界値と各階級の度数を知ることができる。
次のコード
print('最小値 =', min(data), ' 最大値
=', max(data))
print('境界値;', results[1])
print('度数:', results[0])
の実行により、以下の内容が出力されている。
最小値 = 49 最大値 = 83
境界値; [45. 50. 55. 60. 65. 70.
75. 80. 85.]
度数: [ 1. 6.
8. 12. 12. 7. 2.
2.]
最小値が左端の境界値より大きく、最大値が右端の境界値より小さいので、全てのデータがヒストグラムに描かれていることが判る。
本書の表1.1.3のデータの棒グラフは、リスト1.4のスクリプトで描くことができる。
リスト1.4 本書の表1.1.3の棒グラフを描くスクリプト(s1_figure1_1_2a.py)
import matplotlib.pyplot as plt
reg = ['区部', '市部', '郡部', '島部']
pop = [8_469_459, 4_006_583, 59_313,
26_362]
# 日本語表記の設定
plt.rcParams['font.family'] = ['Yu
Gothic', 'Noto Sans CJK JP',
'Hiragino Maru Gothic Pro']
plt.bar(reg, pop, width = 0.4)
plt.show()
リスト1.4のスクリプトを実行すると、図1.3の棒グラフが描かれる。
図1.3
縦軸の上部に表示されている「1e6」は「」を表し、縦軸の「8」は「8000000」を表している。
本書の図1.1.2に合わせたグラフを描くために、次のリスト1.5のスクリプトを用意した。
リスト1.5 本書の図1.1.2に合わせた棒グラフを描くスクリプト(s1_figure1_1_2.py)
import matplotlib.pyplot as plt
reg = ['区部', '市部', '郡部', '島部']
pop = [8_469_459, 4_006_583, 59_313,
26_362]
# 日本語表記の設定
plt.rcParams['font.family'] = ['Yu
Gothic', 'Noto Sans CJK JP',
'Hiragino Maru Gothic Pro']
plt.bar(reg, pop, width = 0.4)
y_v = [1_000_000 * i * 2 for i in
range(6)] # 縦軸の目盛り値
y_L = ['{}'.format(v) for v in
y_v]
# 縦軸の目盛りのラベル
plt.yticks(y_v, y_L)
plt.ylabel('人 口', fontsize = 14)
for v in y_v:
plt.hlines(v, -0.2, 3.2,
alpha = 0.3)
plt.xticks(fontsize = 14)
plt.xlabel('地 域', fontsize = 14)
plt.title('東京都の人口\n', fontsize = 18)
plt.tight_layout()
# グラフの整形
plt.show()
リスト1.5のスクリプトを実行すると、図1.4のグラフが描かれる。
図1.4
本書の表1.1.4の東京都の人口の推移データは、リスト1.6のスクリプトで折れ線グラフとして表すことができる。
リスト1.6 本書の表1.1.4のデータの折れ線グラフ描画スクリプト(s1_figure1_1_3a.py)
import matplotlib.pyplot as plt
year = [1880, 1900, 1920, 1940, 1960,
1980, 2000]
pop = [959_596, 2_014_100, 3_699_428,
7_354_971,
9_683_802, 11_618_281, 12_064_101]
# 日本語表記の設定
plt.rcParams['font.family'] = ['Yu
Gothic', 'Noto Sans CJK JP',
'Hiragino
Maru Gothic Pro']
plt.plot(year, pop)
plt.show()
リスト1.6のスクリプトを実行すると図1.5の折れ線グラフが描かれる。
図1.5
図1.5のグラフを、本書の図1.1.3のグラフのように描くために、リスト1.6をリスト1.7のように加筆した。
リスト1.7 リスト1.6に加筆したスクリプト(s1_figure1_1_3.py)
import matplotlib.pyplot as plt
year = [1880, 1900, 1920, 1940, 1960,
1980, 2000]
pop = [959_596, 2_014_100, 3_699_428,
7_354_971,
9_683_802, 11_618_281, 12_064_101]
# 日本語表記の設定
plt.rcParams['font.family'] = ['Yu
Gothic', 'Noto Sans CJK JP',
'Hiragino Maru Gothic Pro']
plt.plot(year, pop)
pop_v = [2_500_000 * i for i in
range(1, 6)]
pop_L = ['{}'.format(v) for v in
pop_v]
plt.yticks(pop_v, pop_L)
plt.ylabel('人\n口',
fontsize = 14, rotation = 0)
plt.xlabel('年次', fontsize = 14)
plt.title('東京都人口推移', fontsize = 16)
plt.tight_layout()
plt.show()
リスト1.7のスクリプトを実行すると、図1.6のグラフが描かれる。
図1.6
本書の表1.2.1の体重と身長のデータの各ヒストグラムと散布図は、リスト1.8のスクリプトで描くことができる。
リスト1.8 ヒストグラムと散布図を描くスクリプト(s1_figure1_2_123a.py)
import matplotlib.pyplot as plt
data = [
(70,
168), (68, 165), (62, 159), (56, 156), (70, 170),
(64,
162), (59, 162), (70, 169), (68, 168), (69, 170),
(67,
168), (63, 166), (58, 163), (74, 170), (65, 168),
(60,
160), (65, 165), (72, 175), (61, 164), (77, 174),
(68,
164), (64, 161), (70, 166), (47, 147), (66, 165),
(68,
170), (73, 174), (74, 172), (63, 164), (83, 182),
(58,
159), (64, 166), (67, 167), (75, 174), (67, 163),
(68,
166), (68, 167), (66, 165), (63, 165), (55, 154),
(61,
163), (60, 160), (62, 164), (62, 160), (59, 160),
(51,
155), (59, 163), (68, 170), (56, 157), (79, 180)]
weight = []
height = []
for w, h in data:
weight.append(w)
height.append(h)
# 日本語表記の設定
plt.rcParams['font.family'] = ['Yu
Gothic', 'Noto Sans CJK JP',
'Hiragino Maru Gothic Pro']
plt.hist(weight)
plt.title('体重のヒストグラム', fontsize = 16)
plt.show()
plt.hist(height)
plt.title('身長のヒストグラム', fontsize = 16)
plt.show()
plt.scatter(weight, height, marker =
'o')
plt.xlabel('体重', fontsize = 14)
plt.ylabel('身\n長',
fontsize = 14, rotation = 0)
plt.title('散布図', fontsize = 16)
plt.tight_layout()
plt.show()
リスト1.8のスクリプトを実行すると、図1.7、図1.8、図1.9が順番に表示される。
図1.7
図1.8
図1.9
これらのグラフを、本書の図1.2.1〜図1.2.3に合わせるために、リスト1.8にリスト1.9のようにコードを書き加える。
リスト1.9 リスト1.8にコードを書き加えたもの(s1_figure1_2_123.py)
import matplotlib.pyplot as plt
import numpy as np
data = [
(70,
168), (68, 165), (62, 159), (56, 156), (70, 170),
(64,
162), (59, 162), (70, 169), (68, 168), (69, 170),
(67,
168), (63, 166), (58, 163), (74, 170), (65, 168),
(60,
160), (65, 165), (72, 175), (61, 164), (77, 174),
(68,
164), (64, 161), (70, 166), (47, 147), (66, 165),
(68,
170), (73, 174), (74, 172), (63, 164), (83, 182),
(58,
159), (64, 166), (67, 167), (75, 174), (67, 163),
(68,
166), (68, 167), (66, 165), (63, 165), (55, 154),
(61,
163), (60, 160), (62, 164), (62, 160), (59, 160),
(51,
155), (59, 163), (68, 170), (56, 157), (79, 180)]
weight = []
height = []
for w, h in data:
weight.append(w)
height.append(h)
print(weight)
print(height)
# 日本語表記の設定
plt.rcParams['font.family'] = ['Yu
Gothic', 'Noto Sans CJK JP',
'Hiragino Maru Gothic Pro']
bins_v1 = np.arange(45, 86, 5)
results = plt.hist(weight, bins =
bins_v1)
plt.xlabel('体重', fontsize = 14)
plt.ylabel('度\n数',
fontsize = 14, rotation = 0)
plt.title('体重のヒストグラム', fontsize = 16)
plt.tight_layout()
plt.show()
print('\n体重:')
print('最小値 =', min(weight), ' 最大値 =',
max(weight))
print('境界値:', results[1])
print('度数:', results[0])
bins_v2 = np.arange(145, 186, 5)
results = plt.hist(height, bins =
bins_v2)
plt.xlabel('身長', fontsize = 14)
plt.ylabel('度\n数',
fontsize = 14, rotation = 0)
plt.title('身長のヒストグラム', fontsize = 16)
plt.tight_layout()
plt.show()
print('\n身長:')
print('最小値 =', min(height), ' 最大値 =',
max(height))
print('境界値:', results[1])
print('度数:', results[0])
plt.scatter(weight, height, marker =
'o')
plt.xlabel('体重', fontsize = 14)
plt.ylabel('身\n長',
fontsize = 14, rotation = 0)
plt.title('散布図', fontsize = 16)
plt.tight_layout()
plt.show()
リスト1.9のスクリプトを実行すると、図1.10、図1.11、図1.12が順次表示される。
図1.10
図1.11
図1.12