第7章 線形モデル編: 第7節 ロジスティック回帰入門
はじめに
アジェンダ
・ロジスティック回帰の説明
・マクロデータを分析する(GDPを予測する)
ロジスティック回帰とは?
ロジスティック回帰(ロジスティックかいき、英: Logistic regression)は、ベルヌーイ分布に従う変数の統計的回帰モデルの一種である。連結関数としてロジットを使用する一般化線形モデル (GLM) の一種でもある。1958年にデイヴィッド・コックスが発表した。確率の回帰であり、統計学の分類に主に使われる。医学や社会科学でもよく使われる。
モデルは同じく1958年に発表された単純パーセプトロンと等価であるが、scikit-learnなどでは、パラメータを決める最適化問題で確率的勾配降下法を使用する物をパーセプトロンと呼び、座標降下法や準ニュートン法などを使用する物をロジスティック回帰と呼んでいる。
二値分類問題に使います。株価の場合、上がっていれば1,下がっていれば0というようなときにこちらのモデルを使います。今回はマクロデータを用いて、株価が上がるのか下がるのかについて見ていきたいと思います。
インポートと設定
%matplotlib inline
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
データセット
変数の説明はこんな感じです。
順に
・GDP
・消費支出指数
・国内総投資
・連邦消費支出総投資
・可処分個人所得
・通貨供給量
・月単位財務省証券(短期債券)
・季節性調整失業率
・インフレ率
・金利
statsmodels.apiからマクロデータを一気に取得できます。
data = pd.DataFrame(sm.datasets.macrodata.load().data)
data.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 203 entries, 0 to 202
Data columns (total 14 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 year 203 non-null float64
1 quarter 203 non-null float64
2 realgdp 203 non-null float64
3 realcons 203 non-null float64
4 realinv 203 non-null float64
5 realgovt 203 non-null float64
6 realdpi 203 non-null float64
7 cpi 203 non-null float64
8 m1 203 non-null float64
9 tbilrate 203 non-null float64
10 unemp 203 non-null float64
11 pop 203 non-null float64
12 infl 203 non-null float64
13 realint 203 non-null float64
dtypes: float64(14)
memory usage: 22.3 KB
'''
目的
実質GDPの年間成長率が上がるか下がるかを予測する。
データ処理
バイナリ(1か0)の目的変数を取得するには、四半期ごとの実質GDPの年間成長率の20四半期の移動平均を計算します。次に、現在の成長が移動平均を超える場合は1を割り当て、それ以外の場合は0を割り当てます。最後に、指標変数をシフトして、次の四半期の結果を現在の四半期に合わせます。
data['growth_rate'] = data.realgdp.pct_change(4)
data['target'] = (data.growth_rate > data.growth_rate.rolling(20).mean()).astype(int).shift(-1)
data.quarter = data.quarter.astype(int)
pct_cols = ['realcons', 'realinv', 'realgovt', 'realdpi', 'm1']
drop_cols = ['year', 'realgdp', 'pop', 'cpi', 'growth_rate']
data.loc[:, pct_cols] = data.loc[:, pct_cols].pct_change(4)
data = pd.get_dummies(data.drop(drop_cols, axis=1), columns=['quarter'], drop_first=True).dropna()
出力結果は
targetを0か1のバイナリーデータに出来ましたね。その他の生値データ[国内消費支出、国内総投資、マネーサプライ等]は4期分の変化率に直しました。
最終的には13変数(198観測値)になります。
statsmodels.apiを用いてサマリーを出力
model = sm.Logit(data.target, sm.add_constant(data.drop('target', axis=1)))
result = model.fit()
result.summary()
解釈方法:
こちらのページに詳しく記載されておりますので、ご参照ください。
画像として保存する方法
plt.rc('figure', figsize=(12, 7))
plt.text(0.01, 0.05, str(result.summary()), {'fontsize': 14}, fontproperties = 'monospace')
plt.axis('off')
plt.tight_layout()
plt.subplots_adjust(left=0.2, right=0.8, top=0.8, bottom=0.1)
plt.savefig('logistic_example.png', bbox_inches='tight', dpi=300);
この記事が気に入ったらサポートをしてみませんか?