はじめに
こんにちは。ソリューション開発ユニットの若鶴です。
JIMS109で発表する際に、Pythonのstatsmodelsというライブラリを使用し、いくつかの回帰結果を比較しました。
その際に関数を作成したので、ここで共有させてもらいます。
この記事の対象者
今回の記事は、次の悩みを持つ人を対象に執筆しています。
- 被説明変数にゼロが多いデータの回帰分析を、Pythonで行いたい
- 回帰結果を簡単に比較するために、少ない手間で結果を出力したい
この記事を読むうえで、必要な知識
また、この記事を読むうえでは、次の知識が必要となります。
- 統計学や回帰分析の基礎知識を習得している
- Pythonによるデータ分析の基礎知識を習得している
回帰分析やPython の基礎知識については、以下の書籍で勉強できます。
※ 統計学や回帰分析の基礎知識習得のための、おすすめ書籍
改訂版 日本統計学会公式認定 統計検定2級対応 統計学基礎
計量経済学
※ Pythonによるデータ分析の基礎知識習得のための、おすすめ書籍
入門 Python 3
Pythonによるデータ分析入門
本記事のコードで実施できること
①説明変数のリスト、②被説明変数の列名、③回帰モデル を選択すると、結果が出力される関数を作成しました。
- 選択できる回帰モデル:
- ロジスティック回帰モデル
- ポアソン回帰モデル
- 負の二項回帰モデル
- 出力結果:
- AIC値
- 回帰結果のサマリー
- 変数の相関行列
コード
# 回帰分析の結果と相関行列を出力する関数 # 回帰分析は、'ロジスティック回帰','ポアソン回帰','負の二項回帰'から選択 def regression(x_list,y_col,df,reg='ロジスティック回帰'): # nanを削除 df_reg=df.copy() df_reg.dropna(axis=0,how="any",inplace=True) df_reg.reset_index(drop=True,inplace=True) # Xとyを設定 y=df_reg[y_col].copy() X=df_reg[x_list].copy() if reg == 'ロジスティック回帰': # 値を0と1に変換する。今回は、値が0の場合は0、1以上の場合は1に設定する y=y.apply(lambda x: 1 if x>=1 else 0) #ロジスティック回帰を実施 model = sm.Logit(y, sm.add_constant(X)) result = model.fit(disp=0) elif reg == 'ポアソン回帰': # ポアソン回帰を実施 model = sm.GLM(y, sm.add_constant(X), family=sm.families.Poisson()) result = model.fit() elif reg == '負の二項回帰': # 負の二項回帰を実施 model = sm.GLM(y, sm.add_constant(X), family=sm.families.NegativeBinomial()) result = model.fit() else: # 回帰モデル名が異なっている場合は、処理を終了する print('回帰モデルを正確に入力ください。処理を終了します。') sys.exit() # 回帰結果の出力 print('モデル名:{}'.format(reg)) print('AIC:\t{}\n'.format(result.aic.round())) print('-'*20) print('回帰結果') display(result.summary()) print('-'*20) # 相関行列の出力 x_list.insert(0,y_col) print('相関行列') display(show_corr(x_list,df)) return
具体例
ここからは、Scikit-learnで提供されているワインのデータセットを用いて、一例として、ロジスティック回帰について具体的に見ていきます。
コード
import sys import pandas as pd import statsmodels.api as sm from sklearn.datasets import load_wine #データの読み込み dataset = load_wine() df = pd.DataFrame(data=dataset.data, columns=dataset.feature_names) df['class'] = dataset.target # xとyの指定 x_col=['alcohol', 'malic_acid', 'ash'] y_col='class' # 関数の実行 regression(x_col, y_col, df, reg='ロジスティック回帰')
出力結果
上のコードを実行すると、以下のように結果が出力されます。
おわりに
学会発表のために分析をしていると、
「回帰モデルごとのAICを比較したい」「この説明変数を加えて(減らして)みてはどうか?」
というように、モデルの微調整を頻繁に行います。
今回作成したregression関数を使用すると比較的簡単に調整できますので、興味があれば試してみてください!