Stage d’initiation à la statistique et cartographie avec R

Introduction

Objectif :

Appréhender une chaîne de traitement de données géographiques simples. Faire des traitements statistiques univariés, bivariés, et la cartographie choroplèthe associée.

Avec un volume horaire de 3 demi-journées (12), l’objectif est centré sur l’écriture d’un programme R puis un document Rmarkdown et d’effectuer des traitements de statistique univariée (valeurs centrales, paramètres de dispersion, histogramme, …) et bivariée (par exemple, corrélation, régression, analyse de variance, test d’égalité des moyennes, tableau de contingence, chi-2). Nous réaliserons ceci en mettant en oeuvre l’ensemble de la chaîne de traitement des données, des tableaux de données jusqu’à la cartographie univariée choroplèthe simple. Afin de vous assurer un accompagnement vers le stage commun avec Carthageo, nous utiliserons à la fois le langage standard R, et les nouvelles évolutions tant pour l’écriture du code (tidyverse) que pour les graphiques (ggplot2). L’objectif est que vous disposiez d’un kit méthodologique pour pouvoir traiter de l’univarié et du bivarié en autonomie, jusqu’à des opérations simples de cartographie.

Support de cours :

Le programme de cet enseignement sera basé sur les outils pédagogiques suivants :

Dates et lieu : Les cours auront lieu en salle 310 du bâtiment Olympe de Gouges à l’Université Paris Cité (MAJ Sept 2O25):

  • Lundi 15 septembre 2025 : 9h-12 et 13-17h, ODG 310
  • Jeudi 18 septembre 2025 ; 9h-12h, ODG 310

Matériel : Les étudiants sont invités à utiliser leur propre ordinateur, et à y installer les dernières versions de R et Rstudio AVANT la première séance. Nous serons en salle informatique et des postes de travail individuels seront également disponibles - https://larmarange.github.io/analyse-R/installation-de-R-et-RStudio.html

Prérequis : Notion de base en statistique univariée et, si possible bivariée.

Documents et syllabus du TD :

Syllabus et données : http://rlegoix.gitpages.huma-num.fr/cours_m2_traitementsstatscarto

L’ensemble des documents sont mis à dispostion sur un dépôt Git : https://gitlab.huma-num.fr/rlegoix/cours_m2_traitementsstatscarto

Partie 1. Introduction à R Introduction à la chaîne de traitement de l’information géographique avec R.

R: une plateforme statistique, un (des) langage(s) de programmation, un couteau suisse.

De la chaîne de traitement de l’information géographique et la production de documents

La chaîne de traitements d’après C. Grasland
La chaîne de traitements d’après C. Grasland

Un éconsystème, ou un environnement, qui évolue vite, en recourrant à des librairies (packages) pour accéder à des fonctions avancées ou plus simples d’utilisation.

Packages et environnements
Packages et environnements

Objectif: Découvrir l’environnement. Manipuler les principaux objects R.

Premiers pas

Exercice: Réaliser les exercices “Premiers pas” du tuto de Claude Grasland : https://claudegrasland.github.io/startR/01-PremierPas.html

Travail sur un tableau de données (dataframe)

Importer les données à partir d’une fichier texte (format CSV)

Données utilisées : Données Revenus, pauvreté et niveau de vie en 2021 (Iris) de la base Dispositif Fichier localisé social et fiscal (Filosofi) : https://www.insee.fr/fr/statistiques/8229323/ La création de ce fichier est documentée dans les annexes.

On peut importer directement le fichier, ou contrôler la structure des variables, comme sur la copie d’écran ci-dessous.

Importer un CSV en utilisant l’interface graphique
Importer un CSV en utilisant l’interface graphique

Notre objectif est de travailler avec les variables

Le tableau de données finales (dataframe) comportera cinq colonnes :

  • identifiant géographique : CODE_IRIS
  • code département : DEP
  • revenus médians 2021 (Médiane du revenu déclaré par unité de consommation (en euros)) : DEC_MED21
  • indice de Gini du revenu déclaré par unité de consommation 2021 : DEC_GI21
  • part des autres revenus (%) (essentiellement des revenus du patrimoine) : DEC_PAUT21
# Méthode simple
Revenus_IRIS <- read.csv("../public/data/Revenus_IRIS_PC.csv")
## Cette méthode nécessite de contrôler à postériori la structure des variables

# Méthode en utilisant l'interface RStudio qui permet 1. de contrôler la structure des variables que l'on importe ; 2. de copier / coller le code utilisé.
library(readr)
Revenus_IRIS_PC <- read_csv("../public/data/Revenus_IRIS_PC.csv", 
    col_types = cols(IRIS = col_character(), 
    DEC_MED21 = col_number(), DEC_GI21 = col_number()))
## New names:
## • `` -> `...1`
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
##   dat <- vroom(...)
##   problems(dat)

Les dimensions du tableau

# Les dimensions du tableau
dim(Revenus_IRIS_PC)
## [1] 2745   28
#> [1] 2529    5

#La fonction class() fournit le type d’un tableau
class(Revenus_IRIS_PC)
## [1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame"
#> [1] "data.frame"

# La fonction head() fournit les premières lignes`
# Visualiser les colonnes et variables disponibles
head(Revenus_IRIS_PC)
## # A tibble: 6 × 28
##    ...1 IRIS      DEC_PIMP21 DEC_TP6021 DEC_INCERT21 DEC_Q121 DEC_MED21 DEC_Q321
##   <dbl> <chr>     <chr>      <chr>      <chr>        <chr>        <dbl> <chr>   
## 1     1 751010101 ns         ns         so           ns              NA ns      
## 2     2 751010102 ns         ns         so           ns              NA ns      
## 3     3 751010103 ns         ns         so           ns              NA ns      
## 4     4 751010104 ns         ns         so           ns              NA ns      
## 5     5 751010105 nd         nd         so           nd              NA nd      
## 6     6 751010199 nd         nd         so           nd              NA nd      
## # ℹ 20 more variables: DEC_EQ21 <chr>, DEC_D121 <chr>, DEC_D221 <chr>,
## #   DEC_D321 <chr>, DEC_D421 <chr>, DEC_D621 <chr>, DEC_D721 <chr>,
## #   DEC_D821 <chr>, DEC_D921 <chr>, DEC_RD21 <chr>, DEC_S80S2021 <chr>,
## #   DEC_GI21 <dbl>, DEC_PACT21 <chr>, DEC_PTSA21 <chr>, DEC_PCHO21 <chr>,
## #   DEC_PBEN21 <chr>, DEC_PPEN21 <chr>, DEC_PAUT21 <chr>, DEC_NOTE21 <chr>,
## #   DEP <dbl>
# Vérifier le type des variables avec str()
str(Revenus_IRIS_PC)
## spc_tbl_ [2,745 × 28] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ ...1        : num [1:2745] 1 2 3 4 5 6 7 8 9 10 ...
##  $ IRIS        : chr [1:2745] "751010101" "751010102" "751010103" "751010104" ...
##  $ DEC_PIMP21  : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_TP6021  : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_INCERT21: chr [1:2745] "so" "so" "so" "so" ...
##  $ DEC_Q121    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_MED21   : num [1:2745] NA NA NA NA NA ...
##  $ DEC_Q321    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_EQ21    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_D121    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_D221    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_D321    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_D421    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_D621    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_D721    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_D821    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_D921    : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_RD21    : chr [1:2745] "so" "so" "so" "so" ...
##  $ DEC_S80S2021: chr [1:2745] "so" "so" "so" "so" ...
##  $ DEC_GI21    : num [1:2745] NA NA NA NA NA NA 471 531 503 487 ...
##  $ DEC_PACT21  : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_PTSA21  : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_PCHO21  : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_PBEN21  : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_PPEN21  : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_PAUT21  : chr [1:2745] "ns" "ns" "ns" "ns" ...
##  $ DEC_NOTE21  : chr [1:2745] "so" "so" "so" "so" ...
##  $ DEP         : num [1:2745] 75 75 75 75 75 75 75 75 75 75 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   ...1 = col_double(),
##   ..   IRIS = col_character(),
##   ..   DEC_PIMP21 = col_character(),
##   ..   DEC_TP6021 = col_character(),
##   ..   DEC_INCERT21 = col_character(),
##   ..   DEC_Q121 = col_character(),
##   ..   DEC_MED21 = col_number(),
##   ..   DEC_Q321 = col_character(),
##   ..   DEC_EQ21 = col_character(),
##   ..   DEC_D121 = col_character(),
##   ..   DEC_D221 = col_character(),
##   ..   DEC_D321 = col_character(),
##   ..   DEC_D421 = col_character(),
##   ..   DEC_D621 = col_character(),
##   ..   DEC_D721 = col_character(),
##   ..   DEC_D821 = col_character(),
##   ..   DEC_D921 = col_character(),
##   ..   DEC_RD21 = col_character(),
##   ..   DEC_S80S2021 = col_character(),
##   ..   DEC_GI21 = col_number(),
##   ..   DEC_PACT21 = col_character(),
##   ..   DEC_PTSA21 = col_character(),
##   ..   DEC_PCHO21 = col_character(),
##   ..   DEC_PBEN21 = col_character(),
##   ..   DEC_PPEN21 = col_character(),
##   ..   DEC_PAUT21 = col_character(),
##   ..   DEC_NOTE21 = col_character(),
##   ..   DEP = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>

On va donc nettoyer tout ça pour réduire la taille, et manipuler des données complètes

# Sélectionner les colonnes qui nous intéressent (nettoyage des fichiers)
Revenus_IRIS_PC <- Revenus_IRIS_PC[,c("IRIS","DEP","DEC_MED21","DEC_GI21","DEC_PAUT21")]

# Nettoyer les fichiers. On a vu que des lignes comportaient des données numériques manquantes, codées NA. On va les supprimer. Il y a deux solutions

# On supprime les enregistrements qui contiennent des données manquantes
# Supprimer les lignes avec des valeurs NA
Revenus_IRIS_PC <- na.omit(Revenus_IRIS_PC)
# Il doit rester 2529 lignes

# On conserve les enregistrements qui sont complets
Revenus_IRIS_PC <- Revenus_IRIS_PC[complete.cases(Revenus_IRIS_PC), ]
# Il doit rester 2529 lignes (le monde est bien fait)
# 

# Ooops, il semblerait que la variable `DEC_PAUT21` soit toujours une chaîne de caractère. On a besoin de la transformer en variable numérique 
# Ce n'est pas très grave
# Essayer puis voir ce que ça donne.

Revenus_IRIS_PC$RevPatrimoine <- as.numeric(Revenus_IRIS_PC$DEC_PAUT21)
## Warning: NAs introduced by coercion
# On a encore un souci car la décimale est codée avec une virgule.
# On va manipuler la chaîne de caractère pour mettre un point à la place

# On utilise la fonction `gsub` qui permet de remplacer des expressions régulières dans une chaîne de caractère
Revenus_IRIS_PC$RevPatrimoine <- gsub(",", ".", Revenus_IRIS_PC$DEC_PAUT21)

# On peut maintenant converir la variable dans un format numérique
Revenus_IRIS_PC$RevPatrimoine <- as.numeric(Revenus_IRIS_PC$RevPatrimoine)

# Et supprimer une variable devenue inutile
Revenus_IRIS_PC$DEC_PAUT21 <- NULL

Résumé statistique du tableau

Cette étape est souvent indispensable, elle fournit une premier analyse univariée. La fonction summary() donne un aperçu général des variables

summary(Revenus_IRIS_PC)
##      IRIS                DEP          DEC_MED21        DEC_GI21    
##  Length:2529        Min.   :75.00   Min.   : 7330   Min.   :202.0  
##  Class :character   1st Qu.:75.00   1st Qu.:18910   1st Qu.:360.0  
##  Mode  :character   Median :92.00   Median :27770   Median :390.0  
##                     Mean   :86.82   Mean   :29052   Mean   :402.4  
##                     3rd Qu.:93.00   3rd Qu.:37260   3rd Qu.:425.0  
##                     Max.   :94.00   Max.   :77180   Max.   :789.0  
##  RevPatrimoine   
##  Min.   : 0.100  
##  1st Qu.: 2.600  
##  Median : 4.600  
##  Mean   : 6.662  
##  3rd Qu.: 7.800  
##  Max.   :62.700

Variables numériques (variables quantitatives)

Une variable numérique peut faire l’objet d’un ensemble de résumés statistiques à l’aide de fonctions élémentaires

  • min() : minimum
  • max() : maximum
  • mean() : moyenne
  • sd() : écart-type (en anglais : standard deviation, soit sd en abrégé)
  • sum() : somme

Pour l’exercice on peut créer un vecteur X à partir d’une variable du dataframe Revenus_IRIS_PC.

X <- Revenus_IRIS_PC$DEC_MED21
min(X)
## [1] 7330
max(X)
## [1] 77180
mean(X)
## [1] 29052
sd(X)
## [1] 11998.37

Pour calculer les quantiles on peut utiliser la fonction quantile() en paramétrant la valeur de fréquence cumulée ascendante

  • quantile(X,0) : minimum
  • quantile(X,0.10) : D1 (premier décile)
  • quantile(X,0.25) : Q1 (premier quartile)
  • quantile(X,0.5) : Q2 (médiane)
  • quantile(X,0.75) : Q3 (troisième quartile)
  • quantile(X,0.90) : D9 (dernier décile)
  • quantile(X,1) : maximum
X <- Revenus_IRIS_PC$DEC_MED21
quantile(X,0.5)
##   50% 
## 27770
sel<-c(0,0.25,0.5,0.75,1)
quantile(X,sel)
##    0%   25%   50%   75%  100% 
##  7330 18910 27770 37260 77180
sel<-c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)

quantile(X,sel)
##    0%   10%   20%   30%   40%   50%   60%   70%   80%   90%  100% 
##  7330 14468 17426 20540 24222 27770 31996 35262 39180 44394 77180

Il peut arriver qu’une fonction soit manquante dans R, comme par exemple le coefficient de variation. Dans ce cas, on peut faire le calcul par des lignes de code ou créer sa propre fonction avec l’instruction function(). La fonction qui est stockée en mémoire apparaît dans la fenêtre Environnement. Lorsqu’on a créé plusieurs fonctions, on peut en faire un programme R qu’on charge en mémoire au début de chaque session. A plus long terme, on peut en faire un package qu’on partagera avec les autres utilisateurs de R (ceux que nous allons bientôt utiliser)

A titre d’exemple, nous créons une fonction cv() qui calcule le rapport entre l’écart-type et la moyenne d’une distribution :

# Calcul du CV avec des lignes de code
X <- Revenus_IRIS_PC$DEC_MED21
sd(X)/mean(X)
## [1] 0.4129963
cv<-function(var) {sd(var)/mean(var)}
cv(X)
## [1] 0.4129963

Rapport Univarié

On peut utiliser certains packages comme skimr, qui produit un tableau prêt à imprimer

library(skimr)
skim(Revenus_IRIS_PC)
Data summary
Name Revenus_IRIS_PC
Number of rows 2529
Number of columns 5
_______________________
Column type frequency:
character 1
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
IRIS 0 1 9 9 0 2529 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
DEP 0 1 86.82 8.54 75.0 75.0 92.0 93.0 94.0 ▅▁▁▁▇
DEC_MED21 0 1 29052.00 11998.37 7330.0 18910.0 27770.0 37260.0 77180.0 ▇▇▅▁▁
DEC_GI21 0 1 402.43 70.76 202.0 360.0 390.0 425.0 789.0 ▁▇▂▁▁
RevPatrimoine 0 1 6.66 7.16 0.1 2.6 4.6 7.8 62.7 ▇▁▁▁▁

Dénombrement

Une variable quantitative peut être discrétisée avec cut(). Elle devient alors un facteur qu’on peut dénomber avec table() puis visualiser avec plot() sous la forme de diagramme en bâtons.

X<-cut(Revenus_IRIS_PC$DEC_MED21, c(0,10000,20000,30000,40000,50000,60000,70000, 80000,90000, 100000))
str(X)
##  Factor w/ 10 levels "(0,1e+04]","(1e+04,2e+04]",..: 4 5 4 4 5 6 5 5 5 4 ...
table(X)
## X
##     (0,1e+04] (1e+04,2e+04] (2e+04,3e+04] (3e+04,4e+04] (4e+04,5e+04] 
##             8           710           679           674           325 
## (5e+04,6e+04] (6e+04,7e+04] (7e+04,8e+04] (8e+04,9e+04] (9e+04,1e+05] 
##            98            29             6             0             0
plot(X,  main = "Fréquence simple des IRIS par catégorie de revenus", xlab = "classes")

X<-cut(Revenus_IRIS_PC$RevPatrimoine, c(0,20,40,60,80,100))
str(X)
##  Factor w/ 5 levels "(0,20]","(20,40]",..: 1 2 1 1 2 2 3 1 1 1 ...
table(X)
## X
##   (0,20]  (20,40]  (40,60]  (60,80] (80,100] 
##     2389      122       17        1        0
plot(X,  main = "Fréquence simple des IRIS par % de patrimoine dans le revenu des ménages", xlab = "classes")

Production d’un histogramme, dans le cas d’une variable continue

X<-Revenus_IRIS_PC$DEC_GI21
hist(X,  main = "Histogramme de l'indice de gini (2021)", xlab = "classes")

Variables qualitatives

Les variables qualitatives nominales ou factor sont des objets composés d’une liste de numéros et d’une liste d’étiquettes.

On peut transformer une variable quantitative en facteur avec la fonction cut()

A partir des revenus, nous allons créer 4 catégories de communes en fonction de la médiane, auxquels nous pouvons simplement donner les noms des quartiles :

  • Q1 : Iris les plus pauvres “Quartiers plus pauvres”
  • Q2: Inférieure à la médiane “Quartiers modestes”
  • Q3 : Supérieurs à la médiane “Quartiers aisés”
  • Q4 ; 4e quartile, les plus riches médiane “Quartiers riches”

On peut écrire cette transformation des données de la manière suivante, en insérant manuellement les bornes, ce qui créé 4 intervalles :

Revenus_IRIS_PC$RevQuartiles <-cut(Revenus_IRIS_PC$DEC_MED21, breaks=c(7330,    18910.0,    27770.0,    37260.0,    77180.0))

On peut ensuite recoder les classes avec levels()

levels(Revenus_IRIS_PC$RevQuartiles)<-c("Quartiers plus pauvres","Quartiers modestes","Quartiers aisés","Quartiers riches")

Une autre possibilité consiste à utiliser une fonction ce qui créé 4 intervalles statistiques (fonction quantile) :

Revenus_IRIS_PC$RevQuartiles <- cut(Revenus_IRIS_PC$DEC_MED21, breaks=c(quantile(Revenus_IRIS_PC$DEC_MED21, probs = seq(0, 1, by=0.25))))

levels(Revenus_IRIS_PC$RevQuartiles)<-c("Quartiers plus pauvres","Quartiers modestes","Quartiers aisés","Quartiers riches")

Option que l’on peut tester par exemple avec le patrimoine

Revenus_IRIS_PC$CatRevPatrimoine <- cut(Revenus_IRIS_PC$RevPatrimoine, breaks=c(quantile(Revenus_IRIS_PC$RevPatrimoine, probs = seq(0, 1, by=0.25))))

levels(Revenus_IRIS_PC$CatRevPatrimoine)<-c("Faible","Inf Mediane","Sup Mediane","Elevés")

Dénombrement

La fonction table()permet de dénombrer une variable qualitative

tab <- table(Revenus_IRIS_PC$RevQuartiles)
tab
## 
## Quartiers plus pauvres     Quartiers modestes        Quartiers aisés 
##                    633                    632                    631 
##       Quartiers riches 
##                    632

Pour comparer 2 variables, ces tables peuvent avoir plusieurs dimensions

tab <- table(Revenus_IRIS_PC$RevQuartiles, Revenus_IRIS_PC$CatRevPatrimoine)
tab
##                         
##                          Faible Inf Mediane Sup Mediane Elevés
##   Quartiers plus pauvres    494         111          23      2
##   Quartiers modestes        144         328         137     23
##   Quartiers aisés            13         172         310    136
##   Quartiers riches            0          18         157    457

Des fonctions permettent de procéder à des calculs ou des manipulations de ces tableaux. La fonction addmargins() rajoute des sommes en ligne (et en colonne si la table est de dimension 2)

tab <- addmargins(tab)
tab
##                         
##                          Faible Inf Mediane Sup Mediane Elevés  Sum
##   Quartiers plus pauvres    494         111          23      2  630
##   Quartiers modestes        144         328         137     23  632
##   Quartiers aisés            13         172         310    136  631
##   Quartiers riches            0          18         157    457  632
##   Sum                       651         629         627    618 2525

La mise en forme des tableaux par R n’est pas toujours satisfaisante. Le package knitr et la fonction kablepermet d’améliorer le rendu dans les documents produits1

kable(tab, format = "latex", digits = 2)

On peut comparer la distribution de ces deux variables avec un plot, qui peut être amélioré, et réaliser sur ce tableau un test statistique (Chi-2)

x <- Revenus_IRIS_PC$RevQuartiles
y <- Revenus_IRIS_PC$CatRevPatrimoine

tab <- table(x, y)

# Version brute
plot(tab) 

# Version améliorée
plot(tab, main = "Distribution des revenus et du patrimoine par IRIS en 2022", xlab ="Revenus médians (quartiles)", ylab ="% de revenus du patrimoine", las = 1, cex = .5)

test<-chisq.test(x, y)
test
## 
##  Pearson's Chi-squared test
## 
## data:  x and y
## X-squared = 2424.6, df = 9, p-value < 2.2e-16

Certaines fonctions permettent de produire des graphiques dont la mise en forme est plus avancée. Le package vcdpar exemple propose plusieurs types de graphiques de ce type

vcd::mosaic(~ RevQuartiles + CatRevPatrimoine, data = Revenus_IRIS_PC, shade = TRUE, direction = "v", rot_labels=c(45,90,0,0))

La position des variables n’est pas lisible. On peut aisément contrôler la position, la taille, etc. avec par exemple les commandes suivantes :

library(vcd)
## Warning: package 'vcd' was built under R version 4.3.3
## Loading required package: grid
mosaic(~ RevQuartiles + CatRevPatrimoine, data = Revenus_IRIS_PC, shade = TRUE, 
            labeling = labeling_border(rot_labels = c(90,0, 0, 0), 
                                  offset_label =c(2,5,0, 0),
                                  varnames = c(FALSE, TRUE),
                                  just_labels=c("center","right"),
                                  tl_varnames = FALSE)  ) 

Comparaison d’une variable quantitative et d’une variable qualitative

La comparaison d’une variable quantitative et d’une variable qualitative peut prendre la forme d’une comparaison de la distribution statistique (boxplot) et d’un test de Fischer. On applique cette analyse à l’indice de Gini en fonction des revenus du patrimoine classés par quartiles

x <- Revenus_IRIS_PC$CatRevPatrimoine # Variable qualitative 
y <- Revenus_IRIS_PC$DEC_GI21 # Variable quantitative (indice de Gini)

plot(x,y, 
     col=c("blue","lightblue","pink", "red"),
     xlab ="Indice de Gini",
     ylab = "% des revenus du patrimoine",
     horizontal=T)

# Text de Fischer
mod<-aov(y~x)
summary(mod)
##               Df  Sum Sq Mean Sq F value Pr(>F)    
## x              3 4701027 1567009     497 <2e-16 ***
## Residuals   2521 7949269    3153                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 4 observations deleted due to missingness
x <- as.factor(Revenus_IRIS_PC$DEP) # Variable qualitative 
y <- Revenus_IRIS_PC$DEC_GI21 # Variable quantitative (indice de Gini)

plot(x,y, 
     col=c("blue","lightblue","pink", "red"),
     xlab ="Indice de Gini",
     ylab = "Départements",
     horizontal=T)

# Text de Fischer
mod<-aov(y~x)
summary(mod)
##               Df  Sum Sq Mean Sq F value Pr(>F)    
## x              3 3566909 1188970   330.3 <2e-16 ***
## Residuals   2525 9089080    3600                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Comparaison de deux variables quantitatives

La comparaison de deux variables qualitatives se fait généralement en traçant un diagramme bivarié, en calculant le coefficient de corrélation (Test de Pearson), et en analysant éventuellement les résultats d’une régression linéaire. On peut faire ces analyses pour deux couples de variables, et analyser la corrélation de l’une avec l’autre.

La régression linéraire permet d’analyser l’hypothèse d’une dépendance entre une variable à expliquer et une variable explicative. La fonction `lm()ù ou lm est l’abbréviation de linear model permet d”effectuer la plupart des modèles de régression linéaire basés sur la méthode des moindres carrés ordinaire. Sa syntaxe est a priori très simple et renvoie les coefficients b et a du modèle de régression.

x <- Revenus_IRIS_PC$DEC_MED21 # Variable quantitative
y <- Revenus_IRIS_PC$RevPatrimoine # Variable quantitative

plot(x,y, xlab="revenus médians",ylab="Revenus du patrimoine")

cor.test(y,x)
## 
##  Pearson's product-moment correlation
## 
## data:  y and x
## t = 56.425, df = 2527, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.7288993 0.7634230
## sample estimates:
##       cor 
## 0.7466635
# Modèle
monmodel1<-lm(y~x)
monmodel1
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##  -6.2732415    0.0004453
# Plot avec la régression
plot(x,y, xlab="revenus médians",ylab="Revenus du patrimoine")
abline(monmodel1, col="red",lwd=2)

summary(monmodel1)
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -8.704 -2.563 -0.297  1.398 43.558 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6.273e+00  2.480e-01  -25.29   <2e-16 ***
## x            4.453e-04  7.891e-06   56.42   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.76 on 2527 degrees of freedom
## Multiple R-squared:  0.5575, Adjusted R-squared:  0.5573 
## F-statistic:  3184 on 1 and 2527 DF,  p-value: < 2.2e-16
residus <- monmodel1$residuals
Revenus_IRIS_PC$residus <- residus
x <- Revenus_IRIS_PC$DEC_MED21 # Variable quantitative (revenus médians)
y <- Revenus_IRIS_PC$DEC_GI21 # Variable quantitative (indice de Gini)

plot(x,y, xlab="revenus médians",ylab="indice de Gini")

cor.test(y,x)
## 
##  Pearson's product-moment correlation
## 
## data:  y and x
## t = 25.499, df = 2527, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4208254 0.4828459
## sample estimates:
##       cor 
## 0.4523825
# Modèle
monmodel2<-lm(y~x)
monmodel2
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##   3.249e+02    2.668e-03
# Plot avec la régression
plot(x,y, xlab="revenus médians",ylab="Revenus du patrimoine")
abline(monmodel2, col="blue",lwd=2)