Konfiguracja danych eksperymentu

Projektowanie eksperymentów w Pythonie

James Chapman

Curriculum Manager, DataCamp

Problem z randomizacją

1) Problem nierówności: różna liczba podmiotów w grupach

Dwie grupy z różną liczbą podmiotów.

Projektowanie eksperymentów w Pythonie

Problem z randomizacją

2) Problem współzmiennej: duża zmienność niektórych współzmiennych → nierównowaga grup w randomizacji

Grupy kontrolna i leczenia zaprojektowane do pomiaru wpływu wieku na czas reakcji. Obie grupy mają nierównomierny rozkład sprawności fizycznej, co choć nie jest głównym celem eksperymentu, może wpływać na zmienną czasu reakcji.

Wynik: trudniej zmierzyć efekt leczenia!

Projektowanie eksperymentów w Pythonie

Randomizacja blokowa

 

  • Najpierw podział na bloki rozmiaru $n$, następnie losowy podział
    • Rozwiązuje problem nierówności

Przykład randomizacji blokowej przedstawiający dwie siatki pomarańczowych i białych kwadratów

  • 24 podmioty podzielone na dwie grupy, następnie poddane randomizacji
Projektowanie eksperymentów w Pythonie

Nasz zbiór danych

  • Zbiór danych e-commerce (ecom) (1000 podmiotów)
    • Średni rozmiar koszyka
    • Średni czas spędzony na stronie
    • Power user (średnio 40+ minut dziennie na stronie)
   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
Projektowanie eksperymentów w Pythonie

Randomizacja blokowa w Pythonie

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
Projektowanie eksperymentów w Pythonie

Wizualizacja podziałów

 

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

Zmienna zakłócająca = zmienna, która może powodować efekt zamiast leczenia

 

Wykres rozkładu seaborn przedstawiający dwa rozkłady zbliżone do normalnego, lekko przezroczyste. Większy niebieski i mniejszy pomarańczowy, nieznacznie nakładające się, z pomarańczowym przesuniętym w prawo

Projektowanie eksperymentów w Pythonie

Randomizacja warstwowa

 

  • Podział według współzmiennej(-ych) najpierw
    • Następnie randomizacja
  • Zielony = wszyscy power users (Żółty = nie power users)
    • Następnie podział na grupę leczenia/kontrolną
  • Rozwiązuje problem współzmiennej/zakłócającej
  • Możliwe dla wielu współzmiennych – ale staje się złożone!

Obraz dwóch siatek danych – zielonej i żółtej. W każdej komórce znajduje się litera T lub C, a żółta siatka jest większa

Projektowanie eksperymentów w Pythonie

Pierwsza warstwa

  • Wyodrębnij power users
  • Próbkuj do grupy leczenia/kontrolnej
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'
Projektowanie eksperymentów w Pythonie

Druga warstwa

  • Wyodrębnij pozostałych użytkowników
  • Próbkuj do grupy leczenia/kontrolnej
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'
Projektowanie eksperymentów w Pythonie

Weryfikacja stratyfikacji

  • Połącz bloki i grupy
  • Użyj groupby, aby sprawdzić alokację
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
Projektowanie eksperymentów w Pythonie

Czas na ćwiczenia!

Projektowanie eksperymentów w Pythonie

Preparing Video For Download...