Introduction

La régression logistique est un genre de régression permettant de prédire le comportement d’une variable qualitative en fonction de plusieurs variables qualitatives ou quantitatives. La régression logistique permet d’effectuer un raisonnement dit “toutes choses étant égales par ailleurs”, elle a pour but d’isoler les effets des variables explicatives sur une variable a expliquer.

“Parler de techniques « toutes choses égales par ailleurs » fait appel à l’idée que si un phénomène social est dû à plusieurs causes, il peut être intéressant de voir l’effet propre de chacune des causes, indépendamment des autres.[…] [S]i le fait d’avoir un fort niveau d’étude encourage à la lecture, et si l’on sait que les femmes lisent plus que les hommes : comme les deux aspects vont ensemble, on souhaite avoir une méthode qui neutralise l’effet de sexe pour isoler l’effet de niveau d’étude (et inversement qui neutralise l’effet de niveau d’étude pour avoir l’effet de sexe).1

Principe élémentaire

Nous allons voir ici comment l’employer pour modéliser le comportement d’une variable binaire c’est à dire, une variable qualitative à deux modalités : une variable pour laquelle il n’existe que deux réponses possibles, comme par exemple, dans un questionnaire une question demandant si les répondants font du sport ou non.

Pour la régression linéaire simple on a modélisé les données avec une équation du type \(y = ax + b\) :

Pour la régression logistique on va calculer une équation de type \(y = ax_1 + bx_2 + cx_3\) :

La pratique du sport

En reprenant l’enquête employée dans le tutoriel sur la régression logistique de Jospeh Larmarrange, nous allons étudier la pratique d’un sport au regard de de l’âge, du sexe, du niveau d’étude, de la pratique religieuse et du nombre moyen d’heures passées à regarder la télévision par jour. En d’autres termes nous allons chercher à savoir ce qui, toute chose égale par ailleurs, explique le mieux la pratique d’un sport.

Dans notre exemple, “pratique un sport” est donc la variable a expliquer et l’âge, le sexe, le niveau d’étude, la pratique religieuse et le fait de regarder la TV sont les variables explicatives.

Premier regard sur les données

Nous allons donc employer une base de données extraite de l’enquête histoire de vie réalisée par l’INSEE en 2003. Le fichier contient 2000 individus et 6 variables. Vous pouvez le télécharger en cliquant ici.

On a importé les données et on les a mis dans un objet nommé d2.

str(d2)
## 'data.frame':    2000 obs. of  6 variables:
##  $ sport    : Factor w/ 2 levels "Non","Oui": 1 2 2 2 1 2 1 1 1 2 ...
##  $ sexe     : Factor w/ 2 levels "Homme","Femme": 2 2 1 1 2 2 2 1 2 1 ...
##  $ grpage   : Factor w/ 4 levels "[16,25)","[25,45)",..: 2 1 3 2 4 2 3 3 1 2 ...
##  $ etud     : Factor w/ 4 levels "Primaire","Secondaire",..: 4 NA 1 4 1 3 1 3 NA 3 ...
##  $ relig    : Factor w/ 6 levels "Pratiquant regulier",..: 4 4 4 3 1 4 3 4 3 2 ...
##  $ heures.tv: num  0 1 0 2 3 2 2.9 1 2 2 ...
  • La première variable est intitulée “sport” indique si le répondant pratique un sport, elle a deux modalités : “Non” ou “Oui”.
  • La deuxième “sexe” indique selon deux modalités le genre des répondants (c’était encore l’usage lors de la constitution de l’enquête).
  • grpage” indique l’âge des répondants en 4 classes : de 16 à 25 ans, de 25 à 45 ans, de 45 à 65 ans et, enfin, plus de 65 ans. Il s’agit d’une variable qualitative à 4 modalités.
  • etud” est une variable qualitative indiquant le niveau d’étude : primaire, secondaire, technique et supérieur.
  • relig” est un variable qualitative indiquant la proximité aux pratiques religieuses.
  • heures.tv” est la seule variable quantitative de la base, elle indique le nombres d’heures de télévision par jour du répondant.

Voyons maintenant les première lignes de la base grâce à la commande head().

sport sexe grpage etud relig heures.tv
Non Femme [25,45) Supérieur Ni croyance ni appartenance 0
Oui Femme [16,25) NA Ni croyance ni appartenance 1
Oui Homme [45,65) Primaire Ni croyance ni appartenance 0
Oui Homme [25,45) Supérieur Appartenance sans pratique 2
Non Femme [65,99] Primaire Pratiquant regulier 3
Oui Femme [25,45) Technique/Professionnel Ni croyance ni appartenance 2

Le premier répondant ne pratique pas de sport, est une femme, a entre 25 et 45 ans, a fait des étude dans le supérieur, n’a pas de croyances religieuses et ne regarde pas la télévision. Le deuxième fait du sport, est une femme qui a entre 16 et 25 ans, on ne connaît pas sont niveau d’étude, elle n’a pas de croyances religieuses et regarde la télévision une heure en moyenne par jour. Et ainsi de suite…

Tris à plats

Voyons maintenant les tri à plats, c’est à dire un résumé de chacune des variables :

summary(d2)
##  sport         sexe          grpage                         etud    
##  Non:1277   Homme: 899   [16,25):169   Primaire               :466  
##  Oui: 723   Femme:1101   [25,45):706   Secondaire             :387  
##                          [45,65):745   Technique/Professionnel:594  
##                          [65,99]:380   Supérieur              :441  
##                                        NA's                   :112  
##                                                                     
##                                                                     
##                          relig       heures.tv     
##  Pratiquant regulier        :266   Min.   : 0.000  
##  Pratiquant occasionnel     :442   1st Qu.: 1.000  
##  Appartenance sans pratique :760   Median : 2.000  
##  Ni croyance ni appartenance:399   Mean   : 2.247  
##  Rejet                      : 93   3rd Qu.: 3.000  
##  NSP ou NVPR                : 40   Max.   :12.000  
##                                    NA's   :5

Sur les 2000 individus 1277 ne pratique pas de sport et 723 en font, 899 sont des hommes le reste sont des femmes, 169 ont entre 16 et 25 ans au moment de l’enquête, etc.

Visualisations des variables

Représentons chaque variables pas un graphique grâce aux commandes pie(), barplot() et hist()

Mis en oeuvre de la regression logistique binaire

Maintenant que nous avons regardé rapidement les données nous allons chercher à savoir quelles sont celles influençant la pratique d’un sport.

Pour réaliser la regression logistique nous allons employer la commande glm() et mettre le résultat du calcul dans un objet que l’on nomme reg.

reg <- glm(sport ~ sexe + grpage + etud + relig + heures.tv, data = d2, family = binomial(logit))

Dans la commande glm() on indique la formule sport ~ sexe + grpage + etud + relig + heures.tv qui signifie : explique la variable “sport” en fonction des variables “sexe”, “age”, “étude”, “religion”, et “télévision”. La variable sport est la variable a expliquer et les autres variables figurant dans la formaule sont les variables explicatives.

On indique ensuite sur quelles données on applique le calcul data = d2 et on lui indique qu’il s’agit d’une régression logistique binomial(logit).

Le résultat du calcul se trouve dans l’objet reg que l’on peut consulter grâce à la commande summary()

summary(reg)
## 
## Call:
## glm(formula = sport ~ sexe + grpage + etud + relig + heures.tv, 
##     family = binomial(logit), data = d2)
## 
## Deviance Residuals: 
##    Min      1Q  Median      3Q     Max  
## -1.687  -0.888  -0.512   1.036   2.418  
## 
## Coefficients:
##                                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                      -0.365890   0.354593  -1.032 0.302138    
## sexeFemme                        -0.370927   0.109143  -3.399 0.000677 ***
## grpage[25,45)                    -0.415192   0.251623  -1.650 0.098932 .  
## grpage[45,65)                    -1.089470   0.257836  -4.225 2.38e-05 ***
## grpage[65,99]                    -1.374148   0.290661  -4.728 2.27e-06 ***
## etudSecondaire                    0.943494   0.197497   4.777 1.78e-06 ***
## etudTechnique/Professionnel       1.055889   0.190103   5.554 2.79e-08 ***
## etudSupérieur                     1.883470   0.195351   9.641  < 2e-16 ***
## religPratiquant occasionnel      -0.100080   0.194664  -0.514 0.607173    
## religAppartenance sans pratique  -0.003265   0.179760  -0.018 0.985507    
## religNi croyance ni appartenance -0.254390   0.200616  -1.268 0.204783    
## religRejet                       -0.335427   0.296010  -1.133 0.257146    
## religNSP ou NVPR                  0.008889   0.410482   0.022 0.982724    
## heures.tv                        -0.125536   0.034565  -3.632 0.000281 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2407.2  on 1882  degrees of freedom
## Residual deviance: 2087.0  on 1869  degrees of freedom
##   (117 observations deleted due to missingness)
## AIC: 2115
## 
## Number of Fisher Scoring iterations: 4

Interpréter les coefficients de régression

On peut reconnaître ici le même genre de résultat que pour la régression linéaire. Ce qui nous intéresse en premier lieu ce sont les coefficients de régression. On les affiches grâce à la commande coef() appliquée sur l’objet dans lequel figure la régression (‘reg’ dans notre exemple), mais ils ne sont pas interpretables en l’état il faut leur appliquer la fonction exponentielle ainsi.

exp(coef(reg))
##                      (Intercept)                        sexeFemme 
##                        0.6935791                        0.6900941 
##                    grpage[25,45)                    grpage[45,65) 
##                        0.6602135                        0.3363947 
##                    grpage[65,99]                   etudSecondaire 
##                        0.2530550                        2.5689412 
##      etudTechnique/Professionnel                    etudSupérieur 
##                        2.8745284                        6.5762829 
##      religPratiquant occasionnel  religAppartenance sans pratique 
##                        0.9047655                        0.9967400 
## religNi croyance ni appartenance                       religRejet 
##                        0.7753891                        0.7150330 
##                 religNSP ou NVPR                        heures.tv 
##                        1.0089282                        0.8820239

R affiche chaques modalités figurant dans la formule avec une valeur :

  • sexefemme : 0,69
  • grpage[25-45) : 0,66
  • grpage[45,65) : 0,33
  • etc.

Ces valeures sont appellées des Odds ratio, pour les interpréter il faut estimer si ils sont plus petit ou plus grand que \(1\) :

  • égal à \(1\) la modalité explicative n’a pas d’effet sur la variable a expliquer.
  • lorsqu’ils sont largement supérieur à \(1\) cela signifie qu’il participe à l’augmentation de la variable a expliquer.
  • inversement une valeur largement inférieur à \(1\) indique une diminution de la variable à expliquer.

On voit ici que la modalité etudSupérieur a un coefficient égal a 6,57. On va interpréter cette valeur en disant : “Toutes choses égales par ailleurs, les répondants faisant des études supérieur ont 6,5 fois plus de chances des faire du sport que les autres”. On peut aussi dire “Dans l’échantillon faire des études supérieur multiplie par 6,5 les chances de faire du sport”.

Pour la modalité grpage[45-65), qui représente la classe d’âge 45-65 ans on voit que l’Odd ratio est égal à 0,25. Comme multiplier par 0,25 revient à multiplier par 1/4 ce qui est la même chose que diviser par 4, on va donc l’interpréter ainsi : “le fait d’appartenir à la classe d’âge 45-65 ans divise par 4 les chances de faire du sport”.

Ces interprétations constituent l’objectif principale de la régression linéaire.

Intervalles de confiance

Afin de rendre cette interprétation plus robuste nous devons consulter les intervalles de confiance des coefficients, ce qui correspond globalement à une marge d’erreurs donné pour chaque coefficient. On les affiches ainsi :

exp(confint(reg))
## Waiting for profiling to be done...
##                                      2.5 %    97.5 %
## (Intercept)                      0.3455859 1.3900306
## sexeFemme                        0.5569178 0.8544113
## grpage[25,45)                    0.4017418 1.0802956
## grpage[45,65)                    0.2021701 0.5569551
## grpage[65,99]                    0.1424857 0.4461755
## etudSecondaire                   1.7526049 3.8061107
## etudTechnique/Professionnel      1.9924733 4.2031165
## etudSupérieur                    4.5133661 9.7174768
## religPratiquant occasionnel      0.6185059 1.3276229
## religAppartenance sans pratique  0.7021228 1.4216262
## religNi croyance ni appartenance 0.5236403 1.1504813
## religRejet                       0.3974974 1.2715124
## religNSP ou NVPR                 0.4395959 2.2191447
## heures.tv                        0.8235449 0.9431143

Pour reprendre l’exemple des répondants ayant un niveau d’étude dans le supérieur on a vu qu’ils ont 6,5 fois plus de chances que les autres de faire du sport et l’intervalle de confiance est de 4,5 à 9,1. On pourrait donc aussi interpréter en disant qu’ils ont au moins 4,5 fois plus de chances de faire au sport et au plus 9 fois plus de chances.

Comment savoir si les Odds ratio sont éloignés de 1 ?

Pour savoir si un odd ratio diffère significativement de 1, on regarde la colonne Pr(>|z|) obtenue avec summary().

summary(reg)
## 
## Call:
## glm(formula = sport ~ sexe + grpage + etud + relig + heures.tv, 
##     family = binomial(logit), data = d2)
## 
## Deviance Residuals: 
##    Min      1Q  Median      3Q     Max  
## -1.687  -0.888  -0.512   1.036   2.418  
## 
## Coefficients:
##                                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                      -0.365890   0.354593  -1.032 0.302138    
## sexeFemme                        -0.370927   0.109143  -3.399 0.000677 ***
## grpage[25,45)                    -0.415192   0.251623  -1.650 0.098932 .  
## grpage[45,65)                    -1.089470   0.257836  -4.225 2.38e-05 ***
## grpage[65,99]                    -1.374148   0.290661  -4.728 2.27e-06 ***
## etudSecondaire                    0.943494   0.197497   4.777 1.78e-06 ***
## etudTechnique/Professionnel       1.055889   0.190103   5.554 2.79e-08 ***
## etudSupérieur                     1.883470   0.195351   9.641  < 2e-16 ***
## religPratiquant occasionnel      -0.100080   0.194664  -0.514 0.607173    
## religAppartenance sans pratique  -0.003265   0.179760  -0.018 0.985507    
## religNi croyance ni appartenance -0.254390   0.200616  -1.268 0.204783    
## religRejet                       -0.335427   0.296010  -1.133 0.257146    
## religNSP ou NVPR                  0.008889   0.410482   0.022 0.982724    
## heures.tv                        -0.125536   0.034565  -3.632 0.000281 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2407.2  on 1882  degrees of freedom
## Residual deviance: 2087.0  on 1869  degrees of freedom
##   (117 observations deleted due to missingness)
## AIC: 2115
## 
## Number of Fisher Scoring iterations: 4

On voit que les modalités s’éloignant le plus de 1 sont celles qui, dans la colonnes Pr(>|z|) ont une p-value plus petite que 0,05 % (indiquées par ***) : sexeFemme, grpage[45,65), grpage[65,99], les trois modalités etud, et la variables heures.tv.

On peut tout afficher ainsi :

library(questionr)
odds.ratio(reg)
## Waiting for profiling to be done...
##                                       OR   2.5 % 97.5 %         p    
## (Intercept)                      0.69358 0.34559 1.3900 0.3021384    
## sexeFemme                        0.69009 0.55692 0.8544 0.0006774 ***
## grpage[25,45)                    0.66021 0.40174 1.0803 0.0989317 .  
## grpage[45,65)                    0.33639 0.20217 0.5570 2.385e-05 ***
## grpage[65,99]                    0.25306 0.14249 0.4462 2.271e-06 ***
## etudSecondaire                   2.56894 1.75260 3.8061 1.777e-06 ***
## etudTechnique/Professionnel      2.87453 1.99247 4.2031 2.787e-08 ***
## etudSupérieur                    6.57628 4.51337 9.7175 < 2.2e-16 ***
## religPratiquant occasionnel      0.90477 0.61851 1.3276 0.6071727    
## religAppartenance sans pratique  0.99674 0.70212 1.4216 0.9855074    
## religNi croyance ni appartenance 0.77539 0.52364 1.1505 0.2047825    
## religRejet                       0.71503 0.39750 1.2715 0.2571464    
## religNSP ou NVPR                 1.00893 0.43960 2.2191 0.9827240    
## heures.tv                        0.88202 0.82354 0.9431 0.0002813 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Améliorer le modèle

Il est aussi utile d’identifier les variables explicatives ayant peu d’importance dans le modèle, celles qui ont peu d’influence sur la variable à expliquer. La méthode consiste à reproduire la régression plusieurs fois en enlevant chaque variable une fois, la commande permettant de le faire automatiquement est step().

reg2 <- step(reg)
## Start:  AIC=2115.03
## sport ~ sexe + grpage + etud + relig + heures.tv
## 
##             Df Deviance    AIC
## - relig      5   2091.3 2109.3
## <none>           2087.0 2115.0
## - sexe       1   2098.6 2124.6
## - heures.tv  1   2100.8 2126.8
## - grpage     3   2139.2 2161.2
## - etud       3   2198.6 2220.6
## 
## Step:  AIC=2109.33
## sport ~ sexe + grpage + etud + heures.tv
## 
##             Df Deviance    AIC
## <none>           2091.3 2109.3
## - sexe       1   2102.0 2118.0
## - heures.tv  1   2105.0 2121.0
## - grpage     3   2141.5 2153.5
## - etud       3   2203.0 2215.0

La commande test plusieurs modèles en enlevant une variable à chaque étape. Le colonne AIC permet de choisir quelle régression est la plus efficace, il s’agit d’une mesure de la qualité d’un modèle statistique. C’est la valeur de ce critère la plus petite qui indique le meilleurs modèle, dans notre cas il s’agit de la suppression de “relig” qui lorsqu’elle n’appairait pas dans le modèle minimise le critère AIC (2109,3), la variable qui représente les pratiques religieuses a donc peu d’effet sur notre modèle, il n’est pas nécessaire qu’elle soit prise en compte pour expliquer la pratique sportive. On créer ainsi une nouvelle régression plus efficace que l’on peut consulter avec la commande summary() :

summary(reg2)
## 
## Call:
## glm(formula = sport ~ sexe + grpage + etud + heures.tv, family = binomial(logit), 
##     data = d2)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.6328  -0.8989  -0.5020   1.0420   2.3826  
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                  -0.4936     0.3219  -1.533 0.125227    
## sexeFemme                    -0.3511     0.1076  -3.263 0.001100 ** 
## grpage[25,45)                -0.3894     0.2500  -1.557 0.119358    
## grpage[45,65)                -1.0383     0.2548  -4.075 4.61e-05 ***
## grpage[65,99]                -1.3099     0.2868  -4.568 4.93e-06 ***
## etudSecondaire                0.9240     0.1969   4.693 2.69e-06 ***
## etudTechnique/Professionnel   1.0353     0.1891   5.476 4.36e-08 ***
## etudSupérieur                 1.8715     0.1946   9.620  < 2e-16 ***
## heures.tv                    -0.1247     0.0344  -3.625 0.000289 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2407.2  on 1882  degrees of freedom
## Residual deviance: 2091.3  on 1874  degrees of freedom
##   (117 observations deleted due to missingness)
## AIC: 2109.3
## 
## Number of Fisher Scoring iterations: 4

Représentations graphique des résultats de régression

Pour finir, différentes bibliothèques de fonction existent permettant de représenter graphiquement la régression logistique.

Dans le package forestmodel la commande du même nom représente les Odds ratio et les p-value associées.

library(forestmodel)
## Loading required package: ggplot2
forest_model(reg)

Il existe aussi la possibilité de représenter le comportement de chaque variable explicatives sur la variable a expliquer.

library(effects)
plot(allEffects(reg))

Conditions d’application de la régression logistique

Pour réaliser une régression logistique, il est nécessaire d’avoir un nombre suffisant de données : au moins 10 fois plus d’individus que de modalités de variables explicatives.

Plus d’informations

Voir en vidéo le cours de Joseph Larmarrange datant de 2021 : https://www.youtube.com/watch?v=-bdMv2aAqUY ou bien la page de tutoriel : https://larmarange.github.io/analyse-R/regression-logistique.html#pr%C3%A9paration-des-donn%C3%A9es

La page Wikipédia : Régression logistique. (2022). In Wikipédia. https://fr.wikipedia.org/w/index.php?title=R%C3%A9gression_logistique&oldid=196346123


  1. Cibois, P. (2014). Les techniques d’analyse « toutes choses égales par ailleurs ». In Les méthodes d’analyse d’enquêtes. ENS Éditions. http://books.openedition.org/enseditions/1463↩︎