통계에 관련된 책이나 분석방법을 찾다보면 자연스럽게 선형대수학에 대한 개념이 나오게 된다. 이번에는 khan Academy와 개발자를 위한 선형대수학 책을 병행학습하며 기초에 대해서 정리해보고자 한다.


1. 글목차

  • 기본개념
  • 데이터분석의 활용 분야
  • 벡터

2. 본문

2.1. 기본 개념

세상에는 두가지 값이 존재한다. 크기만 존재하는 값을 의미하는 스칼라(Scala), 크기와 방향이 존재하는 벡터(Vector). 이과 전공으로 물리학에서 자주 등장하는 힘에 관련된 표기를 흔히 벡터로 표기하기 때문에 익숙하다.

 

  • 선형대수학(Linear Algebra)는 이처럼 벡터와 행렬, 선형 변환과 같은 수학적인 구조를 다루는 학문이다. 통계학과에서는 2학년의 전공 필수 과목이다.

서울대학교의 통계학 전공 로드맵

선형은 직선처럼 행동하는 성질을 뜻하며, 벡터와 행렬 연산에서 입력이 변할 때 비례적으로 변하는 특성을 가짐을 의미한다. 반면 대수는 원소들의 연산 규칙을 이용하여 복잡한 수학구조를 다룰 수 있게한다. 선형대수에서는 벡터 공간안에서 행렬, 선형 변환과 같은 대수적 구조를 연구하는 학문이다. 

  • 벡터(Vector)는 크기와 방향을 갖는 수학적 개체로 n-차원 공간에 한 점을 나타나는 배열이다. 
  • 행렬(Matrix)은 숫자들을 직사각형 모양의 배열로 나타낸 수학 구조이며, 벡터의 선형변환이나 여러 방정식을 하나의 시스템으로 묶어 처리하는데 사용된다. 기하학적으로는 벡터의 선형 변환을 적용하는 도구이다.

벡터과 행렬의 연산은 다른 벡터를 생성한다.

  • 선형 변환(Linear Transformation)은 벡터나 행렬을 변환하는 함수로, 공간에서 점들을 다른 위치로 이동시키는 방법이다. 


2.2. 활용 분야

  • 데이터는 벡터와 행렬로 표현되므로 데이터분석을 하는 툴의 기본은 이런 선형대수의 이론을 기반으로 한다.
  • 선형 회귀 분석은 가장 기본적인 예측 모델 중 하나라 선형 방정식을 기반으로 한다. 

$\hat{y} = X \beta  $

  • 차원축소 방법 중 하나인 주성분 분석(PCA)은 행렬의 고유값과 고유벡터의 계산을 통해 데이터의 주된 변동을 설명하는 축을 찾아내어 데이터의 차원을 줄인다.  해당 내용은 데이터과학을 위한 통계 스터디에 정리한 바 있다.

https://snowgot.tistory.com/134

 

(9) DSforS : Chap5. 분류 5.1 ~ 5.3 나이브베이즈(NB), 선형판별분석(LDA)

1. 목차5.1. 나이브베이즈(NB)5.2. 선형판별분석(LDA) 2. 본문 들어가기에 앞서 이책이 이론적으로는 확실히 친절한 책은 아님을 다시 확인시켜주는 단원이라 생각된다. 특히 나이브 베이즈와 판별

snowgot.tistory.com

 

  • 추천시스템(Recommendation System)은 행렬 분해(Matrix Factorization) 방법을 사용하여 사용자와 아이템 간이 상호작용 행렬을 분해아여 숨겨진 패턴을 발견한다. 예를들어 특이값 분해(Sigular Value Decomposition)은 추천 시스템에서 자주 사용 되는 기법이다. 
  • 클러스터링 및 분류: K-means 클러스터링과 같은 군집화는 벡터 간의 유사도를 계산하기 위하여 유클리드 거리 혹은 코사인 거리가 사용된다. 이때 연산이 선형대수 기반이다.

 

2.3. 벡터(vector)

  • 표기법: 일반적으로 진한 로마자 $v$ 혹은 이탤릭체 $v$, 위쪽에 화살표 $\overrightarrow{v}$를 붙여 표기한다.
  • 차원(dimensionality): 벡터가 가진 원소의 수. 차원은 일반적으로 $\mathbb{R}$ 으로 나타내는데 $\mathbb{R}^2$ 와 같이 표현하면 실수(Real Number) 2차원 평면(흔히 말하는 x,y축)에 존재한다는 것이다.
  • 방향(orientation) : 열방향 혹은 행방향으로 나타낸다. 
    • 벡터는 시작점이 일반적으로 원점을 기준으로 표기하며, 방향과 크기만 같다면 모두 같은 벡터이다. 

       
      • 방향이 존재하기 때문에 벡터는 기하학적 공간에 표기하여 설명을 할 수 있는 장점이 있다. 대표적으로 벡터의 덧셈과 뺄쌤은 다음과 같이 표기한다.

백터의 덧셈
벡터의 뺄샘

  • 크기(norm): 는 벡터의 꼬리부터 머리까지의 거리이며 일반적으로 유클리드 공식에 따라 구한다. 크기는 양쪽에 | 2개로 표기한다.

$ \left\|v \right\| = \sqrt{\sum_{i=1}^{n}{v_{i}^2}} $

  • 단위 벡터: 길이가 1인 벡터로 어떤 벡터든 크기기로 나누면 길이를 1로 제한하여 만들 수 있다.

$  \left\|v \right\|  =1 $

 

  • 벡터의 내적(dot product)
    • 벡터의 내적은 점곰(dot product) 혹은 스칼라 곱이라고도 표현하며, 동일한 차원의 두 벡터사이에서 수행할 수 있다. 예를 들면 [1 2] $\cdot $ [1, 3 ] = 1*1 + 2*3 = 7 이 된다. 내적한 값은 방향이 존재하지 않은 스칼라 값이 된다.  시그마 표기법을 이용한 공식은 다음과 같다.

$ \vec{v} \cdot \vec{w} = \sum^n_{i = 1}{a_i b_i}$

Python에서는 numpy의 np.dot 함수로 구할 수 있다.

import numpy as np

v = np.array([1,2])
w = np.array([1,3])

np.dot(v,w)
# 7

벡터의 내적은 두 벡터의 유사성과 매핑의 척도이다. 몸무게와 키의 데이터를 수집했다고 했을때 각 벡터의 내적은 클 것이다. 하지만 단위가 크면 해당 값도 클 것이기 때문에 각 벡터의 크기로 정규화로 제거할 수 있다. 이런 정규화된 내적을 피어슨 상관계수 라고 한다. 

  • 내적의 기하학적 해석
    • 내적을 벡터 기호를 이용하여 표기하면 다음과 같다.

$ \overrightarrow{v} \cdot \overrightarrow{w} = \left\| v \right\| \left\|w \right\| cos(\theta) $

여기서  $ \overrightarrow{a}*cos(\theta)$ 는 $ \overrightarrow{v}$의  $ \overrightarrow{b}$의 정사영(projection)임을 확인할 수 있다. (삼각함수의 성질)

  • 백터의 외적(Corss product)
    • 벡터의 외적 크로스 곱이라고 말하며,  $vw^{T}$로 나타낸다. 기본적으로 벡터는 열방향으로 표기하므로 전치(Transporse)를 통해 행방향으로 바꿔주기 위함이다. 또한, 외적은 내적과 달리 3차원 공간에서만 정의된다. 

$ \|\vec{v} \times \vec{w}\| = \|\vec{v}\| \cdot \|\vec{w}\| \cdot \sin \theta $

 

import numpy as np

v = np.array([1,2,3])
w = np.array([1,4,5])

np.cross(v, w.T)
# array([-2, -2,  2])
  • 외적의 기하학적 해석
    • 외적은 3차원 공간에서 두 벡터가 만들어 내는 평면의 법선 벡터이다

  • 직교 벡터 분해
    • 행렬의 특징 중 하나는 분해를 통해 행렬에 숨겨진 정보를 찾을 수 있다는 점이다. 마치 실수는 정수와 소수점 부분으로 나눌 수 있고, 수는 소인수 분해를 통해서 소수로 나눌 수 있는 것 처럼
      • ex) 4.27 -> 4 + 0.27
      • ex2) 16 -> $ 2^4$
    • 원리: 두 벡터가 있을 때, 한 벡터를 다른 벡터에 직교하는 벡터를 만들려면 어떻게 해야할까? 아래 $ \overrightarrow{b}$ 의 벡터를 $ \overrightarrow{a} $ 에 직교하도록 하려면, 상수배 ($\beta$)를 한 $ \overrightarrow{a}$를 만들고 두 벡터의 차이를 구하면 된다. 두 벡터의 차이가 직교하면 내적이 0 이되므로 다음 식이 성립한다.

$ a^{T}(b-\beta{a}) = 0 $

$\beta$를 구하기 위하여 내적이 분배 법칙이 가능하다는 점을 응용한다면 다음 식에 도달하게 된다.

$ a^{T}b - \beta a^{T}a = 0  $

$ \beta a^{T}a = a^{T}b $

$ \therefore \beta = \frac{a^{T}b}{a^{T}a} $

위식 $\beta$는 선형회귀의 $\beta$와 같은 기호이다. 위 식은 벡터 b를 a에 투영하여 그 투영 성분을 제거해 a와 직교하는 방법만 남기는 방법이다.  직교한다는 것은 기존 데이터(a벡터)를 설명하지 못하는 오차(잔차)를 말하며  바로 $ a^{T}b - \beta a^{T}a$ 벡터가 잔차 성분이다.  이처럼 행렬분해와 직교화는 최소제곱법, 통계학, 머신러닝에 걸쳐 이루는 많은 응용의 기반이 된다.

9월 2일부터 2달간 진행된 인과추론 스터디에 대한 후기를 남깁니다. 작년에 워낙 핫한 분야이기도 하였고, 마냥 쉽지 않을거라 생각했지만 이때 아니면 언제 공부해보겠는가라는 생각으로 진행했습니다. 매주 Chapter를 학습하고 개념들을 정리하면서 블로깅까지 마무리를 했습니다. 


1. Keep

  • 블로그에 Latex문법을 쓰면서 꽤나 속도가 늘었습니다. 이제는 손으로 쓰는것보다 Latex문법이 편할 정도입니다. Notion 역시 Latex 문법을 지원하기 때문에 공부 자료를 정리하기가 매우 좋아져서 만족합니다.
  • 책에 함축된 개념들이 많아서 한 번이 아닌 이틀에 걸쳐서 반복해서 읽고 데이터의 인과추론 유튜브를 보면서 복습을 했습니다. 모호하던 개념들이 정리가 되는 점이 좋았습니다.
  • 스터디 참여원들에게 알려주면서 스스로 깨닫게 되는 공부방식도 좋았던 것 같습니다. 

2. Problem

  • 난이도 자체가 높기 때문에, 일주일에 5-6시간 투자로는 밀도있는 읽기가 쉽지 않았습니다. 특히 통계학 학부 과정에서 당연히 알고가는 필수 개념들(ex 선형대수, 결합확률 등)을 당연히 알고 전개하는 책이라 이해하는데 시간소모를 쓰게 되었습니다.
  • 자연스럽게 학습을 하는데 시간을 많이 쓰다보니, 놓치는 개념이나 실예제에서 어떻게 쓸지에 대한 이해도 멀어져가는 부분이 있었습니다.

3. Try

  • 지식의 밀도에 따라 시간배분을 해야할 필요가 있겠습니다. 같은 개념을 이해할 때 다양한 소스 혹은 컨텐츠로 이해할 필요가 있다고 느꼈습니다.
  • 돌아돌아 기본 통계 개념와 파생되는 개념에 대한 통달이 아직 되지 않은 것 같아 보완이 필요하네요. 기본서를 다시 들쳐봐야겠습니다.

 

종합적으로 볼 때, 할 수있는만큼 공부했고 더 나아가기 위해서 Chapter 5에서 멈추고 선형대수부터 다시 공부해볼 생각입니다. 아마 인과추론은 데이터분석분야에서 계속 저를 괴롭힐 것 같은 생각이 드네요 😂

2024년 10월 12일 ADP 시험을 보고 왔습니다. 결론적으로 말하자면 디버깅하는데 시간을 너무 많이 써서 100% 실력발휘를 못한거 같아 너무 아쉽습니다.  문제는 평이했지만 시간이 너무 모자라서 아쉬움이 많이 남는 회차입니다. 복기도 할 겸 정리를 해봅니다.


1. 개요

  • 9시 ~ 9시 30분: 화장실 동선확인, 자료 정리, 응시표, 신분증 준비 등을 진행

시험은 신도림 테크노마트 5층 그린컴퓨터학원에서 치뤘습니다. 9시 정시에 입장했지만, 수험생 번호표도 안 붙어있어서 시험장으로서 준비는 잘 안되어있습니다. 입장해서 주위 환경과 동선을 파악하고 자료정리에 신경을 썼습니다.

https://naver.me/GxOLoE1G

 

그린컴퓨터아트학원 신도림캠퍼스 : 네이버

방문자리뷰 61 · 블로그리뷰 74

m.place.naver.com

 

  • 9시 30분 ~ 10시: Chrome 실행, 시험URL 즐겨찾기, 데이터 확인

9시 30분부터는 데이터를 확인하면서부터 문제를 대략 유추할 수 있었습니다. 예를 들어 ts라는 데이터 이름이 존재해서 시계열 문제가 나오는구나 체크하고 시계열 관련된 코드를 준비했습니다. 다른 데이터도 미리 불러오고 관련된 라이브러리도 사전에 import 하여 준비하는 것이 좋겠습니다. 어쨋든 최종적으로 워드로 작성 제출해야하기 때문에, 가독성 높은 코드는 나의 논리를 전달하기 좋으니까요~

 

2. 머신러닝 단원

문제 1,2,3번

머신러닝의 1~3번 문제는 1개의 데이터로 진행했고, 간염의 진행상황(0,1,2,3)를 종속변수로 하고  각종 간질환 지표를 독립변수로 하는 데이터였습니다. 다음 데이터셋과 비슷하나 독립변수가 모두 전처리된 연속형 변수 였습니다. 

https://www.kaggle.com/datasets/fedesoriano/hepatitis-c-dataset

1-1)결측치 처리 방안 2개 제시하고, 통계량으로 비교하고, 어떤걸 사용하는게 좋을지 제시해라
1-2)이상치 판단하고, 처리해야할지 판단해서 제시하라
1-3) 위의 처리를 마친 데이터로 EDA를 실행하는데, 종속변수의 데이터 값을 기준으로 독립변수들이 다름을 확인해라
1-4)상관행렬 구하고, 상관행렬을 주성분분석하여 새로운 설명변수를 만드는데 사용할 수 있는지 판단하여 제시해라

결측치 방안을 단순대치, 알고리즘 대치 등으로 작성할 수 있었는데, 시간이 너무 없어서 단순대치만 적어야 했던게 너무 아쉽습니다... 주성분분석의 경우 해석력을 잃어버리는 단점이 존재하니까 그만큼 가치가 있는지 보기 위해서 상관관계를 확인해보면 됩니다. 만약 다중공선성 등이 발견되면 적용하면 됩니다.

2-1)클래스 불균형이 존재하는데 해결할 수 있는 방안 2가지를 제시
2-2)클래스 불균형 상황에서 분류모델의 성능을 평가하기 위한 방안 3가지를 제시(10점)
2-3)위에서 제시한 2가지 불균형 처리 방법을 사용하고, 3가지 평가지표로 결과를 평가
*행 넘버의 5의 배수로 train과 test 셋 분리
*종속변수가 0,1,2,3 4개 값을 가지는데, 0과 1,2,3의 2가지 범주로 나누어서 모델 학습 및 평가 진행

2-2 클래스 불균형문제는 10점 배점이였고 아마 방안 1개당 3점, 3개 다 적으면 10점이 되는 형식이였나 봅니다. f1_score가 precision/recall의 개념을 담고 있기에 따로 뭐가 있나 하고 고민하던 중 시간이 없어서 추가로 기입을 못했습니다 ㅠㅠ

3-1) 1에서 전처리한 데이터를 바탕으로 종속변수에서 0을 제외한 1,2,3의 데이터만 가지고 학습 및 평가 진행해라. 이 때 모델은 3개 사용.
*동일하게 행 넘버의 5의 배수로 train과 test 셋 분리
3-2) 위에서 학습한 모델과 평가지표를 바탕으로 간염여부를 판단할 수 있는 지표? 정보?를 제시해라

3-2) 문제에서는 변수 중요도라는  명확한 워딩이 있던걸로 기억하는데, 아마 회귀분석이면 $/beta$ 값, 트리모델이면 Featrure importance 기준으로 나열했으면 되었을 것 같습니다.

문제 4번

두 개의 데이터를 주어주고 각각 전처리하여 조인 하는 문제였습니다.  32회 기출의 발전기와 시간에 따른 출력량이 pivot 되어있는 테이블이여서 전처리에는 크게 어렵진 않았습니다만... 중간에 함정이..

4) 지하철 이용객, 기상 데이터(aws.csv)
- melt 함수 사용
- 강수량에 대해 0으로 결측치 대치
- 기초통계량 확인하여 제시
- 토,일에 해당하는 데이터 weeday 1로, 나머지 0으로
*(weekday의 단어 뜻을 모르나..? 왜 이런 변수명이..)
- 두 개 csv merge

1)user 컬럼과 기후를 나타내는 컬럼들의 상관관계를 분석하고, 주말여부에 따른 user 변수의 차이를 검증하라.

2)선형 회귀모델과 머신러닝 모델을 사용하여 user 변수를 예측, 평가하라.

전처리 요구사항만 5줄인가 되어서 시간을 30분정도 썼던 걸로 기억합니다. 정말 화나는건 기상 데이터는 날짜별 시간대별 강수량, 습도 등이 적혀있는 데이터인데 2021-05-05 13시에  해당 데이터가 없어서 merge하는 과정에서 생긴 결측치가 있었습니다. 혹시 코드 수행을 잘 못했는지 디버깅 하다가 시간을 20분 추가로 날렸습니다... 크나큰 패착... inner 조인을 해야했다 생각이 들기도 하지만, 어쨋든 지하철 이용객이 Main Table이니 Left join한 건 맞다고 봅니다. 

이게 악질적으로 느껴졌던건 기상데이터는 몇 만행이고 실제로 중간에 결측치라고 표현되지도 않습니다.  다음과 같이 표현되기 때문이죠.

date humaditiy
2021-05-05 11:00   20
2021-05-05 12:00   11
2021-05-05 14:00   12

애초에 date가 날라가 있기 때문에 데이터 자체로만 보면 결측치인지 알 수 가 없습니다..  date를 시작날짜와 끝 날짜로 dummy table을 만들어서 공란이 있는지 확인을 해볼 수 도 있을 것 같지만.. 시간이 이렇게 부족한 시험에서 이렇게 만들었어야 했나 싶습니다.

3. 통계분석

문제 5번

데이터: A,B 공장의 수율 데이터(defective.csv)
- 불량률(100-수율)에 대해 검정진행이므로 새로운 컬럼 생성 필요
- (A B 공장간 불량률) 차이 평균 표준편차
- 차이 검정에 대한 귀무/대립가설 제시하고 검정 진행해라.

간단한 2그룹 수치형 검정에 대한 문제입니다. 데이터가 600개가 넘었던걸로 기억하는데, 정작 kolmogorov 검정을 해보니 p-value가 0.000 이하로 낮게 나와서 맨-휘트니 검정으로 진행하고 차이가 있다고 결론 지었습니다. 정말 이상했던 건, 이단 이 통계 검정 뿐 아니라 다른 2그룹 연속형 수치 검정 문제들이 p_value가 매우 다들 낮게 나와서 제가 잘못했나 다시 확인하기도 했습니다.

문제 6번

데이터: 기차연착(delay.csv)
데이터 호선 4개 주어지고, 연착횟수(5분, 10분, 15분, 20분, 25분? 5분 단위 6개 컬럼)
1)지하철 노선 1번 데이터의 연착횟수가 포아송 따르는지 검정하는 2가지 방법 제시
2)시간에 따른 연착횟수를 3개 컬럼으로 재처리(10분미만, 10~20분? 20분 초과?)하고, 
지하철 노선 별 연착횟수가 차이가 있는지 검정 진행(분할표 만들고, 2개 Column씩 합친 다음 카이제곱 검정 진행)

결과적으로 노션별 연착 구분별 crosstab을 만들고 카이제곱을 진행하면 되는 쉬운 문제입니다.

문제 7번

- 데이터: 단일컬럼 시계열(ts.csv)
- 컬럼명 없이 데이터만 존재 했음
- 1) acf, pacf의 개념을 설명하고  모델을 적합해라
- 2)Acf pacf를 그리고, 해당 Plot data를 기반으로 ARMA(p,q)모형 제시

여기서 또 마음에 안드는게 단일 시계열 데이터인데  컬럼명이 안 적혀있어서 단순히 pd.read_csv 불러오면 첫 번째 데이터가 컬럼명으로 들어옵니다. 물론 header = None을 넣으면 되지만 이렇게 일관성 없게 데이터를 줘야만 했나 생각이듭니다.  문제 자체는 쉬워서 pmarima로 자동 적합을하고 pacf, acf 그래프를 그려서 해석을 붙였습니다.

4. 마무리

선형계획법과 같은 문제는 나오지 않고 전처리의 비중이 다소 크고 통계문제는 평이했던 것 같습니다. 하지만 시간이 너무나도 부족하기 때문에 9시 30분~10시에 주어지는 데이터와 jupyter notebook 환경에 미리 세팅해놓는게 좋겠습니다. 또한, 머신러닝 문제는 1번 ~ 3번 과 같이 묶여서 진행 되기 때문에 재사용 가능한 함수형으로 모델을 구축해놓는게 좋겠습니다.문제의 모든 부분이 코딩으로 수행해야하는 것은 아니며, "데이터 불균형에 적합한 평가지표를 작성하라", "ACF와 PACF 정의를 작성해라" 등의 텍스트로 수행할 수 있는 문제도 있으니 문제를 받으면 해당 문제의 답은 미리 작성하는게 좋겠습니다. 

전반적으로 뭔가 문제를 고찰하고 다양한 실험을 해볼 수 있는 시험은 아니라는 걸 깨달았고, 그때 그때 생각나는 답변을 적어서 최소한의 점수를 확보하는게 유효할 거라 생각됩니다. 나름 선방할 수 있는 기회였는데 많이 아쉽네요 ㅠㅠ . 결과를 지켜봐야겠습니다.

1. 도입

글또 10기가 다시 시작되었다. 8기가 시작한게 23년 1월이니 거의 만 2년에 가까워지는 것 같다. 글또에서 글을 쓰고자고 결심한 이유는 일을하면서 문서의 힘을 경험하면서이다. 결국 다수의 사람들이 커뮤니케이션 하기 가장 기본적은 매체는 글과 문서이라고 느껴졌다. 그렇게 퇴사를 하고 개인사업을 진행하면서 내가 필요한 지식을 Hard Copy 혹은 인터넷에서 수집하는 도중 충격받은 블로그가 하나 있다.

https://recipesds.tistory.com/

 

친절한 데이터 사이언티스트 되기 강좌

Data Recipes (통계에서 머신러닝까지) 여기는 데이터사이언티스트가 되고 싶은 분들에게 기본적으로 알아야하는 것들을 널리 이롭게 알리고자 하는 곳예요. 강의실전체Map을 참고하세요!! ★ by 히

recipesds.tistory.com

히언이라는 닉네임을 가지신 분인데, 데이터사이언스에 대한 직관과 통찰로 단순히 글과 몇 가지 손으로 그린 그래프로 개념을 명쾌하게 설명해준다. 나는 놀랐던 점이, 코딩과 현란한 그래프를 가지지 않고 이렇게 쉽게 설명할 수 있다는 점이 첫 번째였고, 구조화된 글 일련의 글 목차들이 "데이터 사이언스 강좌"에 맞게 구성이 잘 되어있다는 것이 놀라웠다. 얼마나 이 분야에 고민을 많이하고 통달했으면 이런 복잡도가 높은 지식을 글로 명쾌하게 설명할 수 있을까? 실제로 히언님은 위 블로그를 만드시기 전에 임베디드 쪽에서도 체계적이고 깔끔한 설명으로 유명하시다고 한다.

이를 기반으로 하여 내가 글을 쓰고 지향하는 바가 고민해봤다. 

  1. 나 역시 지식을 누군가가 만든 책을 받아 공부를 시작했다.
  2. 나 역시 이런 지식을 공유하여 보답할 선택지가 있다. 
  3. 또한, 그 지식을 공유하면서 스스로에게 학습이 되고 나아가 나의 가치를 증명하는 기반이 될 수 있다.

학습효과의 피라미드

 

2. 목표

그래서 지난 스터디 혹은 업무 간 생각이 났던 이론들을 꾸준히 이 블로그에 올리고 있다. 하지만 몇가지 아쉬운 점이 존재한다. 이론에 집중된 공부를 하다보니 조금은 뻔하고, 가끔은 발전이 없다. 공부의 완성은 지식을 흡수하고 소화시켜서 다시 주춧돌을 만들어 나만의 방식으로 재구성하는 과정이라고 생각한다. 누군가의 책은 좋은 Example이지만 단지 흡수하는 것일 뿐, 피상적으로 이해하고 best use case만 이야기하기 때문에 업무에 적용할 때는 "어떻게 시작해야하지" 라는 물음에 갖히곤 한다. 

따라서, 이론을 익혔으면 이를 실무예제에 적용하여 적용하는 것이 중요하다고 느껴졌다. 예를 들면,  단순히 통계분포를 이해하는 것에 넘어 분포가 회사의 업무에 어떤 상황에 쓰일 수 있는지 등을 같이 작성하는 게 글로도, 나의 발전으로도 좋은 방향임을 이해하게 되었다.  따라서 앞으로 글또의 글은 다음 원칙을 가지고 작성해보고자 한다.

1. 비즈니스적 문제  정의

  • A/B test raw code 시스템 만들기(무작위 할당, 검정 등)

2. 기반이된 이론 혹은 개념

  • 통계적 해결방법이라면 Latex 수식을 이용해서 현상을 수식으로 설명하기
  • Technical 방법론 기술의 배경 덧붙이기

3. 위를 실행하기 위한 실용예제

  • 독립 실행 가능한 Python Script
  • 프로덕트 실행을 위한 git 혹은 Docker 이미지

위 내용을 글로 쓰기엔 꽤나 빡빡한 조건이긴 하다. 일을하면서 독립된 프로젝트를 2주간 만들고 글로 표현한다는 것은 쉽지않은 일임을 지금것 느껴왔다. 그럼에도 불구하고 높은 이상을 잡는 이유는 ① 안하는 것보다 뭐든 하는 것이 낫고 ② 100의 퀄리티 시간을 소모하는 것보다, 80의 퀄리티로 여러 개를 시도해보는 것이 낫다 는 마음가짐이다.

3. 마무리

회사 다닐 때는 멀리했던 이런 지식들이 이제는 조금은 나의 무기로서 갖춰가는 모습이 보인다. 조금은 뿌듯하지만, 어떤 분야도 아직 통달했다고 하기는 어려운 것 같다. 나의 작은 육각형의 스킬을 넓힐 과정을 꾸준히해서 Chief Data Officer가 되는 것이 목표이다. 단순히 알고 끄덕이는 것과  실현하고 구현해서 결과로 내는 것은 분명히 다른 것임을 더더욱 느낀다. 하나씩 조각들을 더 발전시켜 나, 팀, 회사, 데이터 생태계에 좋은 영향을 주는 사람이 되고 싶다. 나의 블로그 별명을 만들어준 지지플랏의 창조자 하들리 윗캠처럼

지난 글에서는 선형회귀분석을 사용하여 교란요인을 보정하는 방법과 온라인 실험상에서의 활용 방법을 알아보았습니다. 이번에는 또 다른 편향 방법 중 하나인 성향 점수 가중치(propensity weighting)에 대해서 알아보고 실제 예시로 구현해보겠습니다.


1. 글목차

  • 매칭의 필요성
  • 매칭의 정의
  • 방법1: 성향점수(PS)
  • 방법2: 역확률 가중치(IPW)

2. 본문

2.1. 매칭(Matching)의 필요성

교육프로그램의 효과를 측정하기 위해서 교육과정에서 얻은 데이터가 있습니다. 우리의 목적은 교육을 받은 사실(처치변수)과 직원 참여도(결과변수) 간의 인과관계를 추정하여 실제적으로 교육 프로그램이 효과가 있는지 확인할 예정입니다.

navie하게 단순성형회귀로  표준화된 참여점수(종속변수) ~ 처치변수(독립변수)에 관한 회귀분석을 진행하면 다음과 같습니다.

import pandas as pd
import numpy as np

df = pd.read_csv('./data/management_training.csv')
df.head(3)

$ engagement_{i} = \tau T_{i} + e_{i} $

import statsmodels.formula.api as smf

smf.ols('engagement_score ~ intervention', data = df).fit().summary().tables[1]

하지만 위의 식에서는 교란변수를 보정하지 않았으므로 실제로 직원교육이 직원 참여도에 0.43만큼 영향이 있다고 단언하기 어렵습니다. 4장에서 배웠던 것처럼 교란변수를 보정하여 결과를 내보겠습니다.

위의 교육프로그램에 대한 영향의 식에 교란변수까지 포함하여 식을 세우면 다음과 같습니다.

$engagement_{i} = \tau T_{i} + \theta X_{i} + e_{i} $

model = smf.ols("""engagement_score ~ intervention 
+ tenure + last_engagement_score + department_score
+ n_of_reports + C(gender) + C(role)""", data=df).fit()

print("ATE:", model.params["intervention"].round(3))
print(f"95% CI:", model.conf_int().loc["intervention", :].values.T.round(3))

"""
ATE: 0.268
95% CI: [0.234 0.302]
"""

이전의 ATE효과 보다 훨씬 작아진 것을 볼 수 가 있습니다. 따라서, 단순히 참여 여부에 대해서만 추정하게 되면 직원참여도가 높은 관리자가 교육 프로그램에 더 많이 참여 했을 가능성이 있다는 해석을 할 수 있습니다. 

하지만 이러한 교란변수 보정이 모든 변수의 상호작용 관계를 설명할 수 있는 것은 아닙니다. 예컨데 선형회귀모델은 처리변수(T)와 결과변수(Y)의 관계가 선형적이라고 가정합니다(① 선형성 가정).  다시 말해 두 변수가 비선형적이라면 인과효과를 정확하게 추정하지 못합니다. 또한, 교란 변수들 간의 비선형성 혹은 상호작용(interaction)을 담지 못합니다.(② 교란변수 모형화의 한계)

이러한 선형회귀 모델의 가정에 대한 의존성을 줄이는 방법으로, 처리군과 대조군을 유사하게 만드는 PS matching 혹은 데이터를 활용하면서 처리 여부에 따른 공변량 차이를 균형있게 조절하는 IPW 방법을 통해서 더 나은 인과 추정을 노려볼 수 있겠습니다.

2.2. 매칭의 정의

매칭이란?

  • 관찰 데이터에서 처리군과 대조군의 특성 차이를 줄여주어 인과 효과를 추정하는데 사용되는 기법

매칭을 사용하는 이유는 관찰연구이거나 혹은 A/Btest에 준하게 실험상황을 가정했는데도 불구하고 불응(non-compliance)등으로 관찰연구와 비슷하게 되었을 때 활용할 수 있기 때문입니다.  매칭은 선택 편향(Selection Bias)을 최소화하는 하나의 방법입니다.

예컨데, 교육 프로그램의 효과를 평가할 때 프로그램에 자발적으로 참여한 사람들은 참여하지 않은 사람들보다 더 높은 동기나나 학업 성취에 대한 관심이 있을 수 있습니다. 이런 상태에서 단순히 두 그룹의 평균을 비교하는 것은 교육 프로그램의 효과가 아니라 참여 동기로 인한 결과 차이를 반영하게 되어 인과적 결론을 잘못 내릴 수 있습니다.

https://stats.stackexchange.com/questions/559516/is-propensity-score-matching-a-must-for-scientific-studies

2.2. 방법1: 성향 점수(Propensity Score)

기존에는 교란변수($X$)를 식별하여 조건부로 두어 뒷문 경로를 차단했다면, 이번에는 성향 점수($e(x)$)를 조건부로 두어 다음 식을 성립하게 하는 목적이 있습니다. 

$ (Y_{1}, Y_{0}) \perp P(x)$

  • 정의: 개체가 처리를 받을 확률을 나타내는 값. 로지스틱 회귀와 같은 모델을 사용해 추정할 수 있음
  • 아이디어: 공변량 들의 고차원 정보를 하나의 요약된 값으로 표현하여 마치 차원 축소를 진행하여 차원의 저주의 문제를 줄여주게 함
  • ps score  : $ \hat{e}(X) = P(T=1 | X = x) $
    • $\hat{e}(X)$: 성향점수 추정치, 이상적인 값
ps_model = smf.logit("""intervention ~ 
tenure + last_engagement_score + department_score
+ C(n_of_reports) + C(gender) + C(role)""", data=df).fit(disp=0)
data_ps = df.assign(
    propensity_score = ps_model.predict(df),
)

data_ps[["intervention", "engagement_score", "propensity_score"]].head()

model = smf.ols("engagement_score ~ intervention + propensity_score",
                data=data_ps).fit()
model.params["intervention"].round(3)
"""
0.263
"""

결과적으로 교란변수를 보정한 선형회귀의 식과 유사한 ATE를 추정할 수 있음을 알 수 있습니다.

 

2.3. 역확률 가중치(IPW)

  • 정의: 개체가 처리를 받았을 확률(성향 점수)의 역수를 사용하여 계산. 예를들어 어떤 개체가 처리 받을 확률이 낮다면 그 개체의 가중치는 높아지는 식
  • 아이디어: 처치의 역확률에 따라 데이터의 가중치를 보정하여, 처치가 무작위 배정된 것처럼 보이게 함

 $w_{i} $ =  \begin{cases} \frac{1}{e(X_i)}, & \text{if } T_i = 1 \ (\text{처리군}) \\ \frac{1}{1 - e(X_i)}, & \text{if } T_i = 0 \ (\text{대조군}) \end{cases}

weight_t = 1/data_ps.query("intervention==1")["propensity_score"]
weight_nt = 1/(1-data_ps.query("intervention==0")["propensity_score"])
t1 = data_ps.query("intervention==1")["engagement_score"] 
t0 = data_ps.query("intervention==0")["engagement_score"] 

y1 = sum(t1*weight_t)/len(data_ps)
y0 = sum(t0*weight_nt)/len(data_ps)
ATE = y1 - y0

print(f"E[Y1]:{y1:.3f}")
print(f"E[Y0]:{y0:.3f}")
print(f"ATE, {ATE:.3f}")
"""
E[Y1]:0.117
E[Y0]:-0.149
ATE, 0.266
"""

얼핏 보면 성향점수(PS) 방법과 역확률 가중치(IPW) 방법이 같은 아이디어에서 나와서 차이가 없는 것 처럼보인다. 다음과 같이 정리해본다.

  성향 점수(PS) 역확률 가중치(IPW)
정의 공변량을 사용해 각 개체가 처리받을 확률을 추정, 확률 값 성향 점수를 이용하여 개체별로 가중치를 부여하는 방법
방법 처리군과 대조군의 특성이 최대한 비슷하도록 만들어 비교, 데이터 탈락 가능성 有  모든 개체에 대해서 계산된 가중치를 부여

 

3. 출처와 링크

 

 

 

지난 글에서는 온라인통제 실험상에서의 인과추론과 선형회귀모델을 적용하는 방법에 대해서 알아보았다. 이번 글은 선형회귀가 어떻게 무작위 배정을한 것처럼 보이게 할 수 있는지 원리와 그 기반에 되는 직교화의 개념, FWL 방법론에 대해서 작성해본다!


 

1. 글목차

  • 조건부 독립성
  • 직교화: 기하학 관점
  • 선형회귀관점에서의 직교화: FWL
  • 더미변수를 이용한 회귀 분석
  • 심슨의 역설

2. 본문

지난 글에서는 무작위 배정을 통한 교란변수의 통제가 중요하다는 것을 알았다. 하지만, RCT가 불가능하거나 어려운 상황 예컨데, 은행에서 고객들의 대출을 빌려주는 상황에서는 어떻게 처치변수(신용한도)가 채무불이행(결과변수)에 미치는 영향을 정량화 할 수 있을까?  실무로 통하는 인과추론 책 4단원에서는 선형회귀를 통한 방법론을 설명하고 있다. 

4단원을 한마디로 요약하자면 다음과 같다.

조건부 독립성이 유지될 때 직교화를 이용해서 처치가 무작위로 배정된 것처럼 보이게 할 수 있다는 점 이 방법은 FWL 정리를 이용해 적용한다. 

한글로 적혀있는데 도통 무슨 말인지 모르겠다.. 하나씩 파헤쳐보고자 한다.

2.1. 조건부 독립성

 

조건부 독립성이란 두 변수 $T$와 $Y$가 어떤 제 3의 변수 $X$가 주어 졌을 때 독립이라는 뜻이다. 수학적으로는 다음과 같이 표현된다. 

$T \perp Y | X $

  • $T$: 처치 변수, 실험하려는 요소
  • $Y$: 결과 변수, 관측하려는 요소
  • $X$: 혼란 변수, 처치와 결과에 영향을 줄 것으로 생각되는 변수

조건부 독립성이 성립하면 처치 변수 $X$가$T$와 $Y$사이의 모든 상관관계를 설명한다고 볼 수 있다. 다시 말해, 혼란 변수가 되는 $X$를 통제한다면 $T$와 $Y$의 인과 관계를 정확하게 추정할 수 있다는 이야기이다.

 

2.2. 직교화(Orthogonalization): 기하학 관점

직교화의 선형회귀 효과를 이해하기 전에 기하학관점에서 이해해보자. 우리가 생각하는 변수들은 모두 벡터 공간에서 벡터로 이해될 수 있다.(ex $Y, X, T$) 이 벡터들은 n차원의 공간에 존재하며, n은 관측치의 개수이다. 

회귀 분석에서 우리가 수행하는 것은 벡터 투영이다. 예를들어 결과 변수 $Y$를 교란 변수 벡터 $X$에 회귀 한다는 것은 $Y$를 $X$벡터 방향으로 직교 투영(Orthogonal Projection) 시킨다는 의미이며 식으로는 다음과 같이 표현한다. 

(선형대수의 필요성..)

$ \hat{Y} = X(X^{T}X)^{-1}X^{T}Y$

여기서 $\hat{Y}$는 $Y$의 벡터가 $X$벡터의 공간에 투여된 결과이다. 이 벡터는 $Y$가 $X$로 설명될 수 있는 부분만을 나타내는 것이다.

 

반면 잔차 벡터 $e$는 $Y$가 $X$에 투영되지 않는 부분으로 정의된다. 

$e = Y - \hat{Y}$

요약하자면 직교 투영을 통해 변수 간의 상관성을 제거하고 특정 벡터가 다른 벡터에 의해 설명되지 않은 순수한 부분을 구하게 된다. 이과정에서 벡터 공간에서 직교화(orthogonalization)가 이루어지는 것이다. 

위 부분은 다음 블로그를 참고하면 좀 더 정석적으로 알 수 있다.

https://angeloyeo.github.io/2020/08/24/linear_regression.html

 

선형회귀 - 공돌이의 수학정리노트 (Angelo's Math Notes)

 

angeloyeo.github.io

 

 

2.3. 선형회귀 관점에서의 직교화: FWL 

요약하자면 FWL(Frisch-Waugh-Lovell Theorem)은 다음 3단계를 거쳐 진행된다.

  1. 편향 제거 단계: 처치 $T$를 교란 요인 $X$에 대해 회귀하여 처치 잔차 $\widetilde{T} = T - \hat{T}$를 구한다.
  2. 잡음 제거 단계: 결과 $Y$를 교란 요인 $X$에 대해 회귀하여 결과 잔차 $\widetilde{Y} = Y - \hat{Y}$를 구한다.
  3. 결과 모델 단계: 결과 잔치 $\widetilde{Y}$ 를 처치 찬차 $\widetilde{T}$에 대해서 회귀하여 $T$가 $Y$에 미치는 인과효과의 추정을 구한다. 

 

다시말해 직교화는 선형 회귀에서 독립 변수들 사이의 상관성을 제거하는 과정이다. 이를 통해 특정 변수가 다른 변수로부터 독립적으로 보이게 하여 처치가 마치 무작위로 배정된 것 처럼 만드는 방법이다. 이는 FWL 정리를 사용해 두 단계로 구현할 수 있다.

import numpy as np
from sklearn.linear_model import LinearRegression

# 가상의 데이터 생성
np.random.seed(42)
n = 100
T = np.random.rand(n, 1)  # 처치 변수
X = np.random.rand(n, 1)  # 교란 변수
Y = 5 * T + 3 * X + np.random.randn(n, 1)  # 결과 변수, T와 X의 조합으로 생성됨

# 1단계: Y를 X에 회귀시켜 잔차 계산 (X가 Y에 미치는 영향을 제거)
model_Y_X = LinearRegression().fit(X, Y)
Y_residual = Y - model_Y_X.predict(X)

# 2단계: T를 X에 회귀시켜 잔차 계산 (X가 T에 미치는 영향을 제거)
model_T_X = LinearRegression().fit(X, T)
T_residual = T - model_T_X.predict(X)

# 3단계: Y의 잔차를 T의 잔차에 회귀하여 T의 순수한 효과 추정
model_residuals = LinearRegression().fit(T_residual, Y_residual)
beta_T_estimate = model_residuals.coef_

print(f"T의 순수한 효과 (beta_T 추정치): {beta_T_estimate[0][0]:.4f}")

위 단계에서 1, 2 단계가 직교화 과정이다. 

  • 1단계: $Y$를 $X$에 회귀 시켜서 잔차 계산. 결과 변수에서 교란 변수의 영향을 제거하는 역할을 한다.
  • 2단계: $T$를 $X$에 회귀 시켜서 잔차 계산. 처치 변수에서 교란 변수의 영향을 제거하는 역할을 한다. 

 잔차끼리 회귀를 수행하는 3단계는 직교화된 변수들 사이에서 처치 변수의 순수한 인과적 효과를 추정하는 과정이다.$Y$ 의 잔차는 X로 설명할 수 없는 Y의 변동 부분만 남게되며, $T$의 잔차는 $X$로 설명할 수 없는 $T$의 변동만 남게 된다

 

2.4. 더미변수를 이용한 회귀분석

책에 있는 예제를 가져와보자. 지출을 예측하기 위해서 신용한도를 처치변수로 추론하는 모델이며, 추후 임금을 통해 보정하는 방식으로 이루어진다.

  • $Y$: 결과변수 - 신용불량
  • $T$: 처치변수 - 신용한도
  • $X$: 혼란변수 - 임금

1. 데이터 불러오기

import pandas as pd
import graphviz as gr
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import statsmodels.formula.api as smf
risk_data_rnd = pd.read_csv("./data/risk_data_rnd.csv")
risk_data_rnd.head()

 

2. 단순회귀 적합하기

plt_df = (risk_data_rnd
          .assign(size=1)
          .groupby("credit_limit")
          .agg({"default": "mean", "size":sum})
          .reset_index())

plt.figure(figsize=(10,4))
sns.scatterplot(data=plt_df,
                x="credit_limit",
                y="default",
                size="size",
                sizes=(1,100))
sns.regplot(data = plt_df,
            x="credit_limit",
            y="default",
            ci = None)
plt.ylim(-0.1,0.3)

plt.title("Default Rate by Credit Limit")
plt.show()

model = smf.ols("default ~ credit_limit", data=risk_data_rnd).fit()
model.summary().tables[1]

 

먼저 신용한도와 신용불량을 단순 회귀 모델을 적합하면  계수가 음수가 나온다. 그대로 해석하면 신용한도가 높을 수록 채무불이행률은 낮아진다는 것이다. 하지만 이 부분은 현재 교란변수를 보정하지 않았기 때문에 올바르지 않은 결과일 확률이 높다. 

따라서 임금을 이용하여 보정변수로 사용할 수 있으며, 이를 위해 credit_score 1을 binning하여 적합할 수 있다. 먼저 구간 별로 히스토그램을 그리면 다음과 같다.

plt.figure(figsize=(15,6))
sns.histplot(data=risk_data_rnd,
             x="credit_limit",
             hue="credit_score1_buckets",
             kde=True,
             palette="Paired",
             alpha = 0.5);
plt.title("Conditional random experiment")
plt.show()

이후 credit_score 구간별로 더미화한뒤 적합한 결과는 다음과 같다.

risk_data_dummies = (risk_data_rnd
                     .join(pd.get_dummies(risk_data_rnd["credit_score1_buckets"],
                                          prefix="sb",
                                          drop_first=True)))

model = smf.ols(
    "default ~ credit_limit + sb_200+sb_400+sb_600+sb_800+sb_1000",
    data=risk_data_dummies
).fit()

model.summary().tables[1]

다중 회귀식 해석에 따라, 다른 credit_score을 고정시켰을때(조건부 확률일 때) 채무불이행률은 신용한도와 양수의 관계를 가진다.  단위가 작은것은 신용한도가 0 ~ 1000단위이며 채무불이행률은 0과 1값을 가지기 때문에 단위차임을 확인할 수 있다. 

위 binning을 바탕으로 임금별로 선형회귀를 각각 적합하면 다음과 같다. 

plt_df = (risk_data_rnd
          .assign(risk_prediction = model.fittedvalues)
          .groupby(["credit_limit", "credit_score1_buckets"])
          ["risk_prediction"]
          .mean()
          .reset_index())

plt.figure(figsize=(10,4))
sns.lineplot(data=plt_df,
             x="credit_limit", 
             y="risk_prediction", 
             hue="credit_score1_buckets", 
             palette = 'Set1');
plt.title("Fitted values by group")
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()

 

2.5. 심슨의 역설(Simpson's paradox)

위 사례를 보면서 언뜻 심슨의 역설이 생각났다. 심슨의 역설이란, 전체 데이터를 분석했을 때 경향과 그룹으로 나누어 분석했을 때의 경향이 서로 반대되는 상황을 말한다. 영국의 통계학자 에드워드 심슨이 정리한 역설이다.

 

위 내용을 보았을때, 회귀 분석에서 교란변수($X$)를 독립변수로 추가하는 것은 심슨의 역설을 해소하고, 처치 변수($T$)와 결과 변수($Y$)간의 정확한 인과관계 추론을 하는데 중요한 역할을 한다는 것을 알 수 있다. 

 

3. 출처와 링크

 

 

 

1장에서는 인과추론의 소개, 2장에서는 RCT의 중요성과 기초 통계개념 그리고 3장에서는 인과관계를 표현하는 그래프 인과모델에 대해서 알아보았다. 이번 장에서는 인과관계를 추론하는데 아주 중요한 회귀분석을 알아본다. 회귀분석은 데이터 분석에서 접할 수 있는 가장 간단하지만 파워풀한 통계방법론으로 편향을 줄이는 방법에서도 유용하다. 또한, 온라인 마케팅 모델에서의 실용적인 사례도 알아본다.


1. 글목차

  • A/B test 결과 회귀분석 적용
  • 온라인 마케팅에서의 회귀분석

2. 본문

2.1. A/B test 결과 회귀분석 적용

온라인 스트리밍 서비스를 하는 회사에서 새로운 추천시스템을 개발했고 이를 측정하기 위해서 A/Btest를 수행했다. 이를 단순집계와 선형회귀의 결과로 표현해보자.

import pandas as pd
data = pd.read_csv('./rec_ab_test.csv')
data.head()


다음은 단순 선형회귀의 식과 구현 결과이다. 

$ WatchTime_{i} = \beta_{0} + \beta_{1}challenger_{i} + e_{i} $

import statsmodels.formula.api as smf
#C()카테고리 변수 처리
#상수항을 따로 넣지 않아 watch_time은 recommender 변수에만 의존 한다고 가정함.
result = smf.ols('watch_time ~ C(recommender)', data = data).fit()
result.summary().tables[1]

다음은 추천시스템 유무에 따른 평균시청시간 결과이다. 

data.groupby('recommender')[['watch_time']].mean()

 

추천시스템을 적용한 그룹은 평균 시청시간이 2.19시간이었고 대조군은 2.05시간이였다. 이는 선형회귀의 결과에서 기본 $\hat{\beta_{0}}$이 2.05 이고 $\hat{\beta_{1}}$(= 추천시스템을 적용했을 때 시청시간의 증가분)가 0.14 라는 값과 일치한다. 이미 a/b test 를 적용한 결과이니 교란변수가 잘 제어되었다는 반증이기도 하다. 

2.2. 온라인 마케팅에서의 회귀분석

2.2.1. 온라인 마케팅의 관심사

책에서느 채무 불이행이라는 데이터를 가지고 회귀분석의 이론과 유용성을 설명한다. 필자는 인과추론의 데이터과학이라는 Youtube와 같이 책을 보고 있는데 다음 영상이 매우 실증적인 설명을 잘해주셔서 풀어서 써보려고한다. 링크는 다음과 같다 .

https://www.youtube.com/watch?v=07SWlTOqxpY&t=1s

온라인 마케팅이란 마케팅 목표(신규 고객 유치, 이탈방지)를 수립하고 이 목표를 달성하기 위한 마케팅을 진행하는 과정이며, 가장 중요한 것은 마케팅 예산 투입 대비 얼만큼의 효과가 발생했는지 효율을 측정하는 것이다. 이를 대표한 지표로서 ROAS(Return on Advertisement Spend)이다. 

2.2.2. 기존 측정 지표: LTA

 

LTA 방법론

LTA(Last Touch Attribution)은 가장 기본적인 측정 방법으로 마케팅 여러가지 매체(Meta, google, naver)쓰고 노출이 되더라도 마지막에 인입된 경로를 기준으로 측정하는 방법이다. 딱 들어도 naive한 방법이라고 여겨지기 때문에 다음과 같은 한계를 가진다.

  • 한계
    1. 유저가 거쳐온 여러 종류의 매체 효과를 측정하기 어려움.
    2. Touch 이후 전환을 측정할 수 없으면 LTA 측정 불가
         ex) 광고를 보고 잠시 있다가 기억이나서 검색해서 들어오는 경우, 광고에 대한 측정 데이터가 남지 않음
    3. 광고의 Incremental(증가분) 측정 불가 
         ex) 원래 들어오려고 했던 organic유저인가 아니면 마케팅 효과로 들어온 유저인가?
      • 이를 위해서는 비광고 대조군의 영향을 제거해야함. a/btest 를 이용하여 광고 타켓군과 대조군을 분할하여 광고를 집행 해볼 수 있다.

비광고 대조군이 존재한다면 해당 영향을 제거하여 광고로 인한 효과를 측정할 수 있을 것

하지만 위 상황에서 우리가 알아야하는 점은 신규유저의 경우 대조군 설정이 불가능하다. 이유는 애초에 데이터가 존재하지 않기 때문이다. 온라인 마케팅은 2가지 UA 마케팅과 리타겟팅 마케팅이 존재하는데 abtest를 적용할 수 있는 마케팅은 리타게팅 마케팅으로 이미 접속한 유저를 재모객하는 온라인 마케팅일 때 유효하다고 할 수 있겠다.

Youtube [실무로 통하는 인과추론] 4-2. 온라인 마케팅 분야에서의 회귀분석

 

2.2.3. 마케팅 믹스 모델링(MMM)

하지만 abtest는 개별 매체의 성과를 비교하는데 유용하지만, 다채널 환경에서의 복잡성에서는 적용하기 어려운 점이 있다. 또한 abtest가 적용하기 어려운 장기적인 광고효과를 측정하는데도 어려움이 있다.  따라서, 광고의 Incremnental 효과를 측정하면서도 각 매체의 기여도를 파악할 순 없을까? 라는 의문에서 MMM이 시작되었다.

고객 1명을 데리고 오는데 각 마케팅 매체가 어느정도 기여를 했는지 파악

(좌) MMM의 개요와 (우) MMM 결과

이때 다중선형회귀를 이용해서 모델링한다. 

$y_{i} = \beta_{0} + \beta_{1}x_{1}  + \beta_{2}x_{2} + ... \beta_{n}x_{n} + \epsilon$

  • $x$: 원인변수 외부 매체, 환경 요인)
  • $\beta$: 원인 변수의 기여도(마케팅 매체 별 효율)

예를 들어 판매량에 대한 회귀분석을 수립하면 다음과 같다. 

$y  = \beta_{Never}X_{Never} + \beta_{mechat}X_{mechat} + \beta_{stargram}X_{stargram} + \beta_{makao}X_{makao} + \sum_{i=1}^{12}\beta_{month}I(X_{month} = i) + \epsilon$

위 결과의 해석은 coef = 1이면 투입 대비 성과가 1:1이라는 것이며, mechat의 효율이 제일 좋고 never의 효율이 제일 좋지 않다고 판단단 내릴 수 있다. 따라서, 마케팅 예산을 mechat에 집중하고 never에 집행 예산을 축소하거나 중단하는 등의 의사결정을 지원할 수 있다. 

 

3. 출처와 링크

  • 교보문고 실무로 통하는 인과추론 with python 
  • Jupyter book 인과추론 
  • github  가짜연구소 Casual Inference Team 
  • Youtube 인과추론의 데이터과학
    • Youtube  [실무로 통하는 인과추론] 4-1. 실무자가 바라본 고객 신용한도와 채무불이행률의 인과적 관계
    • Youtube [실무로 통하는 인과추론] 4-2. 온라인 마케팅 분야에서의 회귀분석 
  • Github causal-inference-in-python-code

 

 

본격적으로 인과추론을 위한 언어인 그래프 모델에 대해서 알아본다. 그래프 모델은 기본적으로 사슬구조, 분기구조, 충돌구조를 개념으로 설명한다.  또한,  교랸편향과 선택편향에 알아 본다. 


1. 글목차

  • 그래프 인과모델
  • 그래프 구조: 사슬, 분기, 충돌구조
  • 교란편향
  • 선택편향

2. 본문

2.1. 그래프 인과모델

1장에서는 인과추정량의 정의, 2장에서는 인과추론을 하기 위한 온라인통제 실험과 기초통계지식에 대해서 알아보았다.  3장에서는 인과추론의 식별과 추정 2단계 중에서 식별에 대한 내용을 더 깊게 들어간다. 식별은 문제가 언어추론의 식으로 표현될 수 있는지 판단하는 단계이며, 추정은 데이터를 사용하여 인과 효과 값을 계산하는 단계이다. 수식이 수학의 언어이듯 인과추론에서는 수식에 더하여 그래프로 설명하는데 그 개념을 담기 위한 단원이라고 생각하면 된다. 

그래프의 표기가 중요한 이유는 인과 구조의 명확한 표현으로 변수들 간의 상호작용을 쉽게 이해할 수 있기 때문이다. 핵심 요소는 다음과 같다. 

  • 노드(Node): 그래프에서 확률변수를 나타내는 원을 의미함
    • T: 처지변수 / M: 중재자  / Y: 종속변수
  • 엣지(Edge): 변수들의 관계를 나타내는 화살표이며 방향성을 표현한다.
  • 방향성 비순환 그래프(DAG, Directed Acyclic Graph): 사이클이 없는 방향성 그래프이다. 순환 구조가 없다고 가정함

2.2. 그래프 구조: 사슬, 분기, 충돌구조

A Survey on Causal Discovery Methods for I.I.D. and Time Series Data, 2024

2.2.1. 사슬 구조

가장 간단한 구조는 사슬(Chain)구조이다. 위 그림의 (a) 그래프이며 인과관계는 화살표 방향으로 흐르지만 상관관계는 양방향으로 흐른다. 위 경우에는 X와 Y는 독립이 아니며 다음과 같이 표현한다.  

$ X \not\perp Z $

반면 Y를 고정시킨다면 X와 Z는 독립이 되며 다음과 같이 표현한다.

$ X \perp Z | Y $

고정시킨다는 것은 조건부라고 표현하기도 한다. 이게 무슨소리냐하면  X를 공부시간, Y를 시험대비 학습 수준(상/중/하), Z를 성적이라고 한다면, 시험대비 학습 수준이 고정된다면 X와 Y의 인과관계가 차단된다.  시험 대비 학습수준이 동일하다면 공부를 얼마나 하든 성적에 영향이 없다는 것이다. 

2.2.2. 사슬 구조

두번째 분기(fork)구조에는 공통원인이 있다. 같은 변수(X)가 Y,Z에 공통된 원인이 된다. 이런 경우 X는 교란요인(Cofounder)라고 부른다. 예컨데 좋은 데이터분석가를 정의해보자. 좋은 데이터 분석가(X)는 뛰어난 SQL 쿼리능력(Y)와 데이터 시각화 능력(Z)에 영향을 주는 교란변수이다. 회사는 좋은 데이터 분석가를 뽑고 싶기 떄문에 기본적으로 SQL쿼리 시험을 보는 것이고 이는 데이터 시각화 능력이 있는 가능성이 높다고 할 수 있겠다. 이렇게 SQL쿼리능력과 데이터 시각화 능력 간에는 상관관계가 존재한다.

일반적으로 공통원인을 공유하는 두 변수는 독립이다. 좋은 데이터 분석가는 일반적으로 SQL쿼리시험과 데이터 시각화 능력이 관계가 있다. 

$ Y \not\perp Z$

반면, 공통원인이 주어지면(고정시키면) 두 변수는 독립이다. 예컨대 좋은 데이터분석가 역량을 고정한다면, 서로 다른 관측치끼리 비교할때 SQL쿼리 능력이 증가하면 데이터 시각화 능력에 대한 역량이 떨어질 수 있다.

$ Y \perp Z | X$

 

2.2.3. 충돌 구조

마지막으로 충돌 구조는 두 노드가 하나의 자식(Z)을 공유하지면 그들(X,Y)사이에는 직접적인 관계가 없는 경우이다. 일반적으로 두 변수는 독립이다. 부모의 키는 서로 독립인 경우를 생각하자.

$ X \perp Y $

하지만 Z가 고정된다면 두 변수는 독립이지 않다.  만약 자식의 키가 170인 가족을 모은다면, 한쪽 부모의 키가 크면 자연스럽게 다른쪽 부모는 작은 경향을 나타낼 것이다.

$ X \not\perp Y | Z $

 

2.3. 식별예제

 

컨설턴트 영입 유무에 따른 회사 수익의 변동유무를 측정해보자.

  • profits_prev_6m: 컨설턴트 고용시점 이전 6개월 간의 회사수익
  • profits_next_6m: 고용시점 이후 6개월간의 회사 수익
  • consultancy: 컨설턴트 고용 유무
import pandas as pd

df = pd.DataFrame({"profits_prev_6m":[1,1,1,5,5,5], "consultancy":[0,0,1,0,1,1],"profits_next_6m":[1,1.1,1.2,5.5,5.7,5.7]})
df

 

컨설턴트 영업 유무에 따른 6개월간의 단순 수익을 비교하면 다음과 같다. 

$E[Y | T = 1] - E[Y | T = 0] $

$ \frac{(1.2 + 5.7 + 5.7)}{3} - \frac{(1.0 + 1.1 + 5.5)}{3}  = 1.67 $

코드로 구현하면 다음과 같다.

con_df = df.groupby(['consultancy'])[['profits_next_6m']].mean()
diff = (con_df.loc[1] - con_df.loc[0]).values[0]
print(f"{diff:.2f}")
#1.67

하지만 위 결과 값은 기본적으로 과거 실적이 좋았던 회사들이 컨설팅을 고용한 비율이 높기 때문에 인과효과라고 하기 어렵다. 따라서 과거 실적이 비슷한 회사끼리 비교하여 한다.  

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.15
5    0.20
Name: profits_next_6m, dtype: float64
'''

위 경우 ATE는 (0.15 + 0.2)/ 2 인가 된다. 즉, 컨설턴트를 고용한 평균처치 효과는 175,000달러가 된다고 알 수 있다. 

여기서 뒷문경로(Back door path)의 개념이 나온다. 6개월 이후 수익에 영향을 줄 수 있는 변수는 처치한 변수(컨설팅)과 6개월 이전의 수익이다. 결과적으로 6개월 이후 수익이 컨설팅이 영향있다는 것을 입증하기 위해서는 6개월 이전의 수익을 고정시켜 뒷문경로를 차단하여 올바른 인과관계를 도출하는 것이다.

2.3. 교랸편향

편향의 첫 번째 주요 원인은 교란이다. 교란은 대개 열린 뒷문 경로가 있을때 발생하는데, 이는 처치와 결과가 공통 원인을 공유하기 떄문이다. 위 예시와 같이 인과효과를 식별하려면 처치와 결과 사이의 모든 뒷문 경로를 닫아 T -> Y로 이루어지는 직접적인 효과만 남겨야한다. 이를 위해선 처치와 결과의 공통 원인을 보정해야하지만 항상 이 원인을 알 수 있거나 측정 가능한 것은 아니다. 

예컨대  관리자의 자질 -> 교육 -> 팀 참여도에 관한 인과관계를 측정하기 위해선  관리자 자질이 직접적으로 팀 참여도에 기여하는 뒷문경로를 차단야한다. 하지만 관리자의 자질은 정량적으로 측정하기 어려우므로,  관리자의 근속기간, 교육 수준 등의 외부변수로 영향을 측정할 수 있으며 이를 대리 교란 요인이라고 한다. 

2.4. 선택편향

 

 

3. 출처와 링크

지난 글에서는 인과추론의 개념과 등장하는 지표에 대해서 알아보았다. 또한, 어떤 처치를 주었을 때와 주어지지 않은 경우를 동시에 관측할 수 없는 상황이 있는 것도 이해했다.  이번 단원에는 극복하기 위한 방법 중 하나로 무작위 배정 실험과 함께 유의수준, p-value 등 기초 통계 개념도 정리한다.


 

1. 글목차

  • 온라인 통제 실험(OCE)
  • 무작위 통제 실험(RCT)
  • 수식으로 알아보는 무작위 배정의 효과
  • 불확실성 반영하기 1: 표본오차와 신뢰구간
  • 불확실성 반영하기 2 : 가설검정
  • 표본 크기 계산

 

2. 본문

2.1. 온라인 통제 실험(OCE)

이전 글에서 평균처치효과(ATE)를 통해 처지에 대한 추정량을 측정할 수 있으며 이를 위해서 실험군과 대조군이 교환가능성이 존재해야한다는 사실을 획득했다.

이 교환가능성을 확보하기 위하여 온라인 환경에서 적용할 수 있는 방법을 온라인 통제 실험(online controlled experiements, OCE)라고 한다. 흔히 A/B test라고 알려져 있다. 예컨대 제품을 사용하는 사용자들을 무작위로 추출하여 두 그룹에 배치한다. 이를 각각 실험군(treatment group)과 대조군(control group)이라 칭하며 균등 비율 5:5로 나누게 된다. 

 

AB test 흐름, Controlled experiments on the web: survey and practical guide, 2008, Data Min Knowl Disc

 

여담으로 해당 비율을 나누는 방법에 대한 방법은 murmur hash 알고리즘이 일반적이며 이를 설명하는 아티클은 다음을 참고하기 바란다. 따로 서비스를 쓰지 않고 직접 개발하는 경우를 위한 요약 자료가 될 것이다. 

A/B testing expreience at Doctrine 

Hash algorithm, Statistical Properties of Exclusive and Non-exclusive Online Randomized Experiments using Bucket Reuse. 2012

 

2.2. 무작위 통제실험(RCT)

OCE는  무작위 통제 실험(Randomized Controlled Trial)에 기반을 두고 있다.이는 통계학에서 한번쯤 들어봤을 로널드 피셔가 제안한 방법론으로 대표적인 예시가 신약개발을 위한 임상시험에 사용하는 방법이다. 

RCT가 강력한 이유는 무작위 할당을 통하여 혼란 변수(cofunder)가 무작위 과정에서 골고루 분포되기 때문에 처치와 결과 간의 관계가 인과적 관계로 해석 할 수 있기 때문이다.

Quasi-Experimental Designs : Research Designs without Random Assignment, 2022, Korea Summer Workshp on Casual Infercnce

 

RCT는 이런 장점에도 불구하고 현실세계에서는 적용하기 어려운 점은 ① 비용 ② 윤리적 문제 이다. 

예컨대 희귀병을 임상시험한다고 할 때 충분한 결과를 내기위한 최소 모집인원이 존재하기 때문에 무한정으로 비용과 시간을 쓸 수 없다. 특히 이 문제는 임상시험의 비용의 상승과 나아가 희귀약의 비용의 증가로 직결된다. 이번에는 임산부의 흡연 유무에 따른 태아의 영향을 연구를 해보자. 이 경우 임상시험을 위하여 임산부에게 흡연을 권장한다면 윤리적인 문제에 봉착하게 된다. 오프라인은 이렇게 적용되는 제한점이 있다.

하지만 온라인의 경우 다르다. 충분한 웹/앱 트래픽과 기간이 있다면 검증을 하기 위한 n수를 늘릴 수 있으며, 윤리적인 문제도 피해갈 수 있다.(사용자들에게 각각 다른 화면을 보여주었다고 하더라도 큰 문제가 되지 않는다). 때문에 OCE가 현재와 같은 분석분야에 널리 사용되고 있다. 

 

2.3.  수식으로 알아보는 무작위 배정의 효과

실험군과 대조군의 평균의 차이가 ATE와 일반적으로 같지 않는 이유는 간단하게 말하면 "우리가 처치한 변수 말고 영향을 줄 수 있는 원인이 존재하기 때문"이다. 1단원에서 가져온 처치와 결과과의 연관 관계는 다음과 같이 수식으로 표현된다. 

$E[Y | T = 1] - E[Y|T=0] $

$ E[Y | T = 1] - E[Y | Y = 0] $ : 실험군과 대조군 간의 관찰된 평균 차이(단순 계산이며 상관관계)

상점의 예시를 들자면 할인(처치)를 실행한 회사의 평균 판매량에서 할인(처치)를 하지 않은 회사의 평균 판매량을 뺀 값이다. 아래 표는 각 상점이 할인을 한 상황과 할인을 하지 않은 상황을 동시에 관찰(평행세계)를 가정하여 작성된 결과이다.

i y0 y1 t x y y1-y0
1 200 220 0 0 200 20
2 120 140 0 0 120 20
3 300 400 0 1 300 100
4 450 500 1 0 500 50
5 600 600 1 0 600 0
6 600 800 1 1 800 200
  • i: 상점 번호
  • y0: 할인(처치)를 적용하지 않은 잠재적 판매량 결과
  • y1: 할인(처치)를 적용한 잠재적 판매량 결과
  • t: 할인(처치) 여부
  • x: 크리스마스 1주일 전이면 1, 크리스마스 주간이면 0
  • y: 할인(처치)에 따른 실제 판매량
  • y1-y0: 잠재적 판매량 결과의 차

 

우리는 위 식에서 잠재적 결과 모델(potentail Outcomes)로 표현하면 다음과 같다.

$E[Y | T = 1] - E[Y | Y = 0] = E[Y_{1} | T =1] - E[Y_{0} | T = 0] $

  • $ E[Y_{1} | T =1] - E[Y_{0} | T = 0]$: 처치를 받았을 때 잠재적 결과와 처치를 받지 않았을 때의 잠재적 결과

 

위 식에  $ E[Y_{0} | T=1} $을 더하고 빼서 정리하면 다음과 같이 ATT와 편향으로 나눌 수 있다.

 

$E[Y | T = 1] - E[Y | Y = 0] = E[Y_{1} - Y_{0}| T = 1] + E[Y_{0} | T = 1] - E[Y_{0} | T = 0] $

  • $ E[Y_{1} - Y_{0}| T = 1]$: 처치된 그룹의 평균 처치 효과(ATT), 실제로 처치 를 받은 사람들이 처치를 받았을 때와 받지 않았을 때의 평균 결과의 차이 
  • $E[Y_{0} | T = 1] - E[Y_{0} | T = 0]$: 편향, 처치 를 받은 사람과 받지 않는 사람 간에 존재하는 처치 이전의 차이. $ E[Y_{0} | T = 1]$ 는 처치 를 받은 사람들이 처치를 받지 않았을 경우의 잠재적 결과(평행세계)

위 식은 상관관계가 인과관계가 될 수 없다는 사실을 편향을 통해서 보여준다. 실제로 규모가 더 큰 상점은 할인을 할 수이쓴 여력이 있었고 할인(처치)를 할 수 있었던 규모가 큰 상점들이 $Y_{0}$이 클 수 밖에없었 다는 것을 보여준다.  $E[Y_{0} | T = 0] < E[Y_{0} | T = 1]$

 따라서 위 예제에서는 실험군과 대조군이 교환가능성이 없었다는 것이다. 반대로 교환가능성이 있다는 말은 $Y_{0}, Y_{1}$과 할인(처치)와 독립적이라는 말이며 다음과 같이 표현된다. 

$Y_{0}, Y_{1} \perp T$

혹은 다음 두 값이 같다는 것으로 표현할 수 있다

$ E[Y_{0} | T = 1} = E[Y_{1} | T = 1} $

이렇게 실험군과 대조군이 교환가능하거나 처치를 무작위로 배정하게 된 경우 실험군과 대조군의 결과를 단순 비교하면 평균처치효과(ATE)를 얻을 수 있다.

$ATE = E[Y_{1} - Y_{0}] = E[Y | T = 1] - E[Y| T=0]$

 

2.4. 불확실성 반영하기 1: 표본오차와 신뢰구간

2.3을 완벽하게 이해하지 못하여도 괜찮다. 우리는 온라인 통제실험을 통해 실험군과 대조군의 교환가능성을 확보하여 편향을 없앨수 있음을 확인했다. 결국 우리는 평균처치효과(ATE)가 관심있는 소재이다. 

여기서 ATE(평균처치효과)가 표본에서 추출된 평균 값이라는 것에 대해서 주목하자. 표본의 평균에 대한 지표이기 때문에 표본오차의 개념의 자연스럽게 나와야한다. 왜냐하면 대부분 모집단 전체에 대한 ATE를 직접 측정할 수 없고 표본을 사용해 추정해야하기 때문이다. 표본을 100개씩 뽑아 10,000번 수행하게 되면 매번 데이터의 분포가 다르게 될 것이며 그에 따라 표본의 평균도 달라질 수 있다. 이때 표본 평균의 표준편차를 표본 오차라 한다. 

예컨대 전환률 0.08인 표본 100개를 10,000 뽑아 히스토그램을 그리면 다음과 같다. 베르누이 분포를 따르는 데이터이지만 표본의 평균은 정규분포의 형태를 따라 중심극한정리(CLT)가 적용되는 모습을 볼 수 있다.

import numpy as np 
import seaborn as sns
import matplotlib.pyplot as plt

np.random.seed(42)
conv_rate = 0.08
size = 100
def run_binomail(conv_rate,size):
    return np.random.binomial(1,conv_rate, size = size)
# 100번 샘플 추출을 10,000번 반복하여 추출하여 평균을 expriments에 저장
expriments = [run_binomail(conv_rate,size).mean() for _ in range(10000)]
plt.hist(expriments, edgecolor = 'black')
plt.axvline(x = conv_rate, color = 'red', linestyle = '--')

 

이 표본평균의 변동성을 설명하기 위한 것이 표본 오차이며 다음과 같이 정의 된다. 

$SE(\bar{X}) = \frac{\sigma}{\sqrt{n}}$

  • $\sigma$ : 모표준편차
  • $\sqrt{n}$: 표본의 크기

위 식을 생각해보자면 표본을 많이 뽑을수록 표본오차는 작아질 것이며, 모표준편차가 크면 클수록 자연스럽게 표본으로 뽑힌 데이터들도 오차가 커질 것임을 알 수 있다. 또한, 모표준편차를 아는 경우가 드물기 때문에 경우 표본의 표준편차 $s$로 대체하게 된다. 

하지만 이런 의문을 가질 수 있다. 표본오차를 추정할 수 있다고 하더라도 통계학에서 '절대'라는 것은 없다. 따라서, 하나의 지표를 제시하는 것보다 표본 평균이 모집단 평균을 포함할 수 있는 범위를 제공하는 것이 바람직하다. 이를 신뢰구간(Confidential Interval)이라고 하며 다음과 같이 정의 된다. 

$ \bar{X} = Z * SE(\bar{X})$

95%의 신뢰구간을 추정하면 Z 는1.96이지만 2 반올림하여 표본 오차를 대입하면 다음과 같다. 

$ \bar{X} = 2 \times \frac{\sigma}{\sqrt{n}} $

해석하자면 실제 평균의 100번 중 95번은 위 신뢰구간에 속함을 의미한다.

 

2.5. 불확실성 반영하기 2: 가설검정

또한 결과에 통계적 방법을 적용하는 방법은 가설 검정이다. 예컨대 두 그룹의 평균의 차이가 통계적으로 유의한 차이가 있는가에 대한 질문을 답하기 위해서 사용할 수 있다. 

가설 검정은 귀무가설과 대립가설 수립이 가장 우선시 된다.

  • 귀무가설($H_0$): 기존에 믿고 있던 사실, ex) 약물은 효과가 없다 
  • 대립가설($H_1$): 주장하려고하는 사실,  ex) 약물은 효과가 있다.

통계의 가설 검정은 귀류법으로 진행한다. 귀류법은 어떤 명제를 참이라고 가정한 후 모순이 도출되면 그 명제는 거짓으로 결론내리는 논리적 추론 방법이다. 귀무가설이 우리가 일반적으로 받아들여지는 사실이므로 이를 참이라고 가정하고 유의확률(p-value)를 도출하여 확률적으로 희박하다고 생각되면 귀무가설을 기각하고 대립가설을 선택한다. 이름하야 새로운 주장의 등장이다.해당 기준을 유의수준(Significant level)이라고 하며 일반적으로 5%를 기준으로 잡는다. 

그럼 유의확률은 어떻게 도출하는가? 세상에 나온 일반적인 데이터 분포에 빗대어 계산한다. 이때 검정통계량(Test Statstics)이 등장한다. 귀무가설이 참이라고 가정했으므로 이를 통해 관찰값과 기대값의 차이를 표준화하여 계산한다. 

예컨데 z-검정 통계량은 표본 평균과 가설로 기대되는 평균의 차이를 표준 편차로 나눈 값이다. 

$ z = \frac{\bar{X} - \mu_0}{\frac{\sigma}{\sqrt{n}}} $

그 밖에 검정통계량은 다음 링크를 참고

(8) Khan Academy: 유의성 검정과 절차, 통계방법론 정리

 

(8) Khan Academy: 유의성 검정과 절차, 통계방법론 정리

이번 글에서는 추론통계의 핵심 유의성 검정과 등장하는 개념, 그리고 일반적인 통계방법론을 정리해본다.1. 글목차유의성 검정에 필요한 개념1종오류와 2종오류유의성 검정 절차통계검정 절차

snowgot.tistory.com

 

하지만 유의수준을 5%로 관리한다고 해도, 아주 낮은 확률로 실제와 판단한 사실이 다를 수 있다. 이 개념을 이해하기 위해서 다음과 같은 혼동행렬을 작성할 수 있다. 

판단 \ 실제 상황 귀무가설이 사실 대립가설이 사실
귀무가설을 기각하지 못함 옳은 채택( ($1-\alpha$) 2종 오류($\beta$)
귀무가설을 기각함 1종 오류($\alpha$) 옳은 기각($1-\beta$, 검정력)

우리는 여기서 2가지를 관리한다. 1종 오류(귀무가설이 사실인데도 불구하고 귀무가설을 기각할 확률 $/alpha$), 2종 오류(대립가설이 사실인데도 불구하고 대립가설을 기각할 확률 $\beta$). 

유의수준($\alpha$)를 5%로 관리했던 것처럼 일반적으로 검정력($1-\beta$)는 80%로 관리한다. 

 

2.6. 표본 크기 계산

자 그럼 이제 불확실성을 반영하고 해당 실험을 만들기 위한 표본 사이즈를 몇 개를 수집해야하는가가 중요하다. 단순히 나오는 결과에 해석하기 보다 A/B test는 해당 실험을 하기 위해 얼마큼 표본의 크기를 수집해야하는 중대한 결정사항이 있기 때문이다. 각 서비스마다 트래픽이 다르기 때문에  적절한 설계를 위해서는 필요한 표본의 크기(n)를 산정해야한다. 

요약하자면 산업의 기준에서 검정력 80%, 유의수준 0.05 에 대하여 필요한 표본의 크기는 다음과 같다.

$n = \frac{16*\sigma^{2}}{\delta^{2}}$

  • $\sigma$: 표준편차
  • $\delta$: 효과의 크기 

해석하자면 효과의 크기를 작게 설정할수록, 1%의 전환률보다 0.1%의 전환율을 측정하고 싶을 경우 더 큰 표본이 필요하다. 또한 과거의 대조군의 표준편차가 클수록 변동성이 크므로 더 많은 표본이 필요하다. 

 

3. 출처와 링크

 

인과관계는 데이터 분석을 입문할 때 항상 등장하는 개념이다. 단순히 "상관관계와 헷갈리지 말자!! 도메인지식을 활용하자!" 라는 성급한 마무리로 인과관계를 밝혀내고 측정하는 방법에 대해서는 넘겨 버린 것이 사실이다. 이번에 실무로 통하는 인과추론 책을 스터디하면서 공부하는 내용을 정리할 예정이다.


 

1. 글목차

  • 인과추론의 기본 개념
  • 인과 추론을 위한 기본 수식과 기호
  • 인과 추정량

2. 본문

 

 

2.1. 인과추론의 기본 개념

 

인과추론(Casual Inference)란 무엇인가? 두 변수 $X_{1}, X_{2}$의 상관관계를 알았다고 하자. 하지만 두 변수가 바로 원인과 결과로 속단하긴 어렵다. $X_{1}$이 원인 $X_{2}$가 결과일 수 도 있고 그 반대의 경우일 수 도 있다. 반면 둘 다 원인의 결과가 아닌 다른 교란변수(confounder)가 두 변수 $X_{1}, X_{2}$에 영향을 준 사례일 수 도있다. 예를 들어 키카 크면 몸무게가 나가는가? 몸무게가 크면 키가 큰가 라는 질문에 두 변수는 상관관계를 가지고 있지만 어느 하나가 원인이라고 보기 어렵다. 다시 말해 성장 혹은 나이가 두 변수를 상승시키는 요인이라고 보는 것이 더 적절할 것이다. 

 

이처럼 통계방법은 어떤 원인가 결과를 직관적으로 설명해주지 않는다. 하지만 이를 추적하고 정량화 하는 방법을 인과추론의 방법이라고 하겠다. 

  • 원인(Cause): 다른 변수에 영향을 미치는 변수. 흔히 독립 변수(independent variable)이라고 불림
  • 결과(Effect): 원인의 변화로 인해 발생하는 결과. 흔히 종속 변수(dependent variable)이라고 불림
  • 상관관계(Correlation): 두 변수간 관계를 말하며 한 변수가 다른 변수와 함께 변할 때 상관관계가 있다고 함. 그러나 상관관계가 받반드시 인과관계를 의미하는 것은 아님
  • 인과관계(Causation): 한 변수의 변화가 다른 변수를 초래하는 관계. 즉 원인이 결과에 직접적인 영향을 미치는 경우

 

2.2. 인과 추론을 위한 기본 수식과 기호

  • 처리 변수(Treatment Variable, $T$): 실험에서의 독립변수로 예를 들어 고혈압 약물에 대한 효과평가를 진행한다고 할 때 복용한 그룹과 복용하지 않은 그룹은 '복용'이 처리 변수
  • 결과 변수(Outcome Variable, $Y$): 종속 변수로 처리에 의하여 영향을 받는 변수. 예를 들어 고혈압 약을 복용(처리 변수)하여 변하는 혈압의 수치를 결과 변수라 함
  • 잠재적 결과(potential Outcomes): 처리 여부에 따라 나타 날 수 있는 두가지 가능한 결과
    • $Y_1$: 처리 받았을 때의 결과
    • $Y_0$: 처리를 받지 않았을 때의 결과

잠재적 결과는 동시에 관찰 할 수 없기 때문에(평행 우주라도 가져오지 않는 한) 서로 대립적 결과(counterfactual problem)을 가진다. 이런 맥락으로, 범주가 두 개인 이진 처치를 관하여 설명할 때 다음 기호를 사용하며 "잠재적" 결과라는 호칭을 붙인다.

  • $Y_{0i}$: 처치 받지 않는 실험 대상 $i$의 잠재적 결과
  • $Y_{1i}$: 처치 받은 실험 대상 $i$의 잠재적 결과
  • $\tau_{i}  = Y_{1i} - Y_{0i} $: 잠재적 결과의 개별 차이

 

 

2.3. 인과 추정량(Casual Estimands)

하지만 평행 세계를 우리가 탐험할지 못하더라도 결과적으로 인과추정으로 인해서 "추정"할 수 있다고 자신감을 가져보자. 일단 인과 추정이 가능하다는 가정하에서 우리가 측정할 지표를 선언하는게 우선일 것 이다. 다음 3가지 지표를 제시한다.

 

  • 평균 처치 효과(Average Treatment Effect, ATE)
    • 전체 모집단에서 처리의 평균적인 인과효과로 전체 모집단에서 처리로 인해 평균적으로 얼마나 변할 것으로 기대되는지를 타나내는 추정량
    • 수식: $ATE = E[Y_{1} - Y_{0}]$ 또는 $E[\tau_{i}]$
      • $Y_{1}$: 처리를 받았을 때의 잠재적 결과
      • $Y_{0}$: 처리를 받지 않았을 때의 잠재적 결과
      • $E(X)$: 기대값
  • 실험군에 대한 평균 처치 효과(Average Treatment Effect on the Treated, ATT)
    • 실제로 처치를 받은 개체들에 대해 계산된 평균적인 처리 효과, 이미 처치를 받은 사람들에게만 초점을 맞춰 그들이 처치를 받았을 때 평균적인 인과에 대한 추정량. 반대는 대조군(Untreated)에 대한 처치효과인 ATU
    • 수식: $ATT = E[Y_{0} - Y_{1} | T = 1] $
      • $T=1$: 처리를 받은 집단
  • 조건부 평균 처치 효과(Conditional Average Treatment Effect, CATE)
    • 특정한 조건이나 집단에 대해 처치가 결과에 미치는 평균적인 인과 효과를 측정하는 개념.개별 특성이나 조건에 따라 처치 효과가 다를 수 있다는 점을 반영하며 ATE와 달리 하위 집단(sugroup)에서의 인과 효과를 추정하는데 중점
    • 수식: $CATE(x)  = E[Y_{1} - Y_{0} |  X = x] $
      • $ X = x $ : 특정 조건을 만족하는 집단

2.3. 인과 추정량 예시

다음은 크리스마스 전주/해당 주간 상점의 할인에 대한 데이터이다. 실제로 상점이 할인 한 세계와 할인하지 않은 세계는 동시에 존재할 수 없지만 인과추정량 계산을 위해 알 수 있다고 가정하고 작성한다.

  • i: 상점 번호
  • y0: 할인(처치)를 적용하지 않은 잠재적 판매량 결과
  • y1: 할인(처치)를 적용한 잠재적 판매량 결과
  • t: 할인(처치) 여부
  • x: 크리스마스 1주일 전이면 1, 크리스마스 주간이면 0
  • y: 할인(처치)에 따른 실제 판매량
  • y1-y0: 잠재적 판매량 결과의 차
i y0 y1 t x y y1-y0
1 200 220 0 0 200 20
2 120 140 0 0 120 20
3 300 400 0 1 300 100
4 450 500 1 0 500 50
5 600 600 1 0 600 0
6 600 800 1 1 800 200

위처럼 평행세계의 관찰자라면 각 인과 추정량을 쉽게 구할 수 있다. 

평균 처치 효과(ATE)는 마지막 열에 대한 평균 값이다. $(20 + 20 + 100 +50 + 0 + 200) / 6 = 65 $ 따라서 가격의 할인으로 판매량이 65가 증가함을 알 수 있다.

실험군에 대한 평균 처치 효과(ATT)는 가격을 할인한 회사(t=1)의 평균 판매량이다. $(50 + 0 + 200)/3 = 83.33$ 

크리스마스 1주일 전이라는 조건부 평균 효과(CATE) 는 회사의 3번과 6번의 효과의 평균이다. $(100 + 200)/2 = 150$ 

하지만 위처럼 데이터를 모두 아는 경우는 없다. 따라서 표는 다음 데이터가 실제 현황이라고 볼 수 있다.

i y0 y1 t x y y1-y0
1 200 NaN 0 0 200 NaN
2 120 NaN 0 0 120 NaN
3 300 NaN 0 1 300 NaN
4 NaN 500 1 0 500 NaN
5 NaN 600 1 0 600 NaN
6 NaN 800 1 1 800 NaN

실제로 한 상점의 할인과 할인을 하지 않은 세계를 동시에 관측하기는 불가능 하므로 처치군과 대조군의 평균을 비교하면 안될까? 

$ ATE = (500 + 600 + 800) / 3 - (200 + 120 + 300) /3   = 426.67 $

이는 상관관계를 인과관계를 착각하는 대표적인 예시이다. 왜냐면 두 할인한 회사와 할인하지 않은 회사가 규모가 다르기 때문이다. 할인을 한다는건 큼 경제적으로 튼튼하여 할인을 많이할 수 도 있다. 두 회사의 매출 규모자체가 다르기 때문이다.  이마트와 롯데마트처럼 다르지만 규모가 비슷한 데이터를 비교해야하지 이마트와 편의점을 비교하면 안된다. 

이는 실험군과 대조군의 교환가능성(Exchangeability)에 대한 여부를 말하는 사례이다. 

2.4. 독립성 가정

인과추론에서 독립성 가정은 조건부 독립성(Conditional Indepence)와 혼란 변수의 통제(Control for Confounders)가 있다.  한가지 방법은 무작위 배정을 통해서 혼란 변수의 통제가 가능하다. 

조건부 독립성은 처리(treatment)와 잠재적 결과(potential outcomes, $Y_{1}, Y_{0}$)가 혼란 변수집합($X$)에 대하 조건부로 독립적이여야한다는 가정이다. 이를 통해 선택 편향(selection bias)를 없는 상태로 만드는 것이며 이를 다음과 같은 수식으로 표현한다.

$(Y_{1}, Y_{0}) \perp T | X$

  • $Y_{1},Y_{0}$: 각각 처치 받았을 때, 받지 않았을 때의 잠재적 결과
  • $X$: 혼란변수
  • $T$: 처리 변수

 

결과적으로 실험군과 대조군이 교환 가능하거나 처치를 무작위로 배정한 경우에는 단순히 실험군과 대조군의 결과를 단순히 비교하면 처치 효과를 얻을 수 있다.

 

$E[Y_{1} - Y_{0}] = E[Y | T = 1] - E[Y | T = 0] $

 

 

 

 

 

3. 출처와 링크

 

+ Recent posts