第7章 線形モデル編: 第7節 ロジスティック回帰入門

はじめに

アジェンダ

・ロジスティック回帰の説明
・マクロデータを分析する(GDPを予測する)

ロジスティック回帰とは?

wikipedia引用

ロジスティック回帰(ロジスティックかいき、英: 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')

データセット

画像1

変数の説明はこんな感じです。
順に

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

出力結果は

画像2

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

画像3

解釈方法:
こちらのページに詳しく記載されておりますので、ご参照ください。

画像として保存する方法

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

この記事が気に入ったらサポートをしてみませんか?