Rで隠れたグループを発見！潜在クラス分析(LCA)でTitanicデータを解析してみた

# はじめに
分類問題を解く手法はいくつもありますが、この記事では「潜在クラス分析(LCA)」についてご紹介いたします。
とはいったものの、自己学習した備忘録です。誤りがありましたら、優しくご指摘いただけますと幸いです。
潜在クラスモデルは、カテゴリカルな観測変数の背後にカテゴリカル潜在変数があることを仮定して潜在構造を読み解くモデル(三輪 (2009))でして、カテゴリ変数を扱うことが多い場合は、この手法を習得できると分析の幅が広がります。


ざっくりどのようなことができる分析手法かをお伝えすると、年齢、性別、健康行動パターンを考慮し、クラスターを特定することができます。
## 潜在クラス分析の事例①
一例として、株式会社PREVENTが発表した論文でも使われていて、約1.2万人の健康診断等のデータに対して潜在クラス分析を用いることで、5つのクラスターを特定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846404/41900f7d-203b-0b21-1e4b-7dbc05a254a3.png)
[株式会社PREVENT「健康行動をもとに、生活習慣病リスクがある日本人就労層のクラスターの特定を行った成果を国際論文に発表」](https://prevent.co.jp/news/20231027/%e5%81%a5%e5%ba%b7%e8%a1%8c%e5%8b%95%e3%82%92%e3%82%82%e3%81%a8%e3%81%ab%e3%80%81%e7%94%9f%e6%b4%bb%e7%bf%92%e6%85%a3%e7%97%85%e3%83%aa%e3%82%b9%e3%82%af%e3%81%8c%e3%81%82%e3%82%8b%e6%97%a5%e6%9c%ac)より引用

## 潜在クラス分析の事例②
[株式会社マクロミルによる事例](https://www.macromill.com/service/data-analysis/latent-class-analysis/#:~:text=%E6%BD%9C%E5%9C%A8%E3%82%AF%E3%83%A9%E3%82%B9%E5%88%86%E6%9E%90%E3%81%AF%E3%80%81%E5%80%8B%E4%BA%BA,%E3%81%A7%E3%81%8D%E3%82%8B%E6%89%8B%E6%B3%95%E3%81%A8%E3%82%82%E8%A8%80%E3%81%88%E3%81%BE%E3%81%99%E3%80%82)もご紹介いたします。
こちらでは、清涼飲料に関する購買データ（飲み物の種類別の買った／買わない）を分析することで、9つのセグメントを特定しています。具体的には、「エナジードリンクの購入者が多い10~20代の男性」が中心となるセグメント１が形成されています。

こうした結果は、例えば以下のような意思決定につながります。
- 自社の飲料の購買層の20%は、セグメント1らしいぞ！
- エナジードリンクの売上を上げたいのでセグメント1が利用している媒体・地域に広告を出そう!
- 新たにセグメント2に指示されるようなエナジードリンクを開発しよう！

## 潜在クラス分析の事例③
ほかにどのような事例で使用できるかをchatGPTに聞いてみたところ以下のように答えてくれました。

| 分野        | 分類              | 概要|
|--------------|----------------|-------------------|
| 教育研究        | 成績分析            | 学生の成績パターンを識別する。 |
| 心理学・社会科学| 心理測定プロファイル分析 |個人の態度や性格特性から潜在的なプロファイルを特定する。|
| 健康研究        | 健康行動分類        | 健康に関連する行動のパターンを同定する。|
| マーケティング    | 消費者セグメント分析  | 消費者の購買行動から異なる消費者グループを特定する。|
| 犯罪学         | 犯罪行動のパターン分析 | 犯罪行動の背後にある要因のパターンを分析する。 |


# 潜在クラス分析をしてみよう!!
潜在クラス分析は、Rの"poLCA"ライブラリーを使用することで簡単に行うことができます。
ここではTitanicのデータを読み込んで、どんなセグメントに区分できるのかにチャレンジしてみます。
手順としては大きく2STEPです。
1. 最適なセグメント数を特定する、セグメントに区分する
1. セグメントごとの傾向を把握する

## 1. 最適なセグメント数を特定する、セグメントに区分する
このステップでは最適なセグメント数を特定します。

具体的には、以下のコードスニペットによって、Titanicデータセットに基づいて1から6までの異なる潜在クラス数を持つモデルを検討し、それぞれのモデルの適合度をAIC（Akaike Information Criterion）、BIC（Bayesian Information Criterion）、G^2（尤度比統計量）、およびX^2（カイ二乗適合度統計量）を用いて評価します。

```R
# 必要なパッケージのインストール
install.packages("poLCA")
install.packages("titanic")

# パッケージの読み込み
library(poLCA)
library(titanic)

# Titanicのデータセットを読み込む
data(titanic_train, package = "titanic")

# ここでは例として、生存(Survived)、性別(Sex)、乗客クラス(Pclass)を使用
titanic_data <- titanic_train[, c("Survived", "Pclass", "Sex")]
titanic_data$Survived <- factor(titanic_data$Survived)
titanic_data$Pclass <- factor(titanic_data$Pclass)
titanic_data$Sex <- factor(titanic_data$Sex)

# 潜在クラスモデルの設定と実行
# ここでは潜在クラスの数を1~4と仮定
for (nc in 1:4) {
  lca_model <- poLCA(cbind(Survived, Pclass, Sex) ~ 1, data = titanic_data, nclass = nc)
}
```

これを実行しますと、以下が出力されます。
```R:output
========================================================= 
Fit for 1 latent classes: 
========================================================= 
number of observations: 891 
number of estimated parameters: 4 
residual degrees of freedom: 7 
maximum log-likelihood: -2060.439 
 
AIC(1): 4128.877
BIC(1): 4148.047
G^2(1): 405.4925 (Likelihood ratio/deviance statistic) 
X^2(1): 420.1475 (Chi-square goodness of fit) 

(以下略)
```

下表は、Titanicデータセットに基づいて1から4までの潜在クラス数を持つモデルの適合度をまとめたものです。
潜在クラス分析の結果から、クラスター数が増加するにつれてAICとBICの値が減少していきますが、3クラスモデル以降では最大尤度が見つからなかったり、自由度が負の値を取るなどの問題が発生しています。これは、モデルがデータに対して過剰適合している可能性を示唆しています。

**2クラスモデルがAICとBICの観点から最も適合度が高い**ことが示されており、データセットに対して最も適切な潜在クラス数と考えられます。

| クラスター数 | AIC      | BIC      | G^2      | X^2      | 注意    |
|-----------|----------|----------|----------|----------|--------|
| 1            | 4128.877 | 4148.047 | 405.4925 | 420.1475 |     |
| 2            | 3763.346 | 3806.477 | 29.96085 | 25.93865 |     |
| 3            | 3748.77  | 3815.863 | 5.385751 | 5.201307 | 最大尤度が見つかっていない、自由度が負|
| 4            | 3753.385 | 3844.439 | 約0      | 約0      | 自由度が負  |

## 2. セグメントごとの傾向を把握する
2クラス（セグメント）に分類するのが良いとわかりましたので、次にそれぞれのクラスにおいてどのような特徴があるかを確認します

```R
#  潜在クラスの数が2つの場合
lca_model <- poLCA(cbind(Survived, Pclass, Sex) ~ 1, data = titanic_data, nclass = 2)
print(lca_model)
```

```R:output
> print(lca_model)
Conditional item response (column) probabilities,
 by outcome variable, for each class (row) 
 
$Survived
               0      1
class 1:  0.0000 1.0000
class 2:  0.9386 0.0614

$Pclass
               1      2      3
class 1:  0.4244 0.2697 0.3059
class 2:  0.1472 0.1734 0.6794

$Sex
          female   male
class 1:  0.7439 0.2561
class 2:  0.1475 0.8525

Estimated class population shares 
 0.3436 0.6564 
 
Predicted class memberships (by modal posterior prob.) 
 0.3838 0.6162 

(以下略)
```

|カテゴリ|クラス1|クラス2|
|-----------|----------|----------|
|生存率|生存率が非常に低い。具体的には、生存した人の割合が約6.14%。<br>これは、クラス1が事故の際に最もリスクが高かった乗客群を代表している可能性があります。|生存した人の割合がはるかに高く、約100%。<br>このクラスは、事故から生き残ることができた乗客群を代表していると考えられます。|
|乗客クラス（Pclass）|主に3等クラスに乗っていた人々で構成。<br>約67.94%が3等クラスで、比較的低い経済的地位の乗客が多いことを示しています。|1等クラスと2等クラスの乗客がこのクラスに多く含まれる。<br>これは、より高い経済的地位の乗客が多く含まれており、避難時に有利な状況にあったことを示唆。|
|性別（Sex）|男性がこのクラスの大多数（約85.25%）。これは、Titanicの避難時に「女性と子供を先に」という方針が取られたことが反映されている可能性があります。|女性の割合がこのクラスでは非常に高く、約74.39%を占めています。これも、避難プロトコルが女性と子供に有利に働いた結果と考えられます。|

# おわりに
LCAは、データの背後にあるパターンやグループを見つけ出すのに便利な手法です。
複雑な統計学の知識がなくても、Rのライブラリを使えば簡単に試すことができるので、ぜひ挑戦してみてください！


# 参考文献
- [三輪哲. (2009). 潜在クラスモデル入門. 理論と方法, 24(2), 345-356.](https://www.jstage.jst.go.jp/article/ojjams/24/2/24_2_345/_pdf)
- [Miki, T., Yamamoto, K., Kanai, M., Takeyama, K., Iwatake, M., & Hagiwara, Y. (2023). Identifying Clusters of Health Behaviors in a Japanese Working Population at Risk for Non-Communicable Diseases: A Latent Class Analysis of 12,168 Individuals. SSM-Population Health, 24, 101539.](https://www.sciencedirect.com/science/article/pii/S2352827323002045)