【Python】臨床研究のための医学統計/ロジスティック回帰

この記事をシェアする

 

はじめに

今回はPythonで行うロジスティック回帰について記事にしたいと思います。

sklearnを使用して作成していきます。

今回もJupyter-Notebookを使用します。

そもそも「ロジスティック回帰」が分からないという方は、下記のブログが分かりやすかったので参照してください。

ww.gixo.jp

Pythonで学ぶあたらしい統計学の教科書

Pythonで学ぶあたらしい統計学の教科書

 

 

sklearnを使用してロジスティック回帰!

まずは必要なものをインポート!

f:id:Medicmed:20180608054832p:plain

おまじないみたいなものです。

そのうち慣れます。

今回はロジスティック回帰を行うので

sklearn.linear_modelから「LogisticRegression」をインポートします。

作成したモデルの予測精度を測定する際に便利なmetricsもインポートしておきます。

 

ロジスティック回帰のグラフを作成する!

f:id:Medicmed:20180608055100p:plain

ロジスティック回帰とは?ってなるのでまずグラフを作成します。

ロジスティック回帰のグラフを作成する関数を定義しておきます。

f:id:Medicmed:20180608055235p:plain

作成したグラフはこのようになりました。

ロジスティック回帰ですね。

イメージがわいたと思うので、データを用いてロジスティック回帰モデルを作っていきたいと思います。

今回も使用するデータは、日本統計学会の公式サイトに掲載されているダウンロード用データです。

日本統計学会公式認定 統計検定2級対応 統計学基礎

 

日本統計学会公式認定 統計検定 1級・準1級 公式問題集[2016〜2017年]

日本統計学会公式認定 統計検定 1級・準1級 公式問題集[2016〜2017年]

 

 

データを読み込む!

f:id:Medicmed:20180608055718p:plain

"Mansion2.data"を今回は使用します。

列名が日本語なので英語に変換します。

 

describe()を使用して主な要約統計量をチェックする!

f:id:Medicmed:20180608055914p:plain

ロジスティック回帰は目的変数が2値データなので、家賃の中央値に着目して「家賃が8900円より高いかどうか」を目的変数にしたいと思います。

 

家賃の中央値から2値データを作成する!

f:id:Medicmed:20180608060302p:plain

家賃を中央値で2値データに分けるために、「price_check(x)」関数を定義します。

これを"p_line"としてmansion変数に新しく追加します。

f:id:Medicmed:20180608060510p:plain

groupby()を使用すると、"p_line"で2つのグループに分けることができます。

分けたグループの中央値を取ると、なぜかキレイな値になりました。

せっかくなので、countplot()を使用してデータを可視化したいと思います。

 

データを可視化する!

家賃の中央値で作った"p_line"で層別化してグラフを作成します。

f:id:Medicmed:20180608060825p:plain

築年数と家賃の関係を中央値より高いかどうかで層別化したグラフになります。

f:id:Medicmed:20180608061000p:plain

今度は家賃と徒歩の時間でグラフを作成してみました。

次から、ロジスティック回帰に使用する説明変数のデータフレームを作成していきます。

 

方角のダミー変数を作成する!

f:id:Medicmed:20180608061222p:plain

ダミー変数を作成するには、pandasに便利な機能があります。

pandasのget_dummies()を使用すると自動でダミー変数に変換してくれます。

get_dummies()を方角に適用すると、なぜか新しく列が1つ増えていたので、drop()を使用して削除しました。

 

説明変数のデータフレームを作成する!

f:id:Medicmed:20180608061441p:plain

今回使用する説明変数は、「徒歩・大きさ・築年数・方角」なので不要なものをdrop()で削除します。

方角をダミー変数に変換したものをpandasのconcat()を使用して連結します。

これでロジスティック回帰に使用する説明変数のデータフレームが準備できました。

次は、目的変数である"p_line"をYという変数に格納します。

f:id:Medicmed:20180608061715p:plain

PandasのSeriesのままなので1次元アレイに変換しておくと良いです。

1次元アレイに変換する方法は2種類あり

①.valuesという属性にアクセスする

②Numpyのravel()を使用する

のどちらかです。

作成した説明変数Xと目的変数Yからロジスティック回帰モデルを作成していきます。

 

ロジスティック回帰モデルを作成する!

f:id:Medicmed:20180608062108p:plain

単回帰や重回帰モデルを作成するのと同じ要領です。

まずはロジスティック回帰のインスタンスを作成し、fit()関数に当てはめるとロジスティック回帰モデルができます。

今回作った説明変数Xと目的変数Yのデータをどれくらいの精度で予測できるかをscore()で測定します。

結果から88%の精度だと分かります。

次に回帰係数の値を表示していきます。

 

回帰係数の値を表示する!

f:id:Medicmed:20180608062455p:plain

回帰係数をDataFrameの形にします。

通常のDataFrameを使用したままだと行方向に回帰係数が表示されるため見にくいです。

そのため、転置を使って列方向に変換して見やすくしています。

f:id:Medicmed:20180608062643p:plain

最後に、列名をそれぞれ"Features"・"Coefficient Estimate"と付けて完成です。

だいぶ見やすくなったと思います。

次は、データを学習データとテストデータの2つに分割して学習データからロジスティック回帰モデルを作成して精度を測定してみます。

 

学習データからロジスティック回帰モデルを作成してテストデータの精度を測定する!

f:id:Medicmed:20180608062921p:plain

データを学習データとテストデータに分割するには便利な関数があります。

train_test_split()を使用すると簡単に分割できます。

ロジスティック回帰モデルを作成するのは先程と同じ手順です。

まず新しいインスタンスを作成し、fit()関数を使用して学習データからモデルを作成します。

f:id:Medicmed:20180608063139p:plain

最後に、テストデータから求めた予測値とYのテストデータを比較します。

今回は方角のダミー変数を作る際に多重共線性を回避するために1つ削除すべきトコロを削除していないので、興味がある方は「多重共線性」についてご自身で調べてみてください。

統計検定試験にも出題される頻出事項なので、受験される方はチェックした方が良いと思います。

 

ぜひ参考にしてみてください。

終わり。

 

合わせて読みたい記事!

www.medicalmed.press

www.medicalmed.press

 

www.medicalmed.press

 

 統計学を本格的に勉強したい人向け! 

www.medicalmed.press

www.medicalmed.press