실험 데이터 설정

Python으로 배우는 실험 설계

James Chapman

Curriculum Manager, DataCamp

무작위화의 문제점

1) 불균형 문제: 그룹 간 피험자 수가 다름

두 그룹의 피험자 수가 서로 다른 그림.

Python으로 배우는 실험 설계

무작위화의 문제점

2) 공변량 문제: 일부 공변량 변동이 큼 → 무작위 배정 시 그룹 불균형

반응 시간에 대한 연령 효과를 측정하려는 대조/처리 그룹. 신체 체력 분포가 두 그룹에서 달라, 주요 관심 변수가 아니더라도 반응 시간에 영향을 줄 수 있음.

결과: 처리 효과 측정이 어려워짐!

Python으로 배우는 실험 설계

블록 무작위화

 

  • 먼저 크기 n의 블록으로 분할 후 무작위 배정
    • 불균형 문제 해결

오렌지와 흰색 사각형으로 된 두 그리드를 보여주는 블록 무작위화 예시

  • 24명을 두 그룹으로 나눈 뒤 무작위 배정
Python으로 배우는 실험 설계

우리 데이터셋

  • 전자상거래 데이터셋(ecom) (피험자 1000명)
    • 평균 장바구니 크기
    • 웹사이트 평균 체류 시간
    • 파워 유저(웹사이트 일일 평균 40분 이상)
   basket_size  web_time  power_user
0          227         7           0
1          123         5           0
2           98        16           0
3          211        45           1
4          133        17           0
Python으로 배우는 실험 설계

파이썬으로 블록 무작위화

group1 = ecom.sample(frac=0.5, random_state=42, replace=False)
group1['Block'] = 1
group2 = ecom.drop(group1.index)
group2['Block'] = 2
print(len(group1), len(group2))
500,500
Python으로 배우는 실험 설계

분할 시각화

 

import seaborn as sns
import matplotlib.pyplot as plt
sns.displot(data=ecom, 
            x='basket_size', 
            hue='power_user', 
            fill=True, 
            kind='kde')    
plt.show()

혼란변수(Confounding) = 처리보다 효과를 유발했을 수도 있는 변수

 

겹쳐 보이는 두 개의 정규분포 형태의 시본 분포 플롯. 더 큰 파란 분포와 약간 오른쪽으로 치우친 작은 주황 분포가 일부 겹쳐 있음

Python으로 배우는 실험 설계

층화 무작위화

 

  • 먼저 공변량 기준으로 분할
    • 그다음 무작위 배정
  • 초록 = 모든 파워 유저 (노랑 = 파워 유저 아님)
    • 이후 처리/대조로 분할
  • 공변량/혼란변수 문제를 보정
  • 여러 공변량에도 가능하나 복잡해짐

두 개의 데이터 그리드(하나는 초록, 하나는 노랑). 각 칸에 T 또는 C가 있고 노란 그리드가 더 큼

Python으로 배우는 실험 설계

첫 번째 층(strata)

  • 파워 유저 분리
  • 처리/대조로 샘플링
strata_1 = ecom[ecom['power_user'] == 1]
strata_1['Block'] = 1

strata_1_g1 = strata_1.sample(frac=0.5, replace=False) strata_1_g1['T_C'] = 'T'
strata_1_g2 = strata_1.drop(strata_1_g1.index) strata_1_g2['T_C'] = 'C'
Python으로 배우는 실험 설계

두 번째 층(strata)

  • 비(非)파워 유저 분리
  • 처리/대조로 샘플링
strata_2 = ecom.drop(strata_1.index)
strata_2['Block'] = 2

strata_2_g1 = strata_2.sample(frac=0.5, replace=False) strata_2_g1['T_C'] = 'T' strata_2_g2 = strata_2.drop(strata_2_g1.index) strata_2_g2['T_C'] = 'C'
Python으로 배우는 실험 설계

층화 확인

  • 블록과 그룹 결합
  • groupby로 할당 확인
ecom_stratified = pd.concat([strata_1_g1, strata_1_g2, strata_2_g1, strata_2_g2])

ecom_stratified.groupby(['Block','T_C', 'power_user']).size()
Block  T_C  power_user
1      C    1              50
       T    1              50
2      C    0             450
       T    0             450
Python으로 배우는 실험 설계

연습해 봅시다!

Python으로 배우는 실험 설계

Preparing Video For Download...