Welcome to the blog

Posts

My thoughts and ideas

DID - 1. Difference-in-difference 기본 개념 | Gin-Girin-Grim

DID - 1. Difference-in-difference 기본 개념

인과추론 기법들 중에서도 DID(Difference-in-Differences)는 원리가 비교적 직관적이고 간단해서 실무에서 자주 사용되는 방법론이다. DID는 어떤 정책이나 처치가 실제로 효과가 있었는지 알아보기 위해, 단순히 전후 비교나 집단 간 비교만 하는 것이 아니라 ‘변화량의 차이’를 측정함으로써 보다 정확한 인과효과를 추정한다. 이번 글에서는 DID의 기본 개념과 작동 원리를 살펴보고, 이를 위해 어떤 가정이 필요한지 알아보자.

DID란?
  • 차이의 차이(DID, Difference In Differences)
  • 2번의 차분을 통해 Treatment effect를 추정하는 방식
    • 그룹 내의 gap : Time series comparison
    • 그룹 간의 gap : cross-sectional comparison
  • How-to
    • 인과추론의 가장 기본적인 접근 방법은 A라는 행동의 성과를 만약 그 행동을 하지 않았더라면 발생했을 성과(counterfactual)와 비교하여 순수한 A 행동의 효과를 측정하는 것이고, 이에 따라 Counterfactual을 잘 선정하는 것이 가장 중요하다.
    • DID를 인과추론 관점에서 다시 보면, 측정이 불가능한 시간에 따른 변화량( $T’_{post}-T_{pre}$)을 control group의 시간에 따른 변화량($C_{post}-C_{pre}$)으로 치환하여 treatment effect를 측정할 수 있다(그림 1).
    • 따라서 DID 분석의 신뢰도는 control group과 counterfactual의 유사성에 달려있다. 다만 counterfactual 전체가 아닌 시간에 따른 변화량만을 치환하므로 변화량에 대한 유사성만 증명하면 된다. 즉 counterfactual과 트렌드 정도만 같아도 충분하므로 control group을 선정하는 것이 상대적으로 용이하다.

    인과추론의 데이터과학

    인과추론의 데이터과학
    그림 1. DID 추정 원리 (source: 인과추론의 데이터과학)


Identification strategy

Identification strategy는 관측 데이터로부터 우리가 관심있는 인과효과를 어떻게 신뢰 가능하게 분리해낼 것인가에 대한 논리적 설계 전략을 의미한다. 주로 counterfactual을 어떻게 만들어낼 것인지, 선택 편향을 어떻게 제거할 것인지, 기본적으로 어떤 가정이 필요한지 등의 문제를 해결하고자 한다.

Identification assumption
  1. Parallel trend assumption
    • DID의 기본 가정으로, 두 그룹의 시간에 따른 변화 트렌드가 같아야 한다는 가정
    • Parallel trend는 시간의 변화량과 변화 패턴의 유사성만 충족하면 되므로 상대적으로 증명이 쉽다. 그래프를 통해 Treatment 이전/이후의 트렌드를 확인하는 방식이 일반적이다.
    • Staggered treatment 등 시각적으로 확인하기 어려운 경우 event study를 통해 간접적인 통계적 검정이 가능하다.
    • 그러나 Parallel pre-trend assumption이 충족되었을지라도 Parallel post-trend가 보장되지는 않는다.
    • 인과추론의 데이터과학
      그림 2. Pre-period에 두 그룹 간 변화 트렌드가 동일함을 그래프로 확인할 수 있다 (source: 인과추론의 데이터과학)
  2. Exogeneity of Treatment Assignment (Exchangeability)
    • Treatment가 독립변수와 독립적이어야 한다.
    • 우연히 treatment가 적용되는 시점에 동시에 발생한 현상(contemporaneous trend) 또는 treatment와 상관성이 있는 confounder가 있다면(post-treatment confounder), post-trend 시점에 영향을 받을 수 있기 때문에 이러한 요인이 있는 지 반드시 점검해야 한다.
    • No spillover effect : 한 그룹에서의 인과효과가 다른 그룹에 영향을 주지 않아야 한다.
  3. OLS 기본 가정
Pre-trend adjustment
  • Parallel pre-trend는 covariates 또는 fixed effect를 제어함으로써 보정할 수 있으나, 모두 제약이 있다.
    • Controlled covariates가 post period에 treatment의 영향을 받는 경우 post-treatment bias가 발생할 수 있다.
    • Fixed effect는 post-treatment bias를 일으키지는 않으나, 과거의 treatment가 현재의 outcome에 영향을 미치거나, 과거의 outcome이 현재의 treatment에 영향을 미치는 경우 또 다른 bias를 일으킬 수 있다.
  • 따라서 DID 분석에서는 covariates를 통제하는 방식보다 매칭을 통해 Post-period bias를 제어하는 것을 선호한다.
    • 매칭은 전체 기간이 아닌 Pre-period의 covariates만을 사용하므로 Post-period 시점에 treatment에 영향을 받을 일이 없으므로 선호된다.
    • 또는 IPW나 Doubly robust DID를 사용할 수도 있다.
    • (참고) Abadie, 2005: “Semiparametric Difference-in-Differences Estimators.” Review of Economic Studies.
  • 또는 log-transformation 등 functional form을 변환함으로써 Pre-trend parallel trend가 성립할 수도 있다.
    • 이에 따라 binary outcome에 대한 DID 분석에서는 probit 또는 logit 모델보다는 OLS로 대표되는 Linear Probability Model(LPM)이 더 선호된다.
    • (참고) Roth and Sant’Anna (2023)

급격한 변화 포인트를 찾아주는 Piecewise Linear Regression | Gin-Girin-Grim

급격한 변화 포인트를 찾아주는 Piecewise Linear Regression

최근에 광고 성과 분석을 하던 중 “광고비를 얼마나 써야 좋은 성과가 날까요?”라는 질문을 받았다. ROAS를 높이는 요인은 광고비 외에도 클릭수, 구매전환율, 객단가 등 다양하기 때문에 인과적인 효과는 사실상 단순한 분석으로는 파악하기 어렵다(높은 ROAS가 반드시 좋은 광고 성과를 의미하는 것이 아니기도 하다). 하지만 광고비를 어느 정도 썼을 때 전환금액의 증가율이 늘어나는지 패턴을 보면 최소한 광고비를 얼마나 세팅해야 할 지 가이드를 얻을 수 있다.

Piecewise Regression

데이터의 패턴이 급격하게 변화하는 포인트를 찾기 위해서 Piecewise Linear Regression을 사용해보았다. Piecewise Regression은 회귀 분석에서 독립 변수를 여러 구간으로 나누고, 각 구간마다 별도의 모델을 적합하는 기법이다. Segmented regression 또는 broken-stick regression 이라고도 한다.

일반적인 선형 회귀는 모든 데이터 범위에서 동일한 선형 관계를 가정하지만 현실의 데이터는 그렇지 않은 경우가 많다. 이런 데이터에서는 하나의 회귀식으로 모든 데이터를 설명하기 어렵고, 독립 변수가 서로 다른 구간에서 변수들 간의 관계가 다르게 나타날 때 Piecewise Regression이 매우 유용하다.

물론 비선형 효과를 고려하는 다항 회귀(polynomial regression), 회귀 스플라인(regression splines), 비모수 평활(non-parametric smoothing) 등의 다양한 방법들이 있다. 전통적인 방법론 대비 Piecewise regression은 2가지 장점을 갖는다.

  1. 데이터의 구간을 나누는 경계를 breakpoint 또는 knot value라고 하는데, 이 breakpoint를 사전에 고정하지 않아도 된다.
  2. 각 구간마다 별도의 모델을 만들기 때문에 각 구간마다 계수를 해석할 수 있다.

Piecewise Regression은 다앙한 분야에서 유용하게 쓰인다. 질병관리청은 Piecewise Regression을 활용해 기온별 온열질환자 발생의 정도가 달라지는 지점을 찾아 구간별 기온의 영향을 분석한 보고서를 발행했다.

Piecewise regression 활용 예시
그림 1. 기온별 온열질환자 발생 수에 대한 piecewise regression 그래프

기온이 1℃ 오를 때마다 온열질환자는 일 최고기온 27.7℃~31.0℃ 구간에서는 약 7.4명, 31.1℃~33.2℃ 구간에서는 약 22명 증가했고, 특히 일 최고기온 33.3℃ 이상 구간에서는 기온이 1℃ 오를 때마다 온열질환자가 약 51명 발생하는 등 증가세가 급격한 것으로 나타났다. 이 결과를 바탕으로 질병관리청에서는 기상청에서 8월 말 낮 기온을 30~34℃로 전망하고 있기 때문에 온열질환 예방에 선제적으로 대응해야 한다는 메세지를 전했다.

Basis function

Basis function(기저함수)은 어떤 복잡한 함수를 표현하기 위해 기본 단위로 사용하는 함수들을 의미한다. 즉, 여러 개의 Basis function을 선형 결합하여 원래의 함수를 근사하거나 표현할 수 있다. Piecewise Linear Regression도 basis function의 결합으로 표현할 수 있다. 수학적으로는 다음과 같이 표현된다.

\[f(x)\approx\sum^{k}_{i=1}\beta_i\phi_i(x)\]

Piecewise Linear Regression에서는 입력 공간을 여러 구간으로 나누고 각 구간 내에서 서로 다른 선형 함수를 적합시키는데, 이 선형 함수들을 만들기 위해 다음 3개의 basis function을 정의한다.

이 중 $h_3(x)$가 Piecewise Linear Function의 핵심이다. 이 함수는 hinge function으로 x < k 이면 0, x ≥ k면 x-k 값을 가진다. 이를 통해 특정 지점 k에서 기울기가 변하는 효과를 만들어낸다.

Piecewise Linear Regression

데이터가 K개의 breakpoints $\tau_1, \tau_2,…,\tau_K$ 에 의해 K+1 구간으로 나뉜다고 할 때,

\[y=\beta_0+\beta_1x+\beta_2(x-\tau_1)_++\beta_3(x-\tau_2)_+...+\beta_{K+1}(x-\tau_K)_++\epsilon\]

각 breakpoint부터 기울기가 추가로 변하면서 전체 구간을 여러 개의 직선 조각(piecewise linear)으로 나누어 모델링한다.

본 분석에서 사용한 piecewise-regression 패키지는 Muggeo의 2003년 논문 “Estimating regression models with unknown break-points”를 바탕으로 구현되었다. 이 패키지에서 사용하는 수식은 다음과 같다.

\[y=c+\alpha x+\beta(x-\psi)H(x-\psi)+\zeta\]

이 때 임의의 시작점을 기준으로 Taylor expansion을 수행하여 선형 근사(linear approximation)함으로써 breakpoint estimate을 찾는다. 이는 본질적으로 비선형 최적화 문제인 breakpoint 추정을 선형 문제로 근사하여 효율적으로 해결하는 방식이다.

Modeling
import numpy as np
import matplotlib.pyplot as plt
import piecewise_regression

n_breakpoints = 2

def cutoff_upper_lower(series, upper_quantile=0.99, lower_quantile=0.01):
    upper = series.quantile(upper_quantile)
    lower = series.quantile(lower_quantile)
    return series.where(series > lower, -0.9999).where(series < upper, -0.9999)

# 1. outlier 상하단 제거
pre_winsorize_columns = ['revenue', 'cost']
cutoff = 0.99
for col in pre_winsorize_columns:
    df[col] = cutoff_upper_lower(df[col], upper_quantile=cutoff, lower_quantile=(1-cutoff))

for col in pre_winsorize_columns:
    df_pwr = df[df[col] != -0.9999]

# 2. Log trasformation
transform_lst = ['revenue', 'cost']
df_pwr_log = df_pwr.apply(lambda x: np.log1p(x) if x.name in transform_lst else x)

pw_fit = piecewise_regression.Fit(df_pwr_log.cost.to_numpy(), df_pwr_log.revenue.to_numpy(), n_breakpoints=n_breakpoints)
pw_fit.summary()

# 3. Plot the data, fit, breakpoints and confidence intervals
pw_fit.plot_data(color="grey", s=20)
pw_fit.plot_fit(color="orange", linewidth=4)
pw_fit.plot_breakpoints()
pw_fit.plot_breakpoint_confidence_intervals()
plt.xlabel("Ad Cost")
plt.ylabel("Ad Revenue")
plt.show()
plt.close()

먼저 outlier를 상하단 1%씩 제거해주었고, 광고비와 전환금액 모두 right-skewed 되어 있기 때문에 log를 씌워주었다.

Piecewise regression 결과
그림 2. Piecewise regression 결과

breakpoint를 2개로 설정했을 때 결과를 살펴보면 alpha1, alpha2, alpha3의 추정량은 구간별 선형 모델의 기울기를 의미한다. beta1, beta2는 각각 구간 1 → 구간 2 모델 간 기울기의 변화량, 구간 2 → 구간 3 모델 간 기울기의 변화량으로 alpha2 = alpha1 + beta1, alpha3 = alpha2 + beta2로 계산된다. breakpoint1, breakpoint2는 구간을 나누는 2개의 지점에 대한 추정량이다.

Piecewise Linear Regression을 시각화해보면 각 breakpoint에서 기울기가 변하는 모습을 볼 수 있다. 이 결과를 바탕으로 최소한 exp(10.7) 이상의 광고비를 들여야 어느 정도의 광고 효과가 있고, exp(13.3) 이상을 설정했을 때 좀 더 분명한 성과가 있을 것이라고 기대할 수 있다.

Piecewise regression line과 신뢰구간
그림 3. Piecewise regression line과 신뢰구간

Reference
MCP와 n8n 비교하여 알아보기 | Gin-Girin-Grim

MCP와 n8n 비교하여 알아보기

AI 프로덕트가 하루가 다르게 쏟아지고 있는데 막상 데이터 분석 실무에서 AI를 적극적으로 사용하고 있지는 못한 것 같다. 물론 분석 결과에 대해 의견을 주고 받거나 쿼리 생성을 하는 등 유용하게 쓰고는 있지만 아직은 AI 프로덕트를 시스템화하여 사용하는데는 한계를 느끼고 있다. 그래서 다양한 AI 프로덕트를 조금씩 사용해보면서 느낀 점을 정리해보려고 한다. 이번 글에서는 MCP와 n8n에 대해서 알아보고 차이점에 대해 비교해보자.

  1. AI Agent란?

    MCP에 앞서 AI Agent에 대한 이해가 있어야 MCP의 역할을 좀 더 이해하기 쉽다.

    • AI Agent는 사용자를 대신하여 사전에 결정된 목표를 달성하기 위해 자율적으로 추론하고 계획하여 복잡한 태스크를 수행하는 AI 시스템을 의미한다.
    • 여기서 중요한 점은 “자율성”에 있는데 단순히 사용자의 인풋에 반응하는 것을 넘어서, 주어진 목표 달성을 위해 스스로 판단하고 계획을 수립하여 실행한다.
    • AI Agent는 다음의 아키텍처로 구성되며, 목표 설정, 정보 획득, 작업 수행 크게 3개의 워크플로우로 작동한다.
    • AI Agent Architecture

    • 여기서 AI Agent와 MCP는 상호 보조의 역할을 수행한다. AI Agent는 두뇌 역할로 사용자 목적을 해석하고 계획을 수립한다면, MCP 서버는 팔과 다리 역할로 정해진 작업을 안전하게 실행한다.
    • AI Agent와 MCP간의 관계

  2. MCP (Model Context Protocol)

    AI Agent 아키텍처 상에서 MCP는 주로 다음과 같은 역할을 한다. 이 중에서 첫 번째 특징이 MCP가 가지는 가장 큰 장점으로 부각되고 있다. 따라서 MCP를 한 마디로 정의한다면 “외부 툴에 AI assistant를 연동하는 표준 시스템”이라고 할 수 있다.

    • Tool Interface 계층의 표준화
      • 전통적으로 AI Agent가 여러 외부 툴이나 서비스에 연결하려면 개별적으로 커넥터 또는 API 개발이 필수적이었는데,
      • MCP는 AI Agent를 다양한 외부 툴 및 데이터 소스에 연결하는 표준화된 프로토콜로 일종의 usb 포트와 같은 역할을 수행한다.
    • Context Management
      • Language Model이 추론할 때 필요한 배경 지식이나 context 정보를 제공함으로써 추론 과정에 부작용이 없도록 한다.
    • Prompts 템플릿
      • 일반적인 LLM 상호작용을 프롬프트 템플릿과 워크플로우를 정의함으로써 표준화하고, 공유하는 강력한 방법을 제공한다.

  3. MCP 아키텍쳐

    MCP는 단순한 클라이언트-서버 아키텍처를 따릅니다.

    MCP Architecture
    • Host(Host with MCP client) : Cursor AI, Claude desktop 등으로 대표되는 사용자 앱. 호스트는 클라이언트에게 특정 요청을 보내고, 클라이언트를 통해 서버 도구를 사용한다.
    • Client : 통신 중개자로서 호스트의 요청을 MCP 언어(JSON RPC 방식)로 변환하여 서버와 통신한다. 서버는 요청을 처리하고 그 결과를 다시 클라이언트에게 전달한다. 클라이언트는 이 결과를 호스트가 이해하는 언어로 변환하여 호스트에게 최종 응답을 전달한다.
    • Server : 클라이언트로부터 받은 요청(웹 검색, DB 조회 등)을 수행한다. 로컬로 운영이 가능하며, 대부분의 시스템이 로컬 서버를 기반으로 실행된다. 리모트 서버와 로컬 서버 모두 통신할 수 있는 환경을 제공한다.
    • MCP Architecture

  4. n8n

    한편 n8n은 오픈소스 AI 워크플로우 자동화 툴이다. 시각적 인터페이스를 제공하여 드래그 앤 드롭 방식으로 워크플로우 설계할 수 있고, 복잡한 코딩 없이도 다양한 애플리케이션과 서비스 연동이 가능하다. 또한 셀프 호스팅이 가능해서 OAuth 및 API 키를 통해 안전한 데이터 연동을 지원한다.

    n8n과 MCP는 주요 역할이 다르기 때문에 서로의 대체재는 아니지만 여러 툴을 연동하여 쓴다는 관점에서 2개의 툴을 비교해보았다. 다수의 툴을 연결할 때 MCP를 통해서 개별적으로 붙이는 경우와 n8n 안에서 연동한 후 MCP로는 n8n만 연결하는 경우를 비교해봤을 때

    • 작업의 유연성이 더 필요하다면 MCP
    • 일정 부분 정해진 워크플로우 안에서 AI agent를 이용하고 싶다면 n8n을 쓰는 것이 적절하지 않을까 싶었다.
    • 리서치 이후에 n8n을 써보았는데 워크플로우 실행 시 ai agent가 실행될 때만 비용이 청구되기 때문에 MCP로 계속 호출하는 것 대비 비용이 절감된다는 인상을 받았다.
    MCP Architecture
Reference
부트스트랩을 활용한 유연한 비즈니스 의사결정 | Gin-Girin-Grim

부트스트랩을 활용한 유연한 비즈니스 의사결정

실험이나 관측 데이터 분석에서 주로 전통적인 통계 방법론, 즉 빈도주의 통계에 기반하는 경우가 많다. 그런데 실무에서는 데이터의 분포가 빈도주의 통계의 기본 가정을 충족시키지 못하는 경우도 있고, 때로는 분석 시간의 제약으로 인해 기계적으로 판단하게 되면서 잘못된 의사결정을 초래하기도 한다. 이 때 부트스트랩은 우리가 관심있는 통계량에 대해 경험적 분포를 제공하여 실무에서 직관적이고 좀 더 정확한 결론을 낼 수 있게 도와준다. 이번 글에서는 부트스트랩에 대해 가볍게 정리하고, 실무에서 부트스트랩이 도움이 되었던 케이스를 정리해보겠다.

  1. 부트스트랩이란?

    부트스트랩은 표본을 통해 모집단의 성질을 추정할 수 있는 것처럼, 표본의 성질에 대해서도 re-sampling을 통해 추정할 수 있다는 개념에서 출발한다. 즉, 표본에서 또 다시 표본을 여러 번 추출하여 표본의 통계량이 어떤 분포를 가지는 지 경험적으로 알아낸다.


    부트스트랩의 장점은 표본의 분포가 정규 분포를 따르지 않거나 크기가 작더라도 통계량의 분포를 경험적으로 추정할 수 있다는 점이다. 부트스트랩도 제약이 있긴 있다. 표본이 서로 독립적이고 동일한 분포(i.i.d)를 따른다는 가정을 충족해야 하고, re-sampling 수가 적을 경우에는 이상치에 크게 영향을 받을 수 있다. 또한 분석을 할 때마다 수치가 조금씩 다르게 나올 수 있는데 이는 re-sampling 횟수를 늘림으로써 변동성을 최소화할 수 있다.


  2. 부트스트랩으로 통계량의 신뢰구간 구하기
    1. 먼저 re-sampling 횟수를 정한다.
    2. 표본에서 복원 추출하여 새로운 표본을 생성한다. 이 때 표본의 크기만큼 re-sampling 한다. 즉 표본이 10개의 데이터로 구성되어 있다면 표본에서 10개의 유닛을 복원 추출한다.
    3. 새로 생성한 표본에 대해 통계량을 계산한다.
    4. 앞 단계에서 얻은 값의 백분위수를 확인하여 신뢰구간을 구한다.
  3. 부트스트랩은 비즈니스 의사결정을 어떻게 돕는가?

    부트스트랩은 다양한 방면에서 활용되지만 실무에서 사용하면서 느낀 장점은 2가지이다.

    1. 이상치에 대한 판단에 직관적 근거를 제공한다.

      이상치를 가진 표본으로 부트스트랩을 수행하면 이상치가 분포에 미치는 영향력을 판단할 수 있다. 첫 번째 그래프에서 가장 왼쪽의 분포는 이상치가 1번 추출된 데이터셋의 분포이고, 그 다음은 2번 추출된 분포, 그 다음은 3번 추출된 분포이다. 이 그래프를 통해서 이상치가 표본의 분포에 매우 큰 영향을 준다는 것을 확인하고 이에 대한 대응책을 마련할 수 있다. 표본의 크기를 키운 후 다시 부트스트랩을 수행하여 이러한 불규칙한 분포가 표본의 크기에 영향을 받은 것인지 확인해볼 수도 있고, 아예 이상치를 제거하는 방법을 취할 수도 있다.

      Outlier가 포함된 표본의 부트스트랩 결과
      그림 1. Outlier가 포함된 표본의 부트스트랩 결과

      이번에는 회귀계수에 대한 부트스트랩 분포다. 이 케이스에서 만약 빈도주의 통계를 기반으로 평가했다면 신뢰구간이 0을 포함하기 때문에 귀무가설을 기각하기 어려웠을 것이다. 그러나 부트스트랩을 수행하여 얻은 회귀계수의 분포를 살펴보면 분석가는 2가지 판단을 내릴 수 있다. 만약 이상치를 제거한다면 그래프의 오른쪽 분포처럼 회귀계수는 0에 가까운, 즉 통계적으로 유의하지 않다고 동일하게 판단할 수 있다. 그렇지만 현실적으로 이상치가 발생할 수 밖에 없는 상황이라면 왼쪽의 분포처럼 음의 효과가 있다고 결론을 내릴 수 있다. 실제 데이터에서는 극단적으로 많이 조회하거나 클릭, 구매하는 등의 이상치가 종종 발생하고 현실적으로 발생이 불가능하지도 않다. 이 때는 이상치를 제거하지 않고 실제로 발생하는 회귀계수의 분포를 파악하는 것이 올바른 의사결정일 수 있다.

      회귀계수에 대한 부트스트랩 결과
      그림 2. 회귀계수에 대한 부트스트랩 결과

    2. 정규분포를 가정하기 애매한 상황에서 통계량 분포의 안정성을 직관적으로 확인할 수 있다.

      두 그룹 간 차이에 대해 통계 검정을 수행할 때 주로 t-test를 많이 사용하는데, 이는 (표본 수가 크다면) 큰 수의 법칙에 의해 표본 통계량의 정규분포를 가정할 수 있기 때문이다. 그러나 때로는 이러한 가정이 여전히 유효한지 확신을 갖기 어려운 때가 있다. 그 중 하나가 비율 지표를 다룰 때인데, 비율 지표의 평균값을 다룬다고 하더라도 그 값이 한 쪽으로 크게 치우친(skewed) 형태라면 정규분포를 따르지 않을 수도 있다. 이 때 부트스트랩으로 경험적 분포를 확인해보면 이런 의문을 해소하고 결론을 내릴 수 있게 된다. 실무에서 평소에는 잘 관찰하지 않던 기능의 전환율을 살펴볼 때 부트스트랩을 적용해보았는데, 아래 그래프처럼 정규분포를 그린다는 것을 직관적으로 확인할 수 있었고, 해당 기능의 배포가 전환율에 긍정적인 영향을 준다는 결론을 보다 확신을 가지고 내릴 수 있었다.

      전환율에 대한 부트스트랩 결과
      그림 3. 전환율에 대한 부트스트랩 결과

부트스트랩은 통계량의 분포 자체를 직접 관찰하게 하여 통계적 불확실성을 탐색할 수 있게 하고, 그에 따라 판단을 돕는 도구다. 실무에서 빈도주의 통계의 가정을 충족하기 어려울 때 부트스트랩을 사용해보면 어떨까?

Reference

(도서) 행동 데이터 분석, 플로랑 뷔송. 한빛미디어