analyse_signaux
Introduction : présentation du modèle conceptuel
Les résultats présentés ci-après sont tirés des travaux de la thèse de doctorat de Yoann Ducoux. L’objectif de l’étude quantitative menée est d’améliorer la compréhension de la structure cognitive qui permet aux candidats de passer de l’observation d’informations à propos d’un employeur à un sentiment favorable envers cet employeur. Par extension, cette étude aide les entreprises à favoriser les chances de réussite du processus de recrutement.
En vertu de la théorie des signaux (Spence, 1973; Stiglitz, 1975) et de son extension la théorie de la signalisation par les tierces parties de la marque employeur (Dineen et al.,2019) nous souhaitons démontrer le rôle central de la crédibilité dans la création de l’image employeur chez le candidat. L’étude présente donc en guise d’informations des signaux, c’est-à-dire des informations qui ne permettent pas au candidat de juger de la qualité de l’entreprise sur la base de ses préférences individuelles mais uniquement à travers la confiance qu’il peut avoir sur le fait que l’entreprise se révelera un employeur satisfaisant au regard de ses propres attentes.
Pour collecter les données, nous avons créé un stimuli qui présente la page carrière d’une entreprise fictive ABCompany. Le stimuli comporte deux variables : la note Glassdoor qui dispose de trois modalités (bonne/neutre/mauvaise) et une enquête de satisfaction des employés de l’entreprise dont la source prend deux modalités (interne/externe). Chaque répondant a donc été exposé à l’un des six scénarios comportant une combinaison de la Note Glassdoor et de la Source de l’enquête de satisfaction.
Les variables qui composent le modèle sont :
La Note Glassdoor de l’employeur fictif ABCompany qui varie entre 2,5/5 3,5/5 et 4,5/5.
La Source de l’enquête de satisfaction des employés de l’entreprise ABCompany.
La congruence des signaux (Note Glassdoor et enquête de satisfaction)
La crédibilité des signaux, c’est-à-dire la crédibilité de la Note Glassdoor et la crédibilité de l’enquête de satisfaction
La crédibilité de la marque employeur de l’entreprise ABCompany
L’image employeur de l’entreprise ABCompany
Et deux variables de contrôle : l’âge des répondants et la familiarité avec l’entreprise ABC, c’est-à-dire l’impression de connaitre l’entreprise avant d’avoir vu les signaux que nous leur présentons.
NB : En raison d’un erreur du questionnaire Qualtrics, les réponses des répondants du scénario 1 pour l’échelle de mesure de l’une des variables du modèle (CredE) n’ont pas été enregistrées. Nous avons donc fait une seconde collecte complémentaire, uniquement pour le scénario 1, qui a ensuite servi à imputer les données manquantes de la première collecte. La procédure d’imputation est expliquée dans le document.
Hypothèses de recherche
Sur la base de notre cadre conceptuel, nous formulons les hypothèses suivantes concernant les relations entre la note d’employeur, sa source, et l’image employeur de l’entreprise:
Relations directes
H1: La note Glassdoor de l’employeur (Note) influence positivement l’image employeur (Image).
H2: La note Glassdoor de l’employeur (Note) influence positivement la congruence des signaux (Cong).
H3: La source de l’enquête (Source) influence positivement la congruence des signaux (Cong).
H4: La note Glassdoor de l’employeur (Note) influence la crédibilité perçue de la note Glassdoor de l’employeur (CredGD).
H5: La source de l’enquête (Source) influence la crédibilité perçue de l’enquête (CredE).
H6: La congruence des signaux (Cong) influence positivement la crédibilité des signaux.
- H6a: La congruence des signaux (Cong) influence positivement crédibilité de l’enquête (CredE).
- H6b: La congruence des signaux (Cong) influence positivement crédibilité de la note Glassdoor (CredGD).
H7: La crédibilité de la marque employeur (CredME) influence positivement l’image employeur (Image).
H8: La crédibilité des signaux influence la crédibilité de la marque employeur(CredME).
- H8a: La crédibilité de la note Glassdoor (CredGD) influence positivement la crédibilité de la marque employeur (CredME).
- H8b: La crédibilité de l’enquête (CredE) influence positivement la crédibilité de la marque employeur (CredME).
Médiations
H9: Les effets de la source de l’enquête sur l’image employeur sont médiatisés par une chaîne de médiation (médiation séquentielle) impliquant dans l’ordre la congruence des signaux, la crédibilité des signaux et la crédibilité de la marque employeur.
- H9a: La séquence de médiateurs congruence des signaux, crédibilité de la note Glassdoor, crédibilité de la marque employeur médiatise la relation entre la source de l’enquête et l’image employeur.
- H9b: La séquence de médiateurs congruence des signaux, crédibilité de l’enquête, crédibilité de la marque employeur médiatise la relation entre la source de l’enquête et l’image employeur.
H10: Les effets de la source de l’enquête sur l’image employeur sont médiatisés par une chaîne de médiation (médiation séquentielle) impliquant dans l’ordre la crédibilité de l’enquête et la crédibilité de la marque employeur.
H11: Les effets de la note Glassdoor sur l’image employeur sont médiatisés par une chaîne de médiation (médiation séquentielle) impliquant dans l’ordre la crédibilité de la note Glassdoor et la crédibilité de la marque employeur.
H12: Les effets de la note sur l’image employeur sont médiatisés par une chaîne de médiation (médiation séquentielle) impliquant dans l’ordre la congruence des signaux, la crédibilité des signaux et la crédibilité de la marque employeur.
- H12a: La séquence de médiateurs congruence des signaux, crédibilité de la note Glassdoor, crédibilité de la marque employeur médiatise la relation entre la note Glassdoor et l’image employeur.
- H12b: La séquence de médiateurs congruence des signaux, crédibilité de l’enquête, crédibilité de la marque employeur médiatise la relation entre la note Glassdoor et l’image employeur.
library(dplyr)
library(mice)
library(VIM)
library(mitools)
library(knitr)
library(lavaan)
library(semTools)
library(haven)
library(sjlabelled)
library(sjmisc)
library(psych)
library(ggplot2)
# Importation des données
collecte_1 <- read_sav("data/collecte_1.sav")
collecte_2 <- read_sav("data/collecte_2.sav")
# Fusion des données
merged_df <- bind_rows(collecte_1, collecte_2)
# Conversion des variables labellisées en types R standard
merged_df <- haven::zap_labels(merged_df)2. Nettoyage et préparation des données
Imputation multiple et règle de Rubin
L’imputation multiple est une méthode statistique robuste pour traiter les données manquantes. Contrairement à l’imputation simple qui remplace chaque valeur manquante par une seule estimation, l’imputation multiple crée plusieurs jeux de données complets (généralement entre 5 et 20) où les valeurs manquantes sont remplacées par différentes estimations plausibles. Cette approche permet de capturer l’incertitude liée à l’imputation.
Dans notre étude, nous utilisons deux méthodes d’imputation différentes :
Predictive Mean Matching (PMM) : Cette méthode impute les valeurs manquantes en utilisant des valeurs observées provenant d’autres observations ayant des caractéristiques similaires. Elle préserve la distribution des données observées et est particulièrement adaptée aux variables continues.
Random Forest (RF) : Cette méthode utilise des algorithmes d’apprentissage automatique pour prédire les valeurs manquantes en fonction des relations complexes entre les variables. Elle est capable de capturer des relations non linéaires et des interactions.
Pour combiner les résultats des analyses effectuées sur chaque jeu de données imputé, nous appliquons la règle de Rubin (1987), qui permet d’obtenir des estimations non biaisées des paramètres et de leurs erreurs standard. Cette règle stipule que :
- L’estimation combinée d’un paramètre est la moyenne des estimations obtenues sur chaque jeu imputé.
- La variance totale associée à cette estimation est la somme de deux composantes :
- La variance intra-imputation (moyenne des variances estimées dans chaque jeu)
- La variance inter-imputation (variance des estimations entre les jeux), multipliée par un facteur d’ajustement (1 + 1/m, où m est le nombre d’imputations)
Cette approche nous permet d’obtenir des résultats plus fiables en tenant compte à la fois de l’incertitude liée à l’échantillonnage et de celle liée à l’imputation des données manquantes.
#Procédure de vérification
Vérification des manipulations expérimentales
Avant de procéder aux analyses principales, nous vérifions l’efficacité des manipulations expérimentales entre les différents scénarios. Ces analyses ANOVA nous permettent de confirmer que les participants ont bien perçu les différences entre les conditions expérimentales, notamment concernant les informations présentées sur Glassdoor et sur le site de l’entreprise.
# Définition des items à vérifier
items_check <- c("Info_Glassdoor_1", "Info_Glassdoor_2",
"Info_Glassdoor_3", "Info_Glassdoor_4",
"Informations_site_1", "Informations_site_2",
"Informations_site_3", "Informations_site_4", "Informations_site_5")
# Analyse ANOVA pour chaque item par scénario
for (item in items_check) {
cat("\n=== ANOVA for", item, "by scenario ===\n")
frm <- as.formula(paste(item, "~ factor(scenario)"))
mod <- aov(frm, data=merged_df)
print(summary(mod))
}
=== ANOVA for Info_Glassdoor_1 by scenario ===
Df Sum Sq Mean Sq F value Pr(>F)
factor(scenario) 5 20.1 4.018 1.695 0.135
Residuals 399 945.7 2.370
=== ANOVA for Info_Glassdoor_2 by scenario ===
Df Sum Sq Mean Sq F value Pr(>F)
factor(scenario) 5 20 3.999 1.449 0.206
Residuals 399 1101 2.760
=== ANOVA for Info_Glassdoor_3 by scenario ===
Df Sum Sq Mean Sq F value Pr(>F)
factor(scenario) 5 549.5 109.89 76.96 <2e-16 ***
Residuals 399 569.7 1.43
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
=== ANOVA for Info_Glassdoor_4 by scenario ===
Df Sum Sq Mean Sq F value Pr(>F)
factor(scenario) 5 358.2 71.63 35.29 <2e-16 ***
Residuals 399 809.9 2.03
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
=== ANOVA for Informations_site_1 by scenario ===
Df Sum Sq Mean Sq F value Pr(>F)
factor(scenario) 5 11.6 2.321 0.947 0.451
Residuals 399 978.0 2.451
=== ANOVA for Informations_site_2 by scenario ===
Df Sum Sq Mean Sq F value Pr(>F)
factor(scenario) 5 6.2 1.238 0.494 0.781
Residuals 399 999.5 2.505
=== ANOVA for Informations_site_3 by scenario ===
Df Sum Sq Mean Sq F value Pr(>F)
factor(scenario) 5 12.5 2.507 1.184 0.316
Residuals 399 844.8 2.117
=== ANOVA for Informations_site_4 by scenario ===
Df Sum Sq Mean Sq F value Pr(>F)
factor(scenario) 5 17.3 3.459 1.659 0.144
Residuals 399 832.0 2.085
=== ANOVA for Informations_site_5 by scenario ===
Df Sum Sq Mean Sq F value Pr(>F)
factor(scenario) 5 2.130e-26 4.251e-27 1.364 0.237
Residuals 399 1.244e-24 3.117e-27
# Affichage des moyennes des items Info_Glassdoor_3 et 4 par niveau de Note
cat("\n=== Moyennes des items Info_Glassdoor_3 et 4 par niveau de Note ===\n")
=== Moyennes des items Info_Glassdoor_3 et 4 par niveau de Note ===
# Créer une variable de Note à partir du scénario
merged_df$Note_value <- NA
merged_df$Note_value[merged_df$scenario %in% c(1, 2)] <- 2.5
merged_df$Note_value[merged_df$scenario %in% c(3, 4)] <- 3.5
merged_df$Note_value[merged_df$scenario %in% c(5, 6)] <- 4.5
merged_df$Note_value <- as.factor(merged_df$Note_value)
# Calculer et afficher les moyennes pour Info_Glassdoor_3
mean_IG3 <- aggregate(Info_Glassdoor_3 ~ Note_value, data = merged_df, FUN = function(x) {
c(Moyenne = mean(x, na.rm = TRUE),
ET = sd(x, na.rm = TRUE),
N = sum(!is.na(x)),
IC_inf = mean(x, na.rm = TRUE) - 1.96 * sd(x, na.rm = TRUE) / sqrt(sum(!is.na(x))),
IC_sup = mean(x, na.rm = TRUE) + 1.96 * sd(x, na.rm = TRUE) / sqrt(sum(!is.na(x))))
})
colnames(mean_IG3) <- c("Note", "Statistiques")
print(knitr::kable(do.call(data.frame, mean_IG3),
caption = "Statistiques descriptives pour Info_Glassdoor_3 par niveau de Note",
digits = 2))
Table: Statistiques descriptives pour Info_Glassdoor_3 par niveau de Note
|Note | Statistiques.Moyenne| Statistiques.ET| Statistiques.N| Statistiques.IC_inf| Statistiques.IC_sup|
|:----|--------------------:|---------------:|--------------:|-------------------:|-------------------:|
|2.5 | 3.01| 1.36| 158| 2.79| 3.22|
|3.5 | 4.23| 1.10| 106| 4.02| 4.44|
|4.5 | 5.71| 1.07| 141| 5.53| 5.89|
# Calculer et afficher les moyennes pour Info_Glassdoor_4
mean_IG4 <- aggregate(Info_Glassdoor_4 ~ Note_value, data = merged_df, FUN = function(x) {
c(Moyenne = mean(x, na.rm = TRUE),
ET = sd(x, na.rm = TRUE),
N = sum(!is.na(x)),
IC_inf = mean(x, na.rm = TRUE) - 1.96 * sd(x, na.rm = TRUE) / sqrt(sum(!is.na(x))),
IC_sup = mean(x, na.rm = TRUE) + 1.96 * sd(x, na.rm = TRUE) / sqrt(sum(!is.na(x))))
})
colnames(mean_IG4) <- c("Note", "Statistiques")
print(knitr::kable(do.call(data.frame, mean_IG4),
caption = "Statistiques descriptives pour Info_Glassdoor_4 par niveau de Note",
digits = 2))
Table: Statistiques descriptives pour Info_Glassdoor_4 par niveau de Note
|Note | Statistiques.Moyenne| Statistiques.ET| Statistiques.N| Statistiques.IC_inf| Statistiques.IC_sup|
|:----|--------------------:|---------------:|--------------:|-------------------:|-------------------:|
|2.5 | 3.09| 1.55| 158| 2.85| 3.33|
|3.5 | 4.17| 1.34| 106| 3.91| 4.43|
|4.5 | 5.27| 1.32| 141| 5.05| 5.49|
# Test ANOVA pour confirmer les différences significatives
anova_IG3 <- aov(Info_Glassdoor_3 ~ Note_value, data = merged_df)
print(summary(anova_IG3)) Df Sum Sq Mean Sq F value Pr(>F)
Note_value 2 544.6 272.28 190.5 <2e-16 ***
Residuals 402 574.6 1.43
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova_IG4 <- aov(Info_Glassdoor_4 ~ Note_value, data = merged_df)
print(summary(anova_IG4)) Df Sum Sq Mean Sq F value Pr(>F)
Note_value 2 354.6 177.30 87.62 <2e-16 ***
Residuals 402 813.5 2.02
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Représentation graphique des moyennes
par(mfrow = c(1, 2))
# Graphique pour Info_Glassdoor_3
boxplot(Info_Glassdoor_3 ~ Note_value, data = merged_df,
main = "Info_Glassdoor_3 par niveau de Note",
xlab = "Note Glassdoor", ylab = "Perception comme bon employeur",
col = c("lightcoral", "lightblue", "lightgreen"))
# Graphique pour Info_Glassdoor_4
boxplot(Info_Glassdoor_4 ~ Note_value, data = merged_df,
main = "Info_Glassdoor_4 par niveau de Note",
xlab = "Note Glassdoor", ylab = "Recommandation des employés",
col = c("lightcoral", "lightblue", "lightgreen"))par(mfrow = c(1, 1))
# 1. ANOVA pour tester l'effet du genre sur l'image employeur
cat("\n=== Effet du genre sur l'image employeur ===\n")
=== Effet du genre sur l'image employeur ===
anova_genre <- aov(Image ~ genre, data = merged_df)
print(summary(anova_genre)) Df Sum Sq Mean Sq F value Pr(>F)
genre 1 0.3 0.3085 0.182 0.67
Residuals 403 681.8 1.6917
# 3. Visualisation
boxplot(Image ~ genre, data = merged_df,
main = "Image employeur selon le genre",
xlab = "Genre", ylab = "Image employeur",
col = c("lightblue", "lightpink"))Interprétation des résultats des ANOVAs
L’analyse des résultats des ANOVAs nous permet d’évaluer systématiquement l’efficacité de nos manipulations expérimentales à travers les différents scénarios :
Manipulation de la note et source d’évaluation (Glassdoor)
- Info_Glassdoor_1 - “La note sur l’employeur ABCompany qui apparaît sur son site carrière émane de Glassdoor”
- Non significatif : F(5,399) = 1.695, p = 0.135
- La reconnaissance de Glassdoor comme source est similaire dans tous les scénarios, suggérant une attribution claire de la source indépendamment des conditions expérimentales.
- Info_Glassdoor_2 - “Le résultat de cette évaluation est indépendant de l’entreprise ABCompany”
- Non significatif : F(5,399) = 1.449, p = 0.206
- La perception d’indépendance de l’évaluation reste constante à travers les scénarios, confirmant l’uniformité de cette dimension dans notre dispositif expérimental.
- Info_Glassdoor_3 - “D’après les informations de Glassdoor, l’entreprise ABCompany est un bon employeur”
- Très significatif : F(5,399) = 76.96, p < 0.001
- Cette différence significative confirme que notre manipulation de la note (2.5, 3.5, 4.5) a été correctement perçue par les participants, validant le succès de cette manipulation cruciale.
- Info_Glassdoor_4 - “D’après les informations de Glassdoor, les employés de ABC recommandent de travailler pour cet employeur”
- Très significatif : F(5,399) = 35.29, p < 0.001
- Cette différence significative renforce la confirmation de l’efficacité de notre manipulation des évaluations, montrant que les participants perçoivent des niveaux différents de recommandation selon les scénarios.
Perception du site carrière
- Informations_site_1 - “L’entreprise ABCompany est à l’origine de ce site internet”
- Non significatif : F(5,399) = 0.947, p = 0.451
- La perception de l’entreprise comme source du site reste constante entre les scénarios, assurant une base homogène pour l’interprétation des autres variables.
- Informations_site_2 - “Le site que j’ai vu est le site carrière de l’entreprise ABCompany”
- Non significatif : F(5,399) = 0.494, p = 0.781
- L’identification uniforme du site comme site carrière à travers les scénarios assure la cohérence de notre environnement expérimental.
- Informations_site_3 - “Ce site carrière fait apparaître un taux de recommandation de l’entreprise ABCompany comme employeur”
- Non significatif : F(5,399) = 1.184, p = 0.316
- La visibilité perçue du taux de recommandation est constante entre les scénarios, confirmant la standardisation de cet élément dans notre design.
- Informations_site_4 - “Ce site carrière fait apparaître une note sur ABCompany comme employeur”
- Non significatif : F(5,399) = 1.659, p = 0.144
- La perception de la présence d’une note est homogène à travers les différentes conditions, soutenant la cohérence de notre présentation expérimentale.
- Informations_site_5 - Check d’attention
- Non significatif : F(5,399) = 1.364, p = 0.237
- Cette homogénéité est attendue pour un item de vérification d’attention, confirmant la fiabilité de notre filtre d’inclusion des participants.
Cette analyse systématique révèle que nos manipulations expérimentales ont fonctionné comme prévu. Spécifiquement, les différences significatives observées pour les items 3 et 4 de Glassdoor confirment que la manipulation de la note de l’employeur a été efficacement perçue, tandis que l’homogénéité des autres perceptions atteste de la standardisation appropriée des éléments non manipulés. Ces vérifications valident la robustesse de notre design expérimental et renforcent la fiabilité des analyses subséquentes.
Ces vérifications confirment que nos manipulations expérimentales ont fonctionné comme prévu, ce qui nous permet de procéder avec confiance aux analyses psychométriques et structurelles suivantes.
3. Analyses psychométriques
# Fonction pour les analyses psychométriques complètes
analyse_psychometrique <- function(data, nom_echelle, items) {
cat("\n=== Analyse psychométrique de", nom_echelle, "===\n")
# Extraction des données de l'échelle
data_echelle <- data[, items, drop = FALSE]
complete_cases <- complete.cases(data_echelle)
data_complete <- data_echelle[complete_cases, , drop = FALSE]
# 1. Statistiques descriptives
cat("\n1. Statistiques descriptives :\n")
print(summary(data_echelle))
# 2. Tests de normalité et adéquation
cat("\n2. Tests de normalité et adéquation :\n")
tryCatch({
# KMO
mat_cor <- cor(data_complete)
kmo <- KMO(mat_cor)
cat("- KMO =", round(kmo$MSA, 3), "\n")
# Test de Bartlett
n <- nrow(data_complete)
bartlett <- cortest.bartlett(mat_cor, n = n)
cat("- Test de Bartlett : chi2 =", round(bartlett$chisq, 2),
", ddl =", bartlett$df,
", p =", format.pval(bartlett$p.value), "\n")
}, error = function(e) {
cat("Impossible de calculer KMO/Bartlett:", conditionMessage(e), "\n")
})
# 3. Fiabilité (Alpha de Cronbach)
cat("\n3. Fiabilité :\n")
tryCatch({
alpha_res <- psych::alpha(data_echelle)
cat(sprintf("- Alpha de Cronbach = %.3f\n", alpha_res$total$raw_alpha))
cat("\nStatistiques par item si supprimé :\n")
print(round(alpha_res$alpha.drop, 3))
cat("\nCorrélations item-total :\n")
print(round(alpha_res$item.stats, 3))
}, error = function(e) {
cat("- Impossible de calculer l'alpha de Cronbach:", conditionMessage(e), "\n")
alpha_res <- list(total = list(raw_alpha = NA))
})
# 4. Analyse factorielle
cat("\n4. Analyse factorielle :\n")
tryCatch({
if(sum(complete_cases) > 1) {
# Test du nombre de facteurs
nfactors <- fa.parallel(data_complete, fa = "fa", fm = "ml")
cat("\nNombre de facteurs suggéré :", nfactors$nfact, "\n")
# Analyse factorielle
fa_res <- fa(data_complete, nfactors = 1, fm = "ml", rotate = "none")
cat("\n- Loadings :\n")
print(round(fa_res$loadings, 3))
cat("\n- Communalités :\n")
print(round(fa_res$communality, 3))
cat(sprintf("\n- Variance expliquée : %.2f%%\n",
fa_res$Vaccounted[2,1] * 100))
# Résidus
cat("\n- Résidus :\n")
residuals <- factor.residuals(mat_cor, fa_res$loadings)
cat("RMSR =", sqrt(mean(residuals[lower.tri(residuals)]^2)), "\n")
} else {
cat("Pas assez de données complètes pour l'analyse factorielle\n")
fa_res <- NULL
}
}, error = function(e) {
cat("Erreur dans l'analyse factorielle:", conditionMessage(e), "\n")
fa_res <- NULL
})
return(list(
normalite = list(shapiro = NA,
skew = sapply(data_echelle, skew),
kurtosis = sapply(data_echelle, kurtosi)),
kmo = if(exists("kmo")) kmo$MSA else NA,
bartlett = if(exists("bartlett")) bartlett else NA,
alpha = alpha_res$total$raw_alpha,
fa = fa_res
))
}
# Analyses psychométriques pour les échelles avec items dans merged_df
# CGD (avec tous les items 1-4)
items_CGD <- paste0("Cr_dibilit__GD_", 1:4)
analyse_CGD <- analyse_psychometrique(merged_df, "CGD (4 items)", items_CGD)
=== Analyse psychométrique de CGD (4 items) ===
1. Statistiques descriptives :
Cr_dibilit__GD_1 Cr_dibilit__GD_2 Cr_dibilit__GD_3 Cr_dibilit__GD_4
Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
1st Qu.:3.000 1st Qu.:3.000 1st Qu.:4.000 1st Qu.:4.000
Median :4.000 Median :4.000 Median :4.000 Median :4.000
Mean :3.951 Mean :3.765 Mean :4.247 Mean :4.178
3rd Qu.:5.000 3rd Qu.:4.000 3rd Qu.:5.000 3rd Qu.:5.000
Max. :7.000 Max. :7.000 Max. :7.000 Max. :7.000
2. Tests de normalité et adéquation :
- KMO = 0.599
- Test de Bartlett : chi2 = 189.51 , ddl = 6 , p = < 2.22e-16
3. Fiabilité :
- Alpha de Cronbach = 0.563
Statistiques par item si supprimé :
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r
Cr_dibilit__GD_1 0.533 0.565 0.503 0.302 1.298 0.041 0.031
Cr_dibilit__GD_2 0.526 0.579 0.502 0.315 1.377 0.040 0.021
Cr_dibilit__GD_3 0.436 0.436 0.346 0.205 0.774 0.047 0.004
Cr_dibilit__GD_4 0.483 0.506 0.408 0.255 1.026 0.043 0.001
med.r
Cr_dibilit__GD_1 0.294
Cr_dibilit__GD_2 0.238
Cr_dibilit__GD_3 0.238
Cr_dibilit__GD_4 0.248
Corrélations item-total :
n raw.r std.r r.cor r.drop mean sd
Cr_dibilit__GD_1 405 0.720 0.636 0.409 0.327 3.951 1.520
Cr_dibilit__GD_2 405 0.645 0.621 0.397 0.306 3.765 1.265
Cr_dibilit__GD_3 405 0.669 0.744 0.645 0.456 4.247 0.914
Cr_dibilit__GD_4 405 0.630 0.688 0.551 0.366 4.178 1.028
4. Analyse factorielle :
Parallel analysis suggests that the number of factors = 3 and the number of components = NA
Nombre de facteurs suggéré : 3
- Loadings :
Loadings:
ML1
Cr_dibilit__GD_1 0.337
Cr_dibilit__GD_2 0.355
Cr_dibilit__GD_3 0.785
Cr_dibilit__GD_4 0.602
ML1
SS loadings 1.218
Proportion Var 0.305
- Communalités :
Cr_dibilit__GD_1 Cr_dibilit__GD_2 Cr_dibilit__GD_3 Cr_dibilit__GD_4
0.114 0.126 0.616 0.362
- Variance expliquée : 30.46%
- Résidus :
RMSR = 0.06691895
# CredGD (avec seulement les items 3-4)
items_CredGD <- paste0("Cr_dibilit__GD_", 3:4)
analyse_CredGD <- analyse_psychometrique(merged_df, "CredGD (2 items)", items_CredGD)
=== Analyse psychométrique de CredGD (2 items) ===
1. Statistiques descriptives :
Cr_dibilit__GD_3 Cr_dibilit__GD_4
Min. :1.000 Min. :1.000
1st Qu.:4.000 1st Qu.:4.000
Median :4.000 Median :4.000
Mean :4.247 Mean :4.178
3rd Qu.:5.000 3rd Qu.:5.000
Max. :7.000 Max. :7.000
2. Tests de normalité et adéquation :
- KMO = 0.5
- Test de Bartlett : chi2 = 106.75 , ddl = 1 , p = < 2.22e-16
3. Fiabilité :
- Alpha de Cronbach = 0.648
Statistiques par item si supprimé :
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r
Cr_dibilit__GD_3 0.429 0.483 0.233 0.483 0.933 NA 0
Cr_dibilit__GD_4 0.543 0.483 0.233 0.483 0.933 NA 0
med.r
Cr_dibilit__GD_3 0.483
Cr_dibilit__GD_4 0.483
Corrélations item-total :
n raw.r std.r r.cor r.drop mean sd
Cr_dibilit__GD_3 405 0.843 0.861 0.598 0.483 4.247 0.914
Cr_dibilit__GD_4 405 0.878 0.861 0.598 0.483 4.178 1.028
4. Analyse factorielle :
Parallel analysis suggests that the number of factors = 1 and the number of components = NA
Nombre de facteurs suggéré : 1
- Loadings :
Loadings:
ML1
Cr_dibilit__GD_3 0.695
Cr_dibilit__GD_4 0.695
ML1
SS loadings 0.966
Proportion Var 0.483
- Communalités :
Cr_dibilit__GD_3 Cr_dibilit__GD_4
0.483 0.483
- Variance expliquée : 48.27%
- Résidus :
RMSR = 1.233824e-08
# CredME
items_CredME <- paste0("Cr_dibilit__ABC_", 1:3)
analyse_CredME <- analyse_psychometrique(merged_df, "CredME", items_CredME)
=== Analyse psychométrique de CredME ===
1. Statistiques descriptives :
Cr_dibilit__ABC_1 Cr_dibilit__ABC_2 Cr_dibilit__ABC_3
Min. :1.000 Min. :1.000 Min. :1.000
1st Qu.:3.000 1st Qu.:4.000 1st Qu.:3.000
Median :4.000 Median :4.000 Median :4.000
Mean :4.025 Mean :3.988 Mean :3.886
3rd Qu.:5.000 3rd Qu.:4.000 3rd Qu.:4.000
Max. :7.000 Max. :7.000 Max. :7.000
2. Tests de normalité et adéquation :
- KMO = 0.723
- Test de Bartlett : chi2 = 580.68 , ddl = 3 , p = < 2.22e-16
3. Fiabilité :
- Alpha de Cronbach = 0.859
Statistiques par item si supprimé :
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r
Cr_dibilit__ABC_1 0.847 0.848 0.736 0.736 5.587 0.015 NA
Cr_dibilit__ABC_2 0.800 0.802 0.670 0.670 4.051 0.020 NA
Cr_dibilit__ABC_3 0.761 0.767 0.622 0.622 3.286 0.023 NA
med.r
Cr_dibilit__ABC_1 0.736
Cr_dibilit__ABC_2 0.670
Cr_dibilit__ABC_3 0.622
Corrélations item-total :
n raw.r std.r r.cor r.drop mean sd
Cr_dibilit__ABC_1 405 0.875 0.863 0.742 0.694 4.025 1.097
Cr_dibilit__ABC_2 405 0.877 0.888 0.807 0.740 3.988 0.937
Cr_dibilit__ABC_3 405 0.903 0.906 0.845 0.777 3.886 0.998
4. Analyse factorielle :
Parallel analysis suggests that the number of factors = 1 and the number of components = NA
Nombre de facteurs suggéré : 1
- Loadings :
Loadings:
ML1
Cr_dibilit__ABC_1 0.752
Cr_dibilit__ABC_2 0.827
Cr_dibilit__ABC_3 0.891
ML1
SS loadings 2.043
Proportion Var 0.681
- Communalités :
Cr_dibilit__ABC_1 Cr_dibilit__ABC_2 Cr_dibilit__ABC_3
0.565 0.684 0.793
- Variance expliquée : 68.07%
- Résidus :
RMSR = 3.566067e-08
# Congruence
items_Cong <- paste0("congruence_signaux_", 1:3)
analyse_Cong <- analyse_psychometrique(merged_df, "Congruence", items_Cong)
=== Analyse psychométrique de Congruence ===
1. Statistiques descriptives :
congruence_signaux_1 congruence_signaux_2 congruence_signaux_3
Min. :1.000 Min. :1.000 Min. :1.000
1st Qu.:3.000 1st Qu.:3.000 1st Qu.:3.000
Median :4.000 Median :4.000 Median :4.000
Mean :3.933 Mean :4.077 Mean :3.852
3rd Qu.:5.000 3rd Qu.:5.000 3rd Qu.:5.000
Max. :7.000 Max. :7.000 Max. :7.000
2. Tests de normalité et adéquation :
- KMO = 0.716
- Test de Bartlett : chi2 = 558.56 , ddl = 3 , p = < 2.22e-16
3. Fiabilité :
- Alpha de Cronbach = 0.853
Statistiques par item si supprimé :
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r
congruence_signaux_1 0.785 0.788 0.650 0.650 3.712 0.021 NA
congruence_signaux_2 0.752 0.752 0.603 0.603 3.033 0.025 NA
congruence_signaux_3 0.846 0.848 0.736 0.736 5.573 0.015 NA
med.r
congruence_signaux_1 0.650
congruence_signaux_2 0.603
congruence_signaux_3 0.736
Corrélations item-total :
n raw.r std.r r.cor r.drop mean sd
congruence_signaux_1 405 0.887 0.885 0.805 0.733 3.933 1.528
congruence_signaux_2 405 0.897 0.903 0.842 0.774 4.077 1.394
congruence_signaux_3 405 0.857 0.853 0.721 0.671 3.852 1.538
4. Analyse factorielle :
Parallel analysis suggests that the number of factors = 1 and the number of components = NA
Nombre de facteurs suggéré : 1
- Loadings :
Loadings:
ML1
congruence_signaux_1 0.826
congruence_signaux_2 0.891
congruence_signaux_3 0.730
ML1
SS loadings 2.009
Proportion Var 0.670
- Communalités :
congruence_signaux_1 congruence_signaux_2 congruence_signaux_3
0.682 0.794 0.532
- Variance expliquée : 66.94%
- Résidus :
RMSR = 7.430452e-08
# Image
items_Image <- paste0("Image_employeur_", 1:3)
analyse_Image <- analyse_psychometrique(merged_df, "Image", items_Image)
=== Analyse psychométrique de Image ===
1. Statistiques descriptives :
Image_employeur_1 Image_employeur_2 Image_employeur_3
Min. :1.00 Min. :1.000 Min. :1.00
1st Qu.:3.00 1st Qu.:3.000 1st Qu.:3.00
Median :5.00 Median :4.000 Median :5.00
Mean :4.38 Mean :4.064 Mean :4.43
3rd Qu.:5.00 3rd Qu.:5.000 3rd Qu.:6.00
Max. :7.00 Max. :7.000 Max. :7.00
2. Tests de normalité et adéquation :
- KMO = 0.762
- Test de Bartlett : chi2 = 954.7 , ddl = 3 , p = < 2.22e-16
3. Fiabilité :
- Alpha de Cronbach = 0.927
Statistiques par item si supprimé :
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r
Image_employeur_1 0.900 0.901 0.819 0.819 9.071 0.010 NA
Image_employeur_2 0.903 0.903 0.824 0.824 9.350 0.010 NA
Image_employeur_3 0.880 0.881 0.787 0.787 7.381 0.012 NA
med.r
Image_employeur_1 0.819
Image_employeur_2 0.824
Image_employeur_3 0.787
Corrélations item-total :
n raw.r std.r r.cor r.drop mean sd
Image_employeur_1 405 0.929 0.931 0.877 0.844 4.380 1.351
Image_employeur_2 405 0.932 0.930 0.873 0.841 4.064 1.444
Image_employeur_3 405 0.942 0.943 0.904 0.869 4.430 1.376
4. Analyse factorielle :
Parallel analysis suggests that the number of factors = 1 and the number of components = NA
Nombre de facteurs suggéré : 1
- Loadings :
Loadings:
ML1
Image_employeur_1 0.889
Image_employeur_2 0.885
Image_employeur_3 0.926
ML1
SS loadings 2.431
Proportion Var 0.810
- Communalités :
Image_employeur_1 Image_employeur_2 Image_employeur_3
0.791 0.783 0.858
- Variance expliquée : 81.05%
- Résidus :
RMSR = 1.422821e-09
# FAM
items_FAM <- paste0("Familiarit__ABC_", 1:3)
analyse_FAM <- analyse_psychometrique(merged_df, "Familiarité", items_FAM)
=== Analyse psychométrique de Familiarité ===
1. Statistiques descriptives :
Familiarit__ABC_1 Familiarit__ABC_2 Familiarit__ABC_3
Min. :1.000 Min. :1.000 Min. :1.000
1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000
Median :1.000 Median :1.000 Median :1.000
Mean :1.328 Mean :1.269 Mean :1.286
3rd Qu.:1.000 3rd Qu.:1.000 3rd Qu.:1.000
Max. :7.000 Max. :6.000 Max. :6.000
2. Tests de normalité et adéquation :
- KMO = 0.75
- Test de Bartlett : chi2 = 1048.21 , ddl = 3 , p = < 2.22e-16
3. Fiabilité :
- Alpha de Cronbach = 0.929
Statistiques par item si supprimé :
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r
Familiarit__ABC_1 0.936 0.937 0.881 0.881 14.766 0.006 NA
Familiarit__ABC_2 0.878 0.881 0.787 0.787 7.405 0.012 NA
Familiarit__ABC_3 0.883 0.889 0.801 0.801 8.027 0.011 NA
med.r
Familiarit__ABC_1 0.881
Familiarit__ABC_2 0.787
Familiarit__ABC_3 0.801
Corrélations item-total :
n raw.r std.r r.cor r.drop mean sd
Familiarit__ABC_1 405 0.926 0.919 0.841 0.819 1.328 0.908
Familiarit__ABC_2 405 0.947 0.952 0.926 0.887 1.269 0.773
Familiarit__ABC_3 405 0.944 0.947 0.917 0.875 1.286 0.810
4. Analyse factorielle :
Parallel analysis suggests that the number of factors = 1 and the number of components = NA
Nombre de facteurs suggéré : 1
- Loadings :
Loadings:
ML1
Familiarit__ABC_1 0.846
Familiarit__ABC_2 0.946
Familiarit__ABC_3 0.931
ML1
SS loadings 2.477
Proportion Var 0.826
- Communalités :
Familiarit__ABC_1 Familiarit__ABC_2 Familiarit__ABC_3
0.716 0.895 0.866
- Variance expliquée : 82.58%
- Résidus :
RMSR = 4.386829e-08
# Analyse de CredE sur subset_noDM car les items sont créés après imputation
items_CredE <- c("CredE1", "CredE2", "CredE3", "CredE4")
analyse_CredE <- analyse_psychometrique(subset_noDM, "CredE", items_CredE)
=== Analyse psychométrique de CredE ===
1. Statistiques descriptives :
CredE1 CredE2 CredE3 CredE4
Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
1st Qu.:3.000 1st Qu.:3.000 1st Qu.:4.000 1st Qu.:3.000
Median :4.000 Median :4.000 Median :4.000 Median :4.000
Mean :3.988 Mean :3.748 Mean :3.912 Mean :3.721
3rd Qu.:5.000 3rd Qu.:5.000 3rd Qu.:4.750 3rd Qu.:4.000
Max. :7.000 Max. :7.000 Max. :7.000 Max. :7.000
2. Tests de normalité et adéquation :
- KMO = 0.781
- Test de Bartlett : chi2 = 565.16 , ddl = 6 , p = < 2.22e-16
3. Fiabilité :
- Alpha de Cronbach = 0.829
Statistiques par item si supprimé :
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
CredE1 0.805 0.817 0.767 0.599 4.474 0.019 0.014 0.550
CredE2 0.836 0.843 0.795 0.642 5.384 0.016 0.008 0.641
CredE3 0.758 0.764 0.702 0.519 3.243 0.024 0.014 0.512
CredE4 0.738 0.752 0.679 0.502 3.029 0.025 0.007 0.550
Corrélations item-total :
n raw.r std.r r.cor r.drop mean sd
CredE1 330 0.800 0.791 0.685 0.616 3.988 1.325
CredE2 330 0.766 0.751 0.608 0.554 3.748 1.353
CredE3 330 0.845 0.863 0.818 0.737 3.912 1.041
CredE4 330 0.870 0.879 0.849 0.760 3.721 1.170
4. Analyse factorielle :
Parallel analysis suggests that the number of factors = 1 and the number of components = NA
Nombre de facteurs suggéré : 1
- Loadings :
Loadings:
ML1
CredE1 0.698
CredE2 0.606
CredE3 0.829
CredE4 0.887
ML1
SS loadings 2.328
Proportion Var 0.582
- Communalités :
CredE1 CredE2 CredE3 CredE4
0.488 0.367 0.688 0.787
- Variance expliquée : 58.22%
- Résidus :
RMSR = 0.02698483
Analyses psychométriques sur données imputées
# Fonction pour analyser CredE sur les jeux imputés
analyse_CredE_imputed <- function(imp_datasets, nom_echelle = "CredE (imputé)", items = c("CredE1", "CredE2", "CredE3", "CredE4")) {
cat("\n=== Analyse psychométrique de", nom_echelle, "sur données imputées ===\n")
# Initialisation des résultats
alphas <- numeric(length(imp_datasets))
kmos <- numeric(length(imp_datasets))
variances <- numeric(length(imp_datasets))
# Analyse sur chaque jeu imputé
for (i in 1:length(imp_datasets)) {
data <- imp_datasets[[i]]
# Extraction des données de l'échelle
data_echelle <- data[, items, drop = FALSE]
complete_cases <- complete.cases(data_echelle)
data_complete <- data_echelle[complete_cases, , drop = FALSE]
# Alpha de Cronbach
alpha_res <- psych::alpha(data_echelle)
alphas[i] <- alpha_res$total$raw_alpha
# KMO et analyse factorielle
if(sum(complete_cases) > 1) {
mat_cor <- cor(data_complete)
kmo_res <- KMO(mat_cor)
kmos[i] <- kmo_res$MSA
fa_res <- fa(data_complete, nfactors = 1, fm = "ml", rotate = "none")
variances[i] <- fa_res$Vaccounted[2,1] * 100
}
}
# Résultats combinés
cat("\nRésultats combinés sur", length(imp_datasets), "jeux imputés :\n")
cat("- Alpha de Cronbach moyen =", round(mean(alphas, na.rm = TRUE), 3), "\n")
cat("- KMO moyen =", round(mean(kmos, na.rm = TRUE), 3), "\n")
cat("- Variance expliquée moyenne =", round(mean(variances, na.rm = TRUE), 2), "%\n")
return(list(
alpha_mean = mean(alphas, na.rm = TRUE),
kmo_mean = mean(kmos, na.rm = TRUE),
variance_mean = mean(variances, na.rm = TRUE)
))
}
# Analyse de CredE sur les jeux imputés PMM
analyse_CredE_pmm <- analyse_CredE_imputed(subset_pmm)
=== Analyse psychométrique de CredE (imputé) sur données imputées ===
Résultats combinés sur 10 jeux imputés :
- Alpha de Cronbach moyen = 0.811
- KMO moyen = 0.758
- Variance expliquée moyenne = 55.53 %
# Analyse de CredE sur les jeux imputés RF
analyse_CredE_rf <- analyse_CredE_imputed(subset_rf)
=== Analyse psychométrique de CredE (imputé) sur données imputées ===
Résultats combinés sur 10 jeux imputés :
- Alpha de Cronbach moyen = 0.803
- KMO moyen = 0.772
- Variance expliquée moyenne = 53.67 %
Synthèse des analyses psychométriques
Cette section présente les analyses psychométriques des différentes échelles utilisées dans notre étude expérimentale. Ces analyses permettent d’évaluer la qualité et la fiabilité des instruments de mesure avant de procéder aux analyses structurelles.
Comparaison des échelles de crédibilité de Glassdoor
Nous avons analysé deux versions de l’échelle de crédibilité perçue de Glassdoor :
- CGD : Version originale à 4 items (items 1 à 4)
- CredGD : Version réduite à 2 items (items 3 et 4 uniquement)
L’analyse psychométrique de l’échelle complète à 4 items a révélé plusieurs problèmes :
- Un indice KMO médiocre (0.599)
- Un alpha de Cronbach insuffisant (0.563)
- Une analyse factorielle suggérant 3 facteurs pour seulement 4 items - Des loadings faibles pour les items 1 et 2 (0.337 et 0.355)
- Une variance expliquée limitée (30.46%)
Face à ces résultats, nous avons décidé de ne conserver que les items 3 et 4 qui présentaient les meilleurs loadings (0.785 et 0.602) et communalités (0.616 et 0.362). Cette décision a permis d’améliorer significativement les propriétés psychométriques de l’échelle.
Comparaison des propriétés psychométriques :
- Alpha de Cronbach :
- CGD (4 items) : α = 0,563
- CredGD (2 items) : α =
0,648
- KMO :
- CGD (4 items) : 0,599
- CredGD (2 items) :
0,5
- Variance expliquée :
- CGD (4 items) : 30,46%
- CredGD (2 items) : 48,3%
- Structure factorielle :
- CGD (4 items) : 3 facteurs suggérés par l’analyse parallèle
- CredGD (2 items) : 1 facteur suggéré par l’analyse parallèle
La version à 2 items (CredGD) présente des propriétés psychométriques nettement supérieures à la version originale à 4 items :
- L’alpha de Cronbach est passé à 0.648, ce qui est acceptable pour une échelle à 2 items
- L’analyse factorielle confirme désormais une structure unidimensionnelle
- Les loadings sont équilibrés (0.695 pour les deux items)
- La variance expliquée a augmenté à 48.27%
- Les résidus sont pratiquement nuls (RMSR ≈ 0)
Cette version réduite de l’échelle CredGD, bien que composée de seulement deux items, capture plus efficacement le construit de crédibilité perçue de Glassdoor et sera donc utilisée dans nos analyses structurelles.
Crédibilité de la Marque employeur (CredME)
Cette échelle à trois items mesure la crédibilité perçue de la marque employeur utilisée par l’entreprise.
Propriétés psychométriques :
- Les moyennes des items sont homogènes (entre 3,89 et 4,03)
- L’indice KMO (0,723) indique une bonne adéquation des données
- Excellente fiabilité interne (α = 0,859)
- Structure factorielle unidimensionnelle confirmée
- Saturations factorielles élevées (0,752 à 0,891)
- Variance expliquée satisfaisante (68,07%)
Cette échelle présente d’excellentes qualités psychométriques, soutenant sa validité et sa fiabilité.
Congruence des Signaux (Cong)
L’échelle de congruence mesure la cohérence perçue entre les différentes sources d’information.
Propriétés psychométriques :
- Les scores moyens sont homogènes (entre 3,85 et 4,08)
- KMO satisfaisant (0,716) - Bonne fiabilité interne (α = 0,853)
- Structure factorielle unidimensionnelle confirmée
- Saturations factorielles élevées (0,730 à 0,891)
- Variance expliquée satisfaisante (66,94%)
Les propriétés psychométriques de cette échelle sont très satisfaisantes.
Image de l’Employeur (Image)
Cette échelle à trois items évalue la perception globale de l’image de l’employeur.
Propriétés psychométriques :
- Scores moyens relativement élevés (entre 4,06 et 4,43)
- Excellent KMO (0,762)
- Fiabilité interne remarquable (α = 0,927)
- Structure factorielle unidimensionnelle confirmée
- Saturations factorielles très élevées (0,885 à 0,926)
- Variance expliquée excellente (81,05%)
Cette échelle présente des qualités psychométriques exceptionnelles, ce qui en fait une mesure très fiable du concept d’image de l’employeur.
Familiarité avec l’Entreprise (FAM)
L’échelle de familiarité mesure la connaissance que les répondants possèdent sur l’entreprise fictive ABC préalablement au questionnaire.
Propriétés psychométriques :
- Scores moyens très bas (entre 1,27 et 1,33 sur 7) - Bon KMO (0,750)
- Fiabilité interne excellente (α = 0,929)
- Structure factorielle unidimensionnelle confirmée
- Saturations factorielles très élevées (0,846 à 0,946)
- Variance expliquée excellente (82,58%)
Les scores très bas indiquent une faible familiarité préalable avec l’entreprise, ce qui est cohérent avec l’utilisation d’une entreprise fictive ou peu connue dans l’expérimentation. Les excellentes propriétés psychométriques confirment néanmoins la validité de cette mesure.
Crédibilité de l’Évaluateur (CredE)
Cette échelle mesure la crédibilité perçue de la source d’évaluation (interne ou externe).
Propriétés psychométriques (sur données complètes) :
- Scores moyens homogènes (entre 3,72 et 3,99)
- Bon KMO (0,781) - Fiabilité interne satisfaisante (α = 0,829)
- Structure factorielle unidimensionnelle confirmée
- Saturations factorielles variables mais acceptables (0,606 à 0,887)
- Variance expliquée satisfaisante (58,22%)
Propriétés sur données imputées :
- Méthode PMM : α = 0,821, KMO = 0,758, variance expliquée = 56,98%
- Méthode RF : α = 0,801, KMO = 0,771, variance expliquée = 53,46%
La robustesse des indicateurs psychométriques entre les données originales et les données imputées par deux méthodes distinctes (PMM et RF) confirme la stabilité et la fiabilité de cette échelle.
Conclusion des analyses psychométriques
La majorité des échelles utilisées dans cette étude présentent d’excellentes propriétés psychométriques, avec des coefficients alpha de Cronbach dépassant 0,80, des indices KMO satisfaisants et des structures factorielles clairement unidimensionnelles. Seule l’échelle de crédibilité de Glassdoor (CredGD) montre des faiblesses, avec une fiabilité limitée et une structure factorielle potentiellement multidimensionnelle (cependant considérant le faible nombre d’items, la suppression d’un item n’a pas permis d’améliorer les propriétés psychométriques de l’échelle.
Les résultats similaires obtenus avec les données imputées (PMM et RF) comparés aux données complètes renforcent la confiance dans la stabilité des mesures utilisées et la pertinence des analyses d’imputation multiple pour traiter les données manquantes.
Ces analyses psychométriques robustes constituent un prérequis essentiel pour les analyses structurelles subséquentes, garantissant que les relations entre variables identifiées dans le modèle SEM reposent sur des mesures fiables et valides.
Analyse de la normalité des variables du modèle
Avant de procéder aux analyses SEM, il est important d’évaluer la normalité des variables incluses dans notre modèle. Cette étape est cruciale car certaines méthodes d’estimation, comme le Maximum Likelihood (ML), supposent que les données suivent approximativement une distribution normale.
# Fonction pour tester la normalité d'une variable
test_normalite <- function(data, var_name) {
# Extraction de la variable
var <- data[[var_name]]
# Test de Shapiro-Wilk
shapiro_test <- shapiro.test(var)
# Calcul de l'asymétrie (skewness) et de l'aplatissement (kurtosis)
skew_val <- psych::skew(var)
kurt_val <- psych::kurtosi(var)
# Retourner les résultats
return(list(
variable = var_name,
shapiro_p = shapiro_test$p.value,
skewness = skew_val,
kurtosis = kurt_val,
normal_shapiro = shapiro_test$p.value > 0.05,
normal_skew_kurt = abs(skew_val) < 1 && abs(kurt_val) < 2
))
}
# Variables à tester
variables_modele <- c("Image", "Cong", "CredE", "CredGD", "CredME")
# Test de la normalité sur les données complètes
resultats_normalite <- lapply(variables_modele, function(var) test_normalite(subset_noDM, var))
# Création du tableau de résultats détaillé
resultats_df <- do.call(rbind, lapply(resultats_normalite, function(x) {
data.frame(
Variable = x$variable,
Shapiro_p = round(x$shapiro_p, 4),
Skewness = round(x$skewness, 3),
Kurtosis = round(x$kurtosis, 3),
Normal_Shapiro = ifelse(x$normal_shapiro, "Oui", "Non"),
Normal_Skew_Kurt = ifelse(x$normal_skew_kurt, "Oui", "Non")
)
}))
# Affichage du tableau détaillé
knitr::kable(resultats_df,
caption = "Tests de normalité des variables du modèle",
col.names = c("Variable", "p-value (Shapiro-Wilk)", "Asymétrie", "Aplatissement",
"Normalité (Shapiro)", "Normalité (Asym./Aplat.)"))| Variable | p-value (Shapiro-Wilk) | Asymétrie | Aplatissement | Normalité (Shapiro) | Normalité (Asym./Aplat.) |
|---|---|---|---|---|---|
| Image | 0.0000 | -0.350 | -0.483 | Non | Oui |
| Cong | 0.0026 | -0.114 | -0.351 | Non | Oui |
| CredE | 0.0000 | -0.723 | 0.473 | Non | Oui |
| CredGD | 0.0000 | -0.062 | 0.848 | Non | Oui |
| CredME | 0.0000 | -0.539 | 1.139 | Non | Oui |
# Statistiques descriptives pour chaque variable
stats_desc <- do.call(rbind, lapply(variables_modele, function(var) {
data.frame(
Variable = var,
Moyenne = round(mean(subset_noDM[[var]], na.rm = TRUE), 3),
Ecart_type = round(sd(subset_noDM[[var]], na.rm = TRUE), 3),
Minimum = round(min(subset_noDM[[var]], na.rm = TRUE), 3),
Q1 = round(quantile(subset_noDM[[var]], 0.25, na.rm = TRUE), 3),
Mediane = round(median(subset_noDM[[var]], na.rm = TRUE), 3),
Q3 = round(quantile(subset_noDM[[var]], 0.75, na.rm = TRUE), 3),
Maximum = round(max(subset_noDM[[var]], na.rm = TRUE), 3)
)
}))
# Affichage des statistiques descriptives
knitr::kable(stats_desc,
caption = "Statistiques descriptives des variables du modèle",
col.names = c("Variable", "Moyenne", "Écart-type", "Minimum", "Q1", "Médiane", "Q3", "Maximum"))| Variable | Moyenne | Écart-type | Minimum | Q1 | Médiane | Q3 | Maximum | |
|---|---|---|---|---|---|---|---|---|
| 25% | Image | 4.471 | 1.255 | 1.0 | 3.667 | 4.667 | 5.333 | 7.000 |
| 25%1 | Cong | 4.167 | 1.272 | 1.0 | 3.333 | 4.000 | 5.000 | 7.000 |
| 25%2 | CredE | 3.842 | 0.999 | 1.0 | 3.312 | 4.000 | 4.500 | 6.250 |
| 25%3 | CredGD | 4.226 | 0.852 | 1.5 | 4.000 | 4.000 | 5.000 | 7.000 |
| 25%4 | CredME | 4.052 | 0.885 | 1.0 | 3.667 | 4.000 | 4.667 | 6.333 |
# Tableau détaillé des tests de normalité univariée
normalite_univariee <- data.frame(
Variable = variables_modele,
Moyenne = sapply(variables_modele, function(var) round(mean(subset_noDM[[var]], na.rm = TRUE), 3)),
Ecart_type = sapply(variables_modele, function(var) round(sd(subset_noDM[[var]], na.rm = TRUE), 3)),
Skewness = sapply(variables_modele, function(var) round(psych::skew(subset_noDM[[var]]), 3)),
Kurtosis = sapply(variables_modele, function(var) round(psych::kurtosi(subset_noDM[[var]]), 3)),
Shapiro_W = sapply(variables_modele, function(var) round(shapiro.test(subset_noDM[[var]])$statistic, 3)),
Shapiro_p = sapply(variables_modele, function(var) round(shapiro.test(subset_noDM[[var]])$p.value, 4)),
Conclusion = sapply(variables_modele, function(var) {
skew <- abs(psych::skew(subset_noDM[[var]])) < 1
kurt <- abs(psych::kurtosi(subset_noDM[[var]])) < 2
if(skew && kurt) {
"Acceptable"
} else {
"Non normale"
}
})
)
# Afficher le tableau détaillé de normalité univariée
knitr::kable(normalite_univariee,
caption = "Analyse détaillée de la normalité univariée",
col.names = c("Variable", "Moyenne", "Écart-type", "Asymétrie", "Aplatissement",
"Shapiro-W", "p-value", "Conclusion"))| Variable | Moyenne | Écart-type | Asymétrie | Aplatissement | Shapiro-W | p-value | Conclusion | |
|---|---|---|---|---|---|---|---|---|
| Image | Image | 4.471 | 1.255 | -0.350 | -0.483 | 0.971 | 0.0000 | Acceptable |
| Cong | Cong | 4.167 | 1.272 | -0.114 | -0.351 | 0.986 | 0.0026 | Acceptable |
| CredE | CredE | 3.842 | 0.999 | -0.723 | 0.473 | 0.954 | 0.0000 | Acceptable |
| CredGD | CredGD | 4.226 | 0.852 | -0.062 | 0.848 | 0.936 | 0.0000 | Acceptable |
| CredME | CredME | 4.052 | 0.885 | -0.539 | 1.139 | 0.952 | 0.0000 | Acceptable |
# Visualisation des distributions
par(mfrow = c(2, 3), mar = c(4, 4, 2, 1))
for (var in variables_modele) {
# Histogramme avec courbe de densité
hist(subset_noDM[[var]],
main = paste("Distribution de", var),
xlab = var,
probability = TRUE,
col = "lightblue",
border = "white")
lines(density(subset_noDM[[var]], na.rm = TRUE), col = "darkblue", lwd = 2)
curve(dnorm(x, mean = mean(subset_noDM[[var]], na.rm = TRUE),
sd = sd(subset_noDM[[var]], na.rm = TRUE)),
add = TRUE, col = "red", lty = 2, lwd = 2)
legend("topright",
legend = c("Densité observée", "Densité normale théorique"),
col = c("darkblue", "red"),
lty = c(1, 2),
lwd = 2,
cex = 0.7)
# QQ-plot
qqnorm(subset_noDM[[var]],
main = paste("QQ-Plot de", var),
pch = 19,
col = "darkblue")
qqline(subset_noDM[[var]], col = "red", lwd = 2)
}par(mfrow = c(1, 1))# Analyse de la normalité multivariée
cat("\n=== Test de normalité multivariée ===\n")
=== Test de normalité multivariée ===
library(MVN)Warning: le package 'MVN' a été compilé avec la version R 4.3.3
mvn_result <- mvn(subset_noDM[, variables_modele], mvnTest = "mardia")
print(mvn_result$multivariateNormality) Test Statistic p value Result
1 Mardia Skewness 147.520567917149 9.13307659444065e-16 NO
2 Mardia Kurtosis 7.67327874433795 1.68753899743024e-14 NO
3 MVN <NA> <NA> NO
# Inspecter la structure du résultat pour comprendre le problème
cat("\n=== Structure du résultat du test de Mardia ===\n")
=== Structure du résultat du test de Mardia ===
cat("Nombre de lignes dans le résultat:", nrow(mvn_result$multivariateNormality), "\n")Nombre de lignes dans le résultat: 3
cat("Noms des tests:", as.character(mvn_result$multivariateNormality$Test), "\n")Noms des tests: Mardia Skewness Mardia Kurtosis MVN
# Créer le tableau de normalité multivariée en extrayant spécifiquement les lignes pour l'asymétrie et l'aplatissement
mardia_skew_idx <- which(mvn_result$multivariateNormality$Test == "Mardia Skewness")
mardia_kurt_idx <- which(mvn_result$multivariateNormality$Test == "Mardia Kurtosis")
# Tableau récapitulatif de la normalité multivariée
mardia_results <- data.frame(
Test = c("Asymétrie multivariée (Mardia)", "Aplatissement multivarié (Mardia)"),
Statistique = as.numeric(as.character(mvn_result$multivariateNormality$Statistic[c(mardia_skew_idx, mardia_kurt_idx)])),
p_value = as.numeric(as.character(mvn_result$multivariateNormality$`p value`[c(mardia_skew_idx, mardia_kurt_idx)]))
)
# Conclusion basée sur les valeurs p numériques
mardia_results$Conclusion <- ifelse(mardia_results$p_value > 0.05, "Normale", "Non normale")
# Formatage les valeurs p pour l'affichage
mardia_results$p_value_formatted <- format(mardia_results$p_value, scientific = TRUE, digits = 4)
# Afficher le tableau de normalité multivariée
knitr::kable(mardia_results[, c("Test", "Statistique", "p_value_formatted", "Conclusion")],
caption = "Résultats des tests de normalité multivariée",
col.names = c("Test", "Statistique", "p-value", "Conclusion"))| Test | Statistique | p-value | Conclusion |
|---|---|---|---|
| Asymétrie multivariée (Mardia) | 147.520568 | 9.133e-16 | Non normale |
| Aplatissement multivarié (Mardia) | 7.673279 | 1.688e-14 | Non normale |
# Interprétation des résultats de Mardia
cat("\n**Interprétation du test de Mardia :**\n")
**Interprétation du test de Mardia :**
cat("- Asymétrie multivariée : Statistique =",
round(as.numeric(as.character(mvn_result$multivariateNormality$Statistic[mardia_skew_idx])), 3),
", p-value =",
format(as.numeric(as.character(mvn_result$multivariateNormality$`p value`[mardia_skew_idx])), scientific = TRUE, digits = 4),
"\n")- Asymétrie multivariée : Statistique = 147.521 , p-value = 9.133e-16
cat("- Aplatissement multivarié : Statistique =",
round(as.numeric(as.character(mvn_result$multivariateNormality$Statistic[mardia_kurt_idx])), 3),
", p-value =",
format(as.numeric(as.character(mvn_result$multivariateNormality$`p value`[mardia_kurt_idx])), scientific = TRUE, digits = 4),
"\n")- Aplatissement multivarié : Statistique = 7.673 , p-value = 1.688e-14
cat("- Conclusion : Les deux tests indiquent une déviation significative de la normalité multivariée (p < 0.05).\n")- Conclusion : Les deux tests indiquent une déviation significative de la normalité multivariée (p < 0.05).
Interprétation des tests de normalité
L’analyse de la normalité des variables clés de notre modèle révèle plusieurs points importants :
Normalité univariée
Test de Shapiro-Wilk : Ce test formel de normalité est très sensible aux écarts, surtout avec des échantillons de taille moyenne à grande. Nos résultats montrent que toutes les variables principales (Image, Cong, CredE, CredGD, CredME) s’écartent significativement d’une distribution normale selon ce test (p < 0.05).
Asymétrie (Skewness) : L’asymétrie mesure le degré de déséquilibre de la distribution. Nos variables présentent des valeurs d’asymétrie modérées :
- Image : asymétrie négative (-0.350), indiquant une tendance vers des valeurs plus élevées
- Cong : quasi-symétrique (-0.114)
- CredE : asymétrie négative modérée (-0.723)
- CredGD : légère asymétrie négative (-0.205)
- CredME : asymétrie négative modérée (-0.539)
Ces valeurs restent toutes dans la plage acceptable (|skewness| < 1), suggérant des déviations modérées de la normalité.
Aplatissement (Kurtosis) : L’aplatissement mesure la concentration des valeurs autour de la moyenne. Nos variables montrent :
- Image : distribution légèrement plus aplatie (-0.483) qu’une normale
- Cong : distribution légèrement plus aplatie (-0.351)
- CredE : distribution légèrement plus pointue (0.473)
- CredGD : distribution légèrement plus pointue (0.490)
- CredME : distribution plus pointue (1.139), mais toujours dans la plage acceptable
Ces valeurs restent toutes dans la plage acceptable (|kurtosis| < 2).
Normalité multivariée
Le test de Mardia indique une déviation significative de la normalité multivariée, avec un coefficient d’asymétrie multivariée de 127.73 (p < 0,001) et un coefficient d’aplatissement multivarié de 7.07 (p< 0,001). Cette déviation est courante dans les données issues de questionnaires utilisant des échelles de Likert.
Implications pour l’analyse SEM
Bien que nos variables s’écartent de la normalité selon les tests formels, les indicateurs d’asymétrie et d’aplatissement restent dans des plages acceptables. Cette situation est typique des données issues de questionnaires en sciences sociales. Pour tenir compte de ces écarts modérés à la normalité, nous avons utilisé l’estimateur MLR (Maximum Likelihood avec erreurs standard robustes) dans nos analyses SEM (ci-après), qui est robuste aux violations modérées de l’hypothèse de normalité.
Les histogrammes et QQ-plots confirment visuellement que, malgré des déviations statistiquement significatives, nos distributions restent raisonnablement proches de la normalité.
Cette analyse de normalité justifie notre choix méthodologique d’utiliser l’estimateur MLR pour les analyses SEM, offrant ainsi un bon compromis entre précision des estimations et robustesse face aux écarts modérés de normalité observés dans nos données.
4. Analyses SEM
Méthode d’équations structurelles (SEM)
Dans cette section, nous utilisons la modélisation par équations structurelles pour analyser les relations directes et indirectes entre nos variables, conformément au cadre conceptuel présenté dans le diagramme initial. Cette approche nous permet d’évaluer simultanément plusieurs chemins de médiation et de quantifier leurs effets respectifs.
Notre stratégie analytique comprend trois approches comparatives du traitement des données manquantes :
1) Analyse sur cas complets (noDM) : utilisation uniquement des observations sans données manquantes (N=330),
2) Imputation multiple par Predictive Mean Matching (PMM) : 10 jeux de données imputés,
3) Imputation multiple par Random Forest (RF) : également 10 jeux de données imputés (N=405 après imputation).
Pour chaque approche, nous utilisons l’estimateur MLR (Maximum Likelihood avec erreurs standard robustes) qui offre une meilleure résistance aux déviations de normalité révélées par les tests de normalité.
# Préparation des données imputées
prepare_imputed_data <- function(imp_list) {
lapply(imp_list, function(df) {
# Création CredE
if (!"CredE" %in% names(df)) {
# Vérifier si les composants existent
has_components <- all(c("CredE1", "CredE2", "CredE3", "CredE4") %in% names(df))
if (has_components) {
# Création CredE à partir des composants existants
df$CredE <- rowMeans(df[, c("CredE1", "CredE2", "CredE3", "CredE4")], na.rm = TRUE)
cat("Variable CredE créée à partir des composants existants\n")
} else {
# Créer les composants si nécessaire
if (!"CredE1" %in% names(df) && all(c("Source", "Cr_dibilit__baro_int_1", "cr_dibilit__baro_ext_1") %in% names(df))) {
df$CredE1 <- ifelse(df$Source == 1, df$Cr_dibilit__baro_int_1, df$cr_dibilit__baro_ext_1)
cat("Variable CredE1 créée\n")
}
if (!"CredE2" %in% names(df) && all(c("Source", "Cr_dibilit__baro_int_2", "cr_dibilit__baro_ext_2") %in% names(df))) {
df$CredE2 <- ifelse(df$Source == 1, df$Cr_dibilit__baro_int_2, df$cr_dibilit__baro_ext_2)
cat("Variable CredE2 créée\n")
}
if (!"CredE3" %in% names(df) && all(c("Source", "Cr_dibilit__baro_int_3", "cr_dibilit__baro_ext_3") %in% names(df))) {
df$CredE3 <- ifelse(df$Source == 1, df$Cr_dibilit__baro_int_3, df$cr_dibilit__baro_ext_3)
cat("Variable CredE3 créée\n")
}
if (!"CredE4" %in% names(df) && all(c("Source", "Cr_dibilit__baro_int_4", "cr_dibilit__baro_ext_4") %in% names(df))) {
df$CredE4 <- ifelse(df$Source == 1, df$Cr_dibilit__baro_int_4, df$cr_dibilit__baro_ext_4)
cat("Variable CredE4 créée\n")
}
# Création CredE
if (all(c("CredE1", "CredE2", "CredE3", "CredE4") %in% names(df))) {
df$CredE <- rowMeans(df[, c("CredE1", "CredE2", "CredE3", "CredE4")], na.rm = TRUE)
cat("Variable CredE créée à partir des composants nouvellement créés\n")
} else {
warning("Impossible de créer CredE: composants manquants")
}
}
}
# Convertion de toutes les variables en numérique
df[] <- lapply(df, as.numeric)
return(df)
})
}
subset_pmm_prepared <- prepare_imputed_data(subset_pmm)
subset_rf_prepared <- prepare_imputed_data(subset_rf)
# Convertion de Note en numérique dans subset_noDM aussi
subset_noDM$Note <- as.numeric(subset_noDM$Note)
# Modèle SEM avec variables de contrôle
model_with_ctrl <- '
# Equation finale (Image)
Image ~ b1*CredME + b2*Note + b3*FAM + b4*age_num
# Médiations
CredME ~ a1*CredE + a2*CredGD
CredE ~ c1*Cong + c2*Source
CredGD ~ d1*Cong + d2*Note
Cong ~ e1*Note + e2*Source
# Effets indirects
ind1 := e2 * c1 * a1 * b1
ind2 := e2 * d1 * a2 * b1
ind3 := c2 * a1 * b1
ind4 := e1 * d1 * a2 * b1
ind5 := e1 * c1 * a1 * b1
ind6 := d2 * a2 * b1
# Effets totaux
tot_ind := ind1 + ind2 + ind3 + ind4 + ind5 + ind6
tot_effect := tot_ind + b2
'
# 1. ANALYSES SUR DONNÉES COMPLÈTES
cat("\n\n===========================================================")
===========================================================
cat("\n=== RÉSULTATS SEM - DONNÉES COMPLÈTES (noDM) ===\n")
=== RÉSULTATS SEM - DONNÉES COMPLÈTES (noDM) ===
cat("===========================================================\n")===========================================================
# Ajustement du modèle
fit_noDM <- sem(model_with_ctrl, data = subset_noDM, estimator = "MLR")
# Indices d'ajustement
cat("\n=== INDICES D'AJUSTEMENT ===\n")
=== INDICES D'AJUSTEMENT ===
fit_indices_noDM <- fitMeasures(fit_noDM)
cat(sprintf("Chi² = %.3f (df=%d, p=%.4f)\n",
fit_indices_noDM["chisq"],
fit_indices_noDM["df"],
fit_indices_noDM["pvalue"]))Chi² = 72.575 (df=18, p=0.0000)
cat(sprintf("CFI = %.3f\n", fit_indices_noDM["cfi"]))CFI = 0.907
cat(sprintf("TLI = %.3f\n", fit_indices_noDM["tli"]))TLI = 0.845
cat(sprintf("RMSEA = %.3f [%.3f; %.3f]\n",
fit_indices_noDM["rmsea"],
fit_indices_noDM["rmsea.ci.lower"],
fit_indices_noDM["rmsea.ci.upper"]))RMSEA = 0.096 [0.073; 0.119]
cat(sprintf("SRMR = %.3f\n", fit_indices_noDM["srmr"]))SRMR = 0.074
# Coefficients et significativité
cat("\n=== COEFFICIENTS DES CHEMINS ===\n")
=== COEFFICIENTS DES CHEMINS ===
# Utilisation de standardizedSolution pour obtenir les coefficients standardisés
coefs_noDM <- standardizedSolution(fit_noDM)
# Filtrage les chemins de régression et effets indirects
reg_paths <- coefs_noDM[coefs_noDM$op %in% c("~", ":="), ]
# Chemins de régression directs
cat("\nRégressions directes:\n")
Régressions directes:
direct_paths <- reg_paths[reg_paths$op == "~", ]
for (i in 1:nrow(direct_paths)) {
signif <- ""
if (direct_paths$pvalue[i] < 0.001) signif <- "***"
else if (direct_paths$pvalue[i] < 0.01) signif <- "**"
else if (direct_paths$pvalue[i] < 0.05) signif <- "*"
else if (direct_paths$pvalue[i] < 0.1) signif <- "."
cat(sprintf("%s ~ %s (%.3f, p=%.4f) %s\n",
direct_paths$lhs[i],
direct_paths$rhs[i],
direct_paths$est.std[i],
direct_paths$pvalue[i],
signif))
}Image ~ CredME (0.514, p=0.0000) ***
Image ~ Note (0.313, p=0.0000) ***
Image ~ FAM (0.015, p=0.7462)
Image ~ age_num (0.090, p=0.0021) **
CredME ~ CredE (0.573, p=0.0000) ***
CredME ~ CredGD (0.138, p=0.0032) **
CredE ~ Cong (0.226, p=0.0000) ***
CredE ~ Source (0.341, p=0.0000) ***
CredGD ~ Cong (0.197, p=0.0046) **
CredGD ~ Note (-0.161, p=0.0169) *
Cong ~ Note (0.594, p=0.0000) ***
Cong ~ Source (0.024, p=0.5816)
# Effets indirects
cat("\nEffets indirects et totaux:\n")
Effets indirects et totaux:
indirect_paths <- reg_paths[reg_paths$op == ":=", ]
for (i in 1:nrow(indirect_paths)) {
signif <- ""
if (indirect_paths$pvalue[i] < 0.001) signif <- "***"
else if (indirect_paths$pvalue[i] < 0.01) signif <- "**"
else if (indirect_paths$pvalue[i] < 0.05) signif <- "*"
else if (indirect_paths$pvalue[i] < 0.1) signif <- "."
cat(sprintf("%s = %.3f (p=%.4f) %s\n",
indirect_paths$label[i],
indirect_paths$est.std[i],
indirect_paths$pvalue[i],
signif))
}ind1 = 0.002 (p=0.5961)
ind2 = 0.000 (p=0.6066)
ind3 = 0.100 (p=0.0000) ***
ind4 = 0.008 (p=0.0778) .
ind5 = 0.039 (p=0.0002) ***
ind6 = -0.011 (p=0.0753) .
tot_ind = 0.139 (p=0.0000) ***
tot_effect = 0.451 (p=0.0000) ***
# 2. ANALYSES SUR DONNÉES IMPUTÉES PMM
cat("\n\n===========================================================")
===========================================================
cat("\n=== RÉSULTATS SEM - IMPUTATION PMM ===\n")
=== RÉSULTATS SEM - IMPUTATION PMM ===
cat("===========================================================\n")===========================================================
# Ajustement du modèle sur chaque jeu imputé
cat("Ajustement du modèle SEM sur chaque jeu imputé PMM...\n")Ajustement du modèle SEM sur chaque jeu imputé PMM...
fit_pmm_list <- vector("list", length(subset_pmm_prepared))
successful_fits <- 0 # Initialisation de successful_fits
# Ajustement du modèle sur chaque jeu imputé manuellement
for (i in 1:length(subset_pmm_prepared)) {
tryCatch({
fit_pmm_list[[i]] <- sem(model_with_ctrl, data = subset_pmm_prepared[[i]], estimator = "MLR")
cat("Modèle", i, "ajusté avec succès\n")
}, error = function(e) {
cat("Erreur lors de l'ajustement du modèle pour le jeu", i, ":", conditionMessage(e), "\n")
fit_pmm_list[[i]] <- NULL
})
}Modèle 1 ajusté avec succès
Modèle 2 ajusté avec succès
Modèle 3 ajusté avec succès
Modèle 4 ajusté avec succès
Modèle 5 ajusté avec succès
Modèle 6 ajusté avec succès
Modèle 7 ajusté avec succès
Modèle 8 ajusté avec succès
Modèle 9 ajusté avec succès
Modèle 10 ajusté avec succès
# Vérification du nombre de modèles ont été ajustés avec succès
successful_fits <- sum(!sapply(fit_pmm_list, is.null))
cat("Nombre de modèles ajustés avec succès:", successful_fits, "sur", length(subset_pmm_prepared), "\n")Nombre de modèles ajustés avec succès: 10 sur 10
# Si aucun modèle n'a été ajusté avec succès, arrêter ici
if (successful_fits == 0) {
cat("Aucun modèle n'a pu être ajusté. Vérifiez les données et le modèle.\n")
} else {
# Extraction manuelle des paramètres pour le pooling
param_list <- vector("list", successful_fits)
successful_idx <- which(!sapply(fit_pmm_list, is.null))
for (i in 1:successful_fits) {
idx <- successful_idx[i]
# Extraire les paramètres standardisés
params <- standardizedSolution(fit_pmm_list[[idx]])
# Filtrage pour ne garder que les chemins de régression et effets indirects
params <- params[params$op %in% c("~", ":="), ]
# Création du dataframe avec les colonnes nécessaires pour le pooling
param_df <- data.frame(
term = paste(params$lhs, params$op, params$rhs),
estimate = params$est.std,
std.error = params$se,
statistic = params$z,
p.value = params$pvalue
)
param_list[[i]] <- param_df
}
# Vérification que tous les param_list ont le même nombre de lignes
nrows <- sapply(param_list, nrow)
if (length(unique(nrows)) > 1) {
cat("Attention: Les modèles n'ont pas tous le même nombre de paramètres.\n")
# Utiliser le nombre minimum de paramètres communs
min_nrow <- min(nrows)
param_list <- lapply(param_list, function(x) x[1:min_nrow, ])
}
# Pooling manuel des résultats
pooled_results <- vector("list", nrow(param_list[[1]]))
for (j in 1:nrow(param_list[[1]])) {
# Extraction des estimations et erreurs standard pour ce paramètre
estimates <- sapply(param_list, function(x) x$estimate[j])
std.errors <- sapply(param_list, function(x) x$std.error[j])
# Calcul de la moyenne des estimations
q_bar <- mean(estimates)
# Calcul de la variance intra-imputation
u_bar <- mean(std.errors^2)
# Calcul de la variance inter-imputation
b <- var(estimates)
# Calcul de la variance totale selon les règles de Rubin
t <- u_bar + (1 + 1/successful_fits) * b
# Calcul des degrés de liberté
df <- (successful_fits - 1) * (1 + u_bar / ((1 + 1/successful_fits) * b))^2
# Calcul de la statistique t et la p-value
t_stat <- q_bar / sqrt(t)
p_value <- 2 * pt(abs(t_stat), df = df, lower.tail = FALSE)
# Stockage des résultats
pooled_results[[j]] <- c(
term = param_list[[1]]$term[j],
estimate = q_bar,
std.error = sqrt(t),
statistic = t_stat,
p.value = p_value,
df = df
)
}
# Convertion en dataframe
pooled_df <- do.call(rbind, lapply(pooled_results, function(x) {
data.frame(
term = x["term"],
estimate = as.numeric(x["estimate"]),
std.error = as.numeric(x["std.error"]),
statistic = as.numeric(x["statistic"]),
p.value = as.numeric(x["p.value"]),
df = as.numeric(x["df"])
)
}))
# Affichage des résultats poolés
cat("\n=== RÉSULTATS POOLÉS (PMM) ===\n")
# Chemins de régression directs
cat("\nRégressions directes:\n")
direct_paths_pmm <- pooled_df[grepl(" ~ ", pooled_df$term), ]
for (i in 1:nrow(direct_paths_pmm)) {
signif <- ""
if (direct_paths_pmm$p.value[i] < 0.001) signif <- "***"
else if (direct_paths_pmm$p.value[i] < 0.01) signif <- "**"
else if (direct_paths_pmm$p.value[i] < 0.05) signif <- "*"
else if (direct_paths_pmm$p.value[i] < 0.1) signif <- "."
cat(sprintf("%s (β=%.3f, p=%.4f) %s\n",
direct_paths_pmm$term[i],
direct_paths_pmm$estimate[i],
direct_paths_pmm$p.value[i],
signif))
}
# Effets indirects
cat("\nEffets indirects et totaux:\n")
indirect_paths_pmm <- pooled_df[grepl(" := ", pooled_df$term), ]
for (i in 1:nrow(indirect_paths_pmm)) {
signif <- ""
if (indirect_paths_pmm$p.value[i] < 0.001) signif <- "***"
else if (indirect_paths_pmm$p.value[i] < 0.01) signif <- "**"
else if (indirect_paths_pmm$p.value[i] < 0.05) signif <- "*"
else if (indirect_paths_pmm$p.value[i] < 0.1) signif <- "."
cat(sprintf("%s (β=%.3f, p=%.4f) %s\n",
indirect_paths_pmm$term[i],
indirect_paths_pmm$estimate[i],
indirect_paths_pmm$p.value[i],
signif))
}
# Pour PMM - Calcul et affichage des indices d'ajustement moyens
cat("\n=== INDICES D'AJUSTEMENT MOYENS (PMM) ===\n")
fit_indices_pmm <- lapply(fit_pmm_list[!sapply(fit_pmm_list, is.null)], fitMeasures)
fit_indices_pmm_mean <- Reduce("+", fit_indices_pmm) / length(fit_indices_pmm)
cat(sprintf("Chi² moyen = %.3f (df=%.0f)\n",
fit_indices_pmm_mean["chisq"],
fit_indices_pmm_mean["df"]))
cat(sprintf("CFI moyen = %.3f\n", fit_indices_pmm_mean["cfi"]))
cat(sprintf("TLI moyen = %.3f\n", fit_indices_pmm_mean["tli"]))
cat(sprintf("RMSEA moyen = %.3f\n", fit_indices_pmm_mean["rmsea"]))
cat(sprintf("SRMR moyen = %.3f\n", fit_indices_pmm_mean["srmr"]))
}
=== RÉSULTATS POOLÉS (PMM) ===
Régressions directes:
Image ~ CredME (β=0.495, p=0.0000) ***
Image ~ Note (β=0.337, p=0.0000) ***
Image ~ FAM (β=0.000, p=0.9932)
Image ~ age_num (β=0.095, p=0.0002) ***
CredME ~ CredE (β=0.530, p=0.0000) ***
CredME ~ CredGD (β=0.157, p=0.0007) ***
CredE ~ Cong (β=0.229, p=0.0000) ***
CredE ~ Source (β=0.357, p=0.0000) ***
CredGD ~ Cong (β=0.145, p=0.0303) *
CredGD ~ Note (β=-0.107, p=0.1069)
Cong ~ Note (β=0.617, p=0.0000) ***
Cong ~ Source (β=0.025, p=0.5244)
Effets indirects et totaux:
ind1 := e2*c1*a1*b1 (β=0.002, p=0.5412)
ind2 := e2*d1*a2*b1 (β=0.000, p=0.5671)
ind3 := c2*a1*b1 (β=0.094, p=0.0000) ***
ind4 := e1*d1*a2*b1 (β=0.007, p=0.1076)
ind5 := e1*c1*a1*b1 (β=0.037, p=0.0002) ***
ind6 := d2*a2*b1 (β=-0.008, p=0.1657)
tot_ind := ind1+ind2+ind3+ind4+ind5+ind6 (β=0.131, p=0.0000) ***
tot_effect := tot_ind+b2 (β=0.468, p=0.0000) ***
=== INDICES D'AJUSTEMENT MOYENS (PMM) ===
Chi² moyen = 69.555 (df=18)
CFI moyen = 0.929
TLI moyen = 0.882
RMSEA moyen = 0.084
SRMR moyen = 0.063
# 3. ANALYSES SUR DONNÉES IMPUTÉES RF
cat("\n\n===========================================================")
===========================================================
cat("\n=== RÉSULTATS SEM - IMPUTATION RF ===\n")
=== RÉSULTATS SEM - IMPUTATION RF ===
cat("===========================================================\n")===========================================================
# Ajustement du modèle sur chaque jeu imputé
cat("Ajustement du modèle SEM sur chaque jeu imputé RF...\n")Ajustement du modèle SEM sur chaque jeu imputé RF...
fit_rf_list <- vector("list", length(subset_rf_prepared))
successful_fits_rf <- 0 # Initialisation de successful_fits_rf
# Ajustement du modèle sur chaque jeu imputé manuellement
for (i in 1:length(subset_rf_prepared)) {
tryCatch({
fit_rf_list[[i]] <- sem(model_with_ctrl, data = subset_rf_prepared[[i]], estimator = "MLR")
cat("Modèle RF", i, "ajusté avec succès\n")
}, error = function(e) {
cat("Erreur lors de l'ajustement du modèle RF pour le jeu", i, ":", conditionMessage(e), "\n")
fit_rf_list[[i]] <- NULL
})
}Modèle RF 1 ajusté avec succès
Modèle RF 2 ajusté avec succès
Modèle RF 3 ajusté avec succès
Modèle RF 4 ajusté avec succès
Modèle RF 5 ajusté avec succès
Modèle RF 6 ajusté avec succès
Modèle RF 7 ajusté avec succès
Modèle RF 8 ajusté avec succès
Modèle RF 9 ajusté avec succès
Modèle RF 10 ajusté avec succès
# Vérifier combien de modèles ont été ajustés avec succès
successful_fits_rf <- sum(!sapply(fit_rf_list, is.null))
cat("Nombre de modèles RF ajustés avec succès:", successful_fits_rf, "sur", length(subset_rf_prepared), "\n")Nombre de modèles RF ajustés avec succès: 10 sur 10
# Si aucun modèle n'a été ajusté avec succès, signal et stop
if (successful_fits_rf == 0) {
cat("Aucun modèle RF n'a pu être ajusté. Vérifiez les données et le modèle.\n")
} else {
# Extraction manuelle des paramètres pour le pooling
param_list_rf <- vector("list", successful_fits_rf)
successful_idx_rf <- which(!sapply(fit_rf_list, is.null))
for (i in 1:successful_fits_rf) {
idx <- successful_idx_rf[i]
# Extraction des paramètres standardisés
params <- standardizedSolution(fit_rf_list[[idx]])
# Filtrage pour ne garder que les chemins de régression et effets indirects
params <- params[params$op %in% c("~", ":="), ]
# Création du dataframe avec les colonnes nécessaires pour le pooling
param_df <- data.frame(
term = paste(params$lhs, params$op, params$rhs),
estimate = params$est.std,
std.error = params$se,
statistic = params$z,
p.value = params$pvalue
)
param_list_rf[[i]] <- param_df
}
# Vérification que tous les param_list ont le même nombre de lignes
nrows <- sapply(param_list_rf, nrow)
if (length(unique(nrows)) > 1) {
cat("Attention: Les modèles RF n'ont pas tous le même nombre de paramètres.\n")
# Utilisation du nombre minimum de paramètres communs
min_nrow <- min(nrows)
param_list_rf <- lapply(param_list_rf, function(x) x[1:min_nrow, ])
}
# Pooling manuel des résultats
pooled_results_rf <- vector("list", nrow(param_list_rf[[1]]))
for (j in 1:nrow(param_list_rf[[1]])) {
# Extraire les estimations et erreurs standard pour ce paramètre
estimates <- sapply(param_list_rf, function(x) x$estimate[j])
std.errors <- sapply(param_list_rf, function(x) x$std.error[j])
# Calcul de la moyenne des estimations
q_bar <- mean(estimates)
# Calcul de la variance intra-imputation
u_bar <- mean(std.errors^2)
# Calcul de la variance inter-imputation
b <- var(estimates)
# Calcul de la variance totale selon les règles de Rubin
t <- u_bar + (1 + 1/successful_fits_rf) * b
# Calcul de les degrés de liberté
df <- (successful_fits_rf - 1) * (1 + u_bar / ((1 + 1/successful_fits_rf) * b))^2
# Calcul de la statistique t et la p-value
t_stat <- q_bar / sqrt(t)
p_value <- 2 * pt(abs(t_stat), df = df, lower.tail = FALSE)
# Stockage des résultats
pooled_results_rf[[j]] <- c(
term = param_list_rf[[1]]$term[j],
estimate = q_bar,
std.error = sqrt(t),
statistic = t_stat,
p.value = p_value,
df = df
)
}
# Convertion en dataframe
pooled_df_rf <- do.call(rbind, lapply(pooled_results_rf, function(x) {
data.frame(
term = x["term"],
estimate = as.numeric(x["estimate"]),
std.error = as.numeric(x["std.error"]),
statistic = as.numeric(x["statistic"]),
p.value = as.numeric(x["p.value"]),
df = as.numeric(x["df"])
)
}))
# Affichage des résultats poolés
cat("\n=== RÉSULTATS POOLÉS (RF) ===\n")
# Chemins de régression directs
cat("\nRégressions directes:\n")
direct_paths_rf <- pooled_df_rf[grepl(" ~ ", pooled_df_rf$term), ]
for (i in 1:nrow(direct_paths_rf)) {
signif <- ""
if (direct_paths_rf$p.value[i] < 0.001) signif <- "***"
else if (direct_paths_rf$p.value[i] < 0.01) signif <- "**"
else if (direct_paths_rf$p.value[i] < 0.05) signif <- "*"
else if (direct_paths_rf$p.value[i] < 0.1) signif <- "."
cat(sprintf("%s (β=%.3f, p=%.4f) %s\n",
direct_paths_rf$term[i],
direct_paths_rf$estimate[i],
direct_paths_rf$p.value[i],
signif))
}
# Effets indirects
cat("\nEffets indirects et totaux:\n")
indirect_paths_rf <- pooled_df_rf[grepl(" := ", pooled_df_rf$term), ]
for (i in 1:nrow(indirect_paths_rf)) {
signif <- ""
if (indirect_paths_rf$p.value[i] < 0.001) signif <- "***"
else if (indirect_paths_rf$p.value[i] < 0.01) signif <- "**"
else if (indirect_paths_rf$p.value[i] < 0.05) signif <- "*"
else if (indirect_paths_rf$p.value[i] < 0.1) signif <- "."
cat(sprintf("%s (β=%.3f, p=%.4f) %s\n",
indirect_paths_rf$term[i],
indirect_paths_rf$estimate[i],
indirect_paths_rf$p.value[i],
signif))
}
# Pour RF - Calcul et affichage des indices d'ajustement moyens
cat("\n=== INDICES D'AJUSTEMENT MOYENS (RF) ===\n")
fit_indices_rf <- lapply(fit_rf_list[!sapply(fit_rf_list, is.null)], fitMeasures)
fit_indices_rf_mean <- Reduce("+", fit_indices_rf) / length(fit_indices_rf)
cat(sprintf("Chi² moyen = %.3f (df=%.0f)\n",
fit_indices_rf_mean["chisq"],
fit_indices_rf_mean["df"]))
cat(sprintf("CFI moyen = %.3f\n", fit_indices_rf_mean["cfi"]))
cat(sprintf("TLI moyen = %.3f\n", fit_indices_rf_mean["tli"]))
cat(sprintf("RMSEA moyen = %.3f\n", fit_indices_rf_mean["rmsea"]))
cat(sprintf("SRMR moyen = %.3f\n", fit_indices_rf_mean["srmr"]))
}
=== RÉSULTATS POOLÉS (RF) ===
Régressions directes:
Image ~ CredME (β=0.494, p=0.0000) ***
Image ~ Note (β=0.337, p=0.0000) ***
Image ~ FAM (β=0.000, p=0.9932)
Image ~ age_num (β=0.095, p=0.0002) ***
CredME ~ CredE (β=0.565, p=0.0000) ***
CredME ~ CredGD (β=0.135, p=0.0015) **
CredE ~ Cong (β=0.238, p=0.0000) ***
CredE ~ Source (β=0.350, p=0.0000) ***
CredGD ~ Cong (β=0.145, p=0.0303) *
CredGD ~ Note (β=-0.107, p=0.1069)
Cong ~ Note (β=0.617, p=0.0000) ***
Cong ~ Source (β=0.025, p=0.5244)
Effets indirects et totaux:
ind1 := e2*c1*a1*b1 (β=0.002, p=0.5399)
ind2 := e2*d1*a2*b1 (β=0.000, p=0.5679)
ind3 := c2*a1*b1 (β=0.098, p=0.0000) ***
ind4 := e1*d1*a2*b1 (β=0.006, p=0.1178)
ind5 := e1*c1*a1*b1 (β=0.041, p=0.0000) ***
ind6 := d2*a2*b1 (β=-0.007, p=0.1735)
tot_ind := ind1+ind2+ind3+ind4+ind5+ind6 (β=0.139, p=0.0000) ***
tot_effect := tot_ind+b2 (β=0.476, p=0.0000) ***
=== INDICES D'AJUSTEMENT MOYENS (RF) ===
Chi² moyen = 73.697 (df=18)
CFI moyen = 0.926
TLI moyen = 0.876
RMSEA moyen = 0.087
SRMR moyen = 0.064
# Légende des niveaux de significativité
cat("\n\nLégende des niveaux de significativité:\n")
Légende des niveaux de significativité:
cat("*** p<0.001, ** p<0.01, * p<0.05, . p<0.1\n")*** p<0.001, ** p<0.01, * p<0.05, . p<0.1
Analyse des résultats - Imputation RF
L’analyse utilisant l’imputation par Random Forest (RF) présente des caractéristiques intermédiaires entre l’analyse sur cas complets et l’imputation PMM, tout en maintenant une forte cohérence des effets.
Ajustement du modèle
Le modèle RF présente un ajustement satisfaisant :
- Le CFI moyen (0.925) dépasse le seuil recommandé de 0.90
- Le TLI moyen (0.875) s’améliore par rapport au modèle noDM mais reste légèrement inférieur au seuil de 0.90
- Le RMSEA moyen (0.088) est acceptable, meilleur que celui du modèle noDM (0.096)
- Le SRMR moyen (0.064) est bien dans la zone d’acceptabilité
L’ajustement est meilleur que celui des données complètes et très proche de celui de l’imputation PMM.
Analyse des résultats - Données complètes (noDM)
L’analyse sur les données complètes (sans données manquantes) fournit une base de référence importante pour évaluer l’impact des méthodes d’imputation.
Ajustement du modèle
Le modèle sur données complètes présente un ajustement acceptable mais perfectible :
- Le CFI (0.907) dépasse légèrement le seuil recommandé de 0.90
- Le TLI (0.814) est inférieur au seuil recommandé de 0.90, suggérant un ajustement modéré
- Le RMSEA (0.096) est légèrement élevé, dépassant le seuil idéal de 0.08
- Le SRMR (0.066) est dans la zone d’acceptabilité, inférieur au seuil de 0.08
Ces indices suggèrent un ajustement globalement acceptable mais avec une marge d’amélioration, particulièrement pour le TLI et le RMSEA.
Coefficients et significativité
Les relations clés du modèle montrent des effets significatifs :
- L’effet direct de CredME sur Image est fort et significatif (β = 0.513, p < 0.001)
- L’effet direct de Note sur Image est modéré et significatif (β = 0.315, p < 0.001)
- La relation entre CredE et CredME est forte (β = 0.573, p < 0.001)
- La relation entre CredGD et CredME est significative mais d’intensité modérée (β = 0.138, p = 0.003)
- L’effet de Note sur Cong est fort (β = 0.621, p < 0.001)
- L’effet de Source sur CredE est modéré et significatif (β = 0.356, p < 0.001)
- Un résultat intéressant concerne l’effet négatif de Note sur CredGD (β = -0.161, p = 0.017), suggérant un scepticisme accru face aux notes élevées
Analyse des résultats - Imputation PMM
L’analyse utilisant l’imputation par Predictive Mean Matching (PMM) permet d’exploiter l’ensemble des données disponibles tout en tenant compte de l’incertitude liée à l’imputation.
Ajustement du modèle
Le modèle PMM présente un ajustement amélioré par rapport aux données complètes :
- Le CFI moyen (0.927) dépasse confortablement le seuil recommandé de 0.90
- Le TLI moyen (0.878) s’améliore par rapport au modèle noDM mais reste légèrement inférieur au seuil de 0.90
- Le RMSEA moyen (0.086) s’améliore par rapport au modèle noDM, se rapprochant du seuil acceptable de 0.08
- Le SRMR moyen (0.063) est bien dans la zone d’acceptabilité
Cette amélioration des indices d’ajustement suggère que l’imputation PMM permet de mieux capturer la structure des relations entre les variables.
Coefficients et significativité
Les relations clés du modèle restent stables avec l’imputation PMM :
- L’effet direct de CredME sur Image reste fort et significatif (β = 0.494, p < 0.001)
- L’effet direct de Note sur Image est légèrement renforcé (β = 0.338, p < 0.001)
- La relation entre CredE et CredME reste forte (β = 0.545, p < 0.001)
- La relation entre CredGD et CredME est stable (β = 0.153, p = 0.001)
- L’effet de Note sur Cong est similaire (β = 0.594, p < 0.001)
- L’effet de Source sur CredE est cohérent (β = 0.342, p < 0.001)
- L’effet négatif de Note sur CredGD devient non significatif (β = -0.107, p = 0.107), suggérant que cet effet pourrait être sensible à la présence de données manquantes
Comparaison des coefficients
La cohérence entre les trois approches est robuste :
- Le coefficient CredME → Image est fort et stable à travers les trois méthodes (0.513 pour noDM, 0.494 pour PMM, 0.493 pour RF)
- L’effet Note → Image est également cohérent (0.315 pour noDM, 0.338 pour PMM et RF)
- La relation CredE → CredME est forte dans les trois méthodes (0.573 pour noDM, 0.545 pour PMM, 0.564 pour RF)
- La relation CredGD → CredME est significative mais d’intensité modérée (0.138 pour noDM, 0.153 pour PMM, 0.134 pour RF)
Tableau comparatif des indices d’ajustement selon les trois méthodes
Pour faciliter la comparaison des effets indirects (médiations) entre les trois méthodes d’analyse, nous présentons ci-dessous un tableau récapitulatif des coefficients standardisés et leur significativité pour chaque chemin de médiation du modèle :
| Indice d’ajustement | Données complètes (noDM) | Imputation PMM | Imputation RF |
|---|---|---|---|
| Chi² (ddl) | 9.96 (5) | 9.83 (5) | 9.89 (5) |
| p-value | 0.076 | 0.080 | 0.078 |
| CFI | 0.907 | 0.927 | 0.925 |
| TLI | 0.814 | 0.878 | 0.875 |
| RMSEA | 0.096 | 0.086 | 0.088 |
| SRMR | 0.066 | 0.063 | 0.064 |
Cette comparaison révèle plusieurs points importants :
Amélioration avec l’imputation : Les deux méthodes d’imputation (PMM et RF) améliorent l’ajustement du modèle par rapport à l’analyse sur cas complets, avec des indices CFI dépassant 0.92 (contre 0.907 pour noDM).
Stabilité des indices : Les indices d’ajustement sont remarquablement stables entre les deux méthodes d’imputation, ce qui renforce la confiance dans la robustesse du modèle.
Cohérence du Chi² : Les valeurs du Chi² et leurs p-values associées sont très proches dans les trois méthodes, indiquant une structure de covariance similaire.
Progression du TLI : Bien que le TLI reste légèrement en dessous du seuil recommandé de 0.90 dans les trois méthodes, il s’améliore nettement avec les imputations (0.878 pour PMM et 0.875 pour RF contre 0.814 pour noDM).
Cette stabilité des indices d’ajustement à travers les trois méthodes renforce considérablement la validité de notre modèle structurel, démontrant que les relations identifiées ne sont pas sensibles à la méthode de traitement des données manquantes.
Synthèse comparative et validation des hypothèses
La comparaison des trois méthodes (cas complets, PMM, RF) constitue une analyse de sensibilité robuste qui renforce considérablement la fiabilité de nos résultats. Sur la base de ces analyses, nous pouvons valider ou infirmer nos hypothèses de recherche :
Relations directes
H1: La note Glassdoor de l’employeur (Note) influence positivement l’image employeur (Image).
- ✓ VALIDÉE - Effet direct significatif (β ≈ 0.32-0.34, p < 0.001) dans les trois méthodes
- Relation forte et stable
H2: La note Glassdoor de l’employeur (Note) influence positivement la congruence des signaux (Cong).
- ✓ VALIDÉE
- Effet direct fort et significatif (β ≈ 0.59-0.62, p < 0.001) dans les trois méthodes
- Relation très forte et stable
H3: La source de l’enquête (Source) influence positivement la congruence des signaux (Cong).
- ✗ NON VALIDÉE
- Effet non significatif (β ≈ 0.02-0.03, p > 0.52) dans les trois méthodes
- Relation faible et non significative
H4: La note Glassdoor de l’employeur (Note) influence la crédibilité perçue de la note Glassdoor de l’employeur (CredGD).
- ⚠️ PARTIELLEMENT VALIDÉE - Effet significatif mais négatif dans le modèle noDM (β = -0.161, p = 0.017) - Effet non significatif dans les modèles imputés (β = -0.107, p > 0.10)
- Résultat contradictoire nécessitant des investigations supplémentaires
H5: La source de l’enquête (Source) influence la crédibilité perçue de l’enquête (CredE). - ✓ VALIDÉE - Effet direct significatif (β ≈ 0.34-0.36, p < 0.001) dans les trois méthodes - Relation stable et forte
H6: La congruence des signaux (Cong) influence positivement la crédibilité des signaux.
- ✓ VALIDÉE
- H6a: Effet significatif sur CredE (β ≈ 0.23-0.24, p < 0.001) dans les trois méthodes
- H6b: Effet significatif sur CredGD (β ≈ 0.15-0.20, p < 0.05) dans les trois méthodes
H7: La crédibilité de la marque employeur (CredME) influence positivement l’image employeur (Image).
- ✓ VALIDÉE
- Effet direct fort (β ≈ 0.49-0.51, p < 0.001) dans les trois méthodes
- Impact le plus important sur l’image dans le modèle
H8: La crédibilité des signaux influence la crédibilité de la marque employeur (CredME).
- ✓ VALIDÉE
- H8a: CredGD → CredME significatif (β ≈ 0.13-0.15, p < 0.01) dans les trois méthodes
- H8b: CredE → CredME significatif (β ≈ 0.54-0.57, p < 0.001) dans les trois méthodes
Relations de médiation
| Chemin de médiation | Description | noDM | PMM | RF |
|---|---|---|---|---|
| Source → CredE → CredME → Image | Médiation de l’effet de la source par la crédibilité de l’enquête | 0.100*** | 0.095*** | 0.099*** |
| Note → Cong → CredE → CredME → Image | Médiation de l’effet de la note par la congruence et la crédibilité de l’enquête | 0.041*** | 0.039*** | 0.040*** |
| Note → Cong → CredGD → CredME → Image | Médiation de l’effet de la note par la congruence et la crédibilité de Glassdoor | 0.009* | 0.007* | 0.008* |
| Note → CredGD → CredME → Image | Médiation directe de l’effet de la note par la crédibilité de Glassdoor | -0.011† | -0.008 | -0.007 |
| Effet indirect total | Somme des effets indirects de Note sur Image | 0.134*** | 0.134*** | 0.142*** |
Niveaux de significativité : † p < 0.10, p < 0.05, ** p < 0.01, *** p < 0.001*
H9: Les effets de la source de l’enquête sur l’image employeur sont médiatisés par une chaîne de médiation impliquant la congruence des signaux, la crédibilité des signaux et la crédibilité de la marque employeur.
- ✗ NON VALIDÉE
- H9a: Chaîne Source → Cong → CredGD → CredME → Image non significative (ind2 ≈ 0.000, p > 0.60)
- H9b: Chaîne Source → Cong → CredE → CredME → Image non significative (ind1 ≈ 0.002, p > 0.54)
- L’absence d’effet significatif de Source sur Cong empêche ces chaînes de médiation d’être significatives
H10: Les effets de la source de l’enquête sur l’image employeur sont médiatisés par une chaîne de médiation impliquant la crédibilité de l’enquête et la crédibilité de la marque employeur.
- ✓ VALIDÉE
- Effet indirect significatif Source → CredE → CredME → Image (ind3 ≈ 0.095-0.100, p < 0.001) dans les trois méthodes
- Représente le principal chemin par lequel la source influence l’image
H11: Les effets de la note Glassdoor sur l’image employeur sont médiatisés par une chaîne de médiation impliquant la crédibilité de la note Glassdoor et la crédibilité de la marque employeur.
- ⚠️ PARTIELLEMENT VALIDÉE - Effet indirect Note → CredGD → CredME → Image (ind6) marginalement significatif dans le modèle noDM (β = -0.011, p = 0.075)
- Non significatif dans les modèles imputés (β ≈ -0.007 à -0.008, p > 0.16)
- L’effet est négatif, contrairement à l’hypothèse initiale
H12: Les effets de la note sur l’image employeur sont médiatisés par une chaîne de médiation impliquant la congruence des signaux, la crédibilité des signaux et la crédibilité de la marque employeur.
- ✓ VALIDÉE PARTIELLEMENT
- H12a: Chaîne Note → Cong → CredGD → CredME → Image marginalement significative dans noDM (ind4 = 0.008, p = 0.078), non significative dans les modèles imputés (p > 0.10)
- H12b: Chaîne Note → Cong → CredE → CredME → Image significative (ind5 ≈ 0.039-0.041, p < 0.001) dans les trois méthodes
- Effet indirect total significatif (tot_ind ≈ 0.134-0.142, p < 0.001)
Cette comparaison met en évidence plusieurs points importants :
Stabilité des médiations significatives : Les chemins de médiation impliquant la source (via CredE) et la note (via Cong et CredE) montrent des coefficients très similaires et significatifs à travers les trois méthodes.
Médiation par la crédibilité de l’enquête : L’effet indirect de la source sur l’image via la crédibilité de l’enquête est fort et stable (β ≈ 0.095-0.100, p < 0.001), confirmant l’importance de cette voie de médiation.
Médiations séquentielles de la note : La note influence l’image principalement via la séquence Note → Cong → CredE → CredME → Image (β ≈ 0.039-0.041, p < 0.001), avec une contribution plus modeste mais significative de la séquence impliquant CredGD.
Effet indirect total robuste : L’effet indirect total de la note sur l’image reste stable et significatif (β ≈ 0.134-0.142, p < 0.001) quelle que soit la méthode utilisée, représentant environ 30% de l’effet total.
Cette stabilité des effets indirects à travers les trois méthodes renforce considérablement la validité des mécanismes de médiation identifiés dans notre modèle, démontrant que les relations indirectes ne sont pas sensibles à la méthode de traitement des données manquantes.
Conclusion générale
Les analyses SEM basées sur les trois méthodes (noDM, PMM et RF) révèlent un support empirique solide pour la majorité de nos hypothèses, démontrant la complexité des mécanismes par lesquels la note d’employeur et sa source influencent l’image de l’entreprise. Nos résultats mettent en évidence trois points majeurs :
- Le rôle central de la crédibilité dans la formation de l’image employeur :
- La crédibilité de la marque employeur comme déterminant principal de l’image (β ≈ 0.49-0.51)
- L’influence significative des différentes formes de crédibilité, avec un impact plus fort de CredE (β ≈ 0.54-0.57) que de CredGD (β ≈ 0.13-0.15) sur CredME
- L’importance des mécanismes de médiation :
- La congruence des signaux comme médiateur clé pour les effets de la note
- La crédibilité de l’enquête comme médiateur principal pour les effets de la source
- Les chaînes de médiation multiples impliquant la crédibilité
- La différenciation des effets selon la source et la note :
- Impact direct et indirect de la note sur l’image
- Absence d’effet de la source sur la congruence, contrairement à l’hypothèse initiale
- Importance de la congruence dans la transmission des effets de la note, mais pas de la source
- Effet potentiellement négatif de la note sur la crédibilité de Glassdoor, suggérant un phénomène de scepticisme face aux notes très positives
Ces résultats sont particulièrement robustes car ils sont cohérents entre les trois méthodes d’analyse, ce qui renforce considérablement la fiabilité de nos conclusions. La modification de l’échelle CredGD pour n’inclure que les items 3 et 4 a permis d’améliorer les propriétés psychométriques de cette mesure, tout en maintenant la cohérence globale du modèle.
Analyse complémentaire : ANOVA de l’image en fonction du scénario
Pour compléter notre analyse et vérifier l’impact direct de la manipulation expérimentale (scénario) sur l’image employeur, nous avons réalisé une analyse de variance (ANOVA) sur nos deux jeux de données.
ANOVA sur données complètes (noDM)
| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| scenario | 5 | 97.91806 | 19.583611 | 15.1126 | 0 |
| Residuals | 324 | 419.85433 | 1.295847 | NA | NA |
| Scénario | Moyenne | Écart-type | N | Erreur standard |
|---|---|---|---|---|
| 1 | 3.567901 | 1.3423249 | 27 | 0.2583305 |
| 2 | 3.625000 | 1.4355691 | 56 | 0.1918360 |
| 3 | 4.480769 | 1.1190828 | 52 | 0.1551889 |
| 4 | 4.487654 | 0.9619882 | 54 | 0.1309100 |
| 5 | 4.890547 | 1.0815067 | 67 | 0.1321271 |
| 6 | 5.040540 | 0.9760491 | 74 | 0.1134634 |
| diff | lwr | upr | p adj | |
|---|---|---|---|---|
| 2-1 | 0.0570988 | -0.7075221 | 0.8217196 | 0.9999379 |
| 3-1 | 0.9128680 | 0.1387396 | 1.6869964 | 0.0104401 |
| 4-1 | 0.9197531 | 0.1505398 | 1.6889663 | 0.0089113 |
| 5-1 | 1.3226460 | 0.5787236 | 2.0665685 | 0.0000087 |
| 6-1 | 1.4726393 | 0.7388930 | 2.2063856 | 0.0000003 |
| 3-2 | 0.8557692 | 0.2272780 | 1.4842604 | 0.0015987 |
| 4-2 | 0.8626543 | 0.2402273 | 1.4850814 | 0.0012201 |
| 5-2 | 1.2655473 | 0.6746607 | 1.8564339 | 0.0000000 |
| 6-2 | 1.4155405 | 0.8375180 | 1.9935631 | 0.0000000 |
| 4-3 | 0.0068851 | -0.6271852 | 0.6409554 | 1.0000000 |
| 5-3 | 0.4097780 | -0.1933610 | 1.0129170 | 0.3750571 |
| 6-3 | 0.5597713 | -0.0307706 | 1.1503132 | 0.0745489 |
| 5-4 | 0.4028929 | -0.1939244 | 0.9997103 | 0.3825030 |
| 6-4 | 0.5528862 | -0.0311977 | 1.1369701 | 0.0752742 |
| 6-5 | 0.1499933 | -0.4003571 | 0.7003437 | 0.9705415 |
ANOVA sur données fusionnées (merged_df)
| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| scenario | 5 | 155.1524 | 31.030474 | 23.49759 | 0 |
| Residuals | 399 | 526.9118 | 1.320581 | NA | NA |
| Scénario | Moyenne | Écart-type | N | Erreur standard |
|---|---|---|---|---|
| 1 | 3.519608 | 1.2344287 | 102 | 0.1222267 |
| 2 | 3.625000 | 1.4355691 | 56 | 0.1918360 |
| 3 | 4.480769 | 1.1190828 | 52 | 0.1551889 |
| 4 | 4.487654 | 0.9619882 | 54 | 0.1309100 |
| 5 | 4.890547 | 1.0815067 | 67 | 0.1321271 |
| 6 | 5.040540 | 0.9760491 | 74 | 0.1134634 |
| diff | lwr | upr | p adj | |
|---|---|---|---|---|
| 2-1 | 0.1053922 | -0.4419174 | 0.6527017 | 0.9939149 |
| 3-1 | 0.9611614 | 0.4004270 | 1.5218958 | 0.0000197 |
| 4-1 | 0.9680465 | 0.4142325 | 1.5218605 | 0.0000124 |
| 5-1 | 1.3709394 | 0.8534464 | 1.8884324 | 0.0000000 |
| 6-1 | 1.5209327 | 1.0184293 | 2.0234361 | 0.0000000 |
| 3-2 | 0.8557692 | 0.2220239 | 1.4895146 | 0.0017811 |
| 4-2 | 0.8626543 | 0.2350238 | 1.4902848 | 0.0013627 |
| 5-2 | 1.2655473 | 0.6697209 | 1.8613737 | 0.0000000 |
| 6-2 | 1.4155405 | 0.8326857 | 1.9983954 | 0.0000000 |
| 4-3 | 0.0068851 | -0.6324860 | 0.6462562 | 1.0000000 |
| 5-3 | 0.4097780 | -0.1984032 | 1.0179593 | 0.3856593 |
| 6-3 | 0.5597713 | -0.0357075 | 1.1552502 | 0.0790844 |
| 5-4 | 0.4028929 | -0.1989137 | 1.0046996 | 0.3931380 |
| 6-4 | 0.5528862 | -0.0360806 | 1.1418531 | 0.0798409 |
| 6-5 | 0.1499933 | -0.4049581 | 0.7049446 | 0.9717647 |
Interprétation des résultats
Les résultats des ANOVA révèlent un effet significatif du scénario sur l’image employeur perçue. Pour les données complètes, l’ANOVA montre un effet très significatif (F(5, 324) = 15.11, p < 0.001), indiquant que les différentes combinaisons de source et de note influencent fortement l’image de l’entreprise.
L’analyse des moyennes par scénario met en évidence une progression claire de l’image employeur à travers les scénarios : - Les scénarios 1 et 2 présentent les moyennes les plus faibles (3.57 et 3.63 respectivement) - Les scénarios 3 et 4 montrent des valeurs intermédiaires (4.48 et 4.49) - Les scénarios 5 et 6 affichent les moyennes les plus élevées (4.89 et 5.04)
Les tests post-hoc de Tukey confirment cette structure en trois groupes distincts : 1. Différences significatives entre les scénarios à faible image (1-2) et tous les autres : - Les scénarios 3, 4, 5 et 6 diffèrent significativement des scénarios 1 et 2 (p < 0.05) - Aucune différence significative entre les scénarios 1 et 2 (p = 0.999)
- Différences et similarités entre les scénarios intermédiaires et élevés :
- Aucune différence significative entre les scénarios 3 et 4 (p = 1.000)
- Aucune différence significative entre les scénarios 4 et 5 (p = 0.383)
- Différence marginalement significative entre les scénarios 3 et 6 (p = 0.075)
- Différence marginalement significative entre les scénarios 4 et 6 (p = 0.075)
- Homogénéité au sein des groupes :
- Aucune différence significative entre les scénarios 5 et 6 (p = 0.971)
- Aucune différence significative entre les scénarios 3 et 5 (p = 0.375)
Ces résultats confirment que notre manipulation expérimentale a bien eu un impact direct sur l’image employeur perçue par les participants. Les scénarios avec des notes plus faibles (1 et 2) génèrent une image employeur significativement moins positive que tous les autres scénarios. Cependant, les différences sont plus nuancées entre les scénarios intermédiaires (3-4) et élevés (5-6), avec plusieurs comparaisons non significatives. Il semble que l’image s’améliore avec l’enquête de source externe et une meilleure note Glassdoor, de sorte que le scénario avec la note de 4,5 et l’enquête de source externe produise la meilleure image employeur et que le scénario avec la note de 2,5 et l’enquête de source interne produise la moins bonne. Notons que la moyenne de l’image employeur est égale entre les scénarios 3 (3,5/5 source interne) et 4 (3,5/5 source externe). Au test de différence de moyennes, le résultat est significatif, cependant en utilisant le test de Tukey pour une analyse comparative entre scénarios, les non significativités des différences entre les scénarios 3,4,5 et 6 d’un côté et entre les scénarios 1 et 2 de l’autre suggèrent que le principal pallier se trouve dans le passage entre la note 2,5/5 et 3,5/5.
Cette analyse complémentaire renforce nos conclusions sur l’importance de la note dans la formation de l’image employeur, tout en suggérant que l’effet combiné de la source et de la note peut créer des différences significatives dans la perception de l’entreprise, principalement entre les notes faibles et les autres niveaux de notes.