Nous allons partir du même jeu de données que précédemment, c’est-à-dire les résultats des élections US 2020 présentés dans l’introduction de cette partie: les données de vote aux élections présidentielles américaines croisées à des variables sociodémographiques. Le code est disponible sur Github.
#!pip install --upgrade xlrd #colab bug verson xlrd
#!pip install geopandas
import requests
url = 'https://raw.githubusercontent.com/linogaliana/python-datascientist/master/content/course/modelisation/get_data.py'
r = requests.get(url, allow_redirects=True)
open('getdata.py', 'wb').write(r.content)
import getdata
votes = getdata.create_votes_dataframes()
Le précédent chapitre visait à proposer un premier modèle pour comprendre les comtés où le parti Républicain l’emporte. La variable d’intérêt étant bimodale (victoire ou défaite), on était dans le cadre d’un modèle de classification.
Maintenant, sur les mêmes données, on va proposer un modèle de régression pour expliquer le score du parti Républicain. La variable est donc continue. Nous ignorerons le fait que ses bornes se trouvent entre 0 et 100 et donc qu’il faudrait, pour être rigoureux, transformer l’échelle afin d’avoir des données dans cet intervalle.
Ce chapitre utilise toujours le même jeu de données, présenté dans l’introduction de cette partie: les données de vote aux élections présidentielles américaines croisées à des variables sociodémographiques. Le code est disponible sur Github.
Principe général
Le principe général de la régression consiste à trouver une loi $h_\theta(X)$ telle que
$$ h_\theta(X) = \mathbb{E}_\theta(Y|X) $$
Cette formalisation est extrêmement généraliste et ne se restreint d’ailleurs par à la régression linéaire.
En économétrie, la régression offre une alternative aux méthodes de maximum de vraisemblance et aux méthodes des moments. La régression est un ensemble très vaste de méthodes, selon la famille de modèles (paramétriques, non paramétriques, etc.) et la structure de modèles.
La régression linéaire
C’est la manière la plus simple de représenter la loi $h_\theta(X)$ comme combinaison linéaire de variables $X$ et de paramètres $\theta$. Dans ce cas,
$$ \mathbb{E}_\theta(Y|X) = X\beta $$
Cette relation est encore, sous cette formulation, théorique. Il convient de l’estimer à partir des données observées $y$. La méthode des moindres carrés consiste à minimiser l’erreur quadratique entre la prédiction et les données observées (ce qui explique qu’on puisse voir la régression comme un problème de Machine Learning). En toute généralité, la méthode des moindres carrés consiste à trouver l’ensemble de paramètres $\theta$ tel que
$$ \theta = \arg \min_{\theta \in \Theta} \mathbb{E}\bigg[ \left( y - h_\theta(X) \right)^2 \bigg] $$
Ce qui, dans le cadre de la régression linéaire, s’exprime de la manière suivante:
$$ \beta = \arg\min \mathbb{E}\bigg[ \left( y - X\beta \right)^2 \bigg] $$
Lorsqu’on amène le modèle théorique ($\mathbb{E}_\theta(Y|X) = X\beta$) aux données, on formalise le modèle de la manière suivante:
$$ Y = X\beta + \epsilon $$
Avec une certaine distribution du bruit $\epsilon$ qui dépend des hypothèses faites. Par exemple, avec des $\epsilon \sim \mathcal{N}(0,\sigma^2)$ i.i.d., l’estimateur $\beta$ obtenu est équivalent à celui du Maximum de Vraisemblance dont la théorie asymptotique nous assure l’absence de biais, la variance minimale (borne de Cramer-Rao).
# packages utiles
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import sklearn.metrics
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
Exercice 1a : Régression linéaire avec scikit
Cet exercice vise à illustrer la manière d’effectuer une régression linéaire avec scikit
.
Dans ce domaine,
statsmodels
est nettement plus complet, ce que montrera l’exercice suivant.
L’intérêt principal de faire
des régressions avec scikit
est de pouvoir comparer les résultats d’une régression linéaire
avec d’autres modèles de régression. Cependant, le chapitre sur les
pipelines montrera qu’on peut très bien insérer, avec quelques efforts
de programmation orientée objet, une régression statsmodels
dans
un pipeline scikit
.
L’objectif est d’expliquer le score des Républicains en fonction de quelques variables. Contrairement au chapitre précédent, où on se focalisait sur un résultat binaire (victoire/défaite des Républicains), cette fois on va chercher à modéliser directement le score des Républicains.
- A partir de quelques variables, par exemple, ‘Unemployment_rate_2019’, ‘Median_Household_Income_2019’, ‘Percent of adults with less than a high school diploma, 2015-19’, “Percent of adults with a bachelor’s degree or higher, 2015-19”, expliquer la variable
per_gop
à l’aide d’un échantillon d’entraînementX_train
constitué au préalable.
⚠️ utiliser la variable Median_Household_Income_2019
en log
sinon son échelle risque d’écraser tout effet.
-
Afficher les valeurs des coefficients, constante comprise
-
Evaluer la pertinence du modèle avec le $R^2$ et la qualité du fit avec le MSE.
-
Représenter un nuage de points des valeurs observées et des erreurs de prédiction. Observez-vous un problème de spécification ?
# packages utiles
import statsmodels.api as sm
import statsmodels.formula.api as smf
Exercice 1b : Régression linéaire avec statsmodels
Cet exercice vise à illustrer la manière d’effectuer une régression linéaire avec statsmodels
qui offre des fonctionnalités plus proches de celles de R
, et moins orientées Machine Learning.
L’objectif est toujours d’expliquer le score des Républicains en fonction de quelques variables.
- A partir de quelques variables, par exemple, ‘Unemployment_rate_2019’, ‘Median_Household_Income_2019’, ‘Percent of adults with less than a high school diploma, 2015-19’, “Percent of adults with a bachelor’s degree or higher, 2015-19”, expliquer la variable
per_gop
. ⚠️ utiliser la variableMedian_Household_Income_2019
enlog
sinon son échelle risque d’écraser tout effet. - Afficher un tableau de régression.
- Evaluer la pertinence du modèle avec le R^2.
- Utiliser l’API
formula
pour régresser le score des républicains en fonction de la variableUnemployment_rate_2019
, deUnemployment_rate_2019
au carré et du log deMedian_Household_Income_2019
.
Hint
Pour sortir une belle table pour un rapport sous $\LaTeX$, il est possible d’utiliser
la méthode Summary.as_latex
. Pour un rapport HTML, on utilisera Summary.as_html
Note
Les utilisateurs de R
retrouveront des éléments très familiers avec statsmodels
,
notamment la possibilité d’utiliser une formule pour définir une régression.
La philosophie de statsmodels
est similaire à celle qui a influé sur la construction
des packages stats
et MASS
de R
: offrir une librairie généraliste, proposant
une large gamme de modèles. Néanmoins, statsmodels
bénéficie de sa jeunesse
par rapport aux packages R
. Depuis les années 1990, les packages R
visant
à proposer des fonctionalités manquantes dans stats
et MASS
se sont
multipliés alors que statsmodels
, enfant des années 2010, n’a eu qu’à
proposer un cadre général (les generalized estimating equations) pour
englober ces modèles.
La régression logistique
Ce modèle s’applique à une distribution binaire. Dans ce cas, $\mathbb{E}_{\theta}(Y|X) = \mathbb{P}_{\theta}(Y = 1|X)$. La régression logistique peut être vue comme un modèle linéaire en probabilité:
$$ \text{logit}\bigg(\mathbb{E}_{\theta}(Y|X)\bigg) = \text{logit}\bigg(\mathbb{P}_{\theta}(Y = 1|X)\bigg) = X\beta $$
La fonction $\text{logit}$ est $]0,1[ \to \mathbb{R}: p \mapsto \log(\frac{p}{1-p})$.
Elle permet ainsi de transformer une probabilité dans $\mathbb{R}$. Sa fonction réciproque est la sigmoïde ($\frac{1}{1 + e^{-x}}$), objet central du Deep Learning.
Il convient de noter que les probabilités ne sont pas observées, c’est l’outcome binaire (0/1) qui l’est. Cela amène à voir la régression logistique de deux manières différentes :
- En économétrie, on s’intéresse au modèle latent qui détermine le choix de l’outcome. Par exemple, si on observe les choix de participer ou non au marché du travail, on va modéliser les facteurs déterminant ce choix ;
- En Machine Learning, le modèle latent n’est nécessaire que pour classifier dans la bonne catégorie les observations
L’estimation des paramètres $\beta$ peut se faire par maximum de vraisemblance ou par régression, les deux solutions sont équivalentes sous certaines hypothèses.
Note
Par défaut, scikit
applique une régularisation pour pénaliser les modèles
peu parcimonieux (comportement différent
de celui de statsmodels
). Ce comportement par défaut est à garder à l’esprit
si l’objectif n’est pas de faire de la prédiction.
# packages utiles
from sklearn.linear_model import LogisticRegression
import sklearn.metrics
Exercice 2a : Régression logistique avec scikit
Avec scikit
, en utilisant échantillons d’apprentissage et d’estimation :
- Evaluer l’effet des variables déjà utilisées sur la probabilité des Républicains de gagner. Affichez la valeur des coefficients.
- Déduire une matrice de confusion et une mesure de qualité du modèle.
- Supprimer la régularisation grâce au paramètre
penalty
. Quel effet sur les paramètres estimés ?
# packages utiles
from scipy import stats
Exercice 2b : Régression logistique avec statmodels
En utilisant échantillons d’apprentissage et d’estimation :
- Evaluer l’effet des variables déjà utilisées sur la probabilité des Républicains de gagner.
- Faire un test de ratio de vraisemblance concernant l’inclusion de la variable de (log)-revenu.
Hint
La statistique du test est:
$$ LR = -2\log\bigg(\frac{\mathcal{L}{\theta}}{\mathcal{L}{\theta_0}}\bigg) = -2(\mathcal{l}{\theta} - \mathcal{l}{\theta_0}) $$