【初心者用】Pythonでできる統計手法|ロジスティック回帰分析

スポンサーリンク
Python
【2021年】ゼロから統計学を独学したい人が読むべき書籍10冊
データサイエンスについて興味があり、統計学を学びたいけど、どんな学習方法がいいか分からない 統計学を独学するために必要な書籍が知りたい 統計...
【初心者】Rと統計学をいっぺんに学ぶ最初の5冊
Rとはオープンソースの統計解析用のプログラミング言語です。 誰でも無料で使えます。統計解析にはSPSSやSASなどが有名ですが、いずれも有料です。大学や研究機関でないと使えないですね。個人でも統計解析できた方が、職場に依存せずにス...

Pythonはデータ分析を行う上で、必要なプログラミング言語ですが、主には機械学習で用いられます。しかし、データ分析には統計学も重要です。特に、ロジスティクス回帰分析は非常に使い勝手が良く、ビジネスでもよく使われています。機械学習でもロジスティック回帰分析は使われますが、その用途は予測に使われることが多いです。

【初心者】コピペでできるロジスティック回帰

統計学ではデータの解釈や説明に使われます。
今回は、統計学の観点からロジスティック回帰分析をPythonを使って実装して理解を深めていきましょう。

【初心者用】Pythonでできる統計手法|重回帰分析

重回帰分析|初心者や文系素人でも直感的に理解できる

必要なライブラリをインポート

import pandas as pd
import numpy as np
from sklearn.datasets import load_breast_cancer
import statsmodels.api as sm

import warnings
warnings.filterwarnings("ignore")

データは scikit-learn のデータセットである乳がんガンのデータ(cancer)を使って説明していきます。

ロジスティック回帰分析は scikit-learn でもできますが、統計に特化するなら statsmodels を使ったほうが簡単です。

では、乳がんのデータセットを1つのデータフレームの形に整えます。

cancer=load_breast_cancer()
df_cancer = pd.DataFrame(cancer.data, columns=cancer.feature_names)
df_cancer['cancer']=cancer.target
df_cancer

出力:

569行、31列のデータフレームになっています。

データの前処理

では、このデータフレームをロジスティック回帰分析ができるように前処理(データを整える)していきます。

前処理は適切に行わないと、分析結果が間違うことがあるので、慎重に行わなければなりませんが、今回は、割愛しでロジスティック回帰分析のみに焦点を当てて説明してきます。

X = df_cancer[["mean area", "area error", "worst perimeter", "worst area"]]
y = df_cancer["cancer"]

X = sm.add_constant(X)

目的変数を、乳がんの有無(陰性/陽性)である「cancer」としますので、これを「y」とします。

説明変数は、変数「mean area」「area error」「worst perimeter」「worst area」の4つとします。この説明変数の選択には特に大きな意味はありません。多すぎると煩雑になるので、レうとして選択したと思って下さい。

一番下のコードは、すべての値が、1.0 である列を作成しています。これは、切片を作るために必要な処理です。重回帰分析では切片が必要です。相当特殊な場合は切片を設けないことがあるかもしれませんが、わたしは知りません。

では、各変数を確認してみましょう。

y

出力:


yには「cancer」が入っています。ロジスティック回帰分析の目的変数は、1か0の二値変数です。

ロジスティック回帰分析は二値変数を分類するモデルです。

次に、説明変数である「x」を見てみましょう。

x

出力:

指定した変数が生じされました。回帰分析でも使用しましたが、ロジスティック回帰分析でも切片の設定が必要です。

X = sm.add_constant(X)
X

出力:


Xには説明変数の4つと、「const」という変数があります。「const」は切片を設定するためのもので、データはすべて 1.0 になっています。

機械学習では予測を重視しますので、学習データとテストデータに分割して、学習データのみを回帰分析します。

統計学ではデータの説明を重視するため、すべてのデータを使って回帰分析します。ここは、用途に合わせて分割するしないを判断して下さい。

ロジスティック回帰分析

model = sm.Logit(y, X)
result = model.fit()

以上でロジスティック回帰分析が完了です。非常に簡単ですね。
1行目で目的変数と説明編巣を指定したモデルを作成します。

2行目でそのモデルを適応させて、「result」とします。

結果の確認

result.summary()

出力:


いっぱい出力結果がありますが、とりあえず最低限のものだけ解説します。

Ⓐは、疑似的な決定係数(R²)です。基本的に決定係数の計算はできないので、無理やり算出すると、こうなるよ、といった程度の解釈でいいと思います。数値が1に近いほど目的変数に対する説明変数の説明力が強いといった意味です。

Ⓑは、係数です。数値が+なら、その変数の数値が上がれば、目的変数が1(陽性)になる確率が上がる。数値が-なら、その変数の数値が上がれば、目的変数が0(陰性)になる確率が上がる。ということを意味します。数値の大小は、説明変数の単位によって異なるため、解釈に注意が必要です。

Ⓒは、P値のことで、「各変数の回帰係数が0である」という帰無仮説のもとで、今回の回帰係数が得られる確率を表しています。慣習的に0.05未満であれば、「有意差がある」ということになります。

ロジスティック回帰分析の結果は以下の方法でも可能です。わたしは、下の方法を多用しています。

result.summary2()

出力:

こちらであれば、AICやBICなども算出されます。

ロジスティック回帰分析において、説明変数の説明力は、オッズ比を使用することが多いです。

オッズ比の算出

オッズ比を出力してみましょう。

np.exp(result.params)

出力:

オッズ比の算出には、係数に対して、numpy の exp() を使います。

これが、オッズ比になります。

1以上であれば、大きくなると、目的変数が1に近づく。

「mean area」であれば、1増えるごとにオッズが1.02倍になる。

1未満であれば、大きくなると、目的変数が0に近づく。

「worst perimeter」であれば、1増えるごとにオッズが0.79倍になる(つまり、小さくなる)。

割合を算出

では、割合を算出してみましょう。

オッズ比 ÷ (1+オッズ比) で計算できます。

np.exp(result.params) / (1 + np.exp(result.params))

出力:

これで割合が算出されます。

重回帰分析|初心者や文系素人でも直感的に理解できる

Pythonで2群間の差を検定する方法
今回は、Pythonを使った統計手法として、2群間の差の検定をする方法をコードとともに見ていきましょう。 統計学はRを使うことが多くなりますが、簡単な統計手法であれば、Pythonでも十分できます。 Pythonの環境設...
【2021年】ゼロから統計学を独学したい人が読むべき書籍10冊
データサイエンスについて興味があり、統計学を学びたいけど、どんな学習方法がいいか分からない 統計学を独学するために必要な書籍が知りたい 統計...

コメント

タイトルとURLをコピーしました