Partie A - Importation, typologie, nettoyage (45 min) /6

A1. Importation des deux CSV (2 pts)

On importe les données :

parcelles <- read.csv2("1.csv",
                    header = TRUE,
                    fileEncoding = "CP1252",
                    stringsAsFactors = FALSE)

dico <- read.csv2("2.csv",
                header = TRUE,
                fileEncoding = "CP1252",
                stringsAsFactors = FALSE)

str(parcelles)
## 'data.frame':    25365 obs. of  109 variables:
##  $ ID                           : int  20003 20003 20005 20005 20005 20005 20005 20007 20007 20007 ...
##  $ ORIGINE                      : chr  "DAAF - BASE2010" "DAAF - BASE2010" "DAAF - BASE2010" "DAAF - BASE2010" ...
##  $ PARC_CAD                     : chr  "9722130000W0490" "9722130000W0490" "9722030000C0434" "9722030000C0434" ...
##  $ PROFOND                      : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ ANNEE                        : int  2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
##  $ COMMU_LAB                    : chr  "LAMENTIN(LE)" "LAMENTIN(LE)" "BASSE-POINTE" "BASSE-POINTE" ...
##  $ NUMERO_SIG                   : chr  NA NA NA NA ...
##  $ Positionne                   : chr  "Plusieurs points GPS" "Plusieurs points GPS" "Plusieurs points GPS" "Plusieurs points GPS" ...
##  $ RPG19_COD                    : chr  "BEF" "BEF" "CSF" "CSF" ...
##  $ ocs_gid                      : int  74838 81193 106665 106665 106665 106665 106665 105216 107387 105216 ...
##  $ ocs_id                       : chr  "OCSGE0000000000006484456" "OCSGE0000000000006490811" "OCSGE0000000000006516282" "OCSGE0000000000006516282" ...
##  $ ocs_code_cs                  : chr  "CS1.1.2.1" "CS2.2.2.2.2" "CS2.2.1.4.5.5" "CS2.2.1.4.5.5" ...
##  $ ocs_code_us                  : chr  "US1.1" "US1.1" "US1.1" "US1.1" ...
##  $ ocs_millesime                : int  2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 ...
##  $ ocs_source                   : chr  "saisie" "RPG" "RPG" "RPG" ...
##  $ ocs_ossature                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ocs_id_origine               : chr  "NC" "NC" "NC" "NC" ...
##  $ ocs_code_or                  : chr  "NC" "NC" "NC" "NC" ...
##  $ formationvegetales_gid       : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ formationvegetales_tfv       : chr  NA NA NA NA ...
##  $ formationvegetales_theme     : chr  NA NA NA NA ...
##  $ formationvegetales_libelle   : chr  NA NA NA NA ...
##  $ pluviométrie_moyenne_annuelle: chr  "2000-3000" "2000-3000" "2000-3000" "2000-3000" ...
##  $ sol.simple_OBJECTID          : int  293 293 12141 12141 12141 12141 12141 12141 12141 12141 ...
##  $ sol.simple_ENSEMBLECD        : chr  "C" "C" "P" "P" ...
##  $ sol.simple_SOUSENSV          : chr  NA NA "P1" "P1" ...
##  $ sol.simple_FACIESCD          : chr  NA NA "e" "e" ...
##  $ sol.simple_SSFACIESCD        : chr  NA NA NA NA ...
##  $ sol.simple_COMPLEXECD        : chr  "Ab Bb" "Ab Bb" NA NA ...
##  $ sol.simple_TENDANCE          : chr  "A, B" "A, B" "P" "P" ...
##  $ sol.simple_OID_              : int  1 1 36 36 36 36 36 36 36 36 ...
##  $ sol.simple_SYMBOLE           : chr  "A, B" "A, B" "P" "P" ...
##  $ sol.simple_TYPE_DE_SO        : chr  "Alluvium, Colluvium" "Alluvium, Colluvium" "Andosol" "Andosol" ...
##  $ sol.complexe_OBJECTID        : int  1318 1318 8313 8574 8575 8341 8342 8470 8470 8161 ...
##  $ sol.complexe_ENSEMBLECD      : chr  "A" "A" "J" "J" ...
##  $ sol.complexe_SOUSENSV        : chr  "A3" "A3" "J1" "J2" ...
##  $ sol.complexe_FACIESCD        : chr  "d" "d" NA NA ...
##  $ sol.complexe_SSFACIESCD      : chr  NA NA NA NA ...
##  $ sol.complexe_VARIANTECD      : chr  NA NA NA NA ...
##  $ sol.complexe_ASSOCD          : chr  NA NA NA NA ...
##  $ sol.complexe_COMPLEXECD      : chr  NA NA NA NA ...
##  $ sol.complexe_TENDANCE        : chr  "A" "A" "J" "J" ...
##  $ mnt.exposition_mean          : num  98.2 105.3 131 63.9 53.5 ...
##  $ mnt.exposition_median        : num  0 0 79.6 63.9 50.7 ...
##  $ mnt.exposition_stdev         : num  137.779 119.415 123.826 0.503 12.503 ...
##  $ mnt.exposition_min           : num  0 0 11.3 63.4 36.9 ...
##  $ mnt.exposition_max           : num  315 315 341.6 64.4 71.6 ...
##  $ mnt.exposition_minority      : num  315 45 11.3 63.4 36.9 ...
##  $ mnt.exposition_majority      : num  0 0 341.6 63.4 36.9 ...
##  $ mnt.exposition_variance      : num  1.90e+04 1.43e+04 1.53e+04 2.53e-01 1.56e+02 ...
##  $ mnt.ombrage_mean             : num  181 181 179 172 179 ...
##  $ mnt.ombrage_median           : num  181 181 180 172 179 ...
##  $ mnt.ombrage_stdev            : num  0.437 1.084 6.234 0.5 2.135 ...
##  $ mnt.ombrage_min              : int  181 178 164 171 176 157 165 183 174 175 ...
##  $ mnt.ombrage_max              : int  182 184 186 172 182 189 179 189 188 189 ...
##  $ mnt.ombrage_minority         : int  182 184 164 171 176 159 165 183 174 175 ...
##  $ mnt.ombrage_majority         : int  181 181 179 171 176 171 173 189 175 175 ...
##  $ mnt.ombrage_variance         : num  0.191 1.176 38.859 0.25 4.56 ...
##  $ mnt.pente_mean               : num  0.22 0.761 3.641 13.082 5.702 ...
##  $ mnt.pente_median             : num  0 0.354 2.689 13.082 5 ...
##  $ mnt.pente_stdev              : num  0.309 0.863 3.399 0.334 0.996 ...
##  $ mnt.pente_min                : num  0 0 1.58 12.75 4.74 ...
##  $ mnt.pente_max                : num  0.707 2.236 12.51 13.416 7.106 ...
##  $ mnt.pente_minority           : num  0.707 2.121 2 12.748 4.743 ...
##  $ mnt.pente_majority           : num  0 0 1.58 12.75 4.74 ...
##  $ mnt.pente_variance           : num  0.0957 0.7455 11.5557 0.1118 0.9924 ...
##  $ mnt.rugosité_mean            : num  0.312 0.5 2.375 8.5 4.2 ...
##  $ mnt.rugosité_median          : num  0 0.5 2 8.5 4 7 7 6 4 7 ...
##  $ mnt.rugosité_stdev           : num  0.437 0.5 1.798 0.5 1.166 ...
##  $ mnt.rugosité_min             : int  0 0 1 8 3 2 3 5 2 6 ...
##  $ mnt.rugosité_max             : int  1 1 7 9 6 10 10 7 8 9 ...
##  $ mnt.rugosité_minority        : int  1 0 7 8 4 2 3 5 2 6 ...
##  $ mnt.rugosité_majority        : int  0 0 2 8 3 7 7 5 4 7 ...
##  $ mnt.rugosité_variance        : num  0.191 0.25 3.234 0.25 1.36 ...
##  $ mnt.tpi_mean                 : num  0.039 -0.0278 0.5312 -0.3125 -0.425 ...
##  $ mnt.tpi_median               : num  0 0 0.375 -0.312 -0.25 ...
##  $ mnt.tpi_stdev                : num  0.0547 0.2353 0.544 0.8125 0.6154 ...
##  $ mnt.tpi_min                  : num  0 -0.625 -0.25 -1.125 -1.375 ...
##  $ mnt.tpi_max                  : num  0.125 0.625 1.625 0.5 0.25 ...
##  $ mnt.tpi_minority             : num  0.125 -0.625 -0.25 -1.125 -1.375 ...
##  $ mnt.tpi_majority             : num  0 0 0.375 -1.125 -1.375 ...
##  $ mnt.tpi_variance             : num  0.00299 0.05536 0.2959 0.66016 0.37875 ...
##  $ mnt.tri_mean                 : num  0.039 0.148 0.812 2.562 1.175 ...
##  $ mnt.tri_median               : num  0 0.0625 0.625 2.5625 1.25 ...
##  $ mnt.tri_stdev                : num  0.0547 0.1849 0.6281 0.0625 0.2031 ...
##  $ mnt.tri_min                  : num  0 0 0.25 2.5 0.875 ...
##  $ mnt.tri_max                  : num  0.125 0.625 2.375 2.625 1.375 ...
##  $ mnt.tri_minority             : num  0.125 0.625 0.25 2.5 0.875 ...
##  $ mnt.tri_majority             : num  0 0 0.625 2.5 1.375 ...
##  $ mnt.tri_variance             : num  0.00299 0.03419 0.39453 0.00391 0.04125 ...
##  $ surface.parcelle_m2          : num  43.2 33477.9 5132.4 1306.3 2879.2 ...
##  $ type_sol                     : chr  "Alluvions continentales" "Alluvions continentales" "Sols peu ‚volu‚s sur cendres" "Sols peu ‚volu‚s sur cendres" ...
##  $ Date_prelevement             : chr  "06/12/2005" "06/12/2005" "08/12/2005" "08/12/2005" ...
##  $ Année                        : int  2005 2005 2005 2005 2005 2005 2005 2005 2005 2005 ...
##  $ Numero_sig                   : chr  "MA/PSCH/02-VG" "MA/PSCH/02-VG" "MA/PSCH/03-VG" "MA/PSCH/03-VG" ...
##  $ Origine_donnee               : int  5 5 5 5 5 5 5 5 5 5 ...
##  $ Interet                      : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Date_enregistrement          : chr  "06/12/2005" "06/12/2005" "08/12/2005" "08/12/2005" ...
##  $ Adresse_parcelle             : chr  "Union" "Union" "Eyma" "Eyma" ...
##   [list output truncated]
dim(parcelles)
## [1] 25365   109

On a donc 25365 observations pour 109 variables.

A2. Sélection des variables imposées (1 pt)

On construit l’objet DATA en ne gardant que les variables demandées dans l’énoncé.

DATA <- parcelles[, c("Taux_chlordecone",
                      "surface.parcelle_m2",
                      "mnt.pente_mean",
                      "mnt.rugosité_mean",
                      "mnt.ombrage_mean",
                      "mnt.exposition_mean",
                      "pluviométrie_moyenne_annuelle",
                      "ocs_source",
                      "Interet")]

str(DATA)
## 'data.frame':    25365 obs. of  9 variables:
##  $ Taux_chlordecone             : num  3.6 3.6 2.7 2.7 2.7 2.7 2.7 1.9 1.9 1.9 ...
##  $ surface.parcelle_m2          : num  43.2 33477.9 5132.4 1306.3 2879.2 ...
##  $ mnt.pente_mean               : num  0.22 0.761 3.641 13.082 5.702 ...
##  $ mnt.rugosité_mean            : num  0.312 0.5 2.375 8.5 4.2 ...
##  $ mnt.ombrage_mean             : num  181 181 179 172 179 ...
##  $ mnt.exposition_mean          : num  98.2 105.3 131 63.9 53.5 ...
##  $ pluviométrie_moyenne_annuelle: chr  "2000-3000" "2000-3000" "2000-3000" "2000-3000" ...
##  $ ocs_source                   : chr  "saisie" "RPG" "RPG" "RPG" ...
##  $ Interet                      : int  1 1 1 1 1 1 1 1 1 1 ...

On dispose maintenant d’un tableau réduit, plus simple à manipuler pour les analyses suivantes.

A3. Typologie (1 pt)

On réalise un tableau récapitulatif du type et du rôle de chaque variable de DATA.

vars <- c("Taux_chlordecone",
          "surface.parcelle_m2",
          "mnt.pente_mean",
          "mnt.rugosité_mean",
          "mnt.ombrage_mean",
          "mnt.exposition_mean",
          "pluviométrie_moyenne_annuelle",
          "ocs_source",
          "Interet")

type_var <- c("quantitative continue",
              "quantitative continue",
              "quantitative continue",
              "quantitative continue",
              "quantitative continue",
              "quantitative continue",
              "qualitative ordinale (par classes)",
              "qualitative nominale",
              "qualitative nominale")

role_var <- c("réponse",
              "explicative",
              "explicative",
              "explicative",
              "explicative",
              "explicative",
              "regroupement / explicative",
              "explicative / contexte",
              "regroupement")

descr <- data.frame(Variable = vars,
                    Type = type_var,
                    Role = role_var,
                    stringsAsFactors = FALSE)

knitr::kable(descr, caption = "Typologie des variables (Question A3)")
Typologie des variables (Question A3)
Variable Type Role
Taux_chlordecone quantitative continue réponse
surface.parcelle_m2 quantitative continue explicative
mnt.pente_mean quantitative continue explicative
mnt.rugosité_mean quantitative continue explicative
mnt.ombrage_mean quantitative continue explicative
mnt.exposition_mean quantitative continue explicative
pluviométrie_moyenne_annuelle qualitative ordinale (par classes) regroupement / explicative
ocs_source qualitative nominale explicative / contexte
Interet qualitative nominale regroupement

On identifie ainsi la variable de réponse (taux de chlordécone), les explicatives quantitatives (surface et indicateurs MNT) et les qualitatives de regroupement.

A4. Nettoyage (2 pts)

On corrige les types des variables de DATA et on regarde la présence de valeurs manquantes.

DATA$Taux_chlordecone    <- as.numeric(DATA$Taux_chlordecone)
DATA$surface.parcelle_m2 <- as.numeric(DATA$surface.parcelle_m2)
DATA$mnt.pente_mean      <- as.numeric(DATA$mnt.pente_mean)
DATA$mnt.rugosité_mean   <- as.numeric(DATA$mnt.rugosité_mean)
DATA$mnt.ombrage_mean    <- as.numeric(DATA$mnt.ombrage_mean)
DATA$mnt.exposition_mean <- as.numeric(DATA$mnt.exposition_mean)

DATA$pluviométrie_moyenne_annuelle <- as.factor(DATA$pluviométrie_moyenne_annuelle)
DATA$ocs_source                    <- as.factor(DATA$ocs_source)
DATA$Interet                       <- as.factor(DATA$Interet)

summary(DATA)
##  Taux_chlordecone  surface.parcelle_m2 mnt.pente_mean   mnt.rugosité_mean
##  Min.   : 0.0010   Min.   :     0.00   Min.   :  0.00   Min.   : 0.00    
##  1st Qu.: 0.0013   1st Qu.:    10.58   1st Qu.: 10.74   1st Qu.: 7.40    
##  Median : 0.0033   Median :    99.96   Median : 17.72   Median :11.96    
##  Mean   : 0.4817   Mean   :   843.26   Mean   : 20.03   Mean   :13.29    
##  3rd Qu.: 0.1525   3rd Qu.:   540.75   3rd Qu.: 26.84   3rd Qu.:17.62    
##  Max.   :17.3500   Max.   :104365.91   Max.   :124.95   Max.   :85.06    
##  mnt.ombrage_mean mnt.exposition_mean pluviométrie_moyenne_annuelle
##  Min.   : 24.79   Min.   :  0.0       0-1250   :  309              
##  1st Qu.:159.50   1st Qu.: 90.0       1250-1500: 1460              
##  Median :177.06   Median :169.9       1500-2000: 6540              
##  Mean   :175.03   Mean   :170.2       2000-3000:13857              
##  3rd Qu.:193.01   3rd Qu.:248.2       3000-5000: 3107              
##  Max.   :254.44   Max.   :359.1       5000-8000:   92              
##    ocs_source   Interet  
##  BDForet:5828   1: 8490  
##  BDTopo :4433   2:10509  
##  calcul :   1   4: 3041  
##  mixte  : 782   5: 3325  
##  RPG    :4735            
##  saisie :9586
colSums(is.na(DATA))
##              Taux_chlordecone           surface.parcelle_m2 
##                             0                             0 
##                mnt.pente_mean             mnt.rugosité_mean 
##                             0                             0 
##              mnt.ombrage_mean           mnt.exposition_mean 
##                             0                             0 
## pluviométrie_moyenne_annuelle                    ocs_source 
##                             0                             0 
##                       Interet 
##                             0

Les variables ont maintenant un type adapté, et le comptage des NA servira à décider quelles lignes exclure dans les analyses qui suivent.

Partie B - Qualitatives, variables dérivées, χ² (45 min)

B1. Univariée qualitative (2 pts)

On étudie la distribution de pluviométrie_moyenne_annuelle avec un tableau et des graphiques.

tab_pluv  <- table(DATA$pluviométrie_moyenne_annuelle)
tab_pluv
## 
##    0-1250 1250-1500 1500-2000 2000-3000 3000-5000 5000-8000 
##       309      1460      6540     13857      3107        92
prop_pluv <- prop.table(tab_pluv) * 100
round(prop_pluv, 1)
## 
##    0-1250 1250-1500 1500-2000 2000-3000 3000-5000 5000-8000 
##       1.2       5.8      25.8      54.6      12.2       0.4
mode_pluv <- names(tab_pluv)[which.max(tab_pluv)]
mode_pluv
## [1] "2000-3000"
barplot(tab_pluv,
        main = "Pluviométrie moyenne annuelle",
        xlab = "Classe de pluviométrie",
        ylab = "Effectifs")

lbl <- paste0(names(prop_pluv), " (", round(prop_pluv, 1), " %)")
pie(prop_pluv,
    labels = lbl,
    main = "Répartition de la pluviométrie moyenne annuelle")

La classe 2000–3000mm est la plus fréquente, les classes extrêmes sont presque absentes.

B2. Création de 2 variables qualitatives dérivées (2 pts)

On crée deux nouvelles variables qualitatives à partir du taux de chlordécone et de la surface.

qT <- quantile(DATA$Taux_chlordecone, probs = c(0.25, 0.75), na.rm = TRUE)
seuil1_T <- qT[1]
seuil2_T <- qT[2]

DATA$Taux_cat <- cut(DATA$Taux_chlordecone,
                     breaks = c(-Inf, seuil1_T, seuil2_T, Inf),
                     labels = c("faible", "moyen", "élevé"),
                     right = TRUE)

qS <- quantile(DATA$surface.parcelle_m2, probs = c(1/3, 2/3), na.rm = TRUE)
seuil1_S <- qS[1]
seuil2_S <- qS[2]

DATA$surface_classe <- cut(DATA$surface.parcelle_m2,
                           breaks = c(-Inf, seuil1_S, seuil2_S, Inf),
                           labels = c("petite", "moyenne", "grande"),
                           right = TRUE)

table(DATA$Taux_cat, useNA = "ifany")
## 
## faible  moyen  élevé 
##   6439  12592   6334
table(DATA$surface_classe, useNA = "ifany")
## 
##  petite moyenne  grande 
##    8456    8454    8455

On obtient des classes faible/moyen/élevé pour le taux et petite/moyenne/grande pour la surface, avec des effectifs raisonnables dans chaque catégorie.

B3. Tableau croisé + test du χ² (2 pts)

On étudie le lien entre Taux_cat et la pluviométrie moyenne annuelle à l’aide d’un tableau croisé et d’un test du χ².

tab_B3 <- table(DATA$Taux_cat, DATA$pluviométrie_moyenne_annuelle)
tab_B3
##         
##          0-1250 1250-1500 1500-2000 2000-3000 3000-5000 5000-8000
##   faible    103       645      2424      3049       218         0
##   moyen     201       784      3038      6821      1656        92
##   élevé       5        31      1078      3987      1233         0
prop_B3_lignes <- prop.table(tab_B3, margin = 1) * 100
round(prop_B3_lignes, 1)
##         
##          0-1250 1250-1500 1500-2000 2000-3000 3000-5000 5000-8000
##   faible    1.6      10.0      37.6      47.4       3.4       0.0
##   moyen     1.6       6.2      24.1      54.2      13.2       0.7
##   élevé     0.1       0.5      17.0      62.9      19.5       0.0
test_chi <- chisq.test(tab_B3)
test_chi
## 
##  Pearson's Chi-squared test
## 
## data:  tab_B3
## X-squared = 2083.7, df = 10, p-value < 2.2e-16
test_chi$stdres
##         
##              0-1250  1250-1500  1500-2000  2000-3000  3000-5000  5000-8000
##   faible   3.229927  16.995545  25.190397 -13.580910 -25.114571  -5.604834
##   moyen    5.449454   3.192468  -5.990369  -1.464526   4.350785   9.677920
##   élevé   -9.542320 -20.776155 -18.408624  15.346879  20.226287  -5.543591

Le test du χ² donne une p‑value très petite (p‑value < 2,2·10⁻¹⁶). On rejette donc H0 au seuil de 5% : Taux_cat et pluviométrie_moyenne_annuelle ne sont pas indépendantes.

Partie C - Quantitatives : stats, graphes, classes (55 min) /5

C1. Indicateurs (2 pts)

On calcule les indicateurs de base (moyenne, médiane, min, max, etc.) pour les variables quantitatives.

varsC <- c("Taux_chlordecone",
           "surface.parcelle_m2",
           "mnt.pente_mean")

indicateurs <- data.frame(
  Variable  = varsC,
  Moyenne   = sapply(DATA[varsC], mean,    na.rm = TRUE),
  Mediane   = sapply(DATA[varsC], median,  na.rm = TRUE),
  Q1        = sapply(DATA[varsC], quantile, probs = 0.25, na.rm = TRUE),
  Q3        = sapply(DATA[varsC], quantile, probs = 0.75, na.rm = TRUE),
  Min       = sapply(DATA[varsC], min,     na.rm = TRUE),
  Max       = sapply(DATA[varsC], max,     na.rm = TRUE),
  Var       = sapply(DATA[varsC], var,     na.rm = TRUE),
  Sd        = sapply(DATA[varsC], sd,      na.rm = TRUE)
)
indicateurs
##                                Variable     Moyenne  Mediane       Q1        Q3
## Taux_chlordecone       Taux_chlordecone   0.4816993  0.00330  0.00130   0.15250
## surface.parcelle_m2 surface.parcelle_m2 843.2608100 99.95569 10.57776 540.75378
## mnt.pente_mean           mnt.pente_mean  20.0265018 17.71580 10.73836  26.83766
##                       Min       Max          Var         Sd
## Taux_chlordecone    0.001     17.35 1.855045e+00    1.36200
## surface.parcelle_m2 0.000 104365.91 8.818724e+06 2969.63368
## mnt.pente_mean      0.000    124.95 1.700549e+02   13.04051

Ces valeurs donnent une idée du niveau moyen et de la dispersion de chaque variable.

C2. Histogrammes + commentaire (1 pt)

On représente la distribution du taux de chlordécone et de la surface par des histogrammes.

par(mfrow = c(1,2))
hist(DATA$Taux_chlordecone,
     main = "Histogramme du Taux_chlordecone",
     xlab = "Taux_chlordecone")

hist(DATA$surface.parcelle_m2,
     main = "Histogramme de la surface",
     xlab = "surface.parcelle_m2")

par(mfrow = c(1,1))

Ces graphiques permettent de visualiser la forme des distributions (concentration, asymétrie, valeurs extrêmes éventuelles).

C3. Boxplots conditionnels (1 pt)

On compare le taux de chlordécone entre les différentes classes de pluviométrie.

boxplot(Taux_chlordecone ~ pluviométrie_moyenne_annuelle,
        data = DATA,
        xlab = "Pluviométrie moyenne annuelle",
        ylab = "Taux_chlordecone",
        main = "Taux_chlordecone selon la pluviométrie")

Le boxplot permet de comparer les médianes, la dispersion et les valeurs extrêmes entre les classes de pluviométrie.

C4. Groupement en classes (Yule et Sturges) (1 pt)

On détermine un nombre de classes raisonnable pour la surface et on construit l’histogramme associé.

x  <- DATA$surface.parcelle_m2
x  <- x[!is.na(x)]
n  <- length(x)
xmin <- min(x)
xmax <- max(x)

kYule    <- 2.5 * n^(1/4)
kSturges <- 1 + 3.3 * log10(n)

kYule; kSturges
## [1] 31.54995
## [1] 15.53398
k <- round(kSturges)

bornes <- seq(from = xmin, to = xmax, length.out = k + 1)

classe_surface <- cut(x, breaks = bornes, include.lowest = TRUE)
tabC4  <- table(classe_surface)
freqC4 <- prop.table(tabC4) * 100

tabC4
## classe_surface
##        [0,6.52e+03]  (6.52e+03,1.3e+04]  (1.3e+04,1.96e+04] (1.96e+04,2.61e+04] 
##               24704                 443                 106                  47 
## (2.61e+04,3.26e+04] (3.26e+04,3.91e+04] (3.91e+04,4.57e+04] (4.57e+04,5.22e+04] 
##                  33                  11                   5                   5 
## (5.22e+04,5.87e+04] (5.87e+04,6.52e+04] (6.52e+04,7.18e+04] (7.18e+04,7.83e+04] 
##                   4                   0                   2                   1 
## (7.83e+04,8.48e+04] (8.48e+04,9.13e+04] (9.13e+04,9.78e+04] (9.78e+04,1.04e+05] 
##                   0                   0                   2                   2
round(freqC4, 1)
## classe_surface
##        [0,6.52e+03]  (6.52e+03,1.3e+04]  (1.3e+04,1.96e+04] (1.96e+04,2.61e+04] 
##                97.4                 1.7                 0.4                 0.2 
## (2.61e+04,3.26e+04] (3.26e+04,3.91e+04] (3.91e+04,4.57e+04] (4.57e+04,5.22e+04] 
##                 0.1                 0.0                 0.0                 0.0 
## (5.22e+04,5.87e+04] (5.87e+04,6.52e+04] (6.52e+04,7.18e+04] (7.18e+04,7.83e+04] 
##                 0.0                 0.0                 0.0                 0.0 
## (7.83e+04,8.48e+04] (8.48e+04,9.13e+04] (9.13e+04,9.78e+04] (9.78e+04,1.04e+05] 
##                 0.0                 0.0                 0.0                 0.0
hist(x,
     breaks = bornes,
     main = "Surface par classes (Sturges/Yule)",
     xlab = "surface.parcelle_m2")

On obtient ainsi une partition de la surface en classes de taille comparable et on voit dans quelles classes se concentrent les parcelles.

Partie D - Corrélation, régression, ACP/clustering (35 min) /3

D1. Corrélation (1 pt)

On étudie le lien linéaire entre la pente moyenne et le taux de chlordécone.

plot(DATA$mnt.pente_mean, DATA$Taux_chlordecone,
     xlab = "mnt.pente_mean",
     ylab = "Taux_chlordecone",
     main = "Taux_chlordecone en fonction de la pente moyenne")

cor_pente <- cor(DATA$mnt.pente_mean, DATA$Taux_chlordecone,
                 use = "complete.obs", method = "pearson")
cor_pente
## [1] 0.01359255

Le nuage de points et la corrélation montrent à quel point la pente et le taux de chlordécone sont liés, et dans quel sens.

D2. Régression multiple (2 pts)

On ajuste un modèle linéaire qui explique le taux de chlordécone à partir de la surface et des variables topographiques.

mod <- lm(Taux_chlordecone ~ surface.parcelle_m2 +
                               mnt.pente_mean +
                               mnt.rugosité_mean +
                               mnt.ombrage_mean,
          data = DATA)

summary(mod)
## 
## Call:
## lm(formula = Taux_chlordecone ~ surface.parcelle_m2 + mnt.pente_mean + 
##     mnt.rugosité_mean + mnt.ombrage_mean, data = DATA)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.0822 -0.4717 -0.4007 -0.2904 16.6046 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          3.606e-02  5.851e-02   0.616    0.538    
## surface.parcelle_m2  6.024e-05  2.857e-06  21.087  < 2e-16 ***
## mnt.pente_mean      -1.187e-02  2.622e-03  -4.525 6.08e-06 ***
## mnt.rugosité_mean    2.358e-02  4.080e-03   5.778 7.64e-09 ***
## mnt.ombrage_mean     1.823e-03  3.098e-04   5.885 4.03e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.349 on 25360 degrees of freedom
## Multiple R-squared:  0.0198, Adjusted R-squared:  0.01965 
## F-statistic: 128.1 on 4 and 25360 DF,  p-value: < 2.2e-16
coef(mod)
##         (Intercept) surface.parcelle_m2      mnt.pente_mean   mnt.rugosité_mean 
##        3.606336e-02        6.023633e-05       -1.186541e-02        2.357773e-02 
##    mnt.ombrage_mean 
##        1.823292e-03

Le résumé du modèle donne les coefficients, les p‑values et le R², ce qui permet de voir quelles variables sont significatives et combien de variabilité du taux de chlordécone est expliquée.

Conclusion (5-8 lignes)

Dans ce TP, on prend en main le jeu de données sur la chlordécone : on importe les deux fichiers, on sélectionne les variables pertinentes et on nettoie la base (types, valeurs manquantes). On décrit ensuite les variables qualitatives et quantitatives à l’aide de tableaux, d’indicateurs et de graphiques (pluviométrie, surface, pente, etc.). Le test du χ² met en évidence un lien significatif entre les classes de pluviométrie et les niveaux de contamination (p‑value < 2,2·10⁻¹⁶), ce qui conduit à rejeter l’hypothèse d’indépendance. On ajuste enfin un modèle de régression linéaire multiple avec la surface et les variables topographiques : les coefficients sont significatifs mais le R² reste faible (environ 2%), donc le modèle explique peu la variabilité du taux de chlordécone. Globalement, on observe que les facteurs environnementaux étudiés ont un impact, mais qu’ils ne suffisent pas à eux seuls pour prédire précisément la contamination des parcelles