Dans le monde d'aujourd'hui, il est difficile d'imaginer le développement de produits sans test A / B. Pour réussir le lancement d'un produit ou d'une nouvelle fonctionnalité, vous devez concevoir correctement A / B, calculer et interpréter ses résultats. Parfois, nous devons tester plus de deux groupes. Dans cet article, nous considérerons un tel cas - plusieurs tests:
- Nous parlerons quand et pourquoi effectuer plusieurs tests;
- examiner les principales méthodes de calcul des résultats des tests et les principes mathématiques sur lesquels les méthodes sont basées;
- nous donnons des exemples de mise en Ćuvre logicielle des mĂ©thodes; Vous pouvez utiliser ces exemples dans vos projets.
Commençons donc.

Expériences multiples: quand et pourquoi
De toute Ă©vidence, toute complication technique de l'expĂ©rience doit ĂȘtre justifiĂ©e par une nĂ©cessitĂ© pratique. Cela s'applique Ă©galement Ă plusieurs tests. Si le public est divisĂ© en plus de deux sous-groupes, la probabilitĂ© d'obtenir une erreur du premier type au cours de l'expĂ©rience augmente de façon exponentielle:
1â(1â alpha)n,
oĂč
n - le nombre de sous-groupes,
alpha - un niveau donné de signification statistique.
Ainsi, lors de l'ajout d'un seul sous-groupe supplémentaire au test de paire habituel (
n=3 ) à un niveau standard donné
alpha=0,05 on obtient la probabilité d'une erreur du premier type
p=0,14 qui dépasse considérablement notre objectif
alpha=0,05 .
Pourquoi faire plusieurs expériences si elles réduisent la précision des résultats de la recherche? Il peut y avoir plusieurs raisons:
- Il est nécessaire de tester plusieurs modifications et leur effet cumulatif sur les métriques du produit. Un exemple montre à l'utilisateur sur la page de service deux nouveaux éléments qui sont situés différemment l'un par rapport à l'autre.
- Les changements ne peuvent ĂȘtre testĂ©s qu'en une seule pĂ©riode, car ils sont Ă la fois interdĂ©pendants et sensibles Ă la saisonnalitĂ© hebdomadaire. Un exemple est la dĂ©sactivation des canaux publicitaires pour calculer l'effet de la cannibalisation inter-canaux.
- Le client souhaite recevoir une rĂ©ponse dans les plus brefs dĂ©lais et Ă moindre coĂ»t, laquelle des options doit ĂȘtre choisie, tout en Ă©conomisant le dĂ©veloppement et la mise en Ćuvre de l'expĂ©rience.
Si nous sommes confrontés à l'un de ces problÚmes et que nous devons calculer la signification statistique du test - nous devons considérer la nécessité de corrections pour plusieurs tests. à propos de ce que c'est et comment le faire correctement, et sera discuté ci-dessous.
Expériences multiples: fonctionnalités de calcul
Concepts de base
Considérons le cas général lorsque nous traitons
n hypothĂšses
H0i ,
i=1,...,n à propos de l'égalité par paire de la médiane ou de la moyenne
m sous-groupes. Dans ce cas, le vrai et le mauvais résultat sont possibles.
H0iVSH1i pour chacun
i=1,...,n hypothÚses. Présentez les résultats comme une expérience de matrice de confusion:
Ainsi rejeté à tort
V de
R rejeté les hypothÚses de base.
Sur la base de ces paramÚtres, nous introduisons deux concepts importants d'erreurs, qui sont contrÎlés lors de tests multiples:
FWER et
Fdr .
Probabilité d'erreur de groupe
FWER (Family-Wise Error Rate) est la probabilité d'obtenir au moins une erreur du premier type et est déterminé par la formule:
FWER=p(V>0).
Fdr (False Discovery Rate) est l'espérance mathématique du rapport des erreurs du premier type au nombre total d'écarts de l'hypothÚse principale:
FDR=E(V/R|R>0).
Considérez les méthodes de contrÎle de ces erreurs en utilisant l'exemple d'un cas de produit standard.
Description du cas
à titre d'exemple simple, considérons une expérience dans laquelle trois groupes d'utilisateurs isolés et disjoints ont vu trois options de page avec une offre de cliquer sur le bouton d'appel d'une annonce. Comme mesure de base pour la simplicité du calcul, nous prenons le nombre total d'appels dans chaque groupe.
Voyons comment la métrique à l'étude a changé:
Fig. 1. Le graphique de la dynamique de la pression sur le bouton d'appel
Nous utiliserons la méthode standard
bootstrap afin de ramener la distribution de la métrique cible dans les échantillons à la normale, et regardez les histogrammes et les tableaux de plage des valeurs moyennes dans les échantillons:
Fig. 2. L'histogramme de la distribution des valeurs moyennes dans les groupes
Fig. 3. La gamme des valeurs moyennes dans les groupes
A en juger par les graphiques, le groupe C gagne par le nombre de clics sur le bouton d'appel. Cependant, il est nécessaire de vérifier la signification statistique des résultats. Pour ce faire, nous apportons la métrique estimée sous la forme de la distribution normale et utilisons le critÚre t de Student habituel pour la comparaison par paires de groupes dans l'expérience, puis en utilisant des méthodes de contrÎle
FWER et
Fdr pour tenir compte des corrections pour les comparaisons multiples.
Commande FWER
Il existe de nombreuses méthodes pour contrÎler cette erreur, mais deux sont les plus courantes:
1) Procédure en une étape avec réglage simultané
pâvalue pour toutes les hypothĂšses testĂ©es en utilisant la mĂ©thode de Bonferroni;
2) ajustement séquentiel et itératif
pâvalue c prise de dĂ©cision Ă chaque Ă©tape conformĂ©ment au rĂ©sultat de la mĂ©thode Hill.
1. Amendement Bonferroni
Cette procédure en une étape réduit la probabilité d'un résultat d'expérience faussement positif. L'essence de la méthode est d'accepter une hypothÚse alternative si:
pâ„ alpha/n,
oĂč
n - le nombre d'hypothÚses testées.
La mĂ©thode peut ĂȘtre implĂ©mentĂ©e tout simplement en utilisant la bibliothĂšque standard
bootstrapped :
from bootstrapped import bootstrap as bs from bootstrapped import compare_functions as bs_cmp from bootstrapped import stats_functions as bs_st bs_ab_estims = bs.bootstrap_ab(np.array(group_A), np.array(group_B), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4) bs_bc_estims = bs.bootstrap_ab(np.array(group_B), np.array(group_C), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4) bs_ac_estims = bs.bootstrap_ab(np.array(group_A), np.array(group_C), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4)
Ayant obtenu les résultats d'une évaluation statistique, nous pouvons conclure si les groupes diffÚrent ou non.
Le principal inconvénient de l'approche: plus il y a de sous-groupes, plus la puissance du critÚre est faible, ce qui augmente la probabilité d'accepter l'hypothÚse incorrecte. Par exemple, pour dix tests et
αi=0,05 besoin d'obtenir
piâ€510â3 dire que la diffĂ©rence est significative. Pour combler ces lacunes, vous pouvez choisir la mĂ©thode Hill.
2. Méthode Hill
Il s'agit d'une procédure de modification séquentielle descendante.
pâvalue . Dans la premiĂšre Ă©tape de l'algorithme de mĂ©thode, rĂ©el
pâvalue tri croissant:
p1â€Â·Â·Â·â€pn,
puis l'original
alpha -niveau:
alphaâČi= alpha/(nâi+1),
aprÚs quoi la condition est vérifiée
piâ„ alphaâČi et conclut si l'hypothĂšse principale est vraie
H0i .
Point de rupture de l'algorithme - instant i oĂč la premiĂšre hypothĂšse principale est acceptĂ©e
H0i et tous les suivants
H0j,j>i .
Vous pouvez implémenter cette méthode à l'aide de la procédure
multipletests() de la bibliothĂšque
statsmodels avec paramĂštre
method=âholmâ :
from bootstrapped import bootstrap as bs from bootstrapped import stats_functions as bs_st from scipy.stats import ttest_ind from statsmodels.sandbox.stats.multicomp import multipletests bs_a = bs.bootstrap(np.array(group_A), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) bs_b = bs.bootstrap(np.array(group_B), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) bs_c = bs.bootstrap(np.array(group_C), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) stat_ab, p_ab = stats.ttest_ind(pd.DataFrame(bs_a), pd.DataFrame(bs_b)) stat_bc, p_bc = stats.ttest_ind(pd.DataFrame(bs_b), pd.DataFrame(bs_c)) stat_ac, p_ac = stats.ttest_ind(pd.DataFrame(bs_a), pd.DataFrame(bs_c)) print(sorted([p_ab, p_bc, p_ac])) print("FWER: " + str(multipletests(sorted([p_ab, p_bc, p_ac]), alpha=0.05, method='holm', is_sorted = True)))
ContrĂŽle FDR
ContrĂŽle
Fdr signifie que la condition est remplie
FDR=E(V/R)< alpha . En mĂȘme temps
FDRâ€FWER , c'est-Ă -dire la probabilitĂ© d'obtenir une erreur de contrĂŽle de premier ordre
Fdr en déclin.
Méthode Benjamini-Hochberg
Cette procédure ascendante implique un changement séquentiel.
pâvalue ascendant prĂ©-triĂ©:
p1â€Â·Â·Â·â€pn.
Puis source
α -le niveau est ajusté par la formule:
alphaâČi=i· alpha/n,
puis, comme dans la méthode Holm, la condition est vérifiée
piâ„ alphaâČi et conclut si l'hypothĂšse principale est vraie
H0i et tous les suivants
H0j,j>i .
La mĂ©thode Benjamini-Hochberg, ainsi que la mĂ©thode Holm, peuvent ĂȘtre mises en Ćuvre en utilisant la procĂ©dure
multipletests() :
print("FDR: " + str(multipletests([p_ab, p_bc, p_ac], alpha=0.05, method='fdr_bh', is_sorted = False)))
Conclusion
Dans l'article, nous avons parlĂ© des principales mĂ©thodes d'Ă©valuation des rĂ©sultats de plusieurs tests et donnĂ© des exemples de code de programme qui implĂ©mentent ces mĂ©thodes. Nous espĂ©rons que vous avez passĂ© du temps avec intĂ©rĂȘt et intĂ©rĂȘt et que vous pourrez mettre en pratique les procĂ©dures dĂ©crites. Et si vous avez des questions, nous nous ferons un plaisir d'y rĂ©pondre.
Merci de votre attention!