Exploratoryツールでロジスティック回帰分析を実施してみる
今回のゴール)
・Exploratoryツールでロジスティック回帰分析を実施する
・指標を理解する
・モデルを評価する
ロジスティック回帰分析とは)
ロジスティック回帰分析とは、説明変数は量的データで、「目的変数」が質的データとなる回帰分析です。そして、「目的変数」が2値の場合(与信通過するorしない、買うor買わないなど)と、3値以上の場合があります。前者を単にロジスティック回帰分析と呼び、後者を多項ロジスティック回帰分析(目的変数が名義尺度:推奨商品A, 推奨商品B, 推奨商品C)や順序ロジスティック回帰分析(目的変数が順序尺度:高評価, 普通, 低評価など)と呼びます。今回は、「ロジスティック回帰分析」を実施いたします。
今回の目的変数は)
個人属性データを利用して、収入が50,000$を超えるかどうかを予測する「ロジスティック回帰分析」をExploratoryツールで検証してみます。また、今回使用するデータのどの変数がより重要な影響度を持っているかもあわせて確認してみることにいたします。
今回のデータソースはこちら)
参考書籍) 東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~
今回の手順)
①データソースの取り込み
まず、下記のようにデータを取り込みます。+ボタンClick後、「ファイルデータ」をClickします。
つぎに、CSV形式を選択。
取り込み結果は下記の通りです。 各1行は、個人の属性情報となります。
②サマリーデータの確認
まずは、サマリーデータの確認をしてみましょう。変数の数は15、レコード数が32,561行あることがわかります。割愛しますが、通常は、各変数の代表値(平均値、中央値、最頻値など)とデータ分布状況を把握しておくことが重要です。特に、ヒストグラムの「多峰性」に注意しておきます。
つぎに、今回の目的変数は、赤枠の「flg-50K」ですがどうやらcharacter型になっております。こちらをlogicalに変更します。
③データ型の変更
下記のように、赤丸をclickしてデータタイプをlogicalに変更します。
下記の通り、”>50K” をTrueに設定する計算式を作成、新しい変数を作成します。
下記の通り、Trueが7,841件、Falseが24,720件となります。
④ アナリティクスで実行
下記のように、各変数を一括で設定してしまいます。ただし、「多重共線性」の問題があり、後ほど、いくつかの変数を間引きます。
ひとまず、下記の通り、「予測変数」にflg-50K以外の変数を一括設定してOKボタンをClickします。その後、実行ボタンをClickします。
「多重共線性」をClickすると、下記のような文言が出現します。「occupation」データのメンバーの一つに”?”があり、これが「workclass」のメンバーの一つ”?“と干渉するようです。もともと、この2つの変数は似たようなメンバーを抱えているため、興味関心の高い方のみを残すようにします。ここでは、「occupation」を残して「workclass」を削除します。
以下のように、「workclass」を除外する。
あらためて、「多重共線性」を確認します。今度は、下記の通り、VIFが10を超えている変数があります。「relationship」と「martial-status」のそれぞれのメンバーが類似傾向にあるため、こちらも興味のある列を残して片方を除外します。今回は、「martial-status」を残します。
下記の通り、「martial-status」を残します。
あらためて、VIFを確認してみましょう。下記の通り、多少10を超えておりますが、多重共線性の問題はこれでクリアと判断します。
⑤ 各レポートを確認してみる
a) 予測確率
初期設定では、True / Falseの境界値は0.5で設定されております。ただし、50,000$を実際に超えている割合は、実際には24%程度のため、この閾値は、後ほど、設定画面から値の調整が必要です。
実際の「is_income_than_50K」のデータ状況は下記の通り。
b) 変数重要度
ロジスティック回帰分析で「変数重要度」を確認してみます。下記の通り、今回の2値分類においては、下記の3つの変数がより重要と言えそうです。「martial-status」が意外でしたが何らかの影響力があるのでしょう。
念のため、下記のデータ状況は把握しておきます。7種類のメンバーがあることがわかります。
c) 係数(有意)
ここでは、有意性が確認された変数に絞ってオッズ比・信頼区間・P値を確認できます。下記の例では、他の変数が一定の場合、educationがHS-grad(高校卒業)からProf-schoolに変わると、オッズ比が1.54倍(信頼区間:1.0-2.2)となる、と解釈できます。オッズ比の内容については、後ほど、確認します。
d) 予測
ここでは、各変数と「is_income_than_50K」(割合)との関係性を細かく確認できます。念のため、True/Falseの閾値が0.5となっているため、後ほど、閾値は調整した方が良さそうです。
d) ROC
ここでは、ROC曲線を確認できます。この曲線が左上隅に近ければ近づくほど、モデルのパフォーマンスは良好と判断できます(つまり、真陽性率が高く、偽陽性率が低くなります)。なお、この指標は、AUCと一緒に考慮する必要があります。AUCは、ROC曲線の下部分の面積と考えます。面積は割合と捉えることができそうです。
e) サマリ
ここでは、全体指標を確認できます。特に重要なのは、AUC、正解率、適合率・検出率、F値あたりです。
⑥指標を理解する
a) 関係の強さを示す時のオッズ比について
オッズ :ある状態である数・確率 / ある状態でない数・確率
例)食べた人 90 / 食べなかった人 10 = 9倍
オッズ比:オッズ / オッズ
ある状態の時のオッズ / ある状態でない時のオッズ
例)Aで食中毒を起こしたグループ(仮にAを食べた:90 食べなかった10とした)のオッズ / Aで食中毒を起こさなかったグループ(仮にAを食べた:10 食べなかった90とした)のオッズ
(90/10) / (10/90) = 81.8(オッズ比)
例)Bで食中毒を起こしたグループのオッズ(仮にBを食べた:50 食べなかった50とした) / Bで食中毒を起こさなかったグループ(仮にBを食べた:50 食べなかった50とした)のオッズ
(50/50) / (50/50) = 1(オッズ比)
上記の例の2つのオッズ比(Bに比べてAはオッズ比がでかい)が表すことは、因子と現象の「関係の強さ」といえます。
b) ロジスティック回帰分析におけるオッズ比
量的変数の値が1増えた時のオッズの増える割合、あるいは、質的変数のベースレベルから別のレベルに変わった場合のオッズの増える割合をさします。こちらも、オッズ比からわかることは相互の関係の強さといえるでしょう。
c) AUC(Area Under the Curve)
前述したROC曲線の下部分の面積をさします。AUCは0.5から1までの値をとり、値が1に近いほどモデル性能が高いことを示します(つまり、ROC曲線が左上に近づいた状態=2値をどれだけきれいに分類できたかを示します)。AUCを確認することでこのロジスティック回帰モデルの性能を評価できるといえます。
d) 正解率(Accuracy Rate)
(真陽性 + 真陰性) / データ数
予測と実際の値の組み合わせ
予測(TRUE) | 予測(FALSE) | |
実際の値(TRUE) | 真陽性(TruePositive) | 偽陰性(False Negative) |
実際の値(FALSE) | 偽陽性(FalsePositive) | 真陰性(True Negative) |
e) 適合率(Precision)
予測(TRUE)が実際に正しかった割合です。TRUEと予測したならTRUEであるべきと考えられ、この適合率が低いということは、第一種過誤(タイプ1エラー)が起きていえます。
真陽性 /(真陽性 + 偽陽性)
予測と実際の値の組み合わせ
予測(TRUE) | 予測(FALSE) | |
実際の値(TRUE) | 真陽性(TruePositive) | 偽陰性(False Negative) |
実際の値(FALSE) | 偽陽性(FalsePositive) | 真陰性(True Negative) |
第一種過誤と第二種過誤の分類
予測(TRUE) | 予測(FALSE) | |
実際の値(TRUE) | 真陽性(TruePositive) | 第二種過誤(タイプ2エラー) |
実際の値(FALSE) | 第一種過誤(タイプ1エラー) | 真陰性(True Negative) |
f) 検出率(Recall)
実際の値(TRUE)を予測できた割合。実際の値(TRUE)を予測できなかった割合が低い場合、第二種過誤(タイプ2エラー)が起きているといえます。ケースによっては、致命的な問題となりますので検出率の低さは留意が必要です。
真陽性 / (真陽性 + 偽陰性)
予測と実際の値の組み合わせ
予測(TRUE) | 予測(FALSE) | |
実際の値(TRUE) | 真陽性(TruePositive) | 偽陰性(False Negative) |
実際の値(FALSE) | 偽陽性(FalsePositive) | 真陰性(True Negative) |
第一種過誤と第二種過誤の分類
予測(TRUE) | 予測(FALSE) | |
実際の値(TRUE) | 真陽性(TruePositive) | 第二種過誤(タイプ2エラー) |
実際の値(FALSE) | 第一種過誤(タイプ1エラー) | 真陰性(True Negative) |
g) F値
0 – 1の値をとります。1に近いほどモデル性能が良いと判断可能です。
検出率と適合率の調和平均
F値 = 2 / ( (1/検出率) + (1/適合率) )
モデル性能を評価する
今回の初期データは下記の通りです。
(1)AUC 0.90
1に近いほど良いため、現状、問題はなさそう。あとは、さらに、精度を上げられるか。
(2)正解率 0.84
1に近いほど良いため、現状、問題はなさそう。ただし、正解率が高くても「適合率」あるいは「検出率」が低い場合、第一種過誤あるいは第二種過誤が発生している場合があり注意が必要です。
(3)適合率 0.73
第一種過誤(タイプ1エラー)は0.27(27%)。
(4)検出率 0.59
第二種過誤(タイプ1エラー)は0.41(41%)。
(5)F値 0.65
(6)True/False閾値の変更
あらためて、予測確率を確認してみます。もともとのデータ(is_income_than_50K)のTrue判断が24%のため、閾値を24%にすることでモデル性能数値が改善されるか試してみます。
(7)数値再確認
前回より正解率が多少下がり、F値が多少改善されました。なお、「適合率」と「検出率」がトレードオフされております。基本的には、どれだけきれいに分類できているかを示す「AUC」の指標を重視しつつ、ケースによって、「適合率」と「検出率」のどちらを優先するか考えながら(第一種過誤と第二種過誤のどちらを重視するか)でロジスティック回帰モデル精度を調整・決定すれば良さそうです。
まとめ
今回は、ロジスティック回帰を試してみました。今回作成し調整済みのロジスティック回帰モデルを使えば、今後、新たなデータが出てきた場合に同じ基準でデータを自動分類作業に活かせるかと思います。そうすることで作業の効率化が測れるのではないでしょうか。
あらたなデータを使ったモデル活用セットアップはこちらの記事が参考になります。
https://exploratory.io/note/2ac8ae888097/dNG8wgo2QN