Chapitre 6 Probabilités et Statistiques Programmation en Python
Probabilités
Introduction # R possède de très nombreuses fonctionnalités dans le domaine des probabilités et statistiques. # Nous allons en présenter quelques unes.
Probabilités # R possède un nom pour chaque loi de probabilité. # Par exemple, le nom pour la loi normale est norm. # # On a les lois de probabilités discrètes suivantes: # Lois discrètes Noms en R # Binomiale binom # Géometrique geom # Hypergéometrique hyper # Négative binomiale nbinom # Poisson pois
Probabilités # On a les lois de probabilités continues suivantes: # # Lois continues Noms en R # Béta beta # Cauchy cauchy # Chi-carrée chisq # Exponentielle exp # F f
Probabilités # Gamma gamma # Log-normale lnorm # Logistique logis # Normale norm # Student t # Uniforme unif # Weibull weibull # Wilcoxon wilcox
Probabilités # Pour chacune de ces lois, taper ?nom_loi pour plus d'infos sur les paramètres requis. # Pour chacune de ces lois, on a quatre fonctions qui commencent par d, p, q et r suivies du nom de la loi. # Par exemple, pour la loi normale: # dnorm, pnorm, qnorm, rnorm # # dnom_loi: fonction de densité (ou fct de masse) P(X = x) # pnom_loi: fonction de distribution P(X <= x) # qnom_loi: fonction des quantiles # rnom_loi: génération de nombres aléatoires # suivant la loi en question
Fonctions de densités # Fonction de densité (ou fct de masse ou de probabilité): # On utilise la fonction dnom_loi. # Elle représente P(X = x).
Fonctions de densités # Cas discret... # loi binomiale par exemple # prob d'obtenir 7 succès sur 10 tirages avec prob de succès 0.4 dbinom(7, size=10, prob=0.4) [1] 0.04246733 plot(0:10, dbinom(0:10, size=10, prob=0.4), type = "p", main = "Binomial Density Function")
Fonctions de densités
Fonctions de densités # Cas continu... # loi normale par exemple plot(dnorm, -4, 4, main = "Normal Density Function") # avec d'autres paramètres plot(dnorm(mean=70, sd=3), 40, 100) Error in dnorm(mean = 70, sd = 3) : argument "x" is missing, with no default # il faut redéfinir une fonction... ma_densite <- function(x){dnorm(x, mean=70, sd=3)} # puis l'imprimer plot(ma_densite, 55, 85)
Fonctions de densités
Fonctions de densités
Fonctions de distributions # Fonction de distribution: # On utilise la fonction pnom_loi. # C'est l'intégrale de la fonction de densité. # Elle représente P(X <= x).
Fonctions de distributions # Cas discret... # loi binomiale par exemple # prob d'obtenir au moins 7 succès sur 10 tirages avec prob de succès 0.4 pbinom(7, size=10, prob=0.4) [1] 0.9877054 plot(0:10, pbinom(0:10, size=10, prob=0.4), type = "p", main = "Cumulative Binomial Distribution")
Fonctions de distributions
Fonctions de distributions # Cas continu... # loi normale par exemple # P(N <= 66) où N v.a. de loi normale, moyenne 70, sd 3 pnorm(66, mean=70, sd=3) [1] 0.09121122 plot(pnorm, -4, 4, main = "Cumulative Normal Distribution") # avec d'autres paramètres plot(pnorm(mean=70, sd=3), 40, 100) Error in pnorm(mean = 70, sd = 3) : argument "q" is missing, with no default # il faut redéfinir une fonction... ma_distribution <- function(x){pnorm(x, mean=70, sd=3)} # puis l'imprimer plot(ma_distribution, 40, 100)
Fonctions de distributions
Fonctions de distributions
Fonctions de quantiles # Fonction de quantiles: # On utilise la fonction qnom_loi. # Cette fonction convertit une probabilité en son quantile correspondant # Par exemple, pour une variable normale de moyenne 25, le quantile correspondant à une probabilité de 0.5 sera précisément 25. qnorm(0.5, mean=25, sd=3) [1] 25
Fonctions de quantiles # Cas discret... # loi binomiale par exemple # Intervalle de confiance de de 95% (alpha = 0.05) d'une variable binomiale de 100 tirages avec prob de succès 0.4. # Les bornes de l'intervalles sont alpha/2 et 1-(alpha/2) qbinom(c(0.05/2, 1-(0.05/2)), size=100, prob=0.4) [1] 31 50
Fonctions de quantiles # Cas continu... # loi normale par exemple # Intervalle de confiance de de 95% (alpha = 0.05) d'une variable normale de moyenne 25 et sd 3. # Les bornes de l'intervalles sont alpha/2 et 1-(alpha/2) qnorm(c(0.05/2, 1-(0.05/2)), mean=25, sd=3) [1] 19.12011 30.87989
Génération de nombres aléatoires # Génération de nombres aléatoires: # On utilise la fonction rnom_loi. # Cette fonction génère des nombres aléatoires tirés selon la loi de probabilité en question
Génération de nombres aléatoires # Cas discrets... rbinom(3, size=10, prob=0.5) # 3 tirages [1] 7 5 5 rpois(3, lambda=10) # 3 tirages [1] 10 10 9
Génération de nombres aléatoires # Cas continus... runif(3, min=-3, max=3) # 3 tirages [1] -1.5792888 -1.6143343 0.2565045 rexp(3, rate=0.1) # 3 tirages [1] 9.7341714 0.1282756 1.4484267 rgamma(3, shape=2, rate=0.1) # 3 tirages [1] 9.019254 45.458567 42.775780 # loi normale: 10'0000 tirages echantillon <- rnorm(100000, mean=88, sd=13) mean(echantillon) # moyenne [1] 88.0355 sd(echantillon) # déviation standard [1] 12.96737
La fonction sample # La fonction sample génère des tirages aléatoires d'un vecteur donné. annees <- 1900:2000 # les années 1900 à 2000 sample(annees, 3) # on tire 3 années aléatoirement [1] 1943 1936 1966
La fonction sample # Pile ou face... pile_face <- c("Pile", "Face") # on génère 10'000 tirages avec remplacement tirages <- sample(pile_face, 100000, replace = TRUE) sum(tirages == "Pile") # nombre de "Pile" [1] 50170 sum(tirages == "Face") # nombre de "Face" [1] 49830 # On biaise la pièce (ajout d'un vecteur de proba) tirages2 <- sample(pile_face, 100000, replace = TRUE, prob = c(0.3, 0.7)) sum(tirages2 == "Pile") [1] 30078 sum(tirages2 == "Face") [1] 69922
Statistiques
Mesures statistiques de base # Mesures statistiques de base. # La fonction summary calcule les mesures statistiques de base: min, max, médiane, moyenne et 1er et 3ème quartiles. # Elle s'applique sur des vecteurs, facteurs, matrices et data frames.
Mesures statistiques de base # Cas des vecteurs: v <- rnorm(1000, mean=3, sd = 0.8) summary(v) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.4577 2.4370 2.9720 3.0120 3.5570 5.7820
Mesures statistiques de base # Cas des matrices: # La fonction s'applique colonne par colonne m <- matrix(v, nrow = 250, ncol = 4, byrow = TRUE, dimnames = list(c(), c("data set 1","data set 2","data set 3","data set 4"))) summary(m) data set 1 data set 2 data set 3 Min. :0.4577 Min. :1.271 Min. :0.532 1st Qu.:2.4889 1st Qu.:2.428 1st Qu.:2.552 Median :2.9495 Median :2.954 Median :2.972 Mean :3.0369 Mean :2.986 Mean :3.052 3rd Qu.:3.5754 3rd Qu.:3.548 3rd Qu.:3.559 Max. :5.7819 Max. :5.218 Max. :5.239 data set 4 ...
Mesures statistiques de base # Cas des data frames: # La fonction s'applique colonne par colonne également library(nutshell) # on appelle la librairie nutshell data(births2006.smpl) # on charge births2006.smpl # Ce data set concerne les naissances aux USA en 2006 summary(births2006.smpl) # remarquer que le summary de la variable SEX, qui est un facteur et non un vecteur, consiste en un simple comptage des observations... DOB_MM DOB_WK MAGER Min. : 1.000 Min. :1.000 Min. :12.00 1st Qu.: 4.000 1st Qu.:3.000 1st Qu.:23.00 Median : 7.000 Median :4.000 Median :27.00 Mean : 6.601 Mean :4.065 Mean :27.37 3rd Qu.:10.000 3rd Qu.:6.000 3rd Qu.:32.00 Max. :12.000 Max. :7.000 Max. :50.00 ...
Fréquences relatives # Fréquences relatives de certaines observations. # Appliquer une expression logique qui sélectionne les observations désirées. # Ainsi, les observations désirées prennent la valeur TRUE et les autres la valeur FALSE. # Mais TRUE et FALSE signifient également 1 et 0, respectivement. # Ainsi, en faisant la moyenne du vecteur booléen, on obtient la fréquence relative des observations désirées.
Fréquences relatives # Exemple: variable qualitative. # Dans le data set births2006.smpl: # la variable SEX représente le sexe du bébé. # Fraction des bébés qui sont des garçons (males) mean(births2006.smpl$SEX == "M") [1] 0.5117206 # Fraction des bébés qui sont des filles (females) mean(births2006.smpl$SEX == "F") [1] 0.4882794
Fréquences relatives # Exemple: variable quantitative. # Dans le data set births2006.smpl: # la variable MAGER représente l'âge de la mère. # Fraction des bébés dont la mère a plus de 40 ans mean(births2006.smpl$MAGER >= 40) [1] 0.0264905
Tables de contingences # Créer des tables de contingences. # La fonction table compte les nombre d’observations relatives à un échantillon de type "factor". table(births2006.smpl$SEX) F M 208653 218670 # Variable DPLURAL représente la pluralité des naissances. table(births2006.smpl$DPLURAL) 1 Single 2 Twin 412979 13658 3 Triplet 4 Quadruplet 642 39 5 Quintuplet or higher 5
Tables de contingences # Le grand intérêt de la fonction table est de pouvoir combiner deux facteurs pour créer une table de contingence. table(births2006.smpl$DPLURAL,births2006.smpl$SEX) F M 1 Single 201596 211383 2 Twin 6709 6949 3 Triplet 327 315 4 Quadruplet 18 21 5 Quintuplet or higher 3 2
Test chi-carré # Tester l'indépendance de deux variables quantitatives en utilisant un test chi- carré. # On utilise les fonction summary et table. # Généralement, une p-value > 0.05 signifie que les variables sont indépendantes, i.e., non corrélées. summary(table(births2006.smpl$DPLURAL,births2006.smpl$SEX)) Number of cases in table: 427323 Number of factors: 2 Test for independence of all factors: Chisq = 1.9998, df = 4, p-value = 0.7358 Chi-squared approximation may be incorrect # Variables indépendantes dans ce cas...
Les quantiles # Calculer les quantiles d'un échantillon. # On utilise la fonction quantile(vec, p). # La variable DBWT représente le poids de l'enfant. quantile(births2006.smpl$DBWT, 0.05, na.rm = TRUE) 5% 2268 quantile(births2006.smpl$DBWT, c(0.05, 0.95), na.rm = TRUE) 5% 95% 2268 4131
Normalisation # Normalisation de l'échantillon: # On utilise la fonction scale(). DBWT_scaled <- scale(births2006.smpl$DBWT) summary(DBWT_scaled) # remarquer que mean = 0 V1 Min. :-5.1033 1st Qu.:-0.4917 Median : 0.0762 Mean : 0.0000 3rd Qu.: 0.6121 Max. : 8.2325 NA's :434
Test de Student (T-test) # Test de Student ou T-test: tester la moyenne d'une population. # Etant donné un échantillon issu d'une population, tester si la moyenne de la population entière pourrait raisonnablement valoir une certaine valeur. # On utilise la fonction t.test(sample, mu=m). # Le résultat est une p-value... # Généralement, une p-value < 0.05 signifie que la moyenne de la population entière ne pourrait raisonnablement pas valoir m.
Test de Student (T-test) # L'idée de ce genre de test d'hypothèse est la suivante: # Une machine est censée fabriquer des pièces de diamètre 2 cm. # On prend les 100 dernières pièces qui ont été produites et on mesure leur diamètre. # Il se trouve que la moyenne de cet échantillon est de 2.08 cm. # Est-il plausible que cet échantillon provienne d'une population de moyenne 2 cm? On effectue un T-test pour le savoir: t.test(sample, mu=2cm). # Si le test est positif, on peut raisonnablement supposer que la machine est encore fonctionnelle. # Si le test est négatif, on supposera au contraire que la machine est déréglée.
Test de Student (T-test) # On génère un échantillon d'une loi normale de moyenne 100. # On demande si la moyenne de la population dont provient l'échantillon pourrait être 95. x <- rnorm(50, mean = 100, sd = 15) t.test(x, mu=95) # Cf. slide suivant
Test de Student (T-test) One Sample t-test data: x t = 3.0035, df = 49, p-value = 0.004195 alternative hypothesis: true mean is not equal to 95 95 percent confidence interval: 96.92409 104.70462 sample estimates: mean of x 100.8144 # La petite p value signifie que la moyenne de la population entière ne pourrait pas être 95.
Test de Student (T-test) # Autre t.test t.test(x, mu = 100) One Sample t-test data: x t = 0.42067, df = 49, p-value = 0.6758 alternative hypothesis: true mean is not equal to 100 95 percent confidence interval: 96.92409 104.70462 sample estimates: mean of x 100.8144 # La grande p value signifie que la moyenne de la population entière pourrait être 100 (ce qui est consistant).
Test de Student (T-test) # T-test: intervalle de confiance autour de la moyenne. # On possède un échantillon issu d'une population et on aimerait déterminer un intervalle de confiance autour de la moyenne de la population (à partir de l'échantillon). # On utilise la fonction t.test(sample, conf.level=c) sans le paramètre mu. # Le résultat est un intervalle de confiance...
Test de Student (T-test) x <- rnorm(50, mean=100, sd=15) t.test(x, conf.level=0.99) One Sample t-test data: x t = 51.92, df = 49, p-value < 2.2e-16 alternative hypothesis: true mean is not equal to 0 99 percent confidence interval: 94.78591 105.10369 sample estimates: mean of x 99.9448 # Ici, l'intervalle de confiance est 94.78591 < mu < 105.10369. Cela signifie que la moyenne de la population, qui est issue d’une loi normale de moyenne 100, a 99% de chance de se trouver entre 94.78591 et 105.10369.
Test de Student (T-test) # Si on ne précise pas le paramètre conf.level, c'est un intervalle de confiance de 95% qui est considéré par défaut. t.test(x) One Sample t-test data: x t = 51.92, df = 49, p-value < 2.2e-16 alternative hypothesis: true mean is not equal to 0 95 percent confidence interval: 96.07638 103.81322 sample estimates: mean of x 99.9448 # La moyenne de la population a 95% de chance de se trouver entre 96.07638 et 103.81322.
Test de Wilcoxon # Wilcoxon signed rank test: intervalle de confiance autour de la médiane. # On possède un échantillon issu d'une population et on aimerait déterminer un intervalle de confiance autour de la médiane de la population (à partir de l'échantillon). # On utilise la fonction wilcox.test(x, conf.int=TRUE). # Le résultat est un intervalle de confiance...
Test de Wilcoxon x <- rnorm(50, mean=100, sd=15) wilcox.test(x, conf.int=TRUE) Wilcoxon signed rank test with continuity correction data: x V = 1275, p-value = 7.79e-10 alternative hypothesis: true location is not equal to 0 95 percent confidence interval: 96.67479 105.58307 sample estimates: (pseudo)median 101.3824 # Ici, l'intervalle de confiance est 96.67479 < m < 105.58307. Cela signifie que la médiane de la population, qui est issue d‘une loi normale de moyenne 100, a 95% de chance de se trouver entre 96.67479 et 105.58307. # La médiane de l'échantillon vaut 102.9267...
Test de proportion de succès # Tester la proportion de succès d'un échantillon. # Un échantillon de taille n contient x succès. On aimerait savoir si on peut raisonnablement supposer que la vraie probabilité de succès, i.e., celle de la loi de probabilité dont provient cet échantillon, est p. # Plus l'échantillon est petit, plus la vraie probabilité de succès est difficile à estimer. # On utilise la fonction prop.test(x, n, p). # Le résultat est une p-value....
Test de proportion de succès prop.test(11, 20, 0.5, alternative="greater") 1-sample proportions test with continuity correction data: 11 out of 20, null probability 0.5 X-squared = 0.05, df = 1, p-value = 0.4115 alternative hypothesis: true p is greater than 0.5 95 percent confidence interval: 0.349615 1.000000 sample estimates: p 0.55 # La vraie proportion p est très probablement supérieure à 0.5.
Test de proportion de succès # Intervalle de confiance autour de la proportion de succès d'un échantillon. # Un échantillon de taille n contient x succès. On aimerait connaître l'intervalle de confiance de 95% autour de la vraie probabilité de succès, i.e., celle de la loi de probabilité dont provient cet échantillon. # On utilise la fonction prop.test(x, n). # Le résultat est un intervalle de confiance pour p....
Test de proportion de succès prop.test(6, 9) 1-sample proportions test with continuity correction data: 6 out of 9, null probability 0.5 X-squared = 0.44444, df = 1, p-value = 0.505 alternative hypothesis: true p is not equal to 0.5 95 percent confidence interval: 0.3091761 0.9095817 sample estimates: p 0.6666667 # La vraie probabilité de succès se trouve entre 0.3091761 et 0.9095817 (95% de chances).
Test de normalité # Test de Shapiro-Wilk: test de normalité. # Tester si un échantillon provient d'une loi normale. # On utilise la fonction shapiro.test(x). # Le résultat est une p-value... # Si p > 0.05, on peut raisonnablement supposer que la population provient d'une loi normale. Si p < 0.05, ce n'est pas le cas.
Test de normalité x <- rnorm(1000, mean=15, sd=3) # loi normale shapiro.test(x) Shapiro-Wilk normality test data: x W = 0.99804, p-value = 0.2994 # Test concluant, p-value > 0.05 y <- rexp(1000, rate=1.7) # loi exponentielle shapiro.test(y) data: y W = 0.82053, p-value < 2.2e-16 # Test non concluant, p-value < 0.05
Test de « randomness » # Test de "randomness". # On a une séquence de réalisations binaires (oui/non, 0/1,...). # On aimerait savoir si cette séquence est aléatoire ou pas. # On utilise la fonction runs.test(as.factor(sample)) de la librairie tseries. # Le résultat est une p-value... # p > 0.05 signifie aléatoire, p < 0.05 signifie non aléatoire.
Test de « randomness » library(tseries) s <- sample(c(0,1), 100, replace=T) runs.test(as.factor(s)) Runs Test data: as.factor(s) Standard Normal = 0.60732, p-value = 0.5436 alternative hypothesis: two.sided # Test réussi, p > 0.05.
Test de « randomness » s <- c(0,0,0,0,1,1,1,1,0,0,0,0) runs.test(as.factor(s)) Runs Test data: as.factor(s) Standard Normal = -2.2997, p-value = 0.02147 alternative hypothesis: two.sided # Test échoué, p < 0.05.
Comparaison de moyennes # Comparaison de la moyenne de deux populations. # On a deux échantillon provenant de deux populations différentes. On aimerait savoir si les moyennes de ces deux populations pourraient être égales. # On utilise la fonction t.test(s1, s2). # Le résultat est une p-value... # Si p > 0.05, test réussi, sinon, test échoué.
Comparaison de moyennes # échantillon d'une loi de Poisson de moyenne 2 x <- rpois(5000, lambda=2) # échantillon d'une loi normale de moyenne 2 y <- rnorm(5000, mean=2, sd=0.8) t.test(x,y) Welch Two Sample t-test data: x and y t = 0.52699, df = 7965.7, p-value = 0.5982 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -0.03295748 0.05719346 sample estimates: mean of x mean of y 2.015000 2.002882 # Test réussi, p-value > 0.05
Comparaison de moyennes x <- rnorm(5000, mean=2, sd=0.8) y <- rnorm(5000, mean=3, sd=0.8) t.test(x,y) Welch Two Sample t-test data: x and y t = -61.549, df = 9997.8, p-value < 2.2e-16 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -1.0127224 -0.9502075 sample estimates: mean of x mean of y 2.023075 3.004540 # Test échoué, p-value < 0.05
Test de corrélation # Test de significativité de corrélation. # On aimerait savoir si la corrélation entre deux variables est statistiquement significative. # Si les échantillons proviennent de lois normales, on utilise la fonction cor.test(x, y). # Sinon, on utilise la fonction cor.test(x, y, method="spearman"). # Le résultat est une p-value... # Si p < 0.05, la corrélation est statistiquement significative. Sinon, elle ne l'est pas.
Test de corrélation x <- rpois(1000, lambda = 6) y <- rnorm(1000, mean=2, sd=0.7) + x # x et y sont donc corrélés par construction cor(x,y) [1] 0.9615372 # Les échatillons semblent fortement corrélés. cor.test(x, y, method="spearman") Spearman's rank correlation rho data: x and y S = 7029800, p-value < 2.2e-16 alternative hypothesis: true rho is not equal to 0 sample estimates: rho 0.957821 # La p-value < 0.05 confirme la significativité de cette corrélation.
Test de proportions # Test d'égalité de proportion. # On a plusieurs échantillons binaires (succès/échec, 0/1, TRUE/FALSE, etc.). # On aimerait savoir si leurs vraies proportions de succès pourrait être égales. # On utilise la fonction prop.test(c(nb_succes1, nb_succes2,...), c(taille1, taille2,...)). # Le résultat est une p-value... # Si p < 0.05, le test est réussi. Sinon, il est échoué.
Test de proportions x <- sample(c(0,1), 1000, replace=TRUE, prob=c(0.49, 0.51)) n_x = sum(x == 1) # compte les succès de x y <- sample(c(0,1), 1000, replace=TRUE, prob=c(0.51, 0.49)) n_y = sum(y == 1) # compte les succès de y prop.test(c(n_x,n_y), c(1000,1000)) # Cf. slide suivant…
Test de proportions 2-sample test for equality of proportions with continuity correction data: c(n_x, n_y) out of c(1000, 1000) X-squared = 0.050016, df = 1, p-value = 0.823 alternative hypothesis: two.sided 95 percent confidence interval: -0.05081824 0.03881824 sample estimates: prop 1 prop 2 0.506 0.512 # La p-value > 0.05, le test est échoué.
Test de comparaison de moyennes # Test de comparaisons des moyennes. # On compare deux à deux les moyennes de plusieurs échantillons, ceux-ci étant groupé par facteurs. # On utilise la fonction pairwise.t.test(echantillon, groups). # On obtient une matrice de p-values... # Si p < 0.05, les moyennes sont différentes. Sinon, elles peuvent raisonnablement être supposées égales.
Test de comparaison de moyennes # On importe la base de données airquality attach(airquality) # On convertit les mois en facteurs Month <- factor(Month, labels = month.abb[5:9]) pairwise.t.test(Ozone, Month) Pairwise comparisons using t tests with pooled SD data: Ozone and Month May Jun Jul Aug Jun 1.00000 - - - Jul 0.00026 0.05113 - - Aug 0.00019 0.04987 1.00000 - Sep 1.00000 1.00000 0.00488 0.00388 P value adjustment method: holm
Test de distributions # Test de distributions. # On a deux échantillons et on aimerait tester le fait que ces deux échantillons puissent provenir d'une même distribution. # On utilise la fonction ks.test(x,y). # On obtient une p-value... # Si p < 0.05, les distributions sont très probablement différentes. Sinon, elle sont très probablement égales.
Test de distributions x <- rpois(1000, lambda = 3) y <- rpois(1000, lambda = 2) ks.test(x, y) Two-sample Kolmogorov-Smirnov test data: x and y D = 0.279, p-value < 2.2e-16 alternative hypothesis: two-sided # p < 0.05 indique que les distributions sont différentes.