EXERCICE 1

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

library(tidyverse)
data(airquality)
glimpse(airquality)
## Rows: 153
## Columns: 6
## $ Ozone   <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, 18, 14, …
## $ Solar.R <int> 190, 118, 149, 313, NA, NA, 299, 99, 19, 194, NA, 256, 290, 27…
## $ Wind    <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6, 6.9, 9…
## $ Temp    <int> 67, 72, 74, 62, 56, 66, 65, 59, 61, 69, 74, 69, 66, 68, 58, 64…
## $ Month   <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,…
## $ Day     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,…
summary(airquality)
##      Ozone           Solar.R           Wind             Temp      
##  Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
##  1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:72.00  
##  Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
##  Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
##  3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
##  Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
##  NAs    :37       NAs    :7                                       
##      Month            Day      
##  Min.   :5.000   Min.   : 1.0  
##  1st Qu.:6.000   1st Qu.: 8.0  
##  Median :7.000   Median :16.0  
##  Mean   :6.993   Mean   :15.8  
##  3rd Qu.:8.000   3rd Qu.:23.0  
##  Max.   :9.000   Max.   :31.0  
## 
mean(airquality$Ozone, na.rm = TRUE)
## [1] 42.12931
median(airquality$Ozone, na.rm = TRUE)
## [1] 31.5
sd(airquality$Ozone, na.rm = TRUE)
## [1] 32.98788
quantile(airquality$Ozone, na.rm = TRUE)
##     0%    25%    50%    75%   100% 
##   1.00  18.00  31.50  63.25 168.00

Le jeu airquality contient 153 individus (jours) et 6 variables numériques (Ozone, Solar.R, Wind, Temp, Month, Day). On relève 37 valeurs manquantes pour Ozone et 7 pour Solar.R, ce qui justifie l’usage systématique de na.rm = TRUE et use = “complete.obs” dans les analyses suivantes. La moyenne (42,13) est nettement supérieure à la médiane (31,5), signe d’une distribution asymétrique à droite, confirmée par l’histogramme (forte concentration entre 0 et 50 µg/m³ puis longue traîne jusqu’à 170) et par la boîte à moustaches, qui fait apparaître deux valeurs atypiques au-delà de 135. Le coefficient de variation élevé (sd/moyenne ≈ 78 %) traduit une forte dispersion relative. Sur une variable aussi dissymétrique, la médiane et l’IQR restent des indicateurs plus robustes que la moyenne et l’écart-type.

Including Plots

You can also embed plots, for example:

library(tidyverse)
ggplot(airquality, aes(x = Ozone)) +
geom_histogram(bins = 15, fill = "#1E7A3D", colour = "white")

ggplot(airquality, aes(y = Ozone)) + geom_boxplot(fill = "#DEEAF1")

Les coefficients de Pearson (r = 0,698) et de Spearman (ρ = 0,774) indiquent tous deux une relation positive forte entre température et ozone, cohérente avec la chimie photochimique de l’ozone troposphérique. L’écart entre les deux s’explique par la sensibilité de Pearson à l’asymétrie et aux valeurs extrêmes déjà relevées sur Ozone : Spearman, basé sur les rangs, capte mieux une relation monotone. Le nuage de points confirme la tendance croissante, avec une dispersion qui s’accentue aux températures élevées. La matrice de corrélation montre par ailleurs une association négative marquée entre Ozone et Wind (r = −0,61), le vent contribuant à disperser la pollution.

library(tidyverse)
ggplot(airquality, aes(Temp, Ozone)) +
geom_point(colour = "#1F4E79") + geom_smooth(method = "lm")

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

cor(airquality$Temp, airquality$Ozone, use = "complete.obs")
## [1] 0.6983603
# Pearson
cor(airquality$Temp, airquality$Ozone, use = "complete.obs", method = "spearman")
## [1] 0.774043
cor(airquality[,1:4], use = "complete.obs")
##              Ozone    Solar.R       Wind       Temp
## Ozone    1.0000000  0.3483417 -0.6124966  0.6985414
## Solar.R  0.3483417  1.0000000 -0.1271835  0.2940876
## Wind    -0.6124966 -0.1271835  1.0000000 -0.4971897
## Temp     0.6985414  0.2940876 -0.4971897  1.0000000
tab <- margin.table(HairEyeColor, c(1, 2)) # cheveux x yeux
tab
##        Eye
## Hair    Brown Blue Hazel Green
##   Black    68   20    15     5
##   Brown   119   84    54    29
##   Red      26   17    14    14
##   Blond     7   94    10    16
chisq.test(tab)
## 
##  Pearson's Chi-squared test
## 
## data:  tab
## X-squared = 138.29, df = 9, p-value < 2.2e-16

Le test donne χ² = 138,29, ddl = 9, p-value < 2,2×10⁻¹⁶. La p-value étant très largement inférieure à 0,05, on rejette l’hypothèse d’indépendance : la couleur des cheveux et la couleur des yeux sont fortement associées. Les effectifs observés étant élevés (total > 500 individus), la condition de validité du test (effectifs théoriques ≥ 5) est largement respectée.

airquality$Month <- factor(airquality$Month)
ggplot(airquality, aes(Month, Temp)) + geom_boxplot(fill = "#E2EFDA")

mod <- aov(Temp ~ Month, data = airquality)
summary(mod)
##              Df Sum Sq Mean Sq F value Pr(>F)    
## Month         4   7061  1765.3   39.85 <2e-16 ***
## Residuals   148   6557    44.3                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

F = 39,85 (ddl 4 et 148), p-value < 2×10⁻¹⁶. On rejette l’hypothèse d’égalité des températures moyennes entre les mois. Les boîtes à moustaches confirment un effet saisonnier net : la température progresse de mai (médiane ≈ 66°F) à juillet-août (médiane ≈ 82-84°F), puis diminue légèrement en septembre (≈ 76°F).

library(readxl)
library(tidyverse)

d <- read_excel("TD_eau_assainissement.xlsx", sheet = "menages")

Le fichier contient 80 ménages et 9 variables (zone, revenu_kFCFA, taille_menage, distance_point_eau_km, consommation_eau_L_j, turbidite_NTU, type_latrine, acces_assainissement). Le revenu moyen est de 111,6 kFCFA (médiane 118,5), la distance moyenne au point d’eau de 0,82 km (médiane 0,39 km), et la consommation moyenne de 139,5 L/jour (médiane 145).

str(d)      # types de chaque colonne
## tibble [80 × 9] (S3: tbl_df/tbl/data.frame)
##  $ id                   : num [1:80] 1 2 3 4 5 6 7 8 9 10 ...
##  $ zone                 : chr [1:80] "rurale" "urbaine" "urbaine" "rurale" ...
##  $ revenu_kFCFA         : num [1:80] 71 138 130 105 94 150 146 189 118 121 ...
##  $ taille_menage        : num [1:80] 4 5 8 3 9 3 4 2 5 9 ...
##  $ distance_point_eau_km: num [1:80] 1.19 1.47 0.16 1.84 1.22 0.32 0.43 0.16 0.15 0.34 ...
##  $ consommation_eau_L_j : num [1:80] 59 161 164 61 274 84 99 59 147 197 ...
##  $ turbidite_NTU        : num [1:80] 7.5 9.2 1.4 7.8 9.5 4 4.6 8.8 14.6 4.6 ...
##  $ type_latrine         : chr [1:80] "privee" "privee" "partagee" "privee" ...
##  $ acces_assainissement : chr [1:80] "non" "oui" "non" "non" ...
head(d)     # les premières lignes
## # A tibble: 6 × 9
##      id zone    revenu_kFCFA taille_menage distance_point_eau_km
##   <dbl> <chr>          <dbl>         <dbl>                 <dbl>
## 1     1 rurale            71             4                  1.19
## 2     2 urbaine          138             5                  1.47
## 3     3 urbaine          130             8                  0.16
## 4     4 rurale           105             3                  1.84
## 5     5 rurale            94             9                  1.22
## 6     6 urbaine          150             3                  0.32
## # ℹ 4 more variables: consommation_eau_L_j <dbl>, turbidite_NTU <dbl>,
## #   type_latrine <chr>, acces_assainissement <chr>
summary(d)
##        id               zone     revenu_kFCFA    taille_menage 
##  Min.   : 1.00   Length   :80   Min.   : 21.00   Min.   : 2.0  
##  1st Qu.:20.75   N.unique : 2   1st Qu.: 70.75   1st Qu.: 4.0  
##  Median :40.50   N.blank  : 0   Median :118.50   Median : 6.0  
##  Mean   :40.50   Min.nchar: 6   Mean   :111.61   Mean   : 5.9  
##  3rd Qu.:60.25   Max.nchar: 7   3rd Qu.:146.25   3rd Qu.: 8.0  
##  Max.   :80.00                  Max.   :233.00   Max.   :10.0  
##  distance_point_eau_km consommation_eau_L_j turbidite_NTU      type_latrine
##  Min.   :0.0100        Min.   : 28.00       Min.   : 1.30   Length   :80   
##  1st Qu.:0.1875        1st Qu.: 89.75       1st Qu.: 4.95   N.unique : 3   
##  Median :0.3900        Median :145.00       Median : 7.95   N.blank  : 0   
##  Mean   :0.8219        Mean   :139.53       Mean   : 7.56   Min.nchar: 6   
##  3rd Qu.:1.3375        3rd Qu.:186.75       3rd Qu.: 9.80   Max.nchar: 8   
##  Max.   :4.1100        Max.   :274.00       Max.   :14.90                  
##  acces_assainissement
##  Length   :80        
##  N.unique : 2        
##  N.blank  : 0        
##  Min.nchar: 3        
##  Max.nchar: 3        
## 
ggplot(d, aes(x = revenu_kFCFA)) +
  geom_histogram(bins = 15, fill = "steelblue", color = "white") +
  labs(title = "Distribution du revenu (kFCFA)")

ggplot(d, aes(x = distance_point_eau_km)) +
  geom_histogram(bins = 15, fill = "seagreen", color = "white") +
  labs(title = "Distance au point d'eau (km)")

ggplot(d, aes(x = consommation_eau_L_j)) +
  geom_histogram(bins = 15, fill = "darkorange", color = "white") +
  labs(title = "Consommation d'eau (L/jour)")

Revenu : distribution étalée, légèrement asymétrique à droite, avec un pic marqué autour de 140-150 kFCFA — probablement la superposition des sous-groupes urbain (revenus plus élevés) et rural (revenus plus faibles). Distance au point d’eau : très fortement asymétrique à droite (médiane 0,39 km, max 4,11 km) — la majorité des ménages vit à proximité d’un point d’eau, mais une minorité doit parcourir jusqu’à 4 km, révélant une inégalité d’accès physique à l’eau. Consommation d’eau : distribution plus régulière, centrée autour de 140-180 L/jour.

tab <- table(d$type_latrine, d$zone)
tab
##           
##            rurale urbaine
##   aucune        2       7
##   partagee     17      19
##   privee        8      27
chisq.test(tab)
## 
##  Pearson's Chi-squared test
## 
## data:  tab
## X-squared = 5.3145, df = 2, p-value = 0.07014
chisq.test(tab)$residuals
##           
##                rurale    urbaine
##   aucune   -0.5952919  0.4248875
##   partagee  1.3914051 -0.9931104
##   privee   -1.1092743  0.7917406

χ² = 5,3145, ddl = 2, p-value = 0,0701. Au seuil de 5 %, la p-value étant supérieure à 0,05, on ne rejette pas l’hypothèse d’indépendance entre le type de latrine et la zone. Les résidus indiquent une tendance (latrines partagées légèrement sur-représentées en zone rurale, latrines privées sous-représentées en zone rurale), mais celle-ci n’est pas confirmée statistiquement à 5 % — le résultat étant proche du seuil, un échantillon plus large pourrait faire apparaître une association significative. Avec seulement 80 observations réparties en 6 cases, certains effectifs théoriques (catégorie « aucune ») sont probablement proches de 5, ce qui fragilise la condition de validité du test ; un test exact de Fisher serait plus prudent.

modele <- aov(revenu_kFCFA ~ zone, data = d)
summary(modele)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## zone         1  96457   96457   72.33 9.89e-13 ***
## Residuals   78 104024    1334                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggplot(d, aes(x = zone, y = revenu_kFCFA)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Revenu par zone")

shapiro.test(residuals(modele))   # normalité
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modele)
## W = 0.96759, p-value = 0.0399
bartlett.test(revenu_kFCFA ~ zone, data = d)  # homogénéité des variances
## 
##  Bartlett test of homogeneity of variances
## 
## data:  revenu_kFCFA by zone
## Bartlett's K-squared = 8.0301, df = 1, p-value = 0.004601
wilcox.test(revenu_kFCFA ~ zone, data = d)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  revenu_kFCFA by zone
## W = 108.5, p-value = 6.756e-10
## alternative hypothesis: true location shift is not equal to 0

F = 72,33 (ddl 1 et 78), p-value = 9,89×10⁻¹³ : le revenu moyen diffère fortement selon la zone, avec une médiane rurale ≈ 65 kFCFA contre ≈ 140 kFCFA en zone urbaine.

La vérification des hypothèses de l’ANOVA montre toutefois des fragilités : le test de Shapiro-Wilk (W = 0,968, p = 0,0399) indique une légère déviation à la normalité des résidus, et le test de Bartlett (K² = 8,03, p = 0,0046) révèle une hétérogénéité des variances entre zones, cohérente avec la dispersion plus marquée et les valeurs atypiques observées en zone urbaine sur le boxplot. Le test non-paramétrique de Wilcoxon (W = 108,5, p = 6,76×10⁻¹⁰), qui ne repose pas sur ces hypothèses, confirme néanmoins une différence significative de revenu entre zones — la conclusion de l’ANOVA est donc robuste malgré la violation de ses conditions d’application.

Synthèse — accès à l’eau et à l’assainissement

Interprétation globale. Trois enseignements se dégagent de cette enquête. D’abord, l’accès à l’eau : si la majorité des ménages est proche d’un point d’eau, une minorité rurale en est significativement éloignée, révélant une inégalité territoriale. Ensuite, l’assainissement : aucune association statistiquement prouvée à 5 % entre type de latrine et zone n’a été établie, bien qu’un signal (p ≈ 0,07) suggère que les ménages ruraux ont un peu moins souvent accès à une latrine privée. Enfin, le revenu : nettement plus élevé en zone urbaine, il peut expliquer indirectement de meilleures conditions d’assainissement en ville — la capacité à financer une latrine privée — même si ce lien n’est pas confirmé directement par le test du khi-deux sur cet échantillon.