あれもPython,これもPython

Pythonメモ※本サイトはアフィリエイトを利用しています

データサイエンスをPythonで試す(4_ロジスティック回帰)

今回は第六章のロジスティック回帰分析です。
参考にしているのは毎度おなじみのこちらの書籍です。(書籍内のコードはRです)

手を動かしながら学ぶ ビジネスに活かすデータマイニング

手を動かしながら学ぶ ビジネスに活かすデータマイニング

今回もRのコードだったものをPythonに変更していきます。
ロジスティック回帰は結構使い勝手が良いので、しっかりと身につけたい所です。
ちなみに、今回も定番のsklearnではなくOrangeというモジュールを使用していきます。
日本語の情報が少ないので、結構、勉強が大変です。

準備

import pandas as pd
import numpy as np
import Orange

重回帰分析の回と同様に、
細かいデータがみたいので、
Orangeを使用します。

データの準備

cv = pd.read_csv("ch6_4_2.txt",sep = " ")
cv.head()

# d21   d22 d23 d24 d25 d26 cv
#0  1   0   1   1   0   1   1
#1  0   1   0   1   1   0   0
#2  1   0   1   0   1   1   1
#3  0   1   0   0   1   0   0
#4  1   0   0   1   1   1   1

行動とコンバージョンのログデータのようですね。
どのような行動をとるとコンバージョンと結びつくか、
をロジスティック回帰で分析します。

今回もorangeのdomainを用意します。
今回は0,1のデータですが、
数値ではなく二値カテゴリカルデータなので、
Discrete型を使用します。

これは事前に、格納できるカテゴリーの定義が必要です。

header = [Orange.feature.Discrete(h) for h in cv.columns]

# カテゴリを定義
for h in header:
    h.add_value("1")
    h.add_value("0")

domain = Orange.data.Domain(header)

func = lambda x:map(str,x)
cv2 = Orange.data.Table(domain,map(func,np.array(cv)))

Descreteは文字列型を受け取るので、
事前に文字列に変換するヘルパーをlambdaで作りました。

モデリングと確認

learner = Orange.classification.logreg.LogRegLearner()
classifier = learner(cv2)

print Orange.classification.logreg.dump(classifier)

とすると、以下の様に変数ごとのデータを見ることができます。

class attribute = cv
class values = <1, 0>

Feature       beta  st. error     wald Z          P OR=exp(beta)

Intercept      -1.88       1.07      -1.77       0.08
d21=0       2.06       0.92       2.24       0.03 7.81e0
d22=1       1.76       0.79       2.23       0.03 5.81e0
d23=0      -0.21       0.65      -0.33       0.74 8.07e-1
d24=1      -0.30       0.89      -0.34       0.74 7.41e-1
d25=0      -0.37       0.64      -0.58       0.56 6.88e-1
d26=0       1.43       0.68       2.10       0.04 4.16e0

少し気を付けなくてはいけないのは、
変数名の横に=0や=1と書いてある所。
これはこの値に対して、betaやzが正負であることを意味しています。

d21=0なので、0方向に対しては、betaが正だけど、
d22は=1なので、1に対しては正だが、0に対しては負ということになります。
(分かりにくい)

今回はここまで。

書籍内では、被説明変数を連続値にしてやる方法もあったけれど、
Pythonではその方法がわからず。。。

前回の記事はこちら

esu-ko.hatenablog.com