Le sondage est une méthode de la statistique inférentielle. Il a pour objectif d’évaluer les paramètres ou les proportions de certaines caractéristiques d’une population cible.
Un exemple: combien de fois les français agés de 18 à 30 ans ont-ils votés en moyenne, à quels types d’élection et pour quels partis ? La population cible est “les français agées de 18 à 30 ans”. Les paramètres et proportions sont le nombre moyen de votes auxquels les indidividus ont pris part, la proportion de votes à telles ou telles élections ou pour tels ou tels partis.
Cependant, les données ont un coût et la plupart du temps, il n’est pas possible d’effectuer un complet recensement des caractéristiques de la population. On parle de sondage lorsque l’évaluation se base sur une partie limitée de la population cible. Cette sous-partie est appelé l’échantillon. L’étude de l’échantillon permet d’inférer les caractéristiques de la population cible. Dans le cas d’une moyenne ou d’une proportion, l’échantillon nous permet de calculer une estimation et les marges d’erreurs probables de cette estimation. C’est ce qu’on appelle un intervalle de confiance.
Quel âge ont les mères ou les pères à la naissance de leur enfant (en 2019) ? C’est la principale question à laquelle il vous sera demander d’apporter une réponse statistique. Plutôt que de vous envoyer interroger au hasard des centaines d’individus dans la rue ou par téléphone, nous avons choisi de vous faire travailler à partir d’une base de données de l’Insee fournissant la liste anonymisée des naissances en 2019). Bien sûr cette base contient la totalité de la population et il serait plus efficace, du point de vue de la qualité des résultats, d’effectuer une analyse descriptive de toute la base. Mais ce n’est pas le but. Ce projet se fixe pour objectif la mise en oeuvre de sondage et l’étude de la qualité des sondages effectués. Cela nécessite de considérer que l’on a un accès partiel à la base de donnée: l’échantillon tiré .
Notez qu’il est très pratique de posséder l’intégralité des données de la population cible. Les estimations faîtes sur la base de l’échantillon tiré peuvent être comparer avec les vrais paramètres de la population.
Si vous avez téléchargé la base de données, vous pouvez la charger sous forme de data frame avec la ligne suivante:
data <- read.csv("C:/users/mathi/OneDrive/Bureau/FD_NAIS_2019.csv", sep = ";")
Créer une fonction echantillonnage permettant d’extraire
de la base de données des échantillons de la taille que l’on souhaite.
Les tirages aléatoires pour constituer ces échantillons doivent être
uniformes et indépendants. La fonction
echantillonnage prendra en paramètres d’entrée un vecteur
contenant les valeurs d’une caractéristique pour une large population et
la taille de l’échantillon que l’on souhaite extraire de cette
population. Elle renverra un vecteur contenant les valeurs de la
caractéristique associées à cette échantillon.
echantillonnage <- function(vecteur_population, taille_echantillon)
return(sample(vecteur_population,taille_echantillon))
data <- read.csv("C:/users/mathi/OneDrive/Bureau/FD_NAIS_2019.csv", sep = ";")
if (!"AGEMERE" %in% names(data)) {
stop("La colonne AGEMERE n'existe pas dans les données.")
}
if (!"AGEPERE" %in% names(data)) {
stop("La colonne AGEPERE n'existe pas dans les données.")
}
data$AGEMERE <- as.numeric(as.character(data$AGEMERE))
data$AGEPERE <- as.numeric(as.character(data$AGEPERE))
if (any(is.na(data$AGEMERE))) {
stop("La colonne AGEMERE contient des valeurs NA.")
}
if (any(is.na(data$AGEPERE))) {
stop("La colonne AGEPERE contient des valeurs NA.")
}
echantillonnage <- function(vecteur_population, taille_echantillon) {
if (!is.null(vecteur_population) && length(vecteur_population) >= taille_echantillon) {
sample(vecteur_population, taille_echantillon)
} else {
stop("Le vecteur population est soit NULL, soit trop petit pour l'échantillonnage demandé.")
}
}
echantillon_age_mere <- echantillonnage(data$AGEMERE, 50)
echantillon_age_mere
## [1] 33 31 28 26 34 26 34 32 43 28 28 33 24 43 27 28 19 40 28 35 35 30 33 30 28
## [26] 25 27 33 43 29 27 34 33 32 25 45 30 34 41 29 29 37 23 27 25 31 24 27 30 26
echantillon_age_pere <- echantillonnage(data$AGEPERE, 50)
echantillon_age_pere
## [1] 39 33 30 37 46 36 35 32 28 46 26 44 36 40 25 31 34 30 34 42 24 28 40 42 27
## [26] 32 34 40 39 30 35 46 31 36 33 33 29 34 33 46 35 34 46 39 24 34 21 34 36 36
construire un échantillon avec votre fonction
echantillonnage et proposer une estimation ponctuelle de la
caractéristique à évaluer.
var(data$AGEMERE)
## [1] 28.89175
ech_mere <- echantillonnage(data$AGEMERE, 50)
variance_age_mere <- var(data$AGEMERE)
ech_mere
## [1] 26 25 30 42 24 32 31 43 34 20 43 22 25 41 33 20 34 27 24 37 23 29 36 37 32
## [26] 35 37 23 39 37 25 30 32 37 35 31 32 36 23 35 27 30 21 21 35 22 20 22 24 43
conf_level pourra être choisi par l’utilisateur
(paramètre de la fonction). L’intervalle sera centré sur l’estimation
ponctuelle. Pour cette question, vous vous poserez notamment les
questions suivantes: la variance de la caractéristique étudiée est-elle
connue ? est-elle seulement estimée ? Quels quantiles interviennent dans
la définition de l’intervalle de confiance ? Il existe en fait une
fonction R prédéfinie qui calcule directement de tels intervalles de
confiance. Vous pourrez l’utiliser pour vérifier vos résultats mais vous
devrez dans tous les cas écrire par vous même un code R faisant ce
travail.intervalle_confiance <- function(vecteur_echantillon, conf_level = 0.95) {
n <- length(vecteur_echantillon)
moyenne <- mean(vecteur_echantillon)
erreur_standard <- sd(vecteur_echantillon) / sqrt(n)
erreur_critique <- qt(1 - (1 - conf_level) / 2, df = n - 1)
marge_erreur <- erreur_critique * erreur_standard
intervalle <- c(moyenne - marge_erreur, moyenne + marge_erreur)
return(intervalle)
}
intervalle_age_mere <- intervalle_confiance(echantillon_age_mere, conf_level = 0.95)
intervalle_age_pere <- intervalle_confiance(echantillon_age_pere, conf_level = 0.95)
intervalle_age_mere
## [1] 29.22992 32.45008
intervalle_age_pere
## [1] 32.94128 36.45872
set.seed(123)
data <- data.frame(AGEMERE = rnorm(10000, mean = 30, sd = 5))
if (!"AGEMERE" %in% colnames(data)) {
stop("La colonne `AGEMERE` n'existe pas dans `data`.")
}
population_mere <- data$AGEMERE
echantillon_mere <- sample(population_mere, 1000, replace = TRUE)
n <- length(echantillon_mere)
mean_ech <- mean(echantillon_mere)
sd_ech <- sd(echantillon_mere)
erreur_gauche <- qnorm(0.95) * sd_ech / sqrt(n)
erreur_droite <- qnorm(0.05) * sd_ech / sqrt(n)
borne_gauche <- mean_ech - erreur_gauche
borne_droite <- mean_ech - erreur_droite
cat("Intervalle de confiance à gauche =", borne_gauche, "\n")
## Intervalle de confiance à gauche = 29.42722
cat("Intervalle de confiance à droite =", borne_droite, "\n")
## Intervalle de confiance à droite = 29.9446
Dans cette partie, on cherche à étudier la qualité des marges d’erreurs des intervalles de confiance.
Protocole: (1) générer un grand nombre d’échantillons de même taille, (2) déterminer les intervalles de confiance associés aux échantillons tirés (\(\alpha\) est fixe), (3) calculer la proportion des intervalles de confiance obtenus qui contiennent la vraie valeur (celle de la population).
De quelle valeur théorique devrait s’approcher la proportion des intervalles de confiance contenant la vraie moyenne ?
Créer le code permettant de réaliser le protocole ci-dessus.
Faire varier la caractéristique à étudier, la taille de l’échantillon, le niveau de confiance … et commentez les résultats.
data <- read.csv("C:/users/mathi/OneDrive/Bureau/FD_NAIS_2019.csv", sep = ";")
if (!is.null(data$AGEPERE)) {
data$AGEPERE <- as.numeric(as.character(data$AGEPERE))
if (any(is.na(data$AGEPERE))) {
stop("La colonne AGEPERE contient des valeurs NA.")
}
grand_echantillon <- echantillonnage(data$AGEPERE, 1000)
print(grand_echantillon)
} else {
stop("La colonne AGEPERE n'existe pas dans les données.")
}
## [1] 31 30 36 37 29 40 33 21 33 33 24 40 36 24 31 37 32 31 34 35 39 32 30 34
## [25] 33 29 33 44 26 41 32 44 42 40 36 46 35 39 33 29 36 39 25 29 34 33 43 42
## [49] 30 36 33 28 27 27 18 37 22 35 36 29 41 38 42 46 31 38 33 37 37 34 29 38
## [73] 42 34 33 33 34 46 26 35 31 36 42 46 30 29 39 38 26 27 35 33 37 35 32 32
## [97] 29 36 32 28 30 41 35 31 43 38 36 31 39 36 28 36 26 32 27 32 27 25 34 30
## [121] 35 44 46 30 29 32 41 40 29 33 30 31 34 39 24 36 36 27 30 35 28 33 30 31
## [145] 34 34 38 37 36 36 39 31 33 30 31 34 31 32 36 28 40 30 29 34 39 38 43 37
## [169] 29 30 46 31 44 31 32 42 24 35 27 30 40 36 33 31 28 39 28 27 40 30 30 28
## [193] 32 46 23 30 37 27 37 24 32 42 31 37 33 35 29 37 32 36 46 39 28 33 38 46
## [217] 32 46 28 21 34 36 33 41 33 41 37 21 46 37 31 36 37 29 46 37 36 24 31 33
## [241] 39 38 27 41 33 31 38 30 32 34 29 33 38 34 31 46 46 42 35 24 32 28 31 45
## [265] 40 46 46 36 40 29 46 28 25 26 34 32 37 33 37 25 32 37 29 39 26 41 26 29
## [289] 34 34 32 34 32 46 34 40 23 26 34 41 34 30 27 41 24 35 32 26 36 37 36 41
## [313] 23 30 34 33 30 41 28 27 26 31 34 36 34 21 40 36 35 45 35 35 40 30 24 34
## [337] 28 39 18 34 28 45 38 25 33 39 34 34 46 20 27 38 37 34 38 27 26 39 31 33
## [361] 29 34 24 46 28 28 38 34 39 28 28 33 32 37 29 28 30 32 32 39 34 35 29 35
## [385] 27 27 28 37 39 31 33 37 33 34 32 44 33 32 28 36 39 37 33 38 27 31 34 42
## [409] 33 35 35 46 46 36 25 29 24 33 37 40 27 35 33 31 22 32 35 25 27 30 40 35
## [433] 31 44 40 28 33 35 42 33 28 32 31 29 46 36 41 36 32 46 46 22 43 32 44 42
## [457] 40 40 39 24 33 40 39 35 22 46 28 28 30 45 39 27 30 29 38 40 32 33 35 35
## [481] 36 30 35 39 33 24 42 33 28 34 35 38 25 28 28 36 33 29 46 39 38 30 40 30
## [505] 25 28 30 25 40 29 37 33 27 46 30 38 27 35 44 25 31 33 32 35 35 40 33 38
## [529] 37 46 26 25 35 42 45 25 26 32 28 46 30 32 28 46 27 32 32 31 29 33 43 37
## [553] 46 37 36 31 31 40 26 25 37 32 35 31 33 38 36 32 25 34 42 30 41 24 46 33
## [577] 46 41 32 27 28 36 43 38 39 46 42 35 29 38 39 34 31 38 32 31 46 28 36 29
## [601] 41 35 23 37 33 33 33 46 32 29 44 41 35 24 29 34 46 41 27 25 38 31 29 37
## [625] 24 35 30 34 33 31 39 42 28 29 25 35 24 36 28 36 46 46 32 33 34 33 34 37
## [649] 29 37 35 30 34 29 32 38 42 31 39 29 46 28 46 28 46 30 35 35 36 31 32 40
## [673] 34 37 27 46 32 30 32 29 31 24 32 41 22 32 33 44 30 35 30 34 46 33 27 31
## [697] 40 32 30 26 31 31 27 34 37 46 38 32 39 36 33 30 42 34 26 28 24 26 34 35
## [721] 28 32 30 33 22 42 42 42 25 46 39 21 33 34 28 34 32 30 40 32 42 26 46 35
## [745] 32 39 40 33 35 30 41 40 31 28 26 26 34 34 35 35 33 36 34 34 27 46 31 37
## [769] 30 44 41 27 28 27 35 28 25 35 24 33 28 38 31 30 32 46 32 31 28 32 33 24
## [793] 31 42 29 37 33 32 34 26 36 36 29 33 36 33 27 26 25 38 38 35 32 26 43 39
## [817] 36 38 35 35 34 46 31 32 26 28 37 30 25 34 37 38 39 22 31 33 40 31 30 39
## [841] 40 35 46 37 44 36 26 29 43 40 46 32 32 28 28 36 29 34 30 33 33 46 39 38
## [865] 33 39 24 29 40 29 29 31 46 37 31 33 40 26 36 38 27 36 42 27 36 28 43 29
## [889] 26 28 32 42 38 28 24 35 35 43 32 33 31 34 37 31 27 31 31 35 43 23 35 31
## [913] 34 31 29 46 26 30 31 24 28 33 33 28 35 35 38 40 32 34 27 33 28 31 29 34
## [937] 31 33 32 28 33 45 40 38 30 29 22 34 36 27 29 38 40 44 39 37 32 28 27 31
## [961] 23 37 33 45 34 40 46 40 33 29 37 37 36 46 31 34 32 43 27 36 36 27 35 35
## [985] 29 32 33 37 23 29 30 31 41 30 38 32 28 37 46 30
déterminer les intervalles de confiance associés aux échantillons tirés (\(\alpha\) est fixe)
intervalle_confiance <- function(vecteur_echantillon, conf_level = 0.95) {
n <- length(vecteur_echantillon)
moyenne <- mean(vecteur_echantillon)
erreur_standard <- sd(vecteur_echantillon) / sqrt(n)
erreur_critique <- qt(1 - (1 - conf_level) / 2, df = n - 1)
marge_erreur <- erreur_critique * erreur_standard
intervalle <- c(moyenne - marge_erreur, moyenne + marge_erreur)
return(intervalle)
}
intervalle_age_pere <- intervalle_confiance(grand_echantillon, conf_level = 0.95)
intervalle_age_pere
## [1] 33.4472 34.1768
(intervalle_age_pere[1]<35)*(intervalle_age_pere[2]>35)
## [1] 0calculer la proportion des intervalles de confiance obtenus qui contiennent la vraie valeur (celle de la population)
echantillons <- replicate(1000, echantillonnage(data$AGEPERE, 1000), simplify = FALSE)
intervalle_confiance <- function(vecteur_echantillon, conf_level = 0.95) {
n <- length(vecteur_echantillon)
m <- mean(vecteur_echantillon)
s <- sd(vecteur_echantillon)
erreur <- qt(1 - (1 - conf_level) / 2, df = n - 1) * s / sqrt(n)
return(c(m - erreur, m + erreur))
}
proportion_contenant_vraie_valeur <- mean(sapply(echantillons, function(echantillon) {
intervalle <- intervalle_confiance(echantillon)
intervalle[1] < mean(data$AGEPERE) & intervalle[2] > mean(data$AGEPERE)
}))
cat("Proportion des intervalles de confiance contenant la vraie valeur :", proportion_contenant_vraie_valeur, "\n")
## Proportion des intervalles de confiance contenant la vraie valeur : 0.954
Faire varier la caractéristique à étudier, la taille de l’échantillon, le niveau de confiance … et commentez les résultats.
echantillons_age_mere <- replicate(1000, echantillonnage(data$AGEMERE, 500), simplify = FALSE)
intervalle_confiance <- function(vecteur_echantillon, conf_level = 0.95) {
n <- length(vecteur_echantillon)
m <- mean(vecteur_echantillon)
s <- sd(vecteur_echantillon)
erreur <- qt(1 - (1 - conf_level) / 2, df = n - 1) * s / sqrt(n)
return(c(m - erreur, m + erreur))
}
vraie_valeur_age_mere <- mean(data$AGEMERE)
proportion_contenant_vraie_valeur_age_mere <- mean(sapply(echantillons_age_mere, function(echantillon) {
intervalle <- intervalle_confiance(echantillon, conf_level = 0.99)
intervalle[1] < vraie_valeur_age_mere & intervalle[2] > vraie_valeur_age_mere
}))
cat("Proportion des intervalles de confiance contenant la vraie valeur de l'âge de la mère :", proportion_contenant_vraie_valeur_age_mere, "\n")
## Proportion des intervalles de confiance contenant la vraie valeur de l'âge de la mère : 0.994
Pour cette partie, il s’agit de faire un pas de côté. Désormais, la population cible n’est plus celle de la base de données, mais une population plus grande et théorique dont aurait été extraite la base de données. Par exemple, les naissances dans le monde en 2019, ou les naissances en France depuis 1 siècle, ou encore toutes les naissances possible d’êtres humains. De plus, on ne dispose plus que d’un seul échantillon de très grande taille: notre base de données.
Le problème part de l’observation suivante: parmi les enfants naît en
2019, il y a légèrement plus d’enfants de sexe masculin que d’enfants de
sexe féminin (variable SEXE). Serait-il raisonnable de
penser que cette observation n’est pas dû au hasard, mais qu’elle
traduit une forme de vérité potentiellement valable en d’autre temps et
d’autres lieux: “les bébés humains sont plus souvent de sexe
masculin”?
Pour étudier ce problème, il faut utiliser le théorème suivant.
Théorème: Soit \(\overline{X}_n\) la moyenne empirique d’un \(n\)-échantillon de loi de Bernoulli \(\mathcal{B}(p).\) On a: \[\dfrac{\sqrt{n} (\overline{X}_n-p)}{\sqrt{p(1-p)}}\underset{n\rightarrow +\infty}{\overset{\mathcal{L}}\rightarrow} N(0,1)\] Cela signifie que pour \(n\) suffisamment grand (\(n>100\)), il est raisonnable d’approcher la distribution de la v.a. \(\sqrt{\frac{n}{p(1-p)}}(\overline{X}_n-p)\) par une loi normale centrée réduite.
Servez-vous de ce théorème pour déterminer un intervalle de confiance de la probabilité qu’un nouveau né soit de sexe masculin. Faîtes varier le niveau de confiance: \(\alpha=0.95, 0.99, 0.999 ...\) Quelles sont vos conclusions ?
data <- read.csv("FD_NAIS_2019.csv", sep=";")
proportion_masculine <- mean(data$SEXE == 1)
intervalle_confiance_proportion <- function(proportion_observee, n, conf_level) {
erreur_standard <- sqrt(proportion_observee * (1 - proportion_observee) / n)
z <- qnorm(1 - (1 - conf_level) / 2)
marge_erreur <- z * erreur_standard
intervalle <- c(proportion_observee - marge_erreur, proportion_observee + marge_erreur)
return(intervalle)
}
n <- nrow(data)
niveaux_confiance <- c(0.95, 0.99, 0.999)
resultats <- sapply(niveaux_confiance, function(conf_level) {
intervalle_confiance_proportion(proportion_masculine, n, conf_level)
})
for (i in 1:length(niveaux_confiance)) {
cat("Intervalle de confiance à", niveaux_confiance[i] * 100, "% :", resultats[, i], "\n")
}
## Intervalle de confiance à 95 % : 0.5099499 0.5122075
## Intervalle de confiance à 99 % : 0.5095952 0.5125621
## Intervalle de confiance à 99.9 % : 0.5091836 0.5129737