2. Sondages

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.

Echantillonnage
Echantillonnage

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 = ";")

2.1 Génération d’échantillons

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))

2.2 Estimations ponctuelles

  1. Pour chacune des caractéristiques:
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é.")
  }
}
  1. l’âge de la mère,
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
  1. l’âge du père,
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.

  1. Donner une estimation ponctuelle non biaisée de la variance de l’âge de de la mère.
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

2.3 Estimations par intervalles de confiance

  1. Créer une fonction fournissant un intervalle de confiance pour chacune des caractéristiques du paragraphe précédent (2.2). Le niveau de confiance 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
  1. Comment la longueur de l’intervalle de confiance varie-t-elle quand on change le niveau de confiance ? Même question quand la taille de l’échantillon augmente.
  • Lorsque le niveau de confiance augmente, l’intervalle de confiance devient plus large, couvrant une plage de valeurs plus étendue. Si la taille de l’échantillon augmente, l’intervalle de confiance tend à devenir plus étroit, car une taille d’échantillon plus grande réduit l’erreur standard, rendant notre estimation plus précise.
  1. Un intervalle de confiance pour une moyenne n’est pas nécessairement centré sur la moyenne d’échantillon \(\overline{X}_n\); par exemple s’il est important de ne pas sous-estimer la moyenne, on peut préférer un intervalle de confiance borné seulement à gauche, c’est à dire de la forme \([a;+\infty[\). Créer une nouvelle fonction qui renvoit un intervalle de confiance de la forme \([a;+\infty[\) et un autre de la forme \(]-\infty;b]\) pour l’âge de la mère. Vous veillerez à choisir convenablement les quantiles pour construire de tels intervalles de confiance.
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

2.4 Etude de la qualité des sondages

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.

  1. générer un grand nombre d’échantillons de même taille
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
  1. 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] 0
  2. calculer 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
  • Les résultats indiquent que, sous un niveau de confiance de 99% avec des échantillons de taille 500 et en changeant la caractéristique pour l’âge de la mère cela change par rapport à la première observation que nous avions fait avec des données différentes. On peut donc en conclure que le fait de changer des données fait également changer la vraie moyenne où dans la première observation nous avions obtenu environ 95% et ici 99%.

2.5 Naît-il plus de filles ou de garçons ?

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
  • En calculant les intervalles de confiance pour la proportion de nouveau-nés masculins à différents niveaux de confiance, nous observons que l’intervalle de confiance à 95% est restreint. En augmentant le niveau de confiance à 99% et 99.9%, les intervalles deviennent plus larges, montrant une plus grande incertitude mais aussi une plus grande probabilité que l’intervalle contienne la vraie proportion.En effet, à travers différents niveaux de confiance on suggère que l’observation d’une légère majorité de nouveau-nés masculins n’est probablement pas due au hasard, mais pourrait ducoup indiquer une tendance réelle dans une population plus large. Ces résultats soutiennent l’idée que les bébés humains naissent légèrement plus souvent de sexe masculin.