# ロジスティック回帰の理論とRによる実装方法を徹底解説！

> 当サイト【スタビジ】の本記事では、ロジスティック回帰についてRでの実装と共に見ていきます。ロジスティック回帰は2値分類問題において解釈がしやすく実務の場でもよく用いられている手法です。最後に理論と実装をより深く学ぶ勉強法も紹介していきますよー！

- URL: https://toukei-lab.com/%e3%83%ad%e3%82%b8%e3%82%b9%e3%83%86%e3%82%a3%e3%83%83%e3%82%af%e5%9b%9e%e5%b8%b0
- 公開: 2022.11.29 / 更新: 2024.11.18
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
本記事では、ロジスティック回帰についてRでの実装と共に見ていきます。ロジスティック回帰は2値分類問題において解釈がしやすく実務の場でもよく用いられている手法です。最後に理論と実装をより深く学ぶ勉強法も紹介していきますよー！
:::

データサイエンティストのウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

[一般化線形モデル](/statistical-model)の一つである、ロジスティック回帰。

有名であり基本的な手法ですが、<mark>実務でもよく使われる汎用性の高い手法です。</mark>

ロジスティック回帰は[多変量解析](/%e5%8e%b3%e9%81%b85%e5%86%8a%ef%bc%81%e5%a4%9a%e5%a4%89%e9%87%8f%e8%a7%a3%e6%9e%90%e3%82%92%e5%8b%89%e5%bc%b7%e3%81%99%e3%82%8b%e4%b8%8a%e3%81%a7%e3%81%8a%e3%81%99%e3%81%99%e3%82%81%e3%81%aa%e6%9c%ac)という分野以外に[機械学習](/machine-learning-fresh)という枠組みでも基本的な手法として出てきます。

この記事では、そんなロジスティック回帰について見ていきたいと思います。

:::talk{who="umatan"}
ビジネスの場でもよく出てくる手法だから要チェックだ！
:::

:::box{title="読み飛ばしガイド"}
・[ロジスティック回帰を用いる場面](#ロジスティック回帰の適用場面)\
・[ロジスティック回帰の計算方法](#βbetaβの推定方法)\
・[ロジスティック回帰の実装](#ロジスティック回帰で実際にデータ分析)\
・[ロジスティック回帰の勉強法](#ロジスティック回帰の勉強法)
:::

## ロジスティック回帰の適用場面

![データサイエンティスト](/wp-content/uploads/2019/09/e37be02ae3870ffbbf95e2a91fb2d4f8_s-e1568208400539.jpg)

[回帰分析](/%e5%9b%9e%e5%b8%b0%e5%88%86%e6%9e%90)は目的変数に負の値でも正の値でもとる連続変量を考えていました。

より正確にいうと、線形回帰において説明変数$x_i$を与えた時の$y_i$の条件付き分布には正規分布を仮定しています。

しかし、世の中には、「**100人中70人の病気が治った。**」や「**ある会社が倒産したかどうか**」などの割合データや二値データが存在します。

どちらも、値は**0から1の範囲**しかとりません。

この時、線形回帰を行うとどうなるでしょうか。

<mark>推定された目的変数は負の値になったり1を超える場合もあり、扱いに困ってしまいます。</mark>

そんな時に用いる方法がロジスティック回帰です。

![ロジスティック回帰](/wp-content/uploads/2022/11/122c95cb4c862ada89adaa95bd9b5416.jpg)

以下の動画でも解説していますので是非チェックしてみてください！

::youtube{#SL-kq73uIYs}

その他の手法含む機械学習系、その他のAI用語を一挙にまとめた以下の記事も合わせて要チェックです！

<https://toukei-lab.com/ai-term>

## ロジスティック回帰モデル

それでは、具体的に**ロジスティック回帰モデル**とは何なのか見ていきましょう

> Using components of linear regression reflected in the logit scale, logistic regression iteratively identifies the strongest linear combination of variables with the greatest probability of detecting the observed outcome.\
> 引用元：[Google-“Logistic Regression: A Brief Primer”](https://onlinelibrary.wiley.com/doi/pdf/10.1111/j.1553-2712.2011.01185.x)

ロジスティック回帰が用いられる場面は<mark>目的変数が二値もしくは割合データの場合</mark>です。\
二値や割合データが従う分布として最も考えられやすいものは二項分布です。

例えば、「$m_i$個体中$y_i$個体が生存した」というデータは、$B(m_i,p_i)$に従うと考えます。この時、$p_i$が未知パラメータになります。

この$p_i$と${\bf x}^T\beta$(線形予測子と呼びます。)を紐付ける関数を考えてみましょう。

$p_i$は0から1の範囲の値しか取らないので、${\bf x}_i^T\beta$が正の無限大になっても負の無限大になっても0\~1の範囲に収まっており、また、単調な関数が良いです。そこで、次の様な関数を用いて$p_i$と紐付けます。

$$
\begin{darray}{rcllll}
p_i&=&\frac{1}{1+exp(-{\bf x}_i^T\beta)}
\end{darray}
$$

この右辺の関数のことをロジスティック関数と呼びます（だからロジスティック回帰）。\
こうすることで、$\beta$を求めれば$p_i$が分かり、$y_i$の従う分布を把握できる様になりました。

では次に、どの様にして$\beta$を求めていくかを考えていきます。\
先ほどの式を右辺が${\bf x}_i^T\beta$だけになる様に変換すると下の式の様になります。

$$
\begin{darray}{rcllll}
log\left(\frac{p_i}{1-p_i}\right)&=&{\bf x}_i^T\beta
\end{darray}
$$

左辺は$p_i$を$1-p_i$で割って対数をとったものになっています。$p_i$を成功の確率と解釈すれば、$1-p_i$は失敗の確率と捉えることができます。

この$\frac{p_i}{1-p_i}$はオッズと呼ばれます。オッズは結果の解釈で重要になるので後で改めて説明します。

また、オッズの対数をとるこの変換を**ロジット変換**と呼び、$logit(p_i)$とも表したりします。

この変換によって、回帰分析っぽくなりました。

さて、ここから$\beta$の推定に入っていきます。

## $\beta$の推定方法

![メモ](/wp-content/uploads/2019/03/a94310ed4de4a08528a026f0badfdb2f_s-e1556972696222.jpg)

ロジット変換によって回帰分析っぽい式になりました。

ロジスティック回帰では$\beta$の推定方法は重み付き[最小二乗法](/least_squares_method)と[最尤法](/maximum_likelihood_method)の二種類があります。

### 重み付き最小二乗法

最小二乗法によって$\beta$の推定を行いたいのですが、最小二乗法を用いる時によいとされるのは<mark>目的変数の条件付き分布がサンプルに対して等分散の正規分布に従うと考えられる時です。</mark>

ここで、$logit(p_i)$の分布を考えてみましょう。\
まず、得られているデータから$p_i$を作るため$p_i=\frac{y_i}{m_i}$とします。$y_i$は二項分布に従うと考えているため、期待値と分散は次の様になります。

$$
\begin{darray}{rcllll}
E[y_i]&=&m_ip_i\\
V[y_i]&=&m_ip_i(1-p_i)
\end{darray}
$$

次に、$logit(p_i)=log\left(\frac{p_i}{1-p_i}\right)=log\left(\frac{y_i}{m_i-y_i}\right)$の分散をデルタ法で近似します。

$$
\begin{darray}{rcllll}
log\left(\frac{p_i}{1-p_i}\right)\approx \frac{1}{m_ip_i(1-p_i)}
\end{darray}
$$

二項分布と正規分布の性質より$m_ip_i(1-p_i)$が十分大きい時、正規分布に従うと見なせます。

そして、重み$\sqrt{w_i}=\sqrt{m_ip_i(1-p_i)}$を$logit(p_i)$にかけることで、等分散性を確保してから最小二乗法を行います。

重みを付けているため**重み付き最小二乗法**と呼びます。

### 最尤法

重み付き最小二乗法は複雑な計算も必要なく手計算でも可能ですが、一つ大きな問題があります。それは、$m_i=1$である時の<mark>二値データでは解析できないことです。</mark>

無理やり解析しても結果は不安定なものになります。そこで、<mark>現在ではコンピュータの発展により最尤法による推定が主流です。</mark>

目的変数は二項分布に従うというところから、尤度関数を導きます。\
同時確率関数は

$$
\begin{darray}{rcllll}
\displaystyle \prod_{ i = 0 }^n \binom{ m_i }{ y_i }p_i^{y_i}(1-p_i)^{m_i-y_i}&=&exp\left[\displaystyle \sum_{ i = 1 }^{ n } {y_i}log\left(\frac{p_i}{1-p_i}\right)+{m_i}log\left(1-p_i\right)+log\binom{ m_i }{ y_i }\right]
\end{darray}
$$

となるので、対数尤度関数は

$$
\begin{darray}{rcllll}
l({\bf p};{\bf y})&=&\displaystyle \sum_{ i = 1 }^{ n } {y_i}log\left(\frac{p_i}{1-p_i}\right)+{m_i}log\left(1-p_i\right)+log\binom{ m_i }{ y_i }
\end{darray}
$$

ここから、$p_i$を${\bf x}_i^T\beta$の式の方で書き直して、パラメータを$\beta$のみにします。

そして、微分することで$\beta$を推定します。

この計算は<mark>式で綺麗に求めるのは難しいためニュートン法などの数値計算方法を用いる必要があります。</mark>

## ロジスティック回帰の結果解釈

![ルービックキューブ](/wp-content/uploads/2019/06/magic-cube-1976725_960_720.jpg)

得られた$\beta$をどの様に解釈すれば良いでしょうか。

線形回帰であれば、<mark>[偏回帰係数](/coefficient)は他の変数が一定である基でその変数を1単位増加させた時に目的変数へ与える影響を表していました。</mark>

しかし、ロジスティック回帰の場合では、$\beta$の大きさがロジスティック関数で変換されるので、よく分かりません。

そこで、オッズを使って解釈します。説明変数が3個のモデルで左辺をオッズにした式を下に示します。

$$
\begin{darray}{rcllll}
\frac{p_i}{1-p_i}&=&exp\left(\beta_0+\beta_1x_i1+\beta_2x_i2+\beta_3x_i3\right)
\end{darray}
$$

ここで、変数1が1単位増えた時の式は次の様になります。

$$
\begin{darray}{rcllll}
\frac{p_i^*}{1-p_i^*}&=&exp\left(\beta_0+\beta_1(x_i1+1)+\beta_2x_i2+\beta_3x_i3\right)\\
&=&exp\left(\beta_1\right)exp\left(\beta_0+\beta_1x_i1+\beta_2x_i2+\beta_3x_i3\right)
\end{darray}
$$

すると、変数1が1単位増える前の式との関係は次の様になります。

$$
\begin{darray}{rcllll}
\frac{p_i^*}{1-p_i^*}&=&exp\left(\beta_1\right)\frac{p_i}{1-p_i}
\end{darray}
$$

すなわち、「変数1が1単位増えるとオッズ比が$exp(\beta)$倍になる。」という解釈ができます。

## ロジスティック回帰で実際にデータ分析

![PC](/wp-content/uploads/2018/09/goriIMGL9703_TP_V1-e1555747456954.jpg)

続いて、ロジスティック回帰モデルの人工データを用いて<mark>**ロジスティック回帰**・Lasso・Ridgeの精度比較</mark>を行います。

Lasso・Ridgeは回帰分析の一種でスパースなデータセットに対して効果的です。

スパース推定に関してはこちらの記事にまとめていますのであわせてご覧ください！

<https://toukei-lab.com/%e3%82%b9%e3%83%91%e3%83%bc%e3%82%b9%e6%8e%a8%e5%ae%9a>

### 実験の設定と手順

:::box
・比較手法：通常のロジスティック回帰・Lasso回帰・Ridge回帰\
・評価指標：テストデータの平均誤判別率\
・シミュレーション回数：100回
:::

実験の流れは簡単にこんな感じです。

1. 人工データを生成
2. データを解析
3. 指標を算出して結果を格納
4. 1\~3を100回繰り返す
5. 結果の平均とばらつきで比較

### 人工データ生成

今回のデータの生成モデルを次に示します。

$$
\begin{darray}{rcllll}
y_i&\sim&B(m_i,q_i)\\
m_i&=&1\\
q_i&=&\frac{1}{1+exp(-1-{\bf x}_i^T{\bf \beta})}\\
{\bf \beta}&=&(1,-1,0,\cdots,0)^T\in {\bf R}^p\\
{\bf x_i}&\sim& N({\bf \mu},{\bf \Sigma})\\
{\bf \mu}&=&{\bf 0}_p\\
{\bf \Sigma}&=&{\bf I}_p\\
i&=&1,2,\cdots,n
\end{darray}
$$

線形回帰のときと同様で、説明変数は$p$次元であり、平均0・独立で発生させています。\
また、$\beta$は$p$次元ベクトルであり、変数1と変数2のみが目的変数へ寄与があります。\
つまり、かなりスパースな設定になっています。\
今回は、$p$を5,10,50と変化させて実験してみます。

### シミュレーション実験

シミュレーション実験をしてみましょう。\
サンプルサイズ$n$は1100とします。\
100個のデータを学習データ、残りの1000個のデータをテストデータとして実験します。

今回用いるコード（$p=50$の場合）を載せておきます。\
実行する前に入っていないパッケージはインストールしておいてください。

```text title="LogisticRegressionSimulaion"
library(MASS)
library(mvtnorm)
library(glmnet)
library(ggplot2)
library(tidyr)

times <- 100 ##シミュレーション回数

n_train <- 100
n_test <- 1000
p <- 50 #変化させて実験

β0 <- 1 ##定数項
β <- c(1,-1,numeric(p-2))
β <- c(β0,β)

μ <- numeric(p)
Σ <- diag(p)


DISC <- data.frame(glm=numeric(times)+NaN, lasso=numeric(times)+NaN, ridge=numeric(times)+NaN)

for(t in 1:times){
  X <- rmvnorm((n_train+n_test),μ,Σ)
  X <- cbind(rep(1,(n_train+n_test)),X)
  q <- 1/(1+exp(-X%*%β))
  m <- rep(1,(n_train+n_test))
  # m <- floor(runif((n_train+n_test),10,31)) ##m~U(10,30)で発生(割合データになる)
  
  y <- c()
  for(i in 1:(n_train+n_test)) y <- c(y,rbinom(1,m[i],q[i]))
  
  data <- cbind(X,y,m)
  data <- as.data.frame(data)
  colnames(data) <- c("Int",paste0('x', 1:p),"y","m")
  
  ##学習データとテストデータを作成
  data_train <- data[1:n_train,]
  data_test <- data[-(1:n_train),]
  
  ##glm(普通の線形回帰)
  result_glm <- glm(formula=as.formula(paste("cbind(y,m-y) ~",paste(paste0('x', 1:p), collapse= "+"))), 
                    data=data_train[,colnames(data_train)!="Int"], family=binomial(link="logit"))
  
  ##glmnet(lasso)
  result_lasso <- cv.glmnet(x=as.matrix(data_train[,!(colnames(data_train) %in% c("Int","y","m"))]), 
                            y=cbind(data_train$m-data_train$y,data_train$y), family="binomial",alpha=1)
  
  ##glmnet(ridge)
  result_ridge <- cv.glmnet(x=as.matrix(data_train[,!(colnames(data_train) %in% c("Int","y","m"))]), 
                            y=cbind(data_train$m-data_train$y,data_train$y), family="binomial",alpha=0)

  ##テストデータの誤判別率を算出
  qhat_glm <- 1/(1+exp(-as.matrix(data_test[,!(colnames(data_test) %in% 
                                                 c("y","m"))])%*%as.matrix(result_glm$coefficients)))
  yhat_glm <- ifelse(qhat_glm<0.5,-1,1)
  y_glm <- ifelse(data_test$y==0,-1,1)
  disc <- y_glm*yhat_glm
  DISC$glm[t] <- length(disc[disc<0])/length(disc)
  
  qhat_lasso <- 1/(1+exp(-as.matrix(data_test[,!(colnames(data_test) %in% 
                                                   c("y","m"))])%*%coefficients(result_lasso,s="lambda.min")))
  yhat_lasso <- ifelse(qhat_lasso<0.5,-1,1)
  y_lasso <- ifelse(data_test$y==0,-1,1)
  disc <- y_lasso*yhat_lasso
  DISC$lasso[t] <- length(disc[disc<0])/length(disc)
  
  qhat_ridge <- 1/(1+exp(-as.matrix(data_test[,!(colnames(data_test) %in% 
                                                   c("y","m"))])%*%coefficients(result_ridge,s="lambda.min")))
  yhat_ridge <- ifelse(qhat_ridge<0.5,-1,1)
  y_ridge <- ifelse(data_test$y==0,-1,1)
  disc <- y_ridge*yhat_ridge
  DISC$ridge[t] <- length(disc[disc<0])/length(disc)
  
  cat("t=",t," ")
}

##ggplotで箱ひげ図を描く
g <- ggplot(gather(DISC), aes(y=value,x=key))
g <- g + geom_boxplot()
g <- g + xlab("Method")
g <- g + ylab("Error Rate")

plot(g)
```

ばらつきも含めて見たいので結果を[箱ひげ図](/python-boxplot)で表します。\
通常のロジスティック回帰はglmと表記してあります。

・$p=5$の結果

![](/wp-content/uploads/2018/02/7151fb1965711d210ff06d8ef970c5cf.png)

やはり<mark>説明変数の数も多くないのでどの手法も同程度ですね。</mark>

・$p=10$の結果

![](/wp-content/uploads/2018/02/1acfd00812392ac52599cc1a436d3d23.png)

Lassoが少し良い精度を示しているように見えます。

・$p=50$の結果

![](/wp-content/uploads/2018/02/fc30a04eca3eb6fddc6351fd6b550d9e.png)

かなり、差が出ました。

線形回帰のときと同様で<mark>Lassoタイプのロジスティック回帰が最も良くなりました。</mark>

また、実行してみるとglm()では$p=50$のとき警告メッセージが出てきてしまいます。これは、変数の数が多くて推定が不安定になったからと考えられます。

どうでしょうか。結果は予想通りでしたね！

精度比較の結果より<mark>シミュレーションでロジスティック回帰モデルのデータの作り方や実際の解析の仕方を伝えたかったので分かっていただけたら嬉しいです！</mark>

## ロジスティック回帰の勉強法

![本](/wp-content/uploads/2017/12/gahag-0011110910-1-e1582524492839.jpg)

ロジスティック回帰の理論と実装について見てきました。

より深く知りたい方に向けて<mark>ロジスティック回帰のおすすめ勉強法</mark>を紹介していきます。

### 理論を書籍で勉強

理論に関しては書籍にエッセンスが詰まっていますので、書籍を用いて勉強することをオススメします。

以下の2冊がオススメ！

::product[データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)]{url="https://www.amazon.co.jp/dp/400006973X?tag=statistic08-22&linkCode=ogi&th=1&psc=1" image="https://m.media-amazon.com/images/I/41RtTklVDtL._SL160_.jpg" amazon="https://www.amazon.co.jp/dp/400006973X?tag=statistic08-22&linkCode=ogi&th=1&psc=1" rakuten="https://af.moshimo.com/af/c/click?a_id=858168&p_id=54&pc_id=54&pl_id=616&url=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E3%2583%2587%25E3%2583%25BC%25E3%2582%25BF%25E3%2583%25A2%25E3%2583%2587%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25B0%2F%3Ff%3D1%26grp%3Dproduct"}

::product[一般化線形モデル入門 原著第2版]{url="https://www.amazon.co.jp/dp/4320018672?tag=statistic08-22&linkCode=ogi&th=1&psc=1" image="https://m.media-amazon.com/images/I/31YXe9CJKnL._SL160_.jpg" amazon="https://www.amazon.co.jp/dp/4320018672?tag=statistic08-22&linkCode=ogi&th=1&psc=1" rakuten="https://af.moshimo.com/af/c/click?a_id=858168&p_id=54&pc_id=54&pl_id=616&url=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E4%25B8%2580%25E8%2588%25AC%25E5%258C%2596%25E7%25B7%259A%25E5%25BD%25A2%2F%3Ff%3D1%26grp%3Dproduct"}

特にデータ解析のためのモデリング入門は通称緑本と呼ばれていて、ロジスティック回帰などの一般化線形モデリングから階層ベイズなどの[統計モデリング](/statistical-model)の応用まで幅広く学べる良書です。

### 実装をWebサービスで勉強

書籍で勉強だけしていてもイメージがわかないと思うので是非当メディアが運営する以下のスクール「**[スタアカ（スタビジアカデミー）](https://toukei-lab.com/achademy/)**」で手を動かしながら学んでみてください！

**[スタアカ（スタビジアカデミー）](https://toukei-lab.com/achademy/)**

[![スタアカ（スタビジアカデミー）のトップページ](/wp-content/uploads/2026/10/achademy-top.jpg)](https://toukei-lab.com/achademy/)

公式サイト：<https://toukei-lab.com/achademy/>

<table class="table">
<tbody>
<tr>
<th>【価格】</th>
<td>ライトプラン：1,280円/月（全コースが受講し放題）<br>
プレミアムプラン：129,800円（通常149,800円・買い切り）</td>
</tr>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【サポート体制】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【受講形式】</th>
<td>オンライン形式</td>
</tr>
<tr>
<th>【学習範囲】</th>
<td>統計学・機械学習・ディープラーニングを網羅的に学ぶ<br>
生成AI（LLM・RAG・プロンプトエンジニアリング）を学ぶ<br>
SQLとPythonを組み合わせて実データを使った様々なワークを行う<br>
実践的なビジネスフレームワークを学ぶ<br>
マーケティングの実行プラン策定</td>
</tr>
</tbody>
</table>

データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「[スタアカ](https://toukei-lab.com/achademy/)」！！

当メディアが運営するスクールです。

月額1,280円のライトプランで、統計学から機械学習・生成AIまで全コースが受講し放題です！

<mark>プレミアムプランでは、24時間以内の質問対応と現役データサイエンティストとの1on1（30分×4回）を実施します！</mark>

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください！

他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。

<mark>そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解などもあわせて学べるボリューム満点のコース</mark>になっています！

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったりする盛りだくさんの内容になってます！

:::box
**・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析**\
**・世界最大手小売企業のウォルマートの実データを用いた需要予測**\
**・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定**\
**・生成AIのAPIを使ってチャットボットやAIエージェントを作る**
:::

::button[スタアカの受講はこちら]{href="https://toukei-lab.com/achademy/" note="＼今すぐ試す／"}

## ロジスティック回帰　まとめ

本記事では。ロジスティック回帰について見てきました！

最後に簡単にまとめておきましょう！

:::memo
**・ロジスティック回帰とは目的変数が二値もしくは割合データの場合に用いる回帰分析である！**\
**・パラメータの推定方法は重み付き最小二乗法か最尤法がある！**\
**・結果の解釈はオッズを用いる！**
:::

ロジスティック回帰を勉強した後は、<mark>統計学をより深めるか様々な機械学習手法を学ぶか、より広範にデータサイエンスを学ぶとよいでしょう！</mark>

以下の記事をぜひ参考にしてみてください！

<https://toukei-lab.com/statistics-freshman>

<https://toukei-lab.com/machine-learning-fresh>

<https://toukei-lab.com/data-scientist>