Nastavení experimentálních dat

Experimentální design v Pythonu

James Chapman

Curriculum Manager, DataCamp

Problém s randomizací

1) Problém nevyváženosti: různý počet subjektů ve skupinách

Dvě skupiny s různým počtem subjektů.

Experimentální design v Pythonu

Problém s randomizací

2) Problém kovariáty: vysoká variabilita některých kovariát → nevyvážené skupiny při randomizaci

Kontrolní a léčebná skupina měřící vliv věku na reakční doby. Skupiny mají nerovnoměrné rozložení fyzické kondice, která, ač není primárním předmětem experimentu, může ovlivnit reakční doby.

Výsledek: obtížnější měření efektu léčby!

Experimentální design v Pythonu

Bloková randomizace

 

  • Nejprve rozdělení do bloků velikosti $n$, pak náhodné rozdělení
    • Řeší problém nevyváženosti

Příklad blokové randomizace se dvěma gridy oranžových a bílých čtverců

  • 24 subjektů rozděleno do dvou skupin a poté randomizováno
Experimentální design v Pythonu

Náš dataset

  • E-commerce dataset (ecom) (1000 subjektů)
    • Průměrná velikost košíku
    • Průměrný čas na webu
    • Aktivní uživatel (průměrně 40+ minut denně na webu)
   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
Experimentální design v Pythonu

Bloková randomizace v Pythonu

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
Experimentální design v Pythonu

Vizualizace rozdělení

 

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()

Konfoundující proměnná = proměnná, která může způsobit efekt místo léčby

 

Graf rozdělení seaborn zobrazující dvě přibližně normální, mírně průhledná rozdělení. Větší modré a menší oranžové, která se lehce překrývají – oranžové je posunuté doprava

Experimentální design v Pythonu

Stratifikovaná randomizace

 

  • Nejprve rozdělení podle kovariáty
    • Poté randomizace
  • Zelená = všichni aktivní uživatelé (žlutá = ostatní)
    • Poté rozdělení na léčbu/kontrolu
  • Řeší problém kovariát/konfoundování
  • Lze použít pro více kovariát – ale složitost roste!

Dva datové gridy – zelený a žlutý. Každá buňka obsahuje písmeno T nebo C; žlutý grid je větší

Experimentální design v Pythonu

První stratum

  • Oddělení aktivních uživatelů
  • Rozdělení do léčby/kontroly
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'
Experimentální design v Pythonu

Druhé stratum

  • Oddělení neaktivních uživatelů
  • Rozdělení do léčby/kontroly
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'
Experimentální design v Pythonu

Ověření stratifikace

  • Spojení bloků a skupin
  • Ověření alokace pomocí 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
Experimentální design v Pythonu

Pojďme procvičovat!

Experimentální design v Pythonu

Preparing Video For Download...