正規分布に従うかの検定

やりたいこと

抽出データが正規分布に従うか、を以下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)

f:id:iiiiikamirin:20201014102930p:plain

正規分布か確認

ヒストグラム

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')

f:id:iiiiikamirin:20201014102116p:plain

あんまりヒストグラムをみてきた経験はないのでよくわからん

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')

f:id:iiiiikamirin:20201014103410p:plain f:id:iiiiikamirin:20201014103422p:plain f:id:iiiiikamirin:20201014103431p:plain

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))

f:id:iiiiikamirin:20201014105749p:plain

有意水準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))

f:id:iiiiikamirin:20201014110710p:plain