statsmodels 0.13.5 時点の情報。

概要

統計モデルを使って推定・検定・探索ができるライブラリ。

インストール

$ pip install statsmodels

使い方

import statsmodels.api as sm

R データセット取得

ds = sm.datasets.get_rdataset("Guerry", "HistData")
# <class 'statsmodels.datasets.utils.Dataset'>
df = ds.data
# <class 'pandas.core.frame.DataFrame'>

参照:https://vincentarelbundock.github.io/Rdatasets/articles/data.html

Package Item 内容
HistData Guerry  
     
     
     
     
     

線形回帰モデルの適用

df_part = df[['Lottery', 'Wealth']]
df_part = df_part.dropna()  # 無効なデータのある行を削除
y = df_part['Lottery']
x = df_part['Wealth']

x1 = sm.add_constant(x)  # 定数項 (1.0) を加えて原点を通らない直線への回帰に対応
model = sm.OLS(y, x1)  # 線形回帰モデルを定義
results = model.fit()

print(results.params)
"""
const     22.592339
Wealth     0.480636
"""

from matplotlib import pyplot as plt
plt.xlabel('Wealth')
plt.ylabel('Lottery')
plt.scatter(x, y, label='real')
plt.plot(x, results.predict(x1), label='predicted')
plt.legend()
plt.show()

Figure_1

グラフの描画

Q-Q プロット

正規分布の Q-Q プロットを行う例。

from scipy import stats

# 使用するデータ(ナイル川の年間流量の推移)の読み込み
ds = sm.datasets.get_rdataset("Nile", "datasets")
df = ds.data
mu = df['value'].mean()
sigma = df['value'].std()

fig = sm.qqplot(df['value'], dist=stats.norm, loc=mu, scale=sigma, marker='.', line='45')
plt.grid()
plt.show()

Figure_1

時系列データ

# 使用するデータ(ナイル川の年間流量の推移)の読み込み
ds = sm.datasets.get_rdataset("Nile", "datasets")
df = ds.data
print(df)
"""
    time  value
0   1871   1120
1   1872   1160
2   1873    963
3   1874   1210
4   1875   1160
..   ...    ...
95  1966    746
96  1967    919
97  1968    718
98  1969    714
99  1970    740
"""

# 描画してみる
from matplotlib import pyplot as plt
plt.xlabel('year')
plt.ylabel('flow [$10^8 m^3$]')
plt.plot(df['time'], df['value'])
plt.grid()
plt.show()

Figure_1

fig, ax = plt.subplots(1, 2, figsize=(8, 3))
# 自己相関係数の描画
sm.graphics.tsa.plot_acf(df['value'], ax=ax[0], lags=49, marker='.')
ax[0].grid()
# 偏自己相関係数の描画
sm.graphics.tsa.plot_pacf(df['value'], ax=ax[1], lags=49, marker='.')
ax[1].grid()
plt.show()

Figure_1