Plan en blocs aléatoires : maîtriser la variance

Conception d'expériences en Python

James Chapman

Curriculum Manager, DataCamp

Comprendre le blocage

 

  • Réduire la variance en regroupant des unités similaires
  • Chaque bloc reçoit tous les traitements
  • Se concentrer sur les effets des traitements, en contrôlant les effets de bloc

Exemple de randomisation par blocs montrant deux grilles de carrés orange et blancs

Conception d'expériences en Python

Exemple de données d'un plan en blocs

athletes.head()
   Athlete_ID Initial_Fitness_Level  Muscle_Gain_kg
0         113              Beginner        3.225102
1          30              Advanced        3.976548
2         183          Intermediate        5.165449
3         200              Beginner        2.188297
4         194              Beginner        4.724162
Conception d'expériences en Python

Mettre en œuvre un plan en blocs aléatoires

  • Utiliser .groupby() pour mélanger à l'intérieur des blocs
blocks = athletes.groupby('Initial_Fitness_Level').apply(

lambda x: x.sample(frac=1)
)
blocks = blocks.reset_index(drop=True) blocks
     Athlete_ID Initial_Fitness_Level  Muscle_Gain_kg
0           198              Advanced           5.742
1           146              Advanced           6.248
2           157              Advanced           6.049
..          ...                   ...             ...
198         164          Intermediate           6.134
199         178          Intermediate           6.591
Conception d'expériences en Python

Blocs aléatoires mis en place

  • numpy.random.choice() pour assigner au hasard les traitements dans chaque bloc
blocks['Treatment'] = np.random.choice(
    ['Cardio', 'Strength Training', 'Mixed'],
    size=len(blocks))

blocks.sample(n=5)
     Athlete_ID  Initial_Fitness_Level  Muscle_Gain_kg          Treatment
 87         194               Beginner           4.724             Cardio
 54           3               Advanced           3.731  Strength Training
177          80           Intermediate           6.758              Mixed
146         183           Intermediate           5.165  Strength Training          
 60         190               Advanced           3.763             Cardio
Conception d'expériences en Python

Visualiser les effets des traitements par bloc

import seaborn as sns
sns.boxplot(x='Initial_Fitness_Level', y='Muscle_Gain_kg', hue='Treatment', data=blocks)
plt.show()

Boîtes à moustaches à l'intérieur des blocs

Conception d'expériences en Python

ANOVA à l'intérieur des blocs

  • Supposer un seuil de signification $\alpha$ de 0,05
from scipy.stats import f_oneway
blocks.groupby('Initial_Fitness_Level').apply(
  lambda x: f_oneway(x[x['Treatment'] == 'Cardio']['Muscle_Gain_kg'], 
                     x[x['Treatment'] == 'Mixed']['Muscle_Gain_kg'],
                     x[x['Treatment'] == 'Strength Training']['Muscle_Gain_kg'])
)
Block
Initial_Fitness_Level
Advanced        (0.7951054385317405, 0.4555687666120679)
Beginner        (0.1085790370950905, 0.8972754969684291)
Intermediate    (0.5678877824942661, 0.5698403547950377)
dtype: object
Conception d'expériences en Python

Visualiser les effets entre blocs

import seaborn as sns
sns.boxplot(x='Initial_Fitness_Level', y='Muscle_Gain_kg', data=blocks)
plt.show()

Boîtes à moustaches entre les blocs

Conception d'expériences en Python

ANOVA entre blocs

f_oneway(
  blocks[blocks['Initial_Fitness_Level'] == "Advanced"]['Muscle_Gain_kg'], 
  blocks[blocks['Initial_Fitness_Level'] == "Beginner"]['Muscle_Gain_kg'], 
  blocks[blocks['Initial_Fitness_Level'] == "Intermediate"]['Muscle_Gain_kg']
)
F_onewayResult(statistic=2.325058605244051, pvalue=0.10045536062209368)
Conception d'expériences en Python

Passons à la pratique !

Conception d'expériences en Python

Preparing Video For Download...