『間違いから学ぶ実践統計解析』PDF版 のRで書かれているコードをPythonで実装していきます。
実践統計解析【第1回】
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データ準備
data_A = np.array([15, 13, 11, 13, 18, 19, 22, 21, 20, 16, 11, 16, 18, 10, 11, 12, 11, 14, 12, 11])
data_B = np.array([15, 17, 21, 23, 28, 19, 22, 24, 30, 26, 21, 19, 18,20, 21, 22, 21, 24, 22, 21])
# 平均値を計算する
print('Aさんのデータの平均値:', np.mean(data_A))
print('Bさんのデータの平均値:', np.mean(data_B))
Aさんの平均値: 14.7
Bさんの平均値: 21.7
# Aさんのデータのヒストグラムを作成する
bins = list(range(np.min(data_A), np.max(data_A) + 1, 2))
freq = pd.Series(data_A).value_counts(bins=bins).values
plt.bar(bins[:-1], freq, width=np.diff(bins), align='edge', edgecolor='black', color='w')
plt.yticks(range(0, np.max(freq) + 1, 2))
plt.title('Histogram of A')
plt.xlabel('A')
plt.ylabel('Frequency')
plt.show()
- テキストに合わせてビン幅を「2」とした
- 各ビン範囲が (a, b] となるようpandas.Series.value_countsを使用した
- 見た目を調整した
# Bさんのデータのヒストグラムを作成する
value_count = pd.Series(data_B).value_counts(bins=8, sort=False)
bins = value_count.index.values.left
freq = value_count.values
width = np.diff(bins)[0]
plt.bar(bins, freq, width=width, align='edge', edgecolor='black', color='w')
plt.xticks(range(np.min(data_B), np.max(data_B)+1, 5))
plt.yticks(range(0, np.max(freq) + 1, 2))
plt.title('Histogram of B')
plt.xlabel('B')
plt.ylabel('Frequency')
plt.show()
- テキストに合わせてビン数を「8」とした
- 各ビン範囲が (a, b] となるようpandas.Series.value_countsを使用した
- 見た目を調整した
# Aさんのデータの要約統計量を確認する
pd.Series(data_A).describe()
count 20.000000
mean 14.700000
std 3.812721
min 10.000000
25% 11.000000
50% 13.500000
75% 18.000000
max 22.000000
# Bさんのデータの要約統計量を確認する
pd.Series(data_B).describe()
count 20.000000
mean 21.700000
std 3.555574
min 15.000000
25% 19.750000
50% 21.000000
75% 23.250000
max 30.000000
# 箱ひげ図を作成する
plt.boxplot([data_A, data_B])
plt.yticks(range(np.min([np.min(data_A), np.min(data_B)]), np.max([np.max(data_A), np.max(data_B)])+1, 5))
plt.show()
# 不偏分散を計算する
# Aさんのデータ
print(np.var(data_A, ddof=1))
# Bさんのデータ
print(np.var(data_B, ddof=1))
14.53684210526316
12.642105263157896
# 不偏標準偏差を計算する
# Aさんのデータ
print(np.std(data_A, ddof=1))
# Bさんのデータ
print(np.std(data_B, ddof=1))
3.8127210893616597
3.5555738303623925
# 標準誤差を計算する
# Aさんのデータ
print(np.sqrt(np.var(data_A, ddof=1) / data_A.size))
# Bさんのデータ
print(np.sqrt(np.var(data_B, ddof=1) / data_B.size))
0.8525503535059721
0.7950504783709615
実行環境
Python 3.9.12
numpy 1.21.5
pandas 1.4.2
matplotlib 3.5.1