본문 바로가기

데이터 공부/2025_하계_학연생

Stata를 활용한 LCL

 

1. Introduction

“사람들은 왜 특정 교통수단을 선택할까?”
“어떤 병원을 선호할까?”
“새로 나온 약을 얼마나 사용할까?”

 

이런 질문들에 답하기 위해 경제학자들과 정책 입안자들은 조건부 로짓 모형(conditional logit model)을 많이 써왔다.

이 모형은 사람들이 어떤 ‘속성(attribute)’을 기준으로 선택을 하는지 분석해준다.
하지만 문제는 있다.

 

사람마다 중요하게 생각하는 기준이 다 다르다는 것.

그래서 등장한 게 바로 잠재 클래스 조건부 로짓 모형(Latent Class Conditional Logit, LCL)이다.
이 모델은 ‘사람들이 모두 같지 않다’는 현실을 반영해서, 비슷한 선택 기준을 가진 사람들을 숨겨진 그룹(클래스)으로 나눈 다음 각각 분석하는 방식이다.

 

내가 아는 LCL 은 이게 전부인데

2. 잠재 클래스 조건부 로짓 모형(LCL) 설명 (Latent Class Conditional Logit)

사람마다 중요하게 생각하는 기준이 다르다.
누군가는 "시간이 중요"하고, 누군가는 "비용이 더 중요"하다.

이런 “사람마다 다른 선택 기준”을 반영하는 게 바로
잠재 클래스 조건부 로짓 모형(Latent Class Conditional Logit, LCL)이다.

 

기본 아이디어는 단순하다:

사람들을 '비슷한 선택 성향'에 따라 클래스(class)로 나눠서,
각 클래스마다 다른 로짓 모델을 적용시킨다

 

예를 들어, 자동차를 고르는 상황이라면...

클래스 1: "연비가 가장 중요"한 사람들
클래스 2: "가격이 더 중요"한 사람들
클래스 3: "퍼포먼스가 중요한" 좋아하는 사람들
클래스 4: "디자인이 중요한" 사람들

 


이런 식으로 숨겨진 그룹을 가정하고, 각 그룹에 대해 따로 조건부 로짓을 추정하는 것이다.

(Stata는 이 그룹을 자동으로 추정한다. 사용자가 미리 분류하지 않아도 된다)

 

이제 이 접근방식을 대수적으로 접근해보자 

 

식을 보면 

한 개인의 선택 확률이

각 클래스에 속할 확률 × 그 클래스의 선택확률
을 더한 것 으로 생각할수 있다 

이걸 통해 개인 간의 선호 차이(discrete heterogeneity)를 자연스럽게 반영할 수 있다. 

(사람이 어떤 클래스에 속할 확률(π)은 개인의 특성(z)에 따라 결정된다)

 

3.추정 방법: lclogit2 vs. lclogitml2

앞서본 수식을 보면 추정해야 할 파라미터를 알수 있다 

클래스별 유틸리티 계수 클래스 소속 확률을 결정하는 계수 를 추정해야 한다. 

 

이를 추정하는 방법은 2가지가 있다 

lclogit2: 빠르고 안정적인 추정을 위한 도구 (기본)

lclogitml2: 정밀한 표준오차와 검정을 위한 도구 (보조 또는 독립 사용 가능)

 

이 둘은 서로 보완적인 관계로
lclogit2로 대충 위치 잡고, lclogitml2로 마무리 조정을 한다고 생각하면 직관적으로 와 닿을수 있다.

 

이제는 각자 사용하는 알고리즘에 대해 집중적으로 알아볼 계획이다 

Expectation-Maximization 알고리즘(EM)

먼저 lclogit2가 사용하는 Expectation-Maximization 알고리즘(EM)은
숨겨진 변수(= 클래스)가 있는 상황에서 매우 효과적인 방법이며 E 부분과 M 부분으로 나누어져 있다

 

E-step: 현재 추정값을 바탕으로 각 사람이 어떤 클래스에 속할 확률(π)을 계산

M-step: 그 확률을 바탕으로 클래스별 조건부 로짓 모형을 새로 추정

이 과정을 반복해서 최대우도 추정값(MLE)에 수렴하게 만든다

 

물론 이 방식에도 약점은 존재하는데 

표준오차를 제공하지 않는다(추정치의 불확실성 정도를 파악할 수 없음).

따라서 뒤에 설명할 gradient-based MLE 와 상호 보완적 관계를 가진다

gradient-based MLE

기울기(gradient)를 따라가며 최대우도값을 찾는 방식이기 때문에

표준오차, 신뢰구간, 검정 등을 자동으로 제공한다 

 

이를 이해하기 위해선 

정보행렬, Gradient Descent Method 를 알아야 하는데.. 

https://www.youtube.com/watch?v=IHZwWFHWa-w

θnew​= θold​− η⋅ ∇L(θ) -> Grandient Descent 방식

 

해당 영상을 보면서 간단하게 이해하는걸 추천한다. 

 

따라서 상호보완적인 둘을 연결해 사용하는것이 일반적이다.

 

지금까지의 흐름을 예시를 통해 노트에 정리해 봤다

천천히 읽어보며 그 흐름을 파악해야 한다 

 

지금까지의 흐름 (어떻게 문제가 발생했고 이를 해결하려는 핵심아이디어, 그리고 How to)

4. 사후 추정 명령어들 (Postestimation)

지금까지 lclogit2나 lclogitml2로 모형을 추정했다. 이제는 이를 활용해 해석을 해야한다 

Stata에서는 그걸 위해 세 가지 사후 추정 명령어가 준비되어 있다. 하나씩 그 쓰임을 알아가 보자

lclogitpr2: 내가 선택할 확률은?

각 사람이 어떤 대안을 얼마나 선호하는지,

그리고 어떤 클래스에 속할 확률이 높은지 예측해주는 명령어이다

 

이 사람은 자전거를 선택할 확률이 0.65 이 사람은 클래스 1에 속할 확률이 0.80이다
해당 정보를 통해 segmentation 인사이트 를 뽑아낼 수 있다

lclogitcov2: 계수들의 불확실성 분석

이 명령어는 클래스별 계수들을 하나의 분포(distribution)로 보고
그들의 분산-공분산 행렬을 계산해준다. 이를 통해

 

"클래스 간 이 속성에 대한 선호 차이가 얼마나 큰가?"
"계수들 사이에 어떤 상관관계가 있나?"

와 같은 것들을 분석 할 수 있다 

lclogitwtp2: WTP 계산

사실 가장 중요하다고 말할 수 있을거 같다 

이 속성 하나를 더 가지기 위해 사람들이 얼마까지 낼 수 있는가?”

 

“여행시간 1시간 단축을 위해 클래스 1은 평균 3.2달러를 낼 의향이 있다.”

와 같은 것들을 알 수 있으며

 

lclogitml2로 추정한 결과가 활성화돼 있으면
표준오차 + 95% 신뢰구간까지 알 수 있다

 

다른 유형의 로짓 모델로의 확장 (Applications to Other Types of Logit Models)

우리가 지금까지 다룬 lclogit2는 기본적으로
조건부 로짓 모형(conditional logit)을 기반으로 한다

확률분포에서 베르누이 분포에서 파생되어 가듯 

조건부 로짓에서 여러 다양한 모델로 확장이 가능하다 

 

1. 다항 로짓(Multinomial Logit, mlogit)도 가능

Stata에서 mlogit은 기본적으로 "넓은(wide)(한 row 에 한 사람)" 형태의 데이터를 요구해.
하지만 clogit은 "길게(long)" 펴진 형태야.

데이터를 long 형태로 변형하면, 다항 로짓도 clogit → lclogit2로 분석 가능하다!

예를 들어,
한 사람이 세 가지 브랜드 중 하나를 선택했다고 하면,
아래처럼 3줄짜리 long 데이터(변수별 정리)로 바꾸면 lclogit2 사용 가능:

id                                 brand                             choice                          price                                               quality
1 A 1 3.0 4
1 B 0 2.5 3
1 C 0 1.8 2

그 뒤엔 group(id) 옵션(셋 기준 설정)만 사용하면 된다. 

2. 순위형 로짓(Rank-Ordered Logit)도 가능

이번엔 선택이 아니라 “선호 순위를 매기는” 경우이다.

예: “1순위는 A, 2순위는 C, 3순위는 B”
이런 순위형 데이터도 clogit → lclogit2로 확장 가능하다.

앞서배운 wide -> long 으로 생각하면 된다.

id                                             alt                                                   choice                                        round
1 A 1 1
1 B 0 1
1 C 0 1
1 B 0 2
1 C 1 2
 

→ 이렇게 만들어서 group(id round) 옵션 주면,
순위형 로짓도 잠재 클래스 구조로 추정 가능!

3. MaxDiff (Best–Worst Scaling, 최대-최소 선택)도 가능

사람들에게 여러 속성을 보여주고,
“가장 좋은 것”과 “가장 싫은 것”을 고르게 하는 방식이지.

이걸 분석하는 모델이 MaxDiff (Maximum Difference Logit) 모델인데,
이 역시 clogit 구조를 따르기 때문에 lclogit2로 분석 가능해.

id                            bw_pair                                         choice                  A                           B                            C
1 A > B 0 1 -1 0
1 B > A 0 -1 1 0
1 A > C 1 1 0 -1
... ... ... ... ... ...
1은 A가 최고, C가 최악이라는 의미
choice = 1인 행만 실제 선택된 조합
나머지는 선택지 후보

 

그 뒤엔 group(id)으로 묶어서 lclogit2 실행하면 된다. 

 

정리

우리는 처음에 이런 질문에서 출발했다.
“왜 사람들은 A를 고르고 B는 안 고를까?”
“시간이 중요할까? 비용이 중요할까?”

이런 선택 행동을 분석하기 위해 **조건부 로짓 모델(Conditional Logit)**이 쓰인다.
이 모델은 사람들이 어떤 ‘속성(attribute)’을 기준으로 선택을 하는지 확률적으로 설명해준다.

하지만 문제는…

 

사람마다 중요하게 생각하는 기준이 다르다는 것.

 

이걸 해결해주는 게 

잠재 클래스 조건부 로짓 모델 (Latent Class Conditional Logit, LCL)

핵심 아이디어

  1. 사람들을 비슷한 선택 성향에 따라 그룹(클래스)으로 나눈다.
  2. 각 클래스마다 별도의 조건부 로짓 모형을 추정한다.

자동차를 예로 들면:

클래스 1: 연비 중요
클래스 2: 가격 중요
클래스 3: 성능 중요
클래스 4: 디자인 중요

 

각 클래스별로 β (선호 계수)가 다르고,
각 사람은 어떤 클래스에 속할 확률(π)도 다르게 추정된다.

추정 방법은 2가지

1. lclogit2: EM 알고리즘 기반 (빠르고 안정적)

E-step: 각 사람이 어떤 클래스에 속할 확률(π) 계산
M-step: 각 클래스의 조건부 로짓 추정
단점: 표준오차 등 불확실성 정보 없음

2. lclogitml2: 기울기 기반 MLE (정밀 추정)

Gradient Descent 방식으로 직접 likelihood를 최대화
장점: 표준오차, 신뢰구간, 검정 가능

 

보통은 lclogit2로 초벌 추정 → lclogitml2로 마무리 다듬기!

사후분석 명령어 (Postestimation)

lclogitpr2 각 대안의 선택 확률 + 클래스 소속 확률 예측
lclogitcov2 계수들의 분산-공분산 행렬 계산
lclogitwtp2 속성당 WTP(지불의사금액) 계산 및 신뢰구간 추정
 

특히 lclogitwtp2는

 

“클래스 2는 시간 1시간 줄이는데 평균 2.8달러 지불할 의향 있음”
같은 실질적인 정책 인사이트를 줄 수 있음.

다양한 응용 가능

다항 로짓 (mlogit): 데이터를 long 형태로 바꾸고 group(id) 옵션 쓰면 OK
순위형 로짓: 선택 → 순위로 바꿔서 group(id round)
MaxDiff: “가장 좋고/싫은 것”을 이용한 모델링도 가능

 

지금까지 조건부 로짓의 약점을 보완한 

잠재 클래스 조건부 로짓 모형(LCL)에 대해 배워보았다. 

생각보다 유용한 모델이고 많은 부분들이 머신러닝의 기법들과 닮아 있어 이해하는데 큰 어려움이 없을 것이라 생각한다.