true

Ce cours a pour visée de vous apprendre à réaliser des analyses univariées sous R.

Durant cette séance, nous allons travailler à partir de la base de données “Communes” de l’INSEE issue du recensement de 2013. A la fin de la séance, il vous sera demander de produire vos propres analyses à partir des autres bases de données mises à votre disposition dans le cadre du projet tutoré (données INSEE et CAF des communes de Seine-Maritime et des IRIS localisés dans la ville de Rouen).

1 - Préparation des données

1.1 - Chargement des données

Dans un premier temps, il est préférable de vérifier que l’espace de travail est vide (c’est-à-dire que R n’a pas gardé en mémoire certaines variables ou des chemins d’accès créés dans une précédente session). Ensuite, on peut spécifier le chemin d’accès dans lequel on souhaite travailler (si l’on prévoit d’avoir un espace de travail privilégié pour la session).

Avant de charger les données, il est important de s’assurer que celles-ci sont dans un format aisément manipulable sous R. Il est recommandé d’éviter les fichiers au format compliqué tel qu’Excel et de préférer des formats texte séparant les différentes colonnes par une tabulation (.txt) ou par un point-virgule (.csv pour comma-separated values). Attention, petite subtilité du langage R : celui-ci requiert de remplacer les barres obliques inversées (ou backslash) des chemins d’accès par des barres obliques (slash : “/”) . Il faut également se renseigner sur le choix d’écriture des décimales : à la “française” avec une virgule ou bien à “l’anglaise” avec un point. On précisera également si le tableau de données contient des noms de colonnes (header=TRUE) ou bien si la première ligne correspondant au premier individu (header=FALSE).

Comment R procède si le paramètre header=TRUE/FALSE est manquant? Conseil : utiliser l’aide (séance 1) pour répondre à la question.

# Nettoyer l'espace de travail
rm(list=ls())

# Connaître l'emplacement de l'espace de travail
getwd()

# Définir l'emplacement de l'espace de travail
setwd("Bureau/LGA1A24/")
getwd()

MyFilesPath <- "Bureau/LGA1A24/"
setwd(MyFilesPath)
getwd()

# Charger la base de données (deux possibilités)

tabCommunes <- read.table("DonneeINSEE_RP2013_Communes.csv", sep=";", dec=".", header=TRUE)

tabCommunes <- read.csv("DonneeINSEE_RP2013_Communes.csv", sep=";", dec=".", header=TRUE)

1.2 - Description du tableau de données

Les données ainsi chargées prennent la forme d’un tableau de données (dataframe). Le type des diverses variables qu’il contient (variables qualitatives ou variables quantitatives de stock et de taux) est “deviné” par R au moment de l’importation. La fonction summary() permet de vérifier le type de chaque variable et renseigne sur leurs caractéristiques principales : nombre de modalités associées à une variable qualitative, valeurs centrales et paramètres de dispersion pour les variables quantitatives.

Quelle était en 2012 la population moyenne des communes du département (variable “P12_POP”)? A quel nombre s’élevait la population féminine des 25% des communes abritant le moins de femmes en 2012 (variable “P12_POPF”)? A combien s’élevait la population masculine communale la plus importante (variable “P12_POPH”)? Quel est le nombre de modalités de la variable “DEP” renseignant sur le département d’appartenance des communes?

summary(tabCommunes)

On remarque donc que R a automatiquement qualifié les variables contenant des données numériques en variables quantitatives. Or, les variables renseignant sur la région d’appartenance des communes en 2013 (“REG”) et en 2016 (“REG2016”), sur leur département (“DEP”) et leur aire urbaine de rattachement en 2010 (“UU2010”), ainsi que sur le code communal que leur attribue l’INSEE (“COM”) sont en fait des variables catégorielles (appelées factor pour facteur). Les modalités de ces variables n’ont donc aucun sens quantitatif et ne renvoit à aucune relation d’ordre. Il est donc nécessaire de changer le type de ces variables.

Changer le type de l’ensemble des variables catégorielles désignées comme des variables quantitatives lors de l’importation.

# vérification de la nature actuelle de la variable à changer
class(tabCommunes$REG)

# changement du type variable par variable
tabCommunes$REG <- as.factor(tabCommunes$REG)
class(tabCommunes$REG)

# nouvelle description de la table de données
summary(tabCommunes)

On remarque que l’ensemble des communes appartient à la région 23 (28 en 2016) et au département 76. Ces variables ne seront donc pas discriminantes dans les analyses. Nous pouvons donc les retirer du tableau de données.

Comment retirer plusieurs colonnes à la fois? Comment retirer une ligne? Conseil : vous référer à la première séance.

# recherche du numéro de colonne de la variable renseignant sur l'appartenance régionale
which(colnames(tabCommunes) == "REG")

# retrait de la variable 
tabCommunes <- tabCommunes[,-1]

2 - Analyses univariées

Exemple : analyse de la population communale en 2012.

2.1 - Caractéristiques de tendance centrale

Nous allons dans un premier temps “résumer” la distribution statistique en une valeur. L’on peut alors chercher à connaître quelle valeur concentre au maximum les individus : c’est le mode (attention, une distribution peut être multimodale); quelle valeur partage la population en groupes de même effectif : c’est la médiane (ou deuxième quartile) ; ou encore quelle valeur pourrait remplacer l’ensemble des valeurs prises par les individus si celles-ci se compensaient (c’est à dire si la distribution des valeurs était symétrique et centrée autour de cette valeur) : c’est la moyenne.

Notons qu’il n’y a pas de fonctions prédéfinies dans la base R pour calculer le mode. Nous allons donc dans un premier temps calculer la fréquence d’apparition des valeurs (c’est-à-dire calculer combien de communes ont une population de n,n+1,etc. habitants?), puis rechercher pour quelle valeur de population la fréquence est la plus élevée.

Quels sont les valeurs du (ou des) mode(s), médiane et moyenne de la distribution des populations communales de Seine-Maritime en 2012?.

# Création d'une table de fréquence
freq <- table(tabCommunes$P12_POP)
# Recherche du mode
freq[max(freq)==freq]

# calcul de la médiane
median(tabCommunes$P12_POP)

# Calcul de la moyenne
mean(tabCommunes$P12_POP)

2.2 Caractéristiques de dispersion

Le résumé d’une distribution que donne une valeur centrale ne permet pas de savoir comment se distribuent les individus autour de cette valeur, ni comment ils se répartissent entre les valeurs extrêmes (c’est-à-dire minimale et maximale). Ont-ils tendance à se concentrer autour de la médiane? de la moyenne? Ou bien sont-ils relativement dispersés? Plusieurs indicateurs permettent de décrire les caractéristiques de dispersion d’une distribution.

Dans un premier temps, on peut chercher à connaître les valeurs entre lesquelles les individus se répartissent (fréquemment). On peut alors calculer à connaître la différence entre la valeur maximale et la valeur minimale : c’est l’étendue de la distribution ; on peut également mesurer l’importance de l’écart des valeurs entre le premier et le dernier quantile (étendue qui comporte 50% des individus situés au centre de la distribution) : c’est l’écart interquantile.

Quelles sont les valeurs de l’étendue et de l’écart interquartile de la distribution? Lequel de ces deux indicateurs est le plus sensible aux valeurs extrêmes?.

# Calcul de l'étendue de la distribution
max(tabCommunes$P12_POP) - min(tabCommunes$P12_POP)

# Calcul de l'écart interquartile (Interquartile range : IQR)
IQR(tabCommunes$P12_POP)

Dans un second temps, on peut chercher à savoir si les modalités sont fréquemment éloignées ou proches des valeurs centrales de moyenne et de médiane. On peut donc calculer pour chaque variable son écart absolu à la moyenne (respectivement médiane), puis définir la somme de ces écarts à la moyenne (resp. médiane) et rapporter cette valeur au nombre d’individus, autrement dit calculer l’écart moyen des individus à la moyenne (resp. médiane).

Quel est l’écart moyen à la moyenne des populations communales de Seine-Maritime en 2012? Est-il supérieur à l’écart absolu moyen à la médiane? Pourquoi utilise-t-on l’écart absolu et non pas l’écart relatif? Aide : calculer la somme des écarts à la moyenne de la série de valeurs suivantes : 25, 20, 10, 0, -10, -20, -25.

# Calcul des écarts absolus des individus à la moyenne
absDistMean <- abs(tabCommunes$P12_POP - mean(tabCommunes$P12_POP))

# Calcul de la somme des écarts absolus à la moyenne
sumAbsDistMean <- sum(absDistMean)

# Calcul de l'écart absolu moyen à la moyenne
meanAbsDistMean <- sumAbsDistMean / length(absDistMean)
# ou :
mean(absDistMean)

# ou encore :
mean(abs(tabCommunes$P12_POP - mean(tabCommunes$P12_POP)))

Il est souvent utile de mettre en avant les valeurs extrêmes d’une distribution lorsque l’on cherche à en mesurer la dispersion. Pour cela, on ne calcule plus la somme des écarts absolus à la moyenne mais la “racine carrée de la moyenne des carrés des écarts à la moyenne”. C’est l’écart quadratique moyen, plus souvent appelé écart-type. La moyenne des carrés des écarts à la moyenne est appelée variance. L’écart-type correspond donc à la racine carrée de la variance.

En se construisant autour des carrés des écarts à la moyenne (et non pas autour des valeurs absolus des écarts à la moyenne), la variance va donner de l’importance aux valeurs extrêmes : ainsi, plus la valeur prise par un individu s’éloigne de la moyenne, plus cet éloignement à un poids important dans le calcul de la dispersion.

Quel est l’écart-type de la distribution des populations communales en Seine-Martime en 2012? En quoi diffère-t-il de l’écart absolue moyen? Aide : comparer la moyenne, l’écart absolu moyen à la moyenne et l’écart-type de la série de valeur A : 08, 08, 08, 08, 12, 12, 12, 12 et B : 02, 10, 10, 10, 10, 10, 10, 18.

# Calcul des carrés des écarts à la moyenne (écarts quadratiques)
quaDistMean <- (tabCommunes$P12_POP - mean(tabCommunes$P12_POP))^2

# Calcul de la moyenne des écarts quadratiques à la moyenne (variance)
meanQuaDistMean <- mean(quaDistMean)

# Calcul de la racine carré de la variance (écart-type)
sdQuaDistMean <- sqrt(meanQuaDistMean)
# ou :
sd(tabCommunes$P12_POP)

2.3 - Visualisation

Lorsque l’on décrit une variable dont la distribution est symétrique et unimodale, l’usage est de donner son écart-type après avoir donné sa moyenne. Lorsque la distribution est disymétrique et unimodale, on travaillera à partir des quartiles et de la médiane. Dans le cas d’une distribution bi ou plurimodale, on donne le nombre et la valeur de chaque mode. Il est ensuite recommandé de calculer les valeurs centrales et de dispersion pour chaque sous-groupe (valeurs regroupées autour du mode).

La représentation graphique d’une distribution apporte une aide visuelle lorsque l’on cherche à en définir la forme. On choisit généralement de représenter l’histogramme des fréquences : pour chaque valeur ou intervalle de valeurs, combien il y a-t-il d’individus? Chaque représentation graphique doit évidemment pouvoir être comprise par un lecteur extérieur : on n’oubliera donc pas de décrire les axes (nom et unité de la variable) et de nommer la figure. D’autre part, il est important de faire figurer la source des données, leur date de collecte/création, et le nombre d’individus représentés dans le graphique.

Changer le nombre d’intervalles de valeurs représentées et les couleurs du graphique (à l’aide de la fonction colors()). Définir un seuil maximal pour la population communale à représenter de 25 000 habitants (à l’aide du paramètre xlim=). Adapter le titre et la légende de la figure à ce nouveau graphique.

# Création de l'histogramme des valeurs prises

hist(tabCommunes$P12_POP, 
     breaks = 100,
     main = "Distribution des populations communales de Seine-Maritime (n = 745)",
     sub = "(Source : INSEE 2012)",
     xlab = "Nombre d'habitants",
     ylab = "Fréquence",
     col = "white",
     border = "black")

La distribution étant très asymétrique à gauche (on peut vérifier cette affirmation simplement, en vérifiant que le mode < médiane < moyenne), il peut également être intéressant d’adopter une échelle logarithmique sur l’axe des abscisses du graphique afin de mieux percevoir les fréquences de distribution des petites valeurs. Pour rappel, une distribution est dîte log-normale si la distribution du logarithme des valeurs suit une loi normale (distribution symétrique autour de la moyenne et l’essentiel des valeurs est contenu entre -2 écarts-types et +2 écarts-types).

# Création de l'histogramme du log des valeurs prises

hist(log(tabCommunes$P12_POP), 
     breaks = 100,
     main = "Distribution des populations communales de Seine-Maritime (n = 745)",
     sub = "(Source : INSEE 2012)",
     xlab = "Nombre d'habitants (en log)",
     ylab = "Fréquence",
     col = "white",
     border = "black")

Selon le degré de connaissance statistique supposé du destinataire du graphique, la représentation du logarithme d’une série statistique peut s’avérer peu pertinente. On peut alors choisir d’adopter une progression géométrique de l’étendue des intervalles de valeurs représentés sur l’axe des abscisses.

Après avoir sélectionner pour le graphique les seules communes de moins de 25 000 habitants, changer les étendues des intervalles de valeurs représentés sur l’axe des abscisses en adoptant une progression géométrique (par exemple : 0,2000,4000,8000,16000,25000 en utilisant le paramètre breaks=). Adapter le titre et la légende de la figure à ce nouveau graphique. Enregistrer les différents graphiques au format .png à l’aide de l’onglet Export de la fenêtre graphique.

3 - Analyse d’une variable qualitative

3.1 - Préparation des données

Nous souhaitons à présent savoir comment les 745 communes de Seine-Maritime se répartissent au sein des secteurs psychatriques. Afin de connaître cette répartition, il nous faut donc charger la base de données indiquant pour chaque commune son appartenance à un secteur.

# Charger la base de données (deux possibilités)
tabSecteurs <- read.table("DSecteur2013.csv", sep=";", dec=".", header=TRUE)

# Description de la base de données
summary(tabSecteurs)

On note que les noms de colonnes comportent des espaces et des caractères spéciaux, ce qui rend leur manipulation difficile. Nous allons donc les renommer en adoptant un codage simplifié.

# Noms actuels des colonnes
colnames(tabSecteurs)

# Chargement de la librairie plyr qui facilite la manipulation des objets
library(plyr)

# Attribution de nouveaux noms de variables
tabSecteurs <- rename(tabSecteurs, c("Secteur.de.Psy.Générale"="PSY_GEN", "code.commune"="COM", "COMMUNES"="LIBCOM", "Secteur.de.Psy.Enfant" = "PSY_ENF", "Population...de.18.ans" = "POP_18-", "Population.de.18.ans.et.." = "POP_18+"))

colnames(tabSecteurs)

D’autre part, on remarque qu’une fois encore nous devons précisé que les caractères numériques de la colonne “COM” décrivent non pas une variable quantitative mais des codes communaux, autrement dit des modalités de variable catégorielle.

# Type actuel de la variable "COM"
class(tabSecteurs$COM)

# Transformation de type de cette variable en facteur
tabSecteurs$COM <- as.factor(tabSecteurs$COM)

3.2 - Dénombrement et représentation graphique

Dans R, les modalités (levels) d’une variable catégorielle (factor) peuvent être dénombrées dans un tableau (table).

Notons que les codes désignant les différents secteurs psychatriques comportent des espaces, ce qui, de nouveau, complique la manipulation des variables. Avant de passer aux analyses, nous allons donc renommer les différentes modalités.

Quel secteur couvre le plus grand nombre de communes? Le plus petit? Quel est le nombre moyen de communes par secteur?

# Catégories (levels) actuelles de la variable "PSY_GEN"
levels(tabSecteurs$PSY_GEN)

# Attributions de nouveaux noms de catégories (utilisation de la fonction revalue du package plyr)
tabSecteurs$PSY_GEN <- revalue(tabSecteurs$PSY_GEN, c("G 01"="G_01", "G 02"="G_02", "G 03"="G_03", "G 04"="G_04", "G 05"="G_05", "G 06"="G_06", "G 07"="G_07", "G 08"="G_08", "G 09"="G_09", "G 10"="G_10", "intersectoriel"="Inter"))

levels(tabSecteurs$PSY_GEN)

# Calcul du nombre de communes (lignes) par secteurs de psychatrie générale
comPsyGen <- table(tabSecteurs$PSY_GEN)

On peut désormais représenter graphiquement la répartition des communes par secteurs psychatriques. La représentation d’un tableau de dénombrement de ce type se fait par le biais d’un diagramme en bâton (barplot).

# Représentation graphique du nombre de communes par secteurs psychatriques
barplot(comPsyGen, main="Répartition des communes par secteurs de psychatrie générale",
   xlab="Secteurs", ylab="Nombre de communes") 

Reproduire le diagramme en bâtons présenté ci-dessous.

4 - Visualisations interactives

Après avoir installé la librairie manipulate sur votre machine, vous réaliserez un graphique interactif (en vous aidant du code suivant) permettant de représenter la distribution de la population totale des communes de Seine-Maritime, la part de la population de moins de 18 ans dans chaque commune, la part des 18-64 ans et des 65 ans et plus (variables à créer). Vous commenterez également les différentes étapes du code.

library(manipulate)

manipulate(hist(x = tabCommunes[[myVar]], breaks = nbBreaks),
           nbBreaks = slider (min = 2, max = 20),
           myVar = picker("P12_POP"))

Pour visualisation interactive plus riche : H. Commenges et R. Cura, 2015, http://elementr.hypotheses.org/232