• Jaouad Madkour
  • Accueil
  • Licence
  • Master
  • Doctorat
  • Informatique
  • Publications
  • À propos

Introduction à l’économétrie

Mise en œuvre sur R et Python

Introduction à l'économétrie
  • Présentation du cours
  • Qu'est-ce que l'économétrie
  • De la théorie au modèle
  • Le modèle économétrique
  • Les moindres carrés ordinaires
  • La qualité de l'ajustement
  • L'inférence sur les coefficients
  • La prévision
  • Le modèle multiple et le ceteris paribus
  • Estimation et R carré ajusté
  • Les trois niveaux de test
  • Les variables qualitatives
  • Les hypothèses de Gauss-Markov
  • La carte des violations
  • La multicolinéarité
  • L'hétéroscédasticité
  • Les erreurs groupées
  • La variable omise
  • Normalité et points influents
  • Les formes fonctionnelles
  • Choisir un modèle, et le seuil de la causalité
  • Étude de cas
  • Mise en œuvre sur R et Python

Introduction à l’économétrie

Chapitre 21 : Mise en œuvre sur R et Python

Auteur·rice
Affiliation

Jaouad Madkour

Faculté d’Économie et de Gestion de Tanger

Date de publication

24 septembre 2026

Lire une sortie

Neuf nombres, et vous savez tous les lire

Sur R

Estimer

sal <- read.csv("salaires.csv", stringsAsFactors = TRUE)
sal$diplome <- relevel(sal$diplome, ref = "Bac")   # fixer la reference

m1 <- lm(salaire ~ anciennete, data = sal)
m2 <- lm(salaire ~ anciennete + diplome, data = sal)
m4 <- lm(salaire ~ anciennete + diplome + sexe + region, data = sal)

summary(m2)
confint(m2)                        # 247.65   293.19   pour l'anciennete
anova(m1, m2)                      # Fisher partiel : F = 164.0
Une ligne qui évite bien des contresens

relevel() fixe la modalité de référence. Sans elle, R prend la première par ordre alphabétique — ici « Bac », par chance.

Sur d’autres données, l’ordre alphabétique donne une référence absurde. Vérifiez toujours laquelle a été retenue.

Diagnostiquer

par(mfrow = c(2, 2)) ; plot(m2)    # les quatre graphiques d'un coup

library(lmtest) ; library(car) ; library(sandwich)

bptest(m2)                         # Breusch-Pagan : BP = 57.60, p = 1.9e-12
vif(m4)                            # tous inferieurs a 2.1
shapiro.test(residuals(m2))        # normalite rejetee
cooks.distance(m2) > 4/nrow(sal)   # les points a examiner
La commande la plus rentable du chapitre

plot(m2) produit les quatre graphiques du chapitre 12 en une instruction : résidus contre valeurs ajustées, quantile-quantile, échelle-position, résidus contre levier.

Quatre secondes, et l’essentiel du diagnostic est fait.

Corriger

# Ecarts-types robustes a l'heteroscedasticite (chapitre 14)
coeftest(m2, vcov = vcovHC(m2, type = "HC1"))

#                Estimate  Std. Error  t value
# (Intercept)     3320.42     144.37    23.00
# anciennete       270.27      13.00    20.78
# diplomeBac+2    1099.57     138.43     7.94
# diplomeBac+5    3336.99     226.28    14.75
Les coefficients n’ont pas bougé

Comparez à la sortie de summary(m2) : mêmes estimations au centime près, écarts-types différents.

C’est exactement ce que la théorie annonçait — et c’est la vérification la plus convaincante du chapitre 14.

L’enquête de ménages

men <- read.csv("menages.csv")
mk  <- lm(consommation ~ revenu, data = men)
mk2 <- lm(consommation ~ revenu + taille + milieu, data = men)

summary(mk)              # b1 = 0.6960, t = 47.3, R2 = 0.8490

# Tester l'hypothese de Keynes : beta1 = 1
linearHypothesis(mk, "revenu = 1")     # F = 426.9 , soit t = -20.66

L’enquête de ménages (suite)

# Ecarts-types de grappe, au niveau du quartier (chapitre 15)
coeftest(mk2, vcov = vcovCL(mk2, cluster = ~ quartier))
#                Estimate  Std. Error  t value
# revenu           0.7045      0.0232    30.35
# taille          70.6689     12.2912     5.75
# milieuUrbain   -99.4397    101.9173    -0.98
Deux lignes concluent deux chapitres

linearHypothesis teste n’importe quelle contrainte linéaire — ici la restriction que la théorie de Keynes impose. La démarche des quatre étapes s’achève sur une commande.

vcovCL corrige le regroupement. Comparez la ligne milieuUrbain à la sortie ordinaire : l’écart-type passe de 55{,}69 à 101{,}92, parce que cette variable est constante dans le quartier.

Sur Python

Les mêmes opérations

import pandas as pd, statsmodels.formula.api as smf
import statsmodels.stats.api as sms

sal = pd.read_csv("salaires.csv")
m2 = smf.ols("salaire ~ anciennete + C(diplome, Treatment('Bac'))",
             data=sal).fit()
print(m2.summary())
m2.conf_int()

Les mêmes opérations (suite)

# Heteroscedasticite
sms.het_breuschpagan(m2.resid, m2.model.exog)     # (57.60, 1.9e-12, ...)
m2r = m2.get_robustcov_results(cov_type="HC1")    # ecarts-types robustes
La correspondance des commandes
R Python
lm smf.ols(...).fit()
relevel C(var, Treatment('ref'))
anova(m1, m2) m2.compare_f_test(m1)
vcovHC get_robustcov_results(cov_type="HC1")
vcovCL cov_type="cluster", cov_kwds={...}
vif variance_inflation_factor

La régression finale de Mincer

import numpy as np
sal["lsal"] = np.log(sal.salaire)

mincer = smf.ols("lsal ~ anciennete + C(diplome, Treatment('Bac'))"
                 " + C(region, Treatment('Autres'))", data=sal).fit()

# anciennete       0.0345   ->  +3.5 %
# Bac+5            0.4353   ->  +54.5 %   (exp(0.4353) - 1)
# R-squared        0.654
100 * (np.exp(mincer.params) - 1)      # les effets exacts en pourcentage
La dernière ligne mérite d’être écrite à chaque fois

Elle convertit tous les coefficients en pourcentages exacts, sans l’approximation 100\beta.

Sur le Bac+5, la différence est de onze points : 43{,}5 contre 54{,}5. C’est une erreur d’interprétation très répandue, et une ligne de code la supprime.

Ce que le logiciel ne fait pas

Trois choses, et ce sont les trois qui comptent

Il ne choisit pas les variables

La spécification vient de la théorie économique. Aucune procédure automatique ne remplace la question : quelles variables devraient figurer dans ce modèle, et lesquelles manquent ?

Il ne signale pas les variables omises, ni l’endogénéité

La sortie reste parfaitement propre. Le R^2 est honorable, les t écrasants, les résidus impeccables — et le coefficient peut être faux.

C’est le chapitre 16 et le chapitre 19 réunis, et c’est ce qui distingue un économètre d’un utilisateur de logiciel.

Ce qu’il faut retenir

Le résumé du chapitre

Six points
  1. lm et smf.ols estiment ; tout le reste de la sortie a été calculé à la main.
  2. relevel ou Treatment fixent la référence des indicatrices : à vérifier systématiquement.
  3. plot(m) donne les quatre graphiques de diagnostic en une instruction.
  4. vcovHC et vcovCL corrigent les écarts-types sans toucher aux coefficients.
  5. linearHypothesis teste une contrainte économique — c’est l’étape 4 de la démarche.
  6. Le logiciel ne choisit pas les variables et ne signale jamais l’endogénéité.
La fin du parcours

Quatre cours, un seul fichier de cinq cents salariés. On l’a décrit, on en a fait un modèle de hasard, on en a tiré des échantillons pour estimer et tester, et l’on a fini par expliquer le salaire par l’ancienneté, le diplôme et la région.

Aucun de ces quatre cours n’a introduit d’outil que le précédent n’annonçait pas. C’est une seule discipline, enseignée en quatre fois — et ce que vous savez maintenant lire, un tableau de régression, en est l’aboutissement.

← Chapitre précédentÉtude de cas

Ressources du chapitre

  • Diapositives
  • Polycopié du chapitre
  • Exercices corrigés
  • Application interactive
  • — Vidéo
  • QCM (bientôt)

© 2026 Jaouad Madkour · jmadkour.org

jmadkour@uae.ac.ma

construit avec Quarto