正規分布に従うかの検定
やりたいこと
抽出データが正規分布に従うか、を以下3通りの方法で確認。
- Q-Qプロット
- Shapiro-Wilk検定
- Kolmogorov-Smirnov検定
参考サイト
【Python】正規分布に従っているかを調べる手法3種 | データ分析Navi| データ分析Navi
使用データ
USDJPY, AUDUSD, USDMXNの3種類の為替データ
期間:2010/1/4 ~ 2020/9/30
log_return = np.log(price).diff().dropna() log_return *= 100. # % log_return.head(5)
正規分布か確認
ヒストグラム
fig = plt.figure(figsize = (12, 4)) ax1 = fig.add_subplot(1,3,1) ax1 = sns.distplot(log_return['USDJPY'], kde = True, bins = 20) ax2 = fig.add_subplot(1,3,2) ax2 = sns.distplot(log_return['AUDUSD'], kde = True, bins = 20) ax3 = fig.add_subplot(1,3,3) ax3 = sns.distplot(log_return['USDMXN'], kde = True, bins = 20) fig.savefig('output/fig.png')
あんまりヒストグラムをみてきた経験はないのでよくわからん
Q-Qプロット
plt.figure() stats.probplot(log_return['USDJPY'], dist = 'norm', plot = plt) plt.title('Probability Plot(USDJPY)') plt.savefig('output/fig0.png') plt.figure() stats.probplot(log_return['AUDUSD'], dist = 'norm', plot = plt) plt.title('Probability Plot(AUDUSD)') plt.savefig('output/fig1.png') plt.figure() stats.probplot(log_return['USDMXN'], dist = 'norm', plot = plt) plt.title('Probability Plot(USDMXN)') plt.savefig('output/fig2.png')
Shapiro-Wilk検定
p_USDJPY = stats.shapiro(log_return['USDJPY'])[1] p_AUDUSD = stats.shapiro(log_return['AUDUSD'])[1] p_USDMXN = stats.shapiro(log_return['USDMXN'])[1] print('USDJPY p_value: {}'.format(p_USDJPY)) print('AUDUSD p_value: {}'.format(p_AUDUSD)) print('USDMXN p_value: {}'.format(p_USDMXN))
有意水準5%としても、全部帰無仮説は棄却。3つとも正規分布に従うとはいえない。
Kolmogorov-Smirnov検定
データ数が多い(目安1000個)場合はこれもいい。(今回は2800ほど)
p_USDJPY = stats.kstest(log_return['USDJPY'], 'norm')[1] p_USDJPY = stats.kstest(log_return['AUDUSD'], 'norm')[1] p_USDJPY = stats.kstest(log_return['USDMXN'], 'norm')[1] print('USDJPY p_value: {}'.format(p_USDJPY)) print('AUDUSD p_value: {}'.format(p_AUDUSD)) print('USDMXN p_value: {}'.format(p_USDMXN))