Налаштування експериментальних даних

Експериментальний дизайн у Python

James Chapman

Curriculum Manager, DataCamp

Проблема рандомізації

1) Проблема нерівності: різна кількість учасників у групах

Дві групи з різною кількістю учасників.

Експериментальний дизайн у Python

Проблема рандомізації

2) Проблема коваріат: велика мінливість деяких коваріат → дисбаланс груп під час рандомізації

Групи контролю й лікування для оцінки впливу віку на час реакції. Розподіл фізичної форми між групами нерівний; це не головна змінна експерименту, але може впливати на час реакції.

Наслідок: складніше виміряти ефект лікування!

Експериментальний дизайн у Python

Блочна рандомізація

 

  • Спершу розбийте на блоки розміру $n$, потім випадково розподіліть
    • Усунення проблеми нерівності

Приклад блочної рандомізації: дві сітки з помаранчевих і білих квадратів

  • 24 учасники діляться на дві групи, потім рандомізуються
Експериментальний дизайн у Python

Наш набір даних

  • Набір даних e-commerce (ecom) (1000 учасників)
    • Середній розмір кошика
    • Середній час на сайті
    • Power user (у середньому 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

Блочна рандомізація в 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()

Конфаундинг = змінна може спричиняти ефект, а не лікування

 

Графік розподілу seaborn із двома напівпрозорими нормальноподібними кривими: більша синя та менша помаранчева, що трохи перекриваються; помаранчева зміщена правіше

Експериментальний дизайн у Python

Стратифікована рандомізація

 

  • Спершу розбиття за коваріатами
    • Потім рандомізація
  • Зелений = усі power users (Жовтий = не power users)
    • Далі поділ Treatment/Control
  • Усунення проблеми коваріат/конфаундингу
  • Можна для кількох коваріатів — але це ускладнює!

Зображення двох сіток даних: одна зелена, інша жовта. У всіх комірках літери T або C; жовта сітка більша

Експериментальний дизайн у Python

Перша страта

  • Відокремте power users
  • Вибірка в Treatment/Control
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

Друга страта

  • Відокремте не power users
  • Вибірка в Treatment/Control
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...