CCCMKホールディングス TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

Pythonのstatsmodelsを用いて、ロジスティック回帰・ポアソン回帰・負の二項回帰の結果を簡単に出力する

はじめに

こんにちは。ソリューション開発ユニットの若鶴です。

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='ロジスティック回帰')

出力結果

上のコードを実行すると、以下のように結果が出力されます。


f:id:m_wakatsuru:20210617074238p:plain

おわりに

学会発表のために分析をしていると、 「回帰モデルごとのAICを比較したい」「この説明変数を加えて(減らして)みてはどうか?」 というように、モデルの微調整を頻繁に行います。

今回作成したregression関数を使用すると比較的簡単に調整できますので、興味があれば試してみてください!