放送大学「心理統計法(‘17)」第1章 データ分布の要約
- 授業ではRスクリプトを使ってますが、以下はPython3スクリプトです。
Python3のスクリプト
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import collections
from os.path import basename, dirname
#表1.1の「知覚時間」のデータ入力
data = [31.43,31.09,33.38,30.49,29.62,
35.40,32.58,28.96,29.43,28.52,
25.39,32.68,30.51,30.15,32.33,
30.43,32.50,32.07,32.35,31.57]
if __name__ == '__main__':
class_widths = np.linspace(24.5, 35.5, 12) #階級(階級幅1秒)
#class_widths = np.linspace(24.5, 35.5, 6) #階級(階級幅2秒)
class_values = [(x+y)/2.0 for x,y in zip(class_widths[:-1],class_widths[1:])] #階級値
hist, bin_edges = np.histogram(data, bins=class_widths) #度数
prob = hist / len(data) #確率
cum_hist = np.cumsum(hist) #累積度数
cum_prob = np.cumsum(prob) #累積確率
print("\n□ 表1.2 度数分布表\n")
print(" 階級値(秒), 階級(秒), 度数, 確率, 累積度数, 累積確率")
for i in range(len(class_values)):
print("%16d, %6.1f〜%0.1f, %12d, %7.2f, %13d, %11.2f" % (class_values[i], \
class_widths[i],class_widths[i+1],hist[i], \
prob[i],cum_hist[i],cum_prob[i]))
plt.title("ヒストグラム", fontsize=18)
plt.xlabel("時間(秒)", fontsize=16)
plt.ylabel("度数", fontsize=16)
plt.bar(class_values, hist)
plt.grid()
plt.savefig("%s/%s1.png" % (dirname(__file__), basename(__file__)), dpi=70)
plt.clf()
plt.title("累積度数図", fontsize=18)
plt.xlabel("時間(秒)", fontsize=16)
plt.ylabel("度数", fontsize=16)
plt.bar(class_values, cum_hist)
plt.grid()
plt.savefig("%s/%s2.png" % (dirname(__file__), basename(__file__)), dpi=70)
plt.clf()
plt.title("累積確率図", fontsize=18)
plt.xlabel("時間(秒)", fontsize=16)
plt.ylabel("確率", fontsize=16)
plt.bar(class_values, cum_prob)
plt.grid()
plt.savefig("%s/%s3.png" % (dirname(__file__), basename(__file__)), dpi=70)
plt.clf()
mean = np.mean(data) #平均値
var = np.var(data) #分散
std = np.std(data) #標準偏差
median = np.median(data) #中央値
print("\n□ 知覚時間」要約統計量(積率系)\n")
print(" 平均値:%13.3f" % mean)
print(" 分散:%18.3f" % var)
print(" 標準偏差:%11.3f" % std)
print("\n□ 知覚時間」要約統計量(分位系)\n")
print(" 小さい順に並べる")
print("\n no, 知覚時間")
for i, v in enumerate(sorted(data)):
print("% 8d, %12.2f" % (i+1, v))
print("\n 中央値:%12.3f" % median)
print(" 30%%点:%12.3f" % np.percentile(data, 30))
print(" 70%%点:%12.3f" % np.percentile(data, 70))
print("\n 階級幅1秒の最頻値\n")
print(" 階級値(秒), 度数")
for k, v in sorted(collections.Counter(np.rint(data)).items(),key=lambda x: x[1], reverse=True):
print("%18d, %10d" % (k,v))
実行の結果
□ 表1.2 度数分布表
階級値(秒), 階級(秒), 度数, 確率, 累積度数, 累積確率
25, 24.5〜25.5, 1, 0.05, 1, 0.05
26, 25.5〜26.5, 0, 0.00, 1, 0.05
27, 26.5〜27.5, 0, 0.00, 1, 0.05
28, 27.5〜28.5, 0, 0.00, 1, 0.05
29, 28.5〜29.5, 3, 0.15, 4, 0.20
30, 29.5〜30.5, 4, 0.20, 8, 0.40
31, 30.5〜31.5, 3, 0.15, 11, 0.55
32, 31.5〜32.5, 4, 0.20, 15, 0.75
33, 32.5〜33.5, 4, 0.20, 19, 0.95
34, 33.5〜34.5, 0, 0.00, 19, 0.95
35, 34.5〜35.5, 1, 0.05, 20, 1.00
□ 知覚時間」要約統計量(積率系)
平均値: 31.044
分散: 4.275
標準偏差: 2.068
□ 知覚時間」要約統計量(分位系)
小さい順に並べる
no, 知覚時間
1, 25.39
2, 28.52
3, 28.96
4, 29.43
5, 29.62
6, 30.15
7, 30.43
8, 30.49
9, 30.51
10, 31.09
11, 31.43
12, 31.57
13, 32.07
14, 32.33
15, 32.35
16, 32.50
17, 32.58
18, 32.68
19, 33.38
20, 35.40
中央値: 31.260
30%点: 30.346
70%点: 32.336
階級幅1秒の最頻値
階級値(秒), 度数
32, 5
30, 4
31, 3
33, 3
29, 3
35, 1
25, 1