本記事では、データ分析において重要な役割を果たす正規性検定について説明し、Pythonを用いた具体的な実装方法を紹介します。具体的には、ヒストグラムとQ-Qプロットの作成、そして正規性検定(ダゴスティーノの歪度/尖度検定、オムニバス検定、コルモゴロフ=スミルノフ検定、シャピロ=ウィルク検定)を取り上げます。
ヒストグラムの描画
ヒストグラムは、データの分布を可視化するためのツールです。Pythonでは、matplotlibのhist関数を使って簡単に描画できます。
import matplotlib.pyplot as plt
import numpy as np
# データ生成
data = np.random.normal(0, 1, 1000)
# ヒストグラムの描画
plt.hist(data, bins=30)
plt.show()
Q-Qプロットの描画
Q-Qプロットは、データの分布が特定の理論分布(ここでは正規分布)に従っているかを視覚的に判断するためのツールです。Pythonでは、scipyのprobplot関数を使って描画できます。
import scipy.stats as stats
# Q-Qプロットの描画
stats.probplot(data, dist="norm", plot=plt)
plt.show()
正規性の検定
ダゴスティーノの歪度/尖度検定
歪度と尖度はデータの形状を特徴付ける指標です。ダゴスティーノの歪度/尖度検定は、これらを基にデータが正規分布からどれほどずれているかを検定します。scipyのskewtestおよびkurtosistest関数を用います。
### 歪度の検定
skewness, skew_p_value = stats.skewtest(data)
print(f'Skewness test statistic: {skewness}, p-value: {skew_p_value}')
### 尖度の検定
kurtosis, kurt_p_value = stats.kurtosistest(data)
print(f'Kurtosis test statistic: {kurtosis}, p-value: {kurt_p_value}')
オムニバス検定
オムニバス検定は、歪度と尖度の両方を考慮して正規性を検定します。scipyのnormaltest関数を使います。
以下のコードでは、正規分布からランダムに生成した1000個のデータをテストしています。検定統計量とp値が出力されます。p値が一定の閾値(一般的には0.05)以下であれば、そのデータが正規分布に従っていないと判断します。
from scipy import stats
# データ生成
data = stats.norm.rvs(size=1000)
# オムニバス検定の実行
k2, omnibus_p_value = stats.normaltest(data)
print(f'Omnibus test statistic: {k2}, p-value: {omnibus_p_value}')
コルモゴロフ=スミルノフ検定
コルモゴロフ=スミルノフ検定は、サンプル分布と理論分布が同じかを検定します。scipyのkstest
関数を使います。
ks_statistic, ks_p_value = stats.kstest(data, 'norm')
print(f'K-S test statistic: {ks_statistic}, p-value: {ks_p_value}')
シャピロ=ウィルク検定
シャピロ=ウィルク検定は、データが正規分布に従っているかを検定します。scipyのshapiro関数を使います。
W, shapiro_p_value = stats.shapiro(data)
print(f'Shapiro-Wilk test statistic: {W}, p-value: {shapiro_p_value}')
有用なデータ分析の場面
正規性検定はデータ分析の様々な場面で活用されます。例えば、A/Bテストにおける結果の分析、統計的仮説検定、回帰分析など、多くの統計的手法はデータの正規性を前提としています。また、データの特性を理解するためにも、その分布の形状を確認することは有用です。