Impostazione dei dati sperimentali

Progettazione Sperimentale in Python

James Chapman

Curriculum Manager, DataCamp

Il problema della randomizzazione

1) Problema di squilibrio: gruppi con numeri diversi di soggetti

Due gruppi con numeri diversi di soggetti.

Progettazione Sperimentale in Python

Il problema della randomizzazione

2) Problema di covariate: alta variabilità in alcune covariate → squilibri nei gruppi con la randomizzazione

Gruppi di controllo e trattamento per misurare l'impatto dell'età sui tempi di reazione. I due gruppi hanno una distribuzione diseguale della forma fisica che, pur non essendo l'obiettivo principale, può influire sui tempi di reazione.

Risultato: più difficile misurare l'effetto del trattamento!

Progettazione Sperimentale in Python

Randomizzazione a blocchi

 

  • Dividi prima in blocchi di dimensione $n$, poi randomizza
    • Risolve lo squilibrio

Esempio di randomizzazione a blocchi con due griglie di quadrati arancioni e bianchi

  • 24 soggetti divisi in due gruppi, poi randomizzati
Progettazione Sperimentale in Python

Il nostro dataset

  • Dataset e-commerce (ecom) (1000 soggetti)
    • Dimensione media carrello
    • Tempo medio sul sito
    • Power user (media 40+ minuti/die sul sito)
   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
Progettazione Sperimentale in Python

Randomizzazione a blocchi in 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
Progettazione Sperimentale in Python

Visualizzare gli split

 

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

Confondente = variabile che potrebbe causare l'effetto invece del trattamento

 

Un grafico di distribuzione seaborn con due curve quasi normali semitrasparenti: una blu più grande e una arancione più piccola, sovrapposte, con l'arancione più a destra

Progettazione Sperimentale in Python

Randomizzazione stratificata

 

  • Dividi prima in base alle covariate
    • Poi randomizza
  • Verde = tutti power user (Giallo = non power user)
    • Poi split Trattamento/Controllo
  • Risolve il problema di covariate/confondenti
  • Si può fare per più covariate, ma diventa complesso

Immagine con due griglie di dati, una verde e una gialla. Entrambe hanno T o C in tutte le celle; la griglia gialla è più grande

Progettazione Sperimentale in Python

La nostra prima strata

  • Separa i power user
  • Campiona in Trattamento/Controllo
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'
Progettazione Sperimentale in Python

La seconda strata

  • Separa i non power user
  • Campiona in Trattamento/Controllo
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'
Progettazione Sperimentale in Python

Confermare la stratificazione

  • Unisci blocchi e gruppi
  • Usa groupby per verificare l'allocazione
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
Progettazione Sperimentale in Python

Ayo berlatih!

Progettazione Sperimentale in Python

Preparing Video For Download...