QQプロットについて
概要
- QQプロットは、2つのデータセットが同一の分布に従うかを視覚的に家人するためのグラフ
- 多くは正規分布に従うかを確認するために使用される
- 他の分布についても同様の手法で確認可能
正規表現のQQプロットの手順
- サンプルデータを昇順に並べ替える
- 理想的な正規分布から値を抽出し、昇順に並べ替える
- 双方のデータの分位数を求め、プロットする
- 分布が正規分布に従っている場合、プロットは直線(45度)に近い形状になる
numpyでの実装
import numpy as np
import matplotlib.pyplot as plt
# サンプルデータの生成 (正規分布に従う乱数を500個生成)
np.random.seed(0) # 結果の再現性のため
sample_data = np.random.normal(loc=0, scale=1, size=500)
# サンプルデータをソート
sorted_sample = np.sort(sample_data)
# 理論的な正規分布の分位数を計算
norm_quantiles = np.linspace(0, 1, len(sorted_sample) + 2)[1:-1]
theoretical_quantiles = np.quantile(np.random.normal(loc=0, scale=1, size=10000), norm_quantiles)
# QQプロットの描画
plt.figure(figsize=(8, 8))
plt.plot(theoretical_quantiles, sorted_sample, "o", label="Sample Quantiles")
plt.plot(theoretical_quantiles, theoretical_quantiles, 'r--', label="Theoretical Quantiles")
plt.xlabel('Theoretical Quantiles')
plt.ylabel('Sample Quantiles')
plt.title('QQ Plot')
plt.legend()
plt.show()
statsmodelsでの実装(デフォルトで正規分布のQQプロットを描画)
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
# サンプルデータの生成 (正規分布に従う乱数を500個生成)
np.random.seed(0)
sample_data = np.random.normal(loc=0, scale=1, size=500)
# QQプロットの作成 (デフォルトでは正規分布と比較される)
fig = sm.qqplot(sample_data, line='45')
plt.title('QQ Plot')
plt.show()