In [1]:
%matplotlib inline
In [2]:
# -*- coding:utf-8 -*-
from __future__ import print_function
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.stattools import durbin_watson
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
In [3]:
# データ読み込み
data = pd.read_csv('example/k0501.csv')
data
Out[3]:
In [4]:
# 説明変数設定
X = data[['X']]
X = sm.add_constant(X)
X
Out[4]:
In [5]:
# 被説明変数設定
Y = data['Y']
Y
Out[5]:
In [6]:
# OLSの実行(Ordinary Least Squares: 最小二乗法)
model = sm.OLS(Y,X)
results = model.fit()
print(results.summary())
In [7]:
# グラフ生成
plt.plot(data["X"], data["Y"], 'o', label="data")
plt.plot(data["X"], results.fittedvalues, label="OLS")
plt.xlim(min(data["X"])-1, max(data["X"])+1)
plt.ylim(min(data["Y"])-1, max(data["Y"])+1)
plt.title('5-1: Auto Correlation')
plt.legend(loc=2)
plt.show()
Durbin-Watson: 2.029となり、2に近い値であり、自己相関がないと結論出来る。
DW統計量に対応するP値を求めることがPythonではおそらくできない(Excelでも出来ない)ため、ダービン=ワトソン統計量の分布表を利用して有意性の検定を行います。
この場合、標本の大きさ=10, 定数項を除いた説明変数の数=1なので、有意水準1%において、下限分布ではDW=0.604, 上限分布ではDW=1.001が有意となる境界、有意水準5%において、下限分布ではDW=0.879, 上限分布ではDW=1.320が有意となる境界です。(詳しくは本書の表を参考にしてください。)
In [8]:
# データ読み込み
data = pd.read_csv('example/k0502.csv')
data
Out[8]:
In [9]:
# 説明変数設定
X = data[['X']]
X = sm.add_constant(X)
# 被説明変数設定
Y = data['Y']
# OLSの実行(Ordinary Least Squares: 最小二乗法)
model = sm.OLS(Y,X)
results = model.fit()
print(results.summary())
# グラフ生成
plt.plot(data["X"], data["Y"], 'o', label="data")
plt.plot(data["X"], results.fittedvalues, label="OLS")
plt.xlim(min(data["X"])-1, max(data["X"])+1)
plt.ylim(min(data["Y"])-1, max(data["Y"])+1)
plt.title('5-2: Auto Correlation')
plt.legend(loc=2)
plt.show()
DW=1.094となり、上限分布において有意水準5%でも帰無仮説を棄却することができ、自己相関が存在すると結論することができる。
In [10]:
data['dX'] = np.nan
data['dY'] = np.nan
for i in range(len(data)):
if i == 0:
data['dX'][i] = np.nan
data['dY'][i] = np.nan
else:
data['dX'][i] = data['X'][i] - data['X'][i-1]
data['dY'][i] = data['Y'][i] - data['Y'][i-1]
data
Out[10]:
In [11]:
# 説明変数設定
X = data['dX'][1:]
X = sm.add_constant(X)
# 被説明変数設定
Y = data['dY'][1:]
# OLSの実行(Ordinary Least Squares: 最小二乗法)
model = sm.OLS(Y,X)
results = model.fit()
print(results.summary())
# グラフ生成
plt.plot(data["dX"], data["dY"], 'o', label="data")
plt.plot(data["dX"][1:], results.fittedvalues, label="OLS")
plt.xlim(min(data["dX"][1:])-0.5, max(data["dX"][1:])+0.5)
plt.ylim(min(data["dY"][1:])-0.5, max(data["dY"][1:])+0.5)
plt.title('5-3: Auto Correlation')
plt.legend(loc=2)
plt.show()