Le laboratoire de science des données
ANOVA avec C#
Un cas d’utilisation de la technique d’analyse des statistiques de variance consiste à demander si les performances des élèves sont les mêmes dans trois classes enseignées par le même enseignant mais avec des manuels différents, explique le Dr. James McCaffrey de Microsoft Research.
L’analyse de la variance (ANOVA) est une technique statistique classique utilisée pour déduire si les moyennes (moyennes) de trois groupes ou plus sont toutes égales, sur la base d’échantillons des groupes. Par exemple, supposons qu’il y ait trois classes différentes d’introduction à l’informatique dans une université. Chaque classe est enseignée par le même professeur mais utilise un manuel différent. Vous voulez savoir si les performances des élèves sont les mêmes dans les trois classes ou non.
Vous avez un examen qui évalue les compétences en informatique sur une échelle de 1 à 15, mais comme l’examen est coûteux et prend du temps à administrer, vous pouvez le faire passer à un maximum de six étudiants sélectionnés au hasard dans chaque classe. Vous administrez l’examen et effectuez une ANOVA sur les trois échantillons pour déduire si les moyennes des trois classes sont identiques ou non.
Une bonne façon de voir où va cet article est de jeter un coup d’œil à la capture d’écran d’un programme de démonstration dans Figure 1. Le programme de démonstration configure trois échantillons : (3, 4, 6, 5), (8, 12, 9, 11, 10, 8) et (13, 9, 11, 8, 12). Les moyennes des trois échantillons sont 4,50, 9,67 et 10,60. Les moyennes des échantillons des deuxième et troisième groupes semblent similaires, mais la moyenne du premier échantillon est un peu inférieure à celle des deux autres.
La moyenne globale des 15 valeurs d’échantillon est de 8,60. Le programme de démonstration calcule les valeurs intermédiaires SSb et SSw (“somme des carrés”) et les utilise pour calculer les valeurs MSb et MSw (“moyenne carrée”). La statistique F calculée est MSb/MSw = 15,884.
Chaque ensemble de données dans un problème ANOVA a deux valeurs df (“degrés de liberté”). Pour les données de démonstration, df1 = nombre de groupes moins un = 3 – 1 = 2, et df2 = nombre total de valeurs moins nombre de groupes = 15 – 3 = 12.
La statistique F et les deux valeurs df sont utilisées pour calculer une valeur p = 0,0004. La valeur p, très vaguement, est la probabilité que les trois moyennes de la population source soient les mêmes sur la base des preuves calculées à partir des trois échantillons. Étant donné que la valeur de p est si petite, vous concluriez qu’il est peu probable que les trois populations sources aient la même moyenne.
Le programme de démonstration ne vérifie pas trois hypothèses ANOVA :
- Les populations de données source sont toutes distribuées normalement (gaussienne, en forme de cloche)
- Les variances des populations de données source sont les mêmes
- Les observations de l’échantillon sont indépendantes les unes des autres
Cet article suppose que vous avez des compétences de programmation intermédiaires ou supérieures avec le langage C #, mais ne suppose pas que vous savez quoi que ce soit sur l’ANOVA. Le code de la démo est un peu trop long pour être présenté dans son intégralité dans cet article, mais vous pouvez trouver le code source complet dans le fichier d’accompagnement à télécharger.
Pour créer le programme de démonstration, j’ai utilisé Visual Studio 2022 (l’édition communautaire gratuite) avec .NET 5 (pour éviter l’étrange nouveau modèle de console .NET 6). Cependant, la démo n’a pas de dépendances significatives, donc toutes les versions relativement récentes de VS et .NET peuvent être utilisées.
Calcul de la statistique F
Le calcul de la statistique F à partir d’échantillons de données est mieux expliqué par un exemple. Supposons, comme dans la démo, qu’il y ait trois groupes d’échantillons :
Group 1: 3, 4, 6, 5 Group 2: 8, 12, 9, 11, 10, 8 Group 3: 13, 9, 11, 8, 12
Les moyennes de chaque groupe d’échantillons et la moyenne globale sont :
Mean 1: (3 + 4 + 6 + 5) / 4 = 18 / 4 = 4.50 Mean 2: (8 + 12 + . . + 8) / 6 = 58 / 6 = 9.67 Mean 3: (13 + 9 + . . + 12) / 5 = 53 / 5 = 10.60 Overall: (3 + 4 + . . + 12) / 15 = 129 / 15 = 8.60
La SSb (“somme des carrés entre les groupes”) est la somme pondérée des différences au carré entre la moyenne de chaque groupe et la moyenne globale :
SSb = 4 * (4.50 - 8.60)^2 + 6 * (9.67 - 8.60)^2 + 5 * (10.60 - 8.60)^2 = 94.07
La MSb (“somme moyenne des carrés entre les groupes”) = SSb/(k – 1) où k est le nombre de groupes. Pour les données de démonstration :
MSb = SSb / (3 - 1) = 94.07 / (3 - 1) = 47.03
Le SSw (“somme des carrés au sein des groupes”) est la somme des différences au carré entre chaque point de données d’échantillon et sa moyenne de groupe associée. Pour les données de démonstration :
SSw = (3 - 4.50)^2 + (4 - 4.50)^2 + . . + (12 - 10.60)^2 = 35.53
Le MSw (“somme moyenne des carrés au sein des groupes”) = SSw / (N – k) où N est le nombre total de points de données d’échantillon et k est le nombre de groupes :
MSw = 35.53 / (15 - 3) = 35.53 / 12 = 2.96
La statistique F est juste MSb divisé par MSw :
F-stat = MSb / MSw = 47.03 / 2.96 = 15.88
Plus la statistique F calculée est grande, plus il est probable que toutes les moyennes de population ne soient pas toutes identiques. Notez que “pas tous pareils” n’est pas équivalent à “tous différents” — “pas tous pareils” signifie qu’au moins deux sont différents.
Calcul de la valeur P à partir de la statistique F
La valeur p est la zone sous la distribution F associée, de la valeur statistique F calculée à l’infini positif. L’idée est mieux expliquée à l’aide d’un graphique. Voir Figure 2.
Il n’y a pas qu’une seule distribution F, il y en a plusieurs. Il existe une distribution F différente pour chaque paire de valeurs df1 et df2. Ceci est similaire à la façon dont il existe une distribution normale (gaussienne, en forme de cloche) différente pour chaque paire de valeurs (moyenne, écart type).
Le graphique dans Figure 2 montre la distribution F pour df1 = 4 et df2 = 12. Contrairement aux distributions gaussiennes qui ont toutes une forme de cloche, les formes des différentes distributions F sont assez différentes les unes des autres.
L’aire totale sous toute distribution F est exactement 1. La valeur p est l’aire de la queue droite : l’aire sous la courbe de la statistique F à l’infini positif. Dans le graphique, chaque rectangle a une aire de 0,10. Si vous regardez attentivement, vous pouvez voir que la zone dans la queue droite est d’environ un rectangle, et en fait la valeur p exacte est de 0,0982.
Le calcul de l’aire sous une distribution F est difficile. Il existe plusieurs approches différentes. Le programme de démonstration utilise la fonction “bêta incomplet régularisé” pour calculer une valeur p. La fonction bêta incomplète régularisée est souvent écrite sous la forme Ix(a, b) ou I(x; a, b). Vous pouvez considérer I(x; a, b) comme une fonction mathématique abstraite qui accepte une valeur x comprise entre 0,0 et 1,0 et des valeurs positives a et b.
Bien que les mathématiques soient approfondies, le calcul d’une valeur p à partir d’une statistique F, df1 et df2 est simple :
x = df2 / (df2 + df1 * f-stat) a = df2 / 2 b = df1 / 2 p-value = I(x, a, b)
Facile. Mais l’implémentation de la fonction I(x; a, b) est largement considérée comme l’un des problèmes les plus difficiles de la programmation scientifique. En bref, I(x; a, b) peut être calculé à l’aide de la fonction log-beta, et la fonction log-beta peut être calculée à l’aide de la fonction log-gamma.
Un précédent Magazine Visual Studio L’article intitulé “Les fonctions LogBeta et LogGamma utilisant C#” explique en détail comment calculer la fonction I(x; a, b).
Le programme de démonstration
Le programme de démonstration commence par configurer trois groupes d’exemples de données :
static void Main(string[] args) { double[][] data = new double[3][]; // 3 groups data[0] = new double[] { 3, 4, 6, 5 }; data[1] = new double[] { 8, 12, 9, 11, 10, 8 }; data[2] = new double[] { 13, 9, 11, 8, 12 }; string[] colNames = new string[] { "Group1", "Group2", "Group3" }; ShowData(data, colNames); . . .
La fonction ShowData() est juste une aide définie par le programme pour afficher les données dans un format agréable. Ensuite, les données de démonstration sont utilisées pour trouver la statistique F calculée :
Console.WriteLine("Calculating F-statistic"); double fstat = Fstat(data); Console.WriteLine("F stat = " + fstat.ToString("F3"));
La fonction Fstat() définie par le programme calcule les moyennes de groupe, la moyenne globale, MSb et MSw comme expliqué dans cet article.
La valeur p est calculée à partir des valeurs des degrés de liberté et de la statistique f calculée comme suit :
int df1 = 3 - 1; // k - 1 int df2 = 15 - 3; // N - k Console.Write("The degrees of freedom are "); Console.WriteLine(df1 + ", " + df2); Console.WriteLine("Calculating p-value "); double pValue = FDist(fstat, df1, df2); Console.Write("p-value = "); Console.WriteLine(pValue.ToString("F8"));
Le programme de démonstration code en dur les valeurs df1 et df2. Une approche alternative consiste à calculer df1 et df2 par programmation à partir des données d’échantillon.
La fonction FDist()
La clé de la démo est la fonction FDist() qui calcule la p-value. Il est défini comme :
static double FDist(double fstat, double df1, double df2) { double x = df2 / (df2 + df1 * fstat); double a = df2 / 2; double b = df1 / 2; return RegIncBeta(x, a, b); // p-value }
La fonction FDist() est trompeusement simple car tout le travail difficile est effectué par la fonction RegIncBeta(). La fonction RegIncBeta() est un wrapper sur une fonction RegIncompleteBeta(), qui appelle les fonctions d’assistance LogBeta() et ContFraction().
Emballer
Il est très important de se rappeler que les résultats d’une analyse ANOVA sont probabilistes et doivent être interprétés avec prudence. Pour les données du monde réel, la valeur de p calculée n’est qu’une indication de la probabilité que les moyennes de la population source soient toutes identiques. Pour les petites valeurs de p (où “petit” dépend de votre scénario de problème particulier), une conclusion appropriée est quelque chose comme “les données de l’échantillon suggèrent qu’il est peu probable que les moyennes de la population soient toutes les mêmes”. Pour les grandes valeurs de p, une conclusion appropriée est la suivante : “les données de l’échantillon suggèrent que toutes les k populations sources ont probablement la même moyenne”.
Comme l’illustrent les données de démonstration, une petite valeur de p ne suggère pas que toutes les moyennes de la population source sont différentes. Il est possible que les moyennes de deux populations ou plus soient les mêmes.
Une faiblesse importante de l’ANOVA est qu’il est souvent impossible de tester les hypothèses selon lesquelles les sources de données sont distribuées gaussiennes et ont des variances égales. C’est une autre raison pour laquelle les conclusions de l’ANOVA doivent être conservatrices.
L’ANOVA est destinée aux scénarios avec trois groupes d’échantillons ou plus. Une technique statistique classique étroitement liée est appelée le test t de Student. Le test t est utilisé pour comparer les moyennes d’exactement deux groupes. Il est possible d’utiliser l’ANOVA pour seulement deux groupes, mais le test t est une approche plus courante.
A propos de l’auteur
Dr. James McCaffrey travaille pour Microsoft Research à Redmond, Wash. Il a travaillé sur plusieurs produits Microsoft, dont Azure et Bing. Jacques est joignable au [email protected].
.