일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 부트 스트래핑
- 캐글 산탄데르 고객 만족 예측
- tableau
- 그로스 마케팅
- WITH ROLLUP
- Growth hacking
- lightgbm
- 데이터 핸들링
- 그로스 해킹
- ARIMA
- DENSE_RANK()
- ImageDateGenerator
- 데이터 정합성
- splitlines
- 마케팅 보다는 취준 강연 같다(?)
- WITH CUBE
- 로그 변환
- 분석 패널
- 캐글 신용카드 사기 검출
- python
- sql
- 리프 중심 트리 분할
- 컨브넷
- 스태킹 앙상블
- 인프런
- 데이터 증식
- 3기가 마지막이라니..!
- XGBoost
- 그룹 연산
- pmdarima
- Today
- Total
LITTLE BY LITTLE
[3-2] 실무로 통하는 인과추론 with 파이썬 - 3장. 그래프 인과모델 본문
목차
<3장. 그래프 인과모델>
3.1 인과관계에 대해 생각해보기3.1.1 인과관계 시각화3.1.2 컨설턴트 영입 여부 결정하기3.2 그래프 모델 집중 훈련3.2.1 사슬 구조3.2.2 분기 구조3.2.3 충돌부 구조3.2.4 연관성 흐름 치트 시트3.2.5 파이썬에서 그래프 쿼리하기
3.3 식별 재해석
3.4 조건부 독립성 가정과 보정 공식
3.5 양수성 가정
3.6 구체적인 식별 예제
3.7 교란 편향
3.7.1 대리 교란 요인
3.7.2 랜덤화 재해석
3.8 선택 편향
3.8.1 충돌부 조건부 설정
3.8.2 선택편향 보정
3.8.3 매개자 조건부 설정
3.9 요약
3.3 식별 재해석
인과 그래프에 대한 이해를 통해서 '편향'의 본질을 더 정확하게 파악할 수 있다.
- 더 중요한 것은, 편향을 없애려면 무엇을 해야 하는지 이해할 수 있다는 점
- 식별이란, '인과 그래프에서 처치와 결과간의 인과관계를 분리하는 과정'이라 볼 수 있다.
- 식별 단계에서는 바람직하지 않은 모든 연관성(backdoor path)을 차단한다.
다시 ✅ 3.1.2 컨설턴트 영입 여부 결정하기 로 돌아가서,
- 두 개의 연관성 경로 중 하나만 인과관계이기에, 인과관계가 제거된 원래그래프와 똑같은 인과 그래프를 만들어 '편향'을 확인할 수 있다. 이 그래프에서 처치와 결과가 여전히 연결된다면, 비인과 경로(backdoor path)때문이며, 이는 편향이 있음을 나타냄
처치와 Y간의 인과관계를 제거했음에도 여전히 연결되는지 확인
consultancy_model_severed = nx.DiGraph([
("profits_prev_6m", "profits_next_6m"),
("profits_prev_6m", "consultancy"),
# ("consultancy", "profits_next_6m"), # 컨설팅(x)과 매출(y)의 인과관계 제거
])
not(nx.d_separated(consultancy_model_severed,
{"consultancy"}, {"profits_next_6m"}, {}))
> True
→ 처치(consultancy)와 Y(profits_next_6m)간의 인과관계를 제거해도, 여전히 연결되어 있음 (즉, 비인과 경로가 존재함)
consultancy_model_severed = nx.DiGraph([
("profits_prev_6m", "profits_next_6m"),
("profits_prev_6m", "consultancy"),
# ("consultancy", "profits_next_6m"), # 컨설팅(x)과 매출(y)의 인과관계 제거
])
not(nx.d_separated(consultancy_model_severed,
{"consultancy"}, {"profits_next_6m"}, {"profits_prev_6m"}))
> False
→ 처치와 Y간의 인과관계를 제거하고, 공통 원인인 과거 실적(C)을 조건부로 하니, 해당 경로가 닫힘을 알 수 있다. 즉, 편향이 C로 인해 존재했었다는 사실을 알 수 있음
3.4 조건부 독립성 가정과 보정 공식
- 과거 실적(C)을 조건부로 했을 때, 처치(컨설팅)와 결과(실적) 사이의 backdoor path를 차단할 수 있었다.
- 즉, 과거 실적이 비슷한 회사들의 그룹 중 처치에 따른 결과를 비교하면, 그 차이는 전적으로 컨설턴트 때문에 발생했다고 볼 수 있고, 정확한 인과 추정량을 구할 수 있다.
조건부 독립성 가정(CIA, Conditional Independence Assumption)
: 공변량 X 수준이 동일한 대상의 잠재적 결과는 평균적으로 같다.
(↔ 공변량 X값이 동일한 대상을 보면, 처치가 마치 무작위로 배정된 것처럼 보인다.)
따라서 X를 조건부로 두거나 통제하면, 평균 처치효과는 실험군과 대조군 간 그룹 내 차이의 가중평균으로 식별할 수 있다.
* 독립성 가정 = 무시 가능성(Ignorability) = 외생성(exogeneity) = 교환 가능성(exchangeability)
* 뒷문 보정(backdoor adjustment): 교란 요인을 보정하여 (=조건부로 두어) 뒷문 경로(backdoor path)를 차단하는 과정
보정 공식(adjustment formula, 조건부 원칙 conditionality principle)
(↔조건부 독립성 가정을 이용해서 인과효과 식별하기)
: 처치가 X그룹 내에서 무작위 배정인 것 처럼 보인다면(=X 조건부 하에서 무작위처럼 보인다면) X로 정의된 각 그룹 내에서 실험군-대조군을 비교하고, 각 그룹의 크기를 가중치로 사용해 결과를 평균내기
3.5 양수성(positivity) 가정
양수성 가정(=공통 지지 common support = 중첩 overlap)
: 처치와 결과 사이의 차이를 X에 따라 평균내므로, X의 모든 그룹에 실험군과 대조군의 실험대상이 반드시존재해야 한다.
↔ 0 < P(T|X) < 1 (처치의 조건부 확률은 반드시 양수이고, 1 미만이어야 한다.)
* 양수성가정을 위배해도 식별이 가능하긴 하나, 외삽(extrapolation)을 해야할 수 있음
3.6 구체적인 식별 예제
✅ EX. 컨설턴트 영입 여부 결정 예제
수익이 낮은 3개 회사(100만 달러)와 높은 3개 회사(500만 달러)의 데이터가 있을 때,
수익이 낮은 회사는 3곳 중 1곳만 컨설턴트를 고용(T=1)했고, 높은 회사는 3곳 중 2곳이 컨설턴트를 고용했다고 가정
df = pd.DataFrame(dict(
profits_prev_6m=[1.0, 1.0, 1.0, 5.0, 5.0, 5.0],
consultancy=[0, 0, 1, 0, 1, 1],
profits_next_6m=[1, 1.1, 1.2, 5.5, 5.7, 5.7],
))
df
처치에 따른 수익 profits_prev_6m 단순 비교시,
(df.query("consultancy==1")["profits_next_6m"].mean()
- df.query("consultancy==0")["profits_next_6m"].mean())
> 1.666666666666667
→ 1.66백만달러의 차이가 난다. (교란이 섞인 부정확한 인과효과)
과거 실적이 비슷한 회사별로 인과 효과 추정 (조건부 독립성 가정 활용)
avg_df = (df
.groupby(["consultancy", "profits_prev_6m"])
["profits_next_6m"]
.mean())
avg_df.loc[1] - avg_df.loc[0]
> profits_prev_6m
> 1.0 0.15
> 5.0 0.20
> Name: profits_next_6m, dtype: float64
→ 과거 실적이 낮은(1.0) 그룹의 인과 효과는 0.15, 과거 실적이 높은(5.0) 그룹의 인과 효과는 0.2로, 두 그룹의 크기가 동일하기에 가중 평균을 구하면 0.175
→ 컨설턴트가 미래 수익에 미치는 영향이 약 175,000달러라고 결론내릴 수 있다. 단, 과거 실적은 컨설턴트 고용과 미래 실적의 유일한 공통원인이라고 가정했을 때(조건부 독립성 가정 활용)
✅ 앞문 보정
: 측정되지 않은 공통 원인이 있더라도, 인과 메커니즘 지식을 활용하여 앞문으로 인과효과를 식별할 수도 있다.
처치가 결과에 미치는 영향(T→Y)과 매개자가 결과에 미치는 영향(M→Y) 두 가지 효과를 결합한 것으로 식별이 가능하다.
하지만 여기에서는 처치(T)와 매개자(M)가 결과(Y)에 미치는 영향을 식별할 수 있어야하기에, IT 업계에서는 적용 사례를 찾기 어려워 많이 쓰이진않음
3.7 교란 편향
교란
: 비인과적으로 연관성이 흐르는 열린 뒷문 경로가 있을 때 발생하는데, 일반적으로 처치와 결과가 공통원인을 공유하기 때문에 발생한다.
✅ EX. 새로운 관리 교육 프로그램(T)이 관리자의 참여도(Y)를 높이는가?
여기에서는 관리자의 자질(이미 잘하고 있는 경우 프로그램에 참석하는 경향이 있을 것)이 교란편향을 일으킨다.
- 공통 원인인 '관리자 자질'을 보정해야하나, 항상 가능하진 않다. (=원인을 알지만 측정 불가능한 경우)
- 관리자의 자질을 관측할 수 없다면, 해당 변수에 따른 조건부 설정도, 교육이 참여도에 미치는 영향 식별도 불가능하다.
3.7.1 대리 교란 요인
교란 요인인 관리자 자질이 측정 불가하므로, 이 요인에 대한 대리 변수로 사용할 수 있는 다른 측정된 변수들을 찾아야 한다. 이 대리 변수를 통제함으로써 편향을 줄이는 데 도움이 되며, (완벽히 제거는 불가) '대리 교란 요인'이라 부른다.
EX. 관리자의 자질
→ (원인이 되는) 대리 교란 요인: 관리자의 근속 기간, 교육 수준
→ (결과가 되는) 대리 교란 요인: 팀의 이직률, 팀의 성과
3.7.2 랜덤화 재해석
관측되지 않은 교란이 있다고 해도, 데이터의 시간 구조를 활용하여 관측되지 않은 교란 요인을 다루거나(4부), 같은 목적으로 도구 변수를 활용(5부)할 수 있다.
✅ 민감도 분석과 부분 식별
민감도 분석
나는 모든 교란 요인을 측정하고 있는가? (X)
측정되지 않은 교란 요인이 분석 결과를 크게 바꾸려면 얼마나 강력해야 하는가?(O)
부분 식별
: 관측 가능한 데이터로 주변에 경계를 설정하는 것
3.8 선택편향
: 공통 효과(Collider)나 매개자(Mediate)를 조건부로 설정할 때 나타나는 편향
(↔ 교란편향은 처치와 결과의 공통원인(Confounder)을 통제하지 않을 때 발생하는 편향)
3.8.1 선택 편향(1) 충돌부(Collider) 조건부 설정
✅ EX. 신규 기능(X)이 고객의 만족도(Y)를 높였을까?
공통 효과(설문 응답)가 조건부로 설정되어 나타난 선택 편향
- NPS를 측정하기 위해 실험-대조군에 설문을 보내 제품을 추천할 의향이 있는지 묻기
- 신규기능을 사용하고 설문에 응답한 고객들이 그렇지 않은 고객들보다 NPS 점수가 더 높다면, 이 차이가 신규기능이 NPS에 미친 인과효과 때문이라고 할 수 있을까?
→ 인과효과라고 볼 수 없다.
X와 Y는 충돌부 구조
:신규 기능(X)과 고객의 만족도(Y)는 '설문 응답'(C)이라는 공통 효과(충돌부)를 가짐
- 신규 기능 → 설문 응답
- 고객 만족도 → 설문 응답
공통효과(설문 응답)에 조건부를 두어(=NPS 설문에 응답한 사람들에게서만 측정된 NPS를 고객 만족도로 사용) 선택편향이 생김
- 이 선택편향을 확인하기 위해 그래프를 다시 만들고 신규 기능(X) → 고객 만족도(Y)로 가는 인과 경로를 삭제하면, NPS로의 직접적인 경로가 닫힌다.
- 그 다음 설문 응답을 조건부로 두면, 신규 기능(X)-NPS(순고객 추천지수)가 여전히 연결되는지 확인할 수 있다.
X(신규 기능)-Y(고객 만족도) 인과 경로를 삭제하여, 선택 편향(신규 기능-NPS)의 편향 확인
nps_model = nx.DiGraph([
("RND", "New Feature"),
# ("New Feature", "Customer Satisfaction"),
("Customer Satisfaction", "NPS"),
("Customer Satisfaction", "Response"),
("New Feature", "Response"),
])
not(nx.d_separated(nps_model, {"NPS"}, {"New Feature"}, {"Response"}))
> True
인과 경로 삭제 후 여젼히 연결되어있는 것으로 보아, 신규 기능 - NPS간의 선택 편향이 존재했음을 확인할 수 있다.
* 인과 경로를 삭제하고 처치와 결과가 여전히 연결되는지 확인하는 접근법은 선택편향에 항상 효과적이지는 않다. 선택편향이 있는 그래프를 다루는 파이썬 라이브러리도 아직 없음 ,,
✅ 반사실적 결과와 비교하여 편향을 직관적으로 이해하기
만약 설문에 응답하지 않은 고객까지 모든 고객의 처치에 따른 결과를 볼 수 있다고 가정한다면,
다음과 같은 결과를 얻을 수 있다.
- 신규 기능을 사용한 응답자(new_feature=1) 중 63%가 nps설문에 응답(responded)
- 대조군(new_feature=0)중에는 18%만이 nps설문에 응답
- 실험-대조군 모두 nps_0에서 nps_1로 가면서 약 0.4만큼 증가 (인과효과=0.4)
실제로는 responded한 사람들의 nps만 존재하기에, 이러한 방식의 nps 열을 볼 수 없다.
응답자별로 분석을 세분화해서 응답자들의 nps는 확인할 수 있다.
→ 0.53(T=1) - 0.31(T=0) = 0.22로, 인과효과가 0.4가 아니라 그 절반 정도 수준에 불과함을 확인할 수 있다. (선택편향 때문)
→ 즉, 고객 만족도가 응답률에 영향을 미치면, 편향(↔ 응답 여부에 따른 인과효과의 차이 존재)은 0이 되지 않는다는 사실을 알 수 있다.
- 만족한 고객은 NPS 설문에 응답할 가능성이 더 높으므로 이 상황에서는 식별할 수 없다.
- 신규 기능(T)이 만족도를 높인다면, 대조군에는 실험군보다 만족도가 높은 고객이 더 많이 포함될 것
- 실험군에는 기준 만족도가 높은 고객과, 기준 만족도가 낮았으나 처치 덕분에 만족도가 높아져 설문에 응답한 고객이 포함되기 때문
- E[Y0| T=0, R=1] > E[Y0| T=1, R=1])
3.8.2 선택편향 보정
앞서 예제에서 보았듯이, 설문에 응답한 사람들을 조건으로 설정하면, 신규 기능과 고객 만족도 사이의 backdoor path를 차단할 수 없다.
따라서 선택편향을 보정하기 위해서는, 추가 가정을 해야 하며, 이 과정에서 그래프 모델을 활용할 수 있다.
✅ 선택편향을 보정하기 위한 추가 가정
"결과가 선택을 야기하지 않는다."
↔ "선택을 설명하는 변수를 조건으로 두자" (= 선택-결과 간의 backdoor path를 제거)
- 결과가 선택을 야기한다는 의미는, 고객 만족도 Y가 높으면 설문 응답률이 높고, 만족도가 낮으면 설문 응답률이 낮아지는 현상
- 만약 신규기능(T) 이외에 고객이 설문에 응답할 가능성과 고객 만족도(Y)에 모두 영향을 미치는 '앱 사용 시간'(=선택을 설명하는 변수)이 있다면 (선택과 결과 모두 유발하는 다른 관측 가능한 변수가 있다면,)
→ 앱 사용 시간을 통제해서 신규 기능(T)이 만족도(Y)에 미치는 영향을 식별할 수 있다.
실험군과 대조군 간의 backdoor path는 '앱 사용 시간'을 통해 흐른다.
- 설문 응답에 조건부를 두게되면, 응답을 충돌부로 두어 신규 기능(X)과 앱 사용 시간 노드가 설명되는 현상이 발생
- 따라서 설문 응답에 조건부를 두면 앱 사용 시간과 고객 만족도간에 원치 않는 연관성이 만들어질 수 있다.
- 선택(R, 응답률)을 조건부로 두어서 열리게되는 path를 X3~X5를 보정함으로써(=conditioning) 다시 닫을 수 있다.
- 그러나 닫을 수 없는 경로(점선)가 두 가지 있다.Y→R←T와 T→R←U →Y
- 처치가 직접 선택을 유발하고, 결과가 선택과 숨겨진 공통 원인을 공유하기 때문
- U의 일부 변동을 설명하는 X2와 X1에 조건을 두어 이 마지막 경로의 편향을 줄일 수나, 완전한 제거는 불가능
✅ 생존분석의 숨겨진 편향
생존분석
: 지속 기간이나 사건 발생까지의 시간을 포함하는 분석으로, 많은 비즈니스 사례에서 나타남
✅ EX. 대출 금액(X)이 고객의 대출 채무불이행 가능성(Y)을 어떻게 높일까?
3년 만기 대출을 받은 고객이 첫 해, 둘째 해 혹은 셋째 해에 채무불이행 할 수도 있고, 모두 상환할 수도 있다.
은행이 대출 금액을 무작위로 배정했다고 했을 때,
- 1년동안 생존한(↔대출 상환한) 고객만 2년차에 관측되고,
- 1년 및 2년 차에 생존한 고객만 3년 차에 관측됨
1. 대출 금액 무작위 배정은 1년차 상환 시점에만 해당된다.
- 2년 차부터는 1년 차에 상환한 고객들만 남기 때문(=생존자만 남음)
- 이러한 '선택'은 첫 해 대출 규모의 효과만 식별가능하게 만듦
- 결과가 선택을 야기하지 않는다는 가정이 깨진다.
2. 2년차부터는 대출 금액이 높은 고객들이 대다수를 차지한다.
- 2년차부터는 1년차에 상환했기에 대출 금액이 높은 구간에서의 대출이 있는 고객이 많을 것
- 즉, 대출 금액이 채무불이행률을 높이는 경향이 생긴다.
- 2년차부터 채무불이행 위험이 낮은 고객들은 대출 금액이 높은 금액 구간에서 과대대표된다.
→ 따라서, 과대대표되는 고객군의 위험률은, 더 큰 대출 금액으로부터 발생할 수 있는 위험률 증가를 상쇄할만큼 영향이 낮아야 한다.
→ 이 선택편향 문제의 간단한 해결책은 연간결과 Y | time = t (↔위험률 Y | time = t)보다 누적결과 Y | time > t (↔생존률 Y | time = t) 에 초점을 맞추는 것
EX. 2년 차의 대출 금액 P(Default | yr=2)는 식별할 수 없지만, P(Default | yr<=2)는 식별할 수 있다.
3.8.3 선택 편향(2) 매개자(Mediate) 조건부 설정
- 지금까지 설명된 선택편향은 불가피한 모집단의 선택 때문에 발생하여, 모집단이 조건부로 주어지도록 강제하였다.
- 의도치 않게 선택편향이 발생하는 경우가 있다.
✅ EX. 동일한 자격을 갖춘 남성과 여성이 다르게 임금을 받는가?
- 매개자인 '직급'을 조건부로 설정 - 선택편향을 제거하기 위해 직급을 통제할 수 있다.
- 직급이 동일한 남성과 여성의 급여가 다르다면, 회사 내 성별 임극 격차가 존재하다는 증거로 생각할 수 있음
- 여성과 남성의 임금차이의 직접 원인 (여성 → 임금)과 간접 원인 (여성 → 직급 → 임금)이 존재한다.
- 남성과 여성의 임금(Y) 차이는 직급(M) 자체의 차이에서도 비롯된다. 여성이 더 높은 직급으로 승진할 가능성이 적음
- 즉, 간접 원인 (여성 → 직급 → 임금)이 처치(여성)과 결과(임금) 사이의 인과 경로이기도 하기에, 배제할 수 없음
- 만약 직급을 통제하고 간접 원인을 고려하지 않는다면, 직접적인 원인만 (여성 → 임금) 식별할 수 있다.
또한, 매개자의 자식이 조건부로 주어져도 편향을 초래한다. 이러한 경우 인과 경로를 부분적으로 차단함
3.9 요약
✅ 식별
: 인과 그래프에서 비인과 흐름(backdoor path)으로부터 인과적인 흐름을 분리하는 것
✅ 분리해야 하는 뒷문 경로(ex.교란 편향)가 있는지 확인하기
- 그래프에서 인과 경로를 제거한 후, T와 Y노드가 여전히 연결되는지 확인, 연결된다면 편향이 존재하는 것
- 베이지안 네트워크 라이브러리 networks 활용: 그래프에서 두 노드가 연결되는지 확인할 때 도움을 줌
✅ 인과 그래프에서 비인과 연관성 경로를 차단하는 방법
- 그래프에 개입
- 일부 변수에 조건부를 두기
✅ 일반적인 두 가지 편향 구조
1. 교란 편향: T와 Y가 공통 원인을 공유할 때 발생 (분기 구조를 형성하여 T와 Y사이 backdoor path가 생김)
*만약, 처치 노드에 개입할 수 있다면 (RCT를 설계하는 상황이라면) 처치를 가리키는 모든 화살표를 삭제한 새로운 그래프를 만들어 교란 편향을 제거할 수 있다.
- 해결 방법: 직접(또는 *대리 변수를 사용) 공통 원인 보정
- 보정 방법: 교란 X를 조건부로 두기 (조건부 독립성 가정 활용하기)
*대리변수 사용: 직접적인 교란변수가 아님에도, 특정 변수를 잘 보정하면 교란으로 인한 편향을 제거할 수 있다. 대리 변수가 교란 변수를 설명할 수 있다면, 해당 변수를 모형에 넣어 편향 보정
2. 선택 편향: T와 Y사이의 공통 효과(또는 공통 효과의 자식)나 매개자(또는 매개자의 자식)를 조건부로 설정할 때 나타나는 편향
- 실험으로도 해결되지 않고, 직관적이지 않고 발견하기 어렵다.
- 교란편향처럼 변수 보정의 문제를 넘어서, '어떤 표본을 얻을 것이냐'에 대한 문제
인과추론의 데이터과학
Session 7-1. 인과 그래프(Causal Diagram)
https://www.youtube.com/watch?v=rbZ4ebZCHMY&ab_channel=%EC%9D%B8%EA%B3%BC%EC%B6%94%EB%A1%A0%EC%9D%98%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99
'데이터 분석 > 인과추론' 카테고리의 다른 글
[4-2] 실무로 통하는 인과추론 with 파이썬 - 4장. 유용한 선형회귀 (0) | 2024.05.12 |
---|---|
[4-1] 실무로 통하는 인과추론 with 파이썬 - 4장. 유용한 선형회귀 (0) | 2024.05.09 |
[3-1] 실무로 통하는 인과추론 with 파이썬 - 3장. 그래프 인과모델 (0) | 2024.05.01 |
[2] 실무로 통하는 인과추론 with 파이썬 - 2장. 무작위 실험 및 기초 통계 리뷰 (0) | 2024.04.21 |
[1] 실무로 통하는 인과추론 with 파이썬 - 1장. 인과추론 소개 (1) | 2024.04.14 |