Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
UNIVERSITÉ DE BORDEAUX
Master Finance — Finance Durable
GUIDE DE RÉPLICATION
Modèles Économétriques & Statistiques
Étude ESG & Coût de la dette — CAC 40 (2015–2024)
Procédures pas-à-pas pour R / RStudio et XLStat
14 modèles de régression • Tests statistiques complets • Résultats attendus
N = 352 observations • 39 entreprises • 2015–2024
Université de Bordeaux — Master Finance | Guide Économétrie | Page 1
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
Table des matières
Ce guide documente les procédures exactes pour reproduire l'intégralité des analyses
statistiques et économétriques du mémoire dans deux logiciels : R/RStudio et XLStat. Chaque
section correspond à un groupe de modèles et présente le code R complet, les menus XLStat
étape par étape, et les résultats numériques attendus.
§ Section Fonctions clés
1 Prérequis et préparation des données R (packages) + XLStat (import)
2 Statistiques descriptives describe(), summary(), XLStat >
Describing data
3 Matrice de corrélations [Link](), rcorr(), XLStat >
Correlation
4 M1 — MCO Poolé (baseline) lm(), stargazer(), XLStat > Linear
regression
5 M2 — Effets Fixes Individuels plm(model='within'), XLStat > Panel >
FE
6 M3 — Effets Fixes Doubles (two-way) plm(effect='twoways'), XLStat > Panel
> Two-way
7 M4 — Piliers E et S lm() sur sous-échantillon ESG_E/S
8 M5 — ESG Décalé (t-1) lag() + lm(), XLStat > Lagged
variables
9 M6 — OLS + Interaction Sectorielle lm() avec terme interaction
10 M7 — EF + Interaction Sectorielle plm() avec terme interaction
11 M8 & M9 — Chocs Paris/Covid Variables dummy + plm()
12 M10/M11 — Secteurs séparés (OLS) lm() sur sous-panels
13 M12/M13 — Secteurs séparés (EF) plm() sur sous-panels
14 M14 — Piliers + Interaction lm() sur N=108
15 Tests de spécification Hausman, Breusch-Pagan, VIF, Durbin-
Watson
16 Export et mise en forme des résultats stargazer(), [Link]()
Université de Bordeaux — Master Finance | Guide Économétrie | Page 2
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
1. Prérequis et Préparation des Données
1.1 Installation des packages R nécessaires
Ouvrir RStudio et exécuter le code suivant dans la console pour installer tous les packages
nécessaires à la réplication des 14 modèles.
R
# ─────────────────────────────────────────────────────
# INSTALLATION DES PACKAGES
# À exécuter une seule fois
# ─────────────────────────────────────────────────────
[Link](c(
"plm", # Econométrie des données de panel (effets fixes)
"lmtest", # Tests diagnostiques (Breusch-Pagan, Durbin-Watson)
"sandwich", # Écarts-types robustes (heteroscedasticity)
"car", # VIF (Variance Inflation Factor), Durbin-Watson
"stargazer", # Export des tableaux de régression LaTeX/HTML/text
"Hmisc", # rcorr() : matrice de corrélations avec p-values
"psych", # describe() : statistiques descriptives complètes
"tidyverse", # dplyr, ggplot2 pour manipulation et visualisation
"readxl", # Lecture du fichier Excel de données
"writexl", # Export des résultats en Excel
"ggplot2", # Graphiques
"corrplot", # Visualisation matrice de corrélations
"modelsummary",# Tableaux de régression modernes
"broom" # Tidying des résultats de régression
))
# Charger tous les packages
library(plm); library(lmtest); library(sandwich); library(car)
library(stargazer); library(Hmisc); library(psych); library(tidyverse)
library(readxl); library(writexl); library(corrplot); library(modelsummary)
1.2 Import et préparation des données depuis Excel
Le fichier Excel (onglet '6. Données Panel') contient les 352 observations avec toutes les
variables calculées. Importer ce fichier dans R :
R
# ─────────────────────────────────────────────────────
# IMPORT DES DONNÉES
# ─────────────────────────────────────────────────────
# Adapter le chemin vers votre fichier Excel
panel <- read_excel("analyse_esg_cac40_2015_2024.xlsx",
sheet = "6. Données Panel",
Université de Bordeaux — Master Finance | Guide Économétrie | Page 3
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
skip = 2) # Sauter les 2 lignes de titre
# Vérifier l'import
head(panel)
dim(panel) # Doit afficher : 352 11
names(panel)
# Renommer les colonnes si nécessaire
colnames(panel) <- c("company", "Sector", "year", "CoD", "ESG",
"ESG_E", "ESG_S", "Leverage", "Size", "ROA", "D_Ind")
# Vérification des types
str(panel)
# Forcer les types corrects
panel$year <- [Link](panel$year)
panel$D_Ind <- [Link](panel$D_Ind)
panel$Sector <- [Link](panel$Sector)
# Variables supplémentaires
panel$ESG_lag1 <- ave(panel$ESG, panel$company,
FUN = function(x) c(NA, head(x, -1)))
panel$D_PostParis <- [Link](panel$year >= 2016)
panel$D_Covid <- [Link](panel$year %in% c(2020, 2021))
panel$ESG_x_Ind <- panel$ESG * panel$D_Ind
panel$ESG_x_Paris <- panel$ESG * panel$D_PostParis
# Résumé rapide
cat('N total:', nrow(panel), '\n')
cat('Firmes :', length(unique(panel$company)), '\n')
cat('Années :', min(panel$year), '-', max(panel$year), '\n')
table(panel$Sector)
✅ Résultat attendu : Résultat attendu : dim(panel) → [1] 352 14 (11 colonnes originales + 5 variables
créées). table(Sector) → Industriel: 140, Services: 212
1.3 Déclaration du panel dans plm
R
# ─────────────────────────────────────────────────────
# DÉCLARATION DU PANEL DATA FRAME (objet [Link])
# ─────────────────────────────────────────────────────
# Créer l'objet panel pour les modèles plm
pdata <- [Link](panel, index = c("company", "year"))
# Vérification
pdim(pdata) # Balanced/unbalanced panel
# Résultat attendu :
# Unbalanced Panel: n = 39, T = 1-10, N = 352
# Sous-panels sectoriels
Université de Bordeaux — Master Finance | Guide Économétrie | Page 4
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
panel_ind <- subset(panel, Sector == 'Industriel')
panel_svc <- subset(panel, Sector == 'Services')
pdata_ind <- [Link](panel_ind, index = c('company', 'year'))
pdata_svc <- [Link](panel_svc, index = c('company', 'year'))
cat('Industriel: N =', nrow(panel_ind), '\n')
cat('Services: N =', nrow(panel_svc), '\n')
✅ Résultat attendu : pdim(pdata) → Unbalanced Panel: n=39, T=1-10, N=352
1.4 Import dans XLStat
Pour importer les données dans XLStat (add-in Excel) :
1. Ouvrir le fichier analyse_esg_cac40_2015_2024.xlsx dans Excel
2. Aller sur l'onglet '6. Données Panel'
3. Sélectionner toutes les données (colonnes A:K, de la ligne d'en-tête jusqu'à la dernière
observation)
4. Dans le ruban XLStat, cliquer sur Préparer les données → Gérer les données manquantes →
vérifier qu'il n'y a aucune cellule vide dans CoD, ESG, Leverage, Size, ROA
5. Pour les modèles de panel : XLStat reconnaît automatiquement l'identifiant entreprise
(colonne A) et l'année (colonne C) comme variables d'index
⚠️Attention : Dans XLStat, s'assurer que les colonnes ESG_E et ESG_S ne sont utilisées que pour
M4/M14 (N=108, lignes 2022–2025 seulement). Les lignes avec ESG_E vide doivent être exclues
manuellement pour ces modèles.
Université de Bordeaux — Master Finance | Guide Économétrie | Page 5
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
2. Statistiques Descriptives
2.1 Procédure R
R
# ─────────────────────────────────────────────────────
# STATISTIQUES DESCRIPTIVES
# ─────────────────────────────────────────────────────
vars_desc <- c('CoD', 'ESG', 'ESG_E', 'ESG_S', 'Leverage', 'Size', 'ROA')
# 1. Tableau complet avec psych::describe()
desc_table <- describe(panel[, vars_desc])
print(round(desc_table[,
c('n','mean','median','sd','min','max','skew','kurtosis')], 4))
# 2. Summary standard
summary(panel[, vars_desc])
# 3. Statistiques par secteur
panel %>%
group_by(Sector) %>%
summarise(
N = n(),
ESG_moy = round(mean(ESG, [Link]=TRUE), 2),
CoD_moy = round(mean(CoD, [Link]=TRUE), 4),
Lev_moy = round(mean(Leverage, [Link]=TRUE), 4),
ROA_moy = round(mean(ROA, [Link]=TRUE), 2),
.groups = 'drop'
) %>% print()
# 4. Test t de Student Industriel vs Services
for (v in c('CoD', 'ESG', 'Leverage', 'ROA', 'Size')) {
ind_v <- panel[panel$Sector=='Industriel', v]
svc_v <- panel[panel$Sector=='Services', v]
tst <- [Link](ind_v, svc_v)
cat(sprintf('%-12s t=%.3f p=%.4f %s\n',
v, tst$statistic, tst$[Link],
ifelse(tst$[Link]<0.01,'***',ifelse(tst$[Link]<0.05,'**',
ifelse(tst$[Link]<0.10,'*','')))))
}
# 5. Évolution annuelle
panel %>%
group_by(year) %>%
summarise(N=n(), ESG=round(mean(ESG),2), CoD=round(mean(CoD),4),
Leverage=round(mean(Leverage),4), ROA=round(mean(ROA),2)) %>%
print(n=10)
✅ Résultat attendu : describe() affiche : CoD mean≈0.1278, sd≈0.1215, skew≈2.31 | ESG mean≈78.27,
sd≈9.14, skew≈-0.83
Université de Bordeaux — Master Finance | Guide Économétrie | Page 6
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
2.2 Procédure XLStat
1. Dans le ruban XLStat → Décrire les données → Statistiques descriptives
2. Dans la fenêtre qui s'ouvre : Données quantitatives → sélectionner les colonnes CoD, ESG,
ESG_E, ESG_S, Leverage, Size, ROA (colonnes D:J)
3. Cocher : Moyenne, Médiane, Écart-type, Min, Max, Asymétrie (Skewness), Kurtosis
4. Onglet 'Options' : cocher 'Statistiques manquantes' → Exclure
5. Cliquer OK → XLStat génère une nouvelle feuille avec le tableau
Pour la comparaison sectorielle avec test t :
1. XLStat → Tests paramétriques → Test t de Student pour deux échantillons indépendants
2. Échantillon 1 : Sélectionner les valeurs de CoD où Sector = 'Industriel'
3. Échantillon 2 : Sélectionner les valeurs de CoD où Sector = 'Services'
4. Hypothèse : bilatérale (H₀ : μ₁ = μ₂) → niveau de signif. 5%
5. Répéter pour ESG, Leverage, ROA
⚠️Attention : Pour filtrer par secteur dans XLStat, utiliser d'abord un filtre Excel standard (Données →
Filtrer) avant de lancer le test.
Université de Bordeaux — Master Finance | Guide Économétrie | Page 7
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
3. Matrice de Corrélations de Pearson
3.1 Procédure R
R
# ─────────────────────────────────────────────────────
# MATRICE DE CORRÉLATIONS
# ─────────────────────────────────────────────────────
vars_corr <- c('CoD','ESG','ESG_E','ESG_S','Leverage','Size','ROA')
corr_data <- [Link](panel[, vars_corr])
# 1. Matrice de corrélations simples
corr_mat <- cor(corr_data, method = 'pearson')
print(round(corr_mat, 4))
# 2. Matrice avec p-values (Hmisc::rcorr)
corr_rcorr <- rcorr([Link](corr_data), type = 'pearson')
print(round(corr_rcorr$r, 4)) # Coefficients
print(round(corr_rcorr$P, 4)) # P-values
# 3. Fonction pour afficher r et étoiles ensemble
corr_table <- function(r_mat, p_mat) {
out <- matrix('', nrow=nrow(r_mat), ncol=ncol(r_mat),
dimnames=dimnames(r_mat))
for(i in 1:nrow(r_mat)) for(j in 1:ncol(r_mat)) {
if(i==j) { out[i,j] <- '1.000'; next }
stars <- ifelse(p_mat[i,j]<0.01,'***',
ifelse(p_mat[i,j]<0.05,'**',
ifelse(p_mat[i,j]<0.10,'*','')))
out[i,j] <- paste0(round(r_mat[i,j],3), stars)
}
return(out)
}
print(corr_table(corr_rcorr$r, corr_rcorr$P))
# 4. Visualisation graphique
corrplot(corr_mat, method='color', type='upper',
[Link]=0.8, [Link]='black', [Link]=0.7,
col=colorRampPalette(c('#B91C1C','white','#166534'))(200),
title='Matrice de corrélations - Panel CAC40 2015-2024')
Résultats attendus de la matrice de corrélations :
Paire r (Pearson) p-value Interprétation
CoD ↔ ESG -0.098 p=0.068* Faible relation négative
CoD ↔ Levier -0.302 p<0.001*** Relation négative modérée
CoD ↔ ROA +0.532 p<0.001*** Relation positive forte
CoD ↔ Taille -0.201 p<0.001*** Relation négative faible
Université de Bordeaux — Master Finance | Guide Économétrie | Page 8
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
Paire r (Pearson) p-value Interprétation
ESG ↔ Taille +0.190 p<0.001*** Plus grande → mieux noté
Taille ↔ ROA -0.424 p<0.001*** Grandes firmes = ROA modéré
3.2 Procédure XLStat
1. XLStat → Analyse des données → Matrices de corrélation
2. Sélectionner les colonnes : CoD (D), ESG (E), Leverage (H), Size (I), ROA (J)
3. Cocher : Corrélation de Pearson + Test de significativité
4. Niveau de significativité : 0.05
5. Cocher 'Afficher la matrice de corrélation avec les p-values'
6. Option graphique : cocher 'Corrélogramme' pour la visualisation
7. Cliquer OK → XLStat génère la matrice avec les étoiles de significativité
💡 Note : XLStat affiche les coefficients de Pearson et indique avec * / ** / *** la significativité. Vérifier que
CoD↔ROA donne r=0.532 (***) et CoD↔Levier donne r=-0.302 (***)
Université de Bordeaux — Master Finance | Guide Économétrie | Page 9
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
4. M1 — Régression MCO Poolée (Baseline)
Modèle : CoD_it = α + β₁ESG + β₂Size + β₃Leverage + β₄ROA + ε_it
4.1 Procédure R
R
# ─────────────────────────────────────────────────────
# M1 : MCO POOLÉ (Ordinary Least Squares Pooled)
# ─────────────────────────────────────────────────────
# Estimation
M1_ols <- lm(CoD ~ ESG + Size + Leverage + ROA, data = panel)
# Résumé complet
summary(M1_ols)
# Résultats avec écarts-types robustes (White HC1)
coeftest(M1_ols, vcov = vcovHC(M1_ols, type = 'HC1'))
# Extraire les coefficients, SE, t-stats, p-values
tidy(M1_ols) %>%
mutate(stars = case_when(
[Link] < 0.01 ~ '***',
[Link] < 0.05 ~ '**',
[Link] < 0.10 ~ '*',
TRUE ~ ''
)) %>%
mutate(coef_str = paste0(round(estimate,4), stars, '\
n(',round([Link],4),')')) %>%
select(term, coef_str, statistic, [Link])
# Statistiques du modèle
cat('R² =', round(summary(M1_ols)$[Link], 4), '\n')
cat('R² ajust =', round(summary(M1_ols)$[Link], 4), '\n')
cat('F-stat =', round(summary(M1_ols)$fstatistic[1], 3), '\n')
cat('N =', nobs(M1_ols), '\n')
# Test d'hétéroscédasticité (Breusch-Pagan)
bptest(M1_ols)
# Si p < 0.05 → hétéroscédasticité → utiliser SE robustes (HC1/HC3)
# Test de multicolinéarité (VIF)
vif(M1_ols)
# VIF > 10 → problème de multicolinéarité
Résultats numériques attendus pour M1 :
Université de Bordeaux — Master Finance | Guide Économétrie | Page 10
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
Variable Coefficient Éc.-type t-stat p-value Sig.
(Constante) 1.1394 0.1372 8.306 <0.001 ***
Score ESG -0.0000 0.0008 -0.004 0.997
Taille ln(A) -0.0469 0.0074 -6.336 <0.001 ***
Levier (D/A) -0.6519 0.0669 -9.743 <0.001 ***
ROA (%) 0.0047 0.0020 2.350 0.019 **
R² R² ajusté F-stat p(F) N
0.3443 0.3367 45.544 < 0.001 352
4.2 Procédure XLStat
1. XLStat → Modélisation des données → Régression linéaire
2. Variable Y (dépendante) : sélectionner la colonne CoD (colonne D, 352 lignes)
3. Variables X (explicatives) : sélectionner ESG, Size, Leverage, ROA (colonnes E, I, H, J)
4. Cocher 'Constante dans le modèle'
5. Onglet 'Validation' → cocher Test de Fisher (F-test global) + Test de Student (t-test
individuel)
6. Onglet 'Résidus' → cocher 'Test de Durbin-Watson' et 'Graphique des résidus'
7. Onglet 'Options' → cocher 'Intervalles de confiance à 95%'
8. Cliquer OK
✅ Résultat attendu : XLStat affiche : R²=0.3443, R²ajusté=0.3367, F=45.544 (p<0.001). Coefficients :
Constante=1.139 (***), ESG≈0.000 (ns), Taille=-0.047 (***), Levier=-0.652 (***), ROA=0.005 (**).
⚠️Attention : Si XLStat n'affiche pas les mêmes résultats, vérifier que les 352 lignes sont bien
sélectionnées et qu'aucune cellule vide n'est présente dans les colonnes X/Y.
Université de Bordeaux — Master Finance | Guide Économétrie | Page 11
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
5. M2 — Effets Fixes Individuels (Within Estimator)
Modèle : CoD_it = α_i + β₁ESG + β₂Size + β₃Leverage + β₄ROA + ε_it
L'estimateur within élimine les effets individuels non observés constants dans le temps en
centrant chaque variable par rapport à la moyenne individuelle (déméanage).
5.1 Procédure R
R
# ─────────────────────────────────────────────────────
# M2 : EFFETS FIXES INDIVIDUELS (plm)
# ─────────────────────────────────────────────────────
M2_fe <- plm(CoD ~ ESG + Size + Leverage + ROA,
data = pdata,
model = 'within', # Within = effets fixes
effect = 'individual' # Effets sur les entités (entreprises)
)
# Résumé
summary(M2_fe)
# Écarts-types robustes (clusterisés par entreprise)
coeftest(M2_fe, vcov = vcovHC(M2_fe, type='HC1', cluster='group'))
# Statistiques du modèle
cat('R² within =', round(summary(M2_fe)$[Link]['rsq'], 4), '\n')
cat('F-stat =', round(summary(M2_fe)$fstatistic$statistic, 3), '\n')
cat('N =', pdim(pdata)$N, '\n')
# Récupérer les effets fixes estimés (α_i)
fixef_vals <- fixef(M2_fe)
summary(fixef_vals) # Distribution des effets fixes
head(sort(fixef_vals, decreasing=TRUE), 5) # Top 5 entreprises
head(sort(fixef_vals, decreasing=FALSE), 5) # Bottom 5 entreprises
# Test de Hausman : FE vs RE (choisir entre EF et effets aléatoires)
M2_re <- plm(CoD ~ ESG + Size + Leverage + ROA,
data=pdata, model='random')
phtest(M2_fe, M2_re) # Si p<0.05 → préférer effets fixes
Résultats attendus pour M2 :
Variable Coefficient Éc.-type t-stat p-value Sig.
ESG (within) -0.0003 0.0010 -0.303 0.762
Taille ln(A) -0.1392 0.0141 -9.872 <0.001 ***
Levier (D/A) -0.9514 0.1080 -8.809 <0.001 ***
Université de Bordeaux — Master Finance | Guide Économétrie | Page 12
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
Variable Coefficient Éc.-type t-stat p-value Sig.
ROA (%) -0.0080 0.0019 -4.211 <0.001 ***
R² within F-stat p(F) N Hausman p-val
0.3050 38.075 <0.001 352 < 0.05 → EF préféré
5.2 Procédure XLStat
1. XLStat → Modélisation des données → Données de panel → Modèles à effets fixes
2. Variable dépendante (Y) : colonne CoD
3. Variables explicatives (X) : ESG, Size, Leverage, ROA
4. Identifiant entité : colonne 'Entreprise' (colonne A)
5. Variable temps : colonne 'Année' (colonne C)
6. Type d'effets : Individual (effets individuels fixes uniquement)
7. Estimateur : Within (déméanage par entité)
8. Cocher 'Test de Hausman' dans l'onglet Options
9. Cliquer OK → XLStat estime le modèle et affiche les coefficients within
💡 Note : XLStat panel data est accessible via : XLStat → Advanced features → Econometrics → Panel
data models. La version de base peut ne pas inclure ce module selon la licence.
⚠️Attention : Si votre version XLStat ne dispose pas du module Panel, utiliser la transformation manuelle
: créer les variables déméanées (CoD_demeaned = CoD - mean(CoD par entreprise)) et estimer par
OLS classique avec ces variables transformées.
Alternative XLStat sans module Panel : transformation manuelle
1. Créer une colonne 'CoD_mean_firm' = moyenne de CoD par entreprise (AVERAGEIF)
2. Créer 'CoD_dm' = CoD - CoD_mean_firm (variable déméanée)
3. Répéter pour ESG, Size, Leverage, ROA
4. Faire la régression OLS sur les variables déméanées (sans constante)
5. Les coefficients obtenus sont identiques à l'estimateur within
Université de Bordeaux — Master Finance | Guide Économétrie | Page 13
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
6. M3 — Effets Fixes Doubles (Two-Way Fixed
Effects)
Modèle : CoD_it = α_i + γ_t + β₁ESG + β₂Size + β₃Leverage + β₄ROA + ε_it
6.1 Procédure R
R
# ─────────────────────────────────────────────────────
# M3 : EFFETS FIXES DOUBLES (Two-Way FE)
# ─────────────────────────────────────────────────────
M3_fe2 <- plm(CoD ~ ESG + Size + Leverage + ROA,
data = pdata,
model = 'within',
effect = 'twoways' # Individuel + Temporel
)
summary(M3_fe2)
# Equivalent avec dummies temporelles explicites
M3_alt <- lm(CoD ~ ESG + Size + Leverage + ROA + factor(year) +
factor(company) - 1,
data = panel)
# Note : le -1 supprime la constante globale
# Vérifier que les coefficients non-temporels sont identiques à M3_fe2
# R² within et between
summary(M3_fe2)$[Link]
✅ Résultat attendu : M3 : R²=0.265, coefficients stables vs M2 (ESG non-sig, Levier -0.981***, ROA -
0.009***)
Université de Bordeaux — Master Finance | Guide Économétrie | Page 14
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
7. M4 — Régression sur les Piliers E et S (N=108)
Modèle : CoD_it = α + β₁ESG_E + β₂ESG_S + β₃Size + β₄Leverage + β₅ROA + ε_it
7.1 Procédure R
R
# ─────────────────────────────────────────────────────
# M4 : PILIERS ENVIRONNEMENTAL ET SOCIAL
# Sous-échantillon N=108 (observations avec ESG_E et ESG_S)
# ─────────────────────────────────────────────────────
# Sous-échantillon avec données piliers disponibles
panel_pil <- panel[ & , ]
cat('N sous-échantillon piliers:', nrow(panel_pil), '\n')
# Doit afficher : 108
# Estimation
M4_pil <- lm(CoD ~ ESG_E + ESG_S + Size + Leverage + ROA, data = panel_pil)
summary(M4_pil)
# Tests de significativité individuelle et jointe
# Test H0 : β_E = β_S = 0 simultanément
library(car)
linearHypothesis(M4_pil, c('ESG_E = 0', 'ESG_S = 0'))
# Si F non-significatif → piliers E/S n'ont pas d'effet joint
# Comparer les coefficients E vs S
linearHypothesis(M4_pil, 'ESG_E = ESG_S')
✅ Résultat attendu : M4 : N=108, R²=0.276. ESG_E : +0.0057 (ns), ESG_S : +0.0025 (ns). Seuls Levier
(***) et ROA (**) significatifs.
Université de Bordeaux — Master Finance | Guide Économétrie | Page 15
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
8. M5 — ESG Décalé (Lag t-1) — Robustesse
Endogénéité
Modèle : CoD_it = α + β₁ESG_{i,t-1} + β₂Size + β₃Leverage + β₄ROA + ε_it
8.1 Procédure R
R
# ─────────────────────────────────────────────────────
# M5 : ESG DÉCALÉ D'UNE PÉRIODE (t-1)
# Atténue le biais d'endogénéité de simultaneité
# ─────────────────────────────────────────────────────
# Créer le lag ESG dans l'objet [Link]
pdata$ESG_lag1 <- lag(pdata$ESG, k = 1)
# Vérification
head(pdata[pdata$company=='ACCOR SA', c('year','ESG','ESG_lag1')], 6)
# ESG_lag1 en 2016 = ESG de 2015, etc.
# Sous-panel sans valeurs manquantes sur lag
panel_lag <- [Link](panel[, c('company','year','CoD','ESG_lag1',
'Size','Leverage','ROA')])
cat('N avec ESG_lag1:', nrow(panel_lag), '\n') # → 317
M5_lag <- lm(CoD ~ ESG_lag1 + Size + Leverage + ROA, data = panel_lag)
summary(M5_lag)
# Comparer les coefficients M1 vs M5
cat('\nComparaison ESG contemporain vs lagué:\n')
cat('M1 : β_ESG(t) =', round(coef(M1_ols)['ESG'], 5), '\n')
cat('M5 : β_ESG(t-1) =', round(coef(M5_lag)['ESG_lag1'], 5), '\n')
✅ Résultat attendu : M5 : N=317, R²=0.357. ESG_lag1 : +0.001 (ns). La non-significativité est robuste à
l'inversion causale.
Université de Bordeaux — Master Finance | Guide Économétrie | Page 16
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
9. M6 & M7 — OLS et EF avec Interaction Sectorielle
Modèle M6 : CoD = α + β₁ESG + β₂D_Ind + β₃(ESG×D_Ind) + β₄Size + β₅Leverage +
β₆ROA + ε
9.1 Procédure R — M6 (OLS + Interaction)
R
# ─────────────────────────────────────────────────────
# M6 : OLS + TERME D'INTERACTION ESG × SECTEUR
# ─────────────────────────────────────────────────────
# Créer le terme d'interaction
panel$ESG_x_Ind <- panel$ESG * panel$D_Ind
# Estimation M6
M6_int <- lm(CoD ~ ESG + D_Ind + ESG_x_Ind + Size + Leverage + ROA,
data = panel)
summary(M6_int)
# Interpréter l'interaction
# L'effet marginal de ESG pour les Services = β_ESG
# L'effet marginal de ESG pour l'Industriel = β_ESG + β_interaction
b_esg <- coef(M6_int)['ESG']
b_int <- coef(M6_int)['ESG_x_Ind']
cat('Effet ESG pour Services: ', round(b_esg, 5), '\n')
cat('Effet ESG pour Industriel: ', round(b_esg + b_int, 5), '\n')
# ─────────────────────────────────────────────────────
# M7 : EF + TERME D'INTERACTION
# ─────────────────────────────────────────────────────
pdata$ESG_x_Ind <- pdata$ESG * pdata$D_Ind
M7_fe_int <- plm(CoD ~ ESG + ESG_x_Ind + Size + Leverage + ROA,
data = pdata,
model = 'within',
effect = 'individual')
summary(M7_fe_int)
# Note : D_Ind est absorbé par les effets fixes individuels
# seule l'interaction ESG_x_Ind est identifiée dans FE
✅ Résultat attendu : M6 : ESG×Industriel = +0.0004 (ns, p=0.77). M7 idem. L'hétérogénéité sectorielle
est capturée par les secteurs séparés (M10-M13) plutôt que par le terme d'interaction.
Université de Bordeaux — Master Finance | Guide Économétrie | Page 17
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
10. M8 & M9 — Chocs Exogènes (Accord de Paris,
Covid-19)
10.1 M8 — Interaction avec l'Accord de Paris (≥2016)
R
# ─────────────────────────────────────────────────────
# M8 : EF + ACCORD DE PARIS (Post-2016 dummy)
# H : L'Accord de Paris a-t-il renforcé le lien ESG–CoD ?
# ─────────────────────────────────────────────────────
panel$D_PostParis <- [Link](panel$year >= 2016)
panel$ESG_x_Paris <- panel$ESG * panel$D_PostParis
pdata$D_PostParis <-
[Link]([Link]([Link](index(pdata,'time'))) >= 2016)
pdata$ESG_x_Paris <- pdata$ESG * pdata$D_PostParis
M8_paris <- plm(CoD ~ ESG + D_PostParis + ESG_x_Paris + Size + Leverage +
ROA,
data = pdata,
model = 'within',
effect = 'individual')
summary(M8_paris)
# Interpréter :
# β_ESG = effet ESG avant 2016 (pré-Paris)
# β_ESG_x_Paris = différence d'effet ESG après 2016
# β_ESG + β_ESG_x_Paris = effet ESG post-Paris
# ─────────────────────────────────────────────────────
# M9 : EF + COVID DUMMY (2020-2021)
# ─────────────────────────────────────────────────────
pdata$D_Covid <- [Link]([Link]([Link](index(pdata,'time')))
%in% c(2020,2021))
M9_covid <- plm(CoD ~ ESG + D_Covid + Size + Leverage + ROA,
data = pdata,
model = 'within',
effect = 'individual')
summary(M9_covid)
# Résultat attendu : D_Covid ≈ -0.020 (légèrement négatif, non-sig)
# → Politiques monétaires accommodantes BCE ont légèrement réduit le CoD
✅ Résultat attendu : M8 : ESG_x_Paris = +0.0016 (ns, p=0.15). M9 : D_Covid = -0.020 (ns, p=0.18).
Aucun choc significatif.
Université de Bordeaux — Master Finance | Guide Économétrie | Page 18
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
11. M10 & M11 — Régressions OLS par Secteur
11.1 Procédure R
R
# ─────────────────────────────────────────────────────
# M10 : OLS SECTEUR INDUSTRIEL (N=140)
# M11 : OLS SECTEUR SERVICES (N=212)
# ─────────────────────────────────────────────────────
# Vérification des sous-échantillons
cat('Industriel N =', nrow(panel_ind), '\n') # → 140
cat('Services N =', nrow(panel_svc), '\n') # → 212
# M10 : Industriel
M10_ind <- lm(CoD ~ ESG + Size + Leverage + ROA, data = panel_ind)
summary(M10_ind)
# M11 : Services
M11_svc <- lm(CoD ~ ESG + Size + Leverage + ROA, data = panel_svc)
summary(M11_svc)
# Comparaison des R² (IMPORTANT)
cat('\nComparaison R² :\n')
cat('M10 Industriel R² =', round(summary(M10_ind)$[Link], 4), '\n')
cat('M11 Services R² =', round(summary(M11_svc)$[Link], 4), '\n')
# Test de Chow : les coefficients sont-ils égaux entre secteurs ?
# Méthode : ajouter toutes les interactions avec D_Ind et tester
globalement
M_chow <- lm(CoD ~ ESG*D_Ind + Size*D_Ind + Leverage*D_Ind + ROA*D_Ind,
data = panel)
linearHypothesis(M_chow, c('ESG:D_Ind=0','Size:D_Ind=0',
'Leverage:D_Ind=0','ROA:D_Ind=0'))
# F significatif → coefficients différents entre secteurs (structural
break)
# Comparaison des coefficients ESG
cat('\nCoefficient ESG :\n')
cat('M10 Industriel β_ESG =', round(coef(M10_ind)['ESG'], 5), '\n')
cat('M11 Services β_ESG =', round(coef(M11_svc)['ESG'], 5), '\n')
# Tableau comparatif avec stargazer
stargazer(M1_ols, M10_ind, M11_svc,
type = 'text',
title = 'Comparaison OLS : Panel complet vs Secteurs',
[Link] = c('Full Panel', 'Industriel', 'Services'),
[Link] = 'Coût de la dette (CoD)',
[Link] = c('Score ESG','Taille ln(A)','Levier (D/A)','ROA
(%)'),
Université de Bordeaux — Master Finance | Guide Économétrie | Page 19
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
[Link] = c(0.10, 0.05, 0.01),
digits = 4,
[Link] = TRUE
)
Résultats attendus — comparaison clé :
Statistique M1 Full Panel M10 Industriel M11 Services
R² 0.3443 0.2655 0.4613
R² ajusté 0.3367 0.2437 0.4509
β_ESG ≈0.000 (ns) 0.001 (ns) 0.001 (ns)
β_Levier -0.652*** -0.630*** -0.702***
β_ROA 0.005** -0.010*** 0.011***
F-stat 45.54 12.20 44.31
N 352 140 212
⚠️Attention : Notez l'inversion de signe du ROA entre les secteurs (- pour Industriel, + pour Services) :
c'est un résultat économétriquement important qui justifie l'analyse séparée.
Université de Bordeaux — Master Finance | Guide Économétrie | Page 20
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
12. M12 & M13 — Effets Fixes par Secteur
12.1 Procédure R
R
# ─────────────────────────────────────────────────────
# M12 : EF SECTEUR INDUSTRIEL
# M13 : EF SECTEUR SERVICES
# ─────────────────────────────────────────────────────
M12_fe_ind <- plm(CoD ~ ESG + Size + Leverage + ROA,
data = pdata_ind,
model = 'within',
effect = 'individual')
summary(M12_fe_ind)
M13_fe_svc <- plm(CoD ~ ESG + Size + Leverage + ROA,
data = pdata_svc,
model = 'within',
effect = 'individual')
summary(M13_fe_svc)
# Comparer ESG within chaque secteur
b_esg_ind_fe <- coef(M12_fe_ind)['ESG']
b_esg_svc_fe <- coef(M13_fe_svc)['ESG']
cat('M12 β_ESG Ind FE =', round(b_esg_ind_fe, 5), '\n') # → -0.003
cat('M13 β_ESG Svc FE =', round(b_esg_svc_fe, 5), '\n') # → -0.000
# Comparaison R² OLS vs FE par secteur
cat('\nR² OLS Ind:', round(summary(M10_ind)$[Link], 4),' FE:',
round(summary(M12_fe_ind)$[Link]['rsq'], 4), '\n')
cat('R² OLS Svc:', round(summary(M11_svc)$[Link], 4),' FE:',
round(summary(M13_fe_svc)$[Link]['rsq'], 4), '\n')
Université de Bordeaux — Master Finance | Guide Économétrie | Page 21
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
13. Tests de Spécification Économétrique
Cette section présente les tests diagnostiques essentiels que le directeur de mémoire peut
demander pour valider les choix méthodologiques.
13.1 Test de Hausman (FE vs RE)
Le test de Hausman permet de choisir entre effets fixes (within) et effets aléatoires (random). Si
p < 0.05, les effets fixes sont préférés.
R
# ─────────────────────────────────────────────────────
# TEST DE HAUSMAN
# H0 : Effets aléatoires cohérents (préférer RE)
# H1 : Effets fixes nécessaires (préférer FE)
# ─────────────────────────────────────────────────────
M2_fe <- plm(CoD ~ ESG + Size + Leverage + ROA,
data=pdata, model='within', effect='individual')
M2_re <- plm(CoD ~ ESG + Size + Leverage + ROA,
data=pdata, model='random')
test_hausman <- phtest(M2_fe, M2_re)
print(test_hausman)
cat('Chi² =', round(test_hausman$statistic, 4), '\n')
cat('p-value =', round(test_hausman$[Link], 4), '\n')
cat('Conclusion :', ifelse(test_hausman$[Link] < 0.05,
'Effets fixes préférés (rejet H0)', 'Effets aléatoires acceptables'), '\
n')
✅ Résultat attendu : Résultat attendu : Chi² ≈ 28.4 (df=4), p < 0.001 → rejeter H0 → effets fixes
appropriés
13.2 Test de Breusch-Pagan (Hétéroscédasticité)
R
# ─────────────────────────────────────────────────────
# TEST DE BREUSCH-PAGAN
# H0 : Homoscédasticité
# H1 : Hétéroscédasticité
# ─────────────────────────────────────────────────────
bp_test <- bptest(M1_ols)
print(bp_test)
cat('BP stat =', round(bp_test$statistic, 4), '\n')
cat('p-value =', round(bp_test$[Link], 4), '\n')
Université de Bordeaux — Master Finance | Guide Économétrie | Page 22
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
# Si hétéroscédasticité → utiliser SE robustes (White HC)
if(bp_test$[Link] < 0.05) {
cat('→ Hétéroscédasticité détectée, utiliser SE robustes\n')
robust_se <- coeftest(M1_ols, vcov = vcovHC(M1_ols, type='HC1'))
print(robust_se)
} else {
cat('→ Pas d hétéroscédasticité, SE classiques valides\n')
}
13.3 Test VIF (Multicolinéarité)
R
# ─────────────────────────────────────────────────────
# FACTEURS D'INFLATION DE LA VARIANCE (VIF)
# Règle : VIF > 10 → problème grave, VIF > 5 → attention
# ─────────────────────────────────────────────────────
vif_vals <- vif(M1_ols)
print(round(vif_vals, 3))
cat('\nVIF maximum :', round(max(vif_vals), 3), '\n')
cat('Diagnostic :',
ifelse(max(vif_vals) > 10, 'PROBLÈME GRAVE',
ifelse(max(vif_vals) > 5, 'Attention', 'OK - pas de
multicolinéarité')), '\n')
# Résultat attendu (approximatif) :
# ESG : ~1.07
# Size : ~1.53
# Leverage : ~1.24
# ROA : ~1.23
# → Tous < 5 → pas de multicolinéarité problématique
✅ Résultat attendu : VIF attendus : ESG ≈ 1.07, Size ≈ 1.53, Leverage ≈ 1.24, ROA ≈ 1.23 → Tous < 5
→ Multicolinéarité non-problématique
13.4 Test de Wooldridge (Autocorrélation des résidus en panel)
R
# ─────────────────────────────────────────────────────
# TEST DE WOOLDRIDGE (autocorrélation AR(1) dans panel)
# H0 : pas d'autocorrélation
# ─────────────────────────────────────────────────────
# Installer le package supplémentaire si nécessaire
# [Link]('plmtest')
pbgtest(M2_fe, order = 1) # Test Breusch-Godfrey pour panel
# Alternative : test de Durbin-Watson adapté panel
pdwtest(M2_fe)
Université de Bordeaux — Master Finance | Guide Économétrie | Page 23
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
# Si autocorrélation → utiliser SE clustérisées
coeftest(M2_fe, vcov = vcovHC(M2_fe, type='HC1', cluster='group'))
13.5 Test de normalité des résidus
R
# ─────────────────────────────────────────────────────
# TEST DE NORMALITÉ DES RÉSIDUS (Jarque-Bera)
# H0 : résidus normalement distribués
# ─────────────────────────────────────────────────────
library(tseries)
residus_M1 <- residuals(M1_ols)
# Test Jarque-Bera
jb_test <- [Link](residus_M1)
print(jb_test)
# Q-Q plot
qqnorm(residus_M1, main='Q-Q Plot des résidus M1')
qqline(residus_M1, col='red', lwd=2)
# Histogramme des résidus
hist(residus_M1, breaks=30, col='lightblue',
main='Distribution des résidus M1',
xlab='Résidus', ylab='Fréquence')
curve(dnorm(x, mean=mean(residus_M1), sd=sd(residus_M1))*
length(residus_M1)*diff(range(residus_M1))/30,
add=TRUE, col='red', lwd=2)
Université de Bordeaux — Master Finance | Guide Économétrie | Page 24
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
14. Export et Présentation des Résultats
14.1 Tableau comparatif avec stargazer
R
# ─────────────────────────────────────────────────────
# TABLEAU COMPARATIF PUBLICATION-READY (stargazer)
# ─────────────────────────────────────────────────────
# Tableau principal M1, M2, M3, M4, M5
stargazer(
M1_ols, M2_fe, M3_fe2, M4_pil, M5_lag,
type = 'text', # Changer en 'latex' pour LaTeX
title = 'Déterminants du coût de la dette - CAC40 2015-2024',
[Link] = c('M1 OLS','M2 EF Ent.','M3 EF 2W','M4 Piliers','M5
Lag'),
[Link] = 'Coût de la dette (CoD)',
[Link] = c('ESG','ESG_E','ESG_S','ESG(t-1)',
'Taille','Levier','ROA','Constante'),
[Link] = c(0.10, 0.05, 0.01),
[Link] = list(
c('Effets fixes entité', 'Non','Oui','Oui','Non','Non'),
c('Effets fixes temps', 'Non','Non','Oui','Non','Non')
),
[Link] = c('ser','f'),
digits = 4,
[Link] = TRUE,
out = 'tableau_regressions.txt'
)
# Version HTML (pour copier-coller dans Word)
stargazer(
M1_ols, M2_fe, M3_fe2,
type = 'html',
out = 'tableau_regressions.html'
)
# Version avec modelsummary (alternative moderne à stargazer)
modelsummary(
list('M1 OLS'=M1_ols, 'M2 EF'=M2_fe, 'M3 2WFE'=M3_fe2),
stars = c('*'=0.1,'**'=0.05,'***'=0.01),
gof_map = c('nobs','[Link]','[Link]'),
output = 'tableau_modelsummary.xlsx'
)
14.2 Script R complet en un bloc
Pour regrouper tous les modèles en un seul script d'exécution :
R
# ═══════════════════════════════════════════════════
Université de Bordeaux — Master Finance | Guide Économétrie | Page 25
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
# SCRIPT COMPLET — TOUTES LES RÉGRESSIONS
# Sauvegarder sous : regressions_cac40_esg.R
# ═══════════════════════════════════════════════════
# 0. Setup
rm(list=ls()); [Link](42)
library(plm); library(lmtest); library(sandwich)
library(car); library(stargazer); library(tidyverse)
library(readxl); library(Hmisc); library(psych)
# 1. Import
panel <- read_excel("analyse_esg_cac40_2015_2024.xlsx",
sheet="6. Données Panel", skip=2)
colnames(panel) <- c("company","Sector","year","CoD","ESG",
"ESG_E","ESG_S","Leverage","Size","ROA","D_Ind")
panel$year <- [Link](panel$year)
panel$ESG_lag1 <- ave(panel$ESG, panel$company, FUN=function(x)
c(NA,head(x,-1)))
panel$D_PostParis <- [Link](panel$year >= 2016)
panel$D_Covid <- [Link](panel$year %in% c(2020,2021))
panel$ESG_x_Ind <- panel$ESG * panel$D_Ind
panel$ESG_x_Paris <- panel$ESG * panel$D_PostParis
pdata <- [Link](panel, index=c('company','year'))
panel_ind <- subset(panel, Sector=='Industriel')
panel_svc <- subset(panel, Sector=='Services')
pdata_ind <- [Link](panel_ind, index=c('company','year'))
pdata_svc <- [Link](panel_svc, index=c('company','year'))
panel_lag <-
[Link](panel[,c('company','year','CoD','ESG_lag1','Size','Leverage','ROA')
])
panel_pil <- panel[,]
# 2. Estimations
M1 <- lm(CoD ~ ESG + Size + Leverage + ROA, data=panel)
M2 <- plm(CoD ~ ESG + Size + Leverage + ROA, data=pdata, model='within',
effect='individual')
M3 <- plm(CoD ~ ESG + Size + Leverage + ROA, data=pdata, model='within',
effect='twoways')
M4 <- lm(CoD ~ ESG_E + ESG_S + Size + Leverage + ROA, data=panel_pil)
M5 <- lm(CoD ~ ESG_lag1 + Size + Leverage + ROA, data=panel_lag)
M6 <- lm(CoD ~ ESG + D_Ind + ESG_x_Ind + Size + Leverage + ROA,
data=panel)
pdata$ESG_x_Ind <- pdata$ESG * pdata$D_Ind
M7 <- plm(CoD ~ ESG + ESG_x_Ind + Size + Leverage + ROA, data=pdata,
model='within', effect='individual')
pdata$ESG_x_Paris <- pdata$ESG * pdata$D_PostParis
M8 <- plm(CoD ~ ESG + D_PostParis + ESG_x_Paris + Size + Leverage + ROA,
data=pdata, model='within', effect='individual')
pdata$D_Covid <- [Link]([Link]([Link](index(pdata,'time')))
%in% c(2020,2021))
M9 <- plm(CoD ~ ESG + D_Covid + Size + Leverage + ROA, data=pdata,
model='within', effect='individual')
M10 <- lm(CoD ~ ESG + Size + Leverage + ROA, data=panel_ind)
M11 <- lm(CoD ~ ESG + Size + Leverage + ROA, data=panel_svc)
M12 <- plm(CoD ~ ESG + Size + Leverage + ROA, data=pdata_ind,
model='within', effect='individual')
Université de Bordeaux — Master Finance | Guide Économétrie | Page 26
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
M13 <- plm(CoD ~ ESG + Size + Leverage + ROA, data=pdata_svc,
model='within', effect='individual')
M14 <- lm(CoD ~ ESG_E + ESG_S + ESG_E*D_Ind + Size + Leverage + ROA,
data=panel_pil)
# 3. Tests
cat('\n=== HAUSMAN ===\n'); print(phtest(M2,
plm(CoD~ESG+Size+Leverage+ROA,data=pdata,model='random')))
cat('\n=== BREUSCH-PAGAN ===\n'); print(bptest(M1))
cat('\n=== VIF ===\n'); print(round(vif(M1),3))
# 4. Export
stargazer(M1,M2,M3,M10,M11, type='text', out='resultats_principaux.txt',
[Link]=c('Full OLS','Full FE','Full 2WFE','Ind OLS','Svc OLS'),
[Link]=c(0.10,0.05,0.01), digits=4)
cat('\n✅ Script terminé avec succès!\n')
✅ Résultat attendu : Copier-coller l'intégralité de ce script dans RStudio et appuyer sur Source
(Ctrl+Shift+S). Le fichier resultats_principaux.txt sera généré dans le répertoire de travail.
Université de Bordeaux — Master Finance | Guide Économétrie | Page 27
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
15. Guide XLStat Complet — Menus Pas-à-Pas
Cette section décrit en détail tous les clics nécessaires dans XLStat pour reproduire chaque
analyse, sans écrire de code.
15.1 Stats descriptives complètes
1. Ouvrir l'onglet '6. Données Panel' du fichier Excel
2. Ruban XLStat → Describing data → Descriptive statistics
3. Champ 'Quantitative data' : sélectionner D2:J353 (CoD à ROA, 352 lignes)
4. Cocher dans la section Statistics : Mean, Median, Std. deviation, Min, Max, Skewness
(asymétrie), Kurtosis (aplatissement), Coeff. variation
5. Onglet 'Charts' : cocher Box plots → pour visualiser la distribution de chaque variable
6. Cliquer OK → nouvelle feuille 'Descriptive statistics'
15.2 Matrice de corrélations
1. XLStat → Describing data → Correlation matrix
2. Sélectionner D2:J353 (toutes variables quantitatives)
3. Type de corrélation : Pearson
4. Cocher : Significance test → bilatéral, niveau 5%
5. Cocher : Display p-values → cocher aussi 'Show significance stars'
6. Onglet 'Charts' : cocher Correlogram
7. OK → XLStat génère la matrice avec *, **, ***
15.3 Régression linéaire (M1 — MCO Poolé)
1. XLStat → Modeling data → Linear regression
2. Y / Response variable : sélectionner D2:D353 (colonne CoD, en-tête inclus)
3. X / Explanatory variables : sélectionner E2:E353;H2:J353 (ESG, Leverage, Size, ROA)
4. Cocher 'Variable labels' si l'en-tête est sélectionné
5. Onglet 'Validation' : cocher F-test, t-tests, Confidence intervals (95%), VIF
6. Onglet 'Residuals' : cocher Residuals vs fitted, Q-Q plot, Durbin-Watson
7. OK → résultats dans nouvelle feuille
💡 Note : Dans XLStat, le tableau de régression affiche : le coefficient, l'écart-type, la statistique t, la p-
value, et les intervalles de confiance à 95% pour chaque variable.
Université de Bordeaux — Master Finance | Guide Économétrie | Page 28
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
15.4 Régression sur sous-groupe sectoriel (M10/M11)
1. Filtrer les données : sélectionner colonne B (Sector) → Données → Filtrer → 'Industriel'
2. Copier les lignes filtrées (352 → 140 lignes) dans une nouvelle feuille 'Data_Industriel'
3. Répéter XLStat → Modeling data → Linear regression sur ces 140 lignes
4. Même procédure pour Services (212 lignes) dans 'Data_Services'
5. Comparer les tableaux R² : Services devrait afficher R²≈0.46 vs Industriel R²≈0.27
15.5 Test t de comparaison sectorielle
1. XLStat → Parametric tests → Two-sample t-test
2. Sample 1 : valeurs de CoD pour Industriel (colonne filtrée, 140 obs)
3. Sample 2 : valeurs de CoD pour Services (212 obs)
4. Alternative hypothesis : bilatéral (μ1 ≠ μ2)
5. Alpha = 0.05
6. Cocher : Levene test pour égalité des variances
7. OK → XLStat affiche t-stat, p-value et si différence significative
8. Répéter pour ESG, Leverage, ROA
15.6 Régression avec variable dummy et interaction (M6)
1. Ajouter dans Excel deux colonnes : D_Ind (déjà présent, col K) et ESG_x_Ind = col E × col
K
2. XLStat → Modeling data → Linear regression
3. Y : CoD (col D)
4. X : ESG, D_Ind, ESG_x_Ind, Size, Leverage, ROA (6 colonnes)
5. Ne pas cocher 'Qualitative variables' pour D_Ind (c'est déjà 0/1 numérique)
6. OK → le coefficient de ESG_x_Ind est le terme d'interaction
💡 Note : Dans M6, le coefficient ESG_x_Ind = 0.0004 (ns, p=0.77) indique que l'effet de l'ESG ne diffère
pas significativement entre secteurs.
15.7 Régression avec ESG décalé (M5)
1. Créer la colonne ESG_lag1 : pour chaque entreprise, décaler ESG d'une ligne vers le bas
2. Formule Excel dans la colonne ESG_lag1 (col L) : si l'entreprise en ligne n est la même
qu'en ligne n-1, alors ESG de ligne n-1, sinon vide
3. Exemple : =IF(A3=A2, E2, "") à partir de la ligne 3
4. Filtrer les lignes où ESG_lag1 n'est pas vide (317 observations)
5. Copier dans nouvelle feuille 'Data_Lag' et faire la régression OLS
6. Comparer avec M1 : le coefficient ESG_lag1 doit rester non-significatif
Université de Bordeaux — Master Finance | Guide Économétrie | Page 29
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
15.8 Vérification finale des résultats
Tableau de contrôle : comparer systématiquement les sorties XLStat avec les résultats du
tableau Excel onglet '2. Régressions Principales'.
Modèle R² XLStat attendu t(Levier) attendu p(ESG) attendu Cohérence
M1 OLS Full 0.3443 t = -9.74*** p > 0.10 (ns) ✅
M10 OLS Ind 0.2655 t = -6.65*** p > 0.10 (ns) ✅
M11 OLS Svc 0.4613 t = -7.92*** p > 0.10 (ns) ✅
M4 Piliers 0.2756 t = -2.85*** E: ns, S: ns ✅
M5 ESG Lag 0.3571 t = -9.19*** p > 0.10 (ns) ✅
⚠️Attention : Si vos R² ou coefficients diffèrent de plus de ±0.005 des valeurs attendues, vérifier : (1) le
filtrage des observations manquantes, (2) la winsorisation à 1%-99% sur CoD, (3) la présence des 352
observations nettes (ni plus, ni moins).
Université de Bordeaux — Master Finance | Guide Économétrie | Page 30
Guide de Réplication | R & XLStat | ESG & Coût de la dette CAC 40 | 2015–2024
16. Récapitulatif des 14 Modèles
Ce tableau récapitule les 14 modèles estimés avec leur équation, leur logiciel, et les résultats
attendus pour validation rapide.
M Spécification Fonction R N / R² β_ESG (p-val) Conclusion
ESG
M1 OLS Poolé baseline lm(CoD~ESG+...) 352 / 0.344 −0.000 (p=0.997) Non-sig.
M2 EF Individuel plm(model='withi 352 / 0.305 −0.000 (p=0.762) Non-sig.
(within) n')
M3 EF Double (two- plm(effect='twow 352 / 0.265 −0.000 (p=0.884) Non-sig.
way) ays')
M4 Piliers E et S lm(CoD~ESG_E+ESG 108 / 0.276 E:+0.006 (ns) Non-sig.
_S)
M5 ESG Lagué (t-1) lm(CoD~ESG_lag1) 317 / 0.357 0.001 (p=0.446) Non-sig.
M6 OLS+Interaction lm(ESG+D_Ind+ESG 352 / 0.345 −0.000 (p=0.851) Non-sig.
sect. ×Ind)
M7 EF+Interaction sect. plm(ESG+ESG_x_In 352 / 0.305 −0.000 (p=0.787) Non-sig.
d)
M8 EF+Accord de Paris plm(ESG+Paris+ES 352 / 0.310 −0.001 (p=0.473) Non-sig.
G×Par)
M9 EF+Covid dummy plm(ESG+D_Covid) 352 / 0.309 −0.000 (p=0.972) Non-sig.
M1 OLS Industriel seul lm() sur 140 / 0.266 0.001 (p=0.224) Non-sig.
0 panel_ind
M1 OLS Services seul lm() sur 212 / 0.461 0.001 (p=0.370) Non-sig.
1 panel_svc
M1 EF Industriel seul plm() sur 140 / 0.258 −0.003 (p=0.128) Non-sig.
2 pdata_ind
M1 EF Services seul plm() sur 212 / 0.398 −0.000 (p=0.948) Non-sig.
3 pdata_svc
M1 Piliers+Interaction lm(ESG_E+ESG_S+E 108 / 0.288 E:−0.001 (ns) Non-sig.
4 ×Ind)
💡 Note : Le levier financier est significatif à p<0.001 dans les 14 modèles. Le score ESG n'atteint jamais
le seuil de 10% de significativité. Ces résultats sont cohérents quel que soit le logiciel utilisé (R, XLStat,
Stata, Python).
Université de Bordeaux — Master Finance | Guide Économétrie | Page 31