# Charger les packages nécessaires
library(readxl)
library(dplyr)
library(lpSolve)
## Étape 1: Importer et préparer les données
# Supposons que vos données sont dans un fichier Excel nommé "bank_data.xlsx"
# avec une feuille nommée "Data"
data <- read_excel("bank_data.xlsx", sheet = "Data")
# Afficher la structure des données pour vérification
str(data)
# Sélectionner les variables nécessaires
# Inputs: charges, total_actifs, fonds_propres, credits, depots
# Output: resultat_net
# (Adaptez ces noms selon vos colonnes réelles)
inputs <- data %>% select(charges, total_actifs, fonds_propres, credits, depots)
outputs <- data %>% select(resultat_net)
# Convertir en matrices pour les calculs
X <- [Link](inputs) # Matrice des inputs
Y <- [Link](outputs) # Matrice des outputs
# Nombre de DMUs (banques) et variables
n <- nrow(X)
m <- ncol(X) # nombre d'inputs
s <- ncol(Y) # nombre d'outputs
## Étape 2: Calculer les ranges d'amélioration (comme dans l'article)
# Pour les outputs: max(y_rj) - y_ro
R_y <- matrix(rep(apply(Y, 2, max), n, s, byrow = TRUE) - Y
# Pour les inputs: x_io - min(x_ij)
R_x <- X - matrix(rep(apply(X, 2, min), n), n, m, byrow = TRUE)
# Pour les variables avec range = 0, on les fixe à 0 (comme dans l'article)
R_y[R_y < 0] <- 0
R_x[R_x < 0] <- 0
## Étape 3: Fonction pour résoudre le modèle RDM pour une DMU
solve_rdm <- function(dmu, X, Y, R_x, R_y, orientation = "non-oriented") {
# dmu: indice de la DMU à évaluer
# orientation: "input", "output" ou "non-oriented" (par défaut)
n <- nrow(X)
m <- ncol(X)
s <- ncol(Y)
# Coefficients de la fonction objectif (max beta)
[Link] <- c(1, rep(0, n)) # beta, puis les lambda
# Contraintes
# 1. Contraintes outputs: sum(lambda_j * y_rj) >= y_ro + beta * R_ro
# 2. Contraintes inputs: sum(lambda_j * x_ij) <= x_io - beta * R_io
# 3. Contrainte de convexité: sum(lambda_j) = 1
# Construction de la matrice des contraintes
# Partie gauche: -beta * R + sum(lambda * Y) pour outputs
output_constr <- cbind(-R_y[dmu, ], t(Y))
# Partie gauche: beta * R + sum(lambda * X) pour inputs
input_constr <- cbind(R_x[dmu, ], -t(X))
# Combiner toutes les contraintes
[Link] <- rbind(
output_constr,
input_constr,
c(0, rep(1, n)) # Contrainte de convexité
# Sens des contraintes
[Link] <- c(
rep(">=", s), # Pour les outputs
rep("<=", m), # Pour les inputs
"==") # Pour la convexité
# Partie droite des contraintes
[Link] <- c(
Y[dmu, ], # Pour les outputs
X[dmu, ], # Pour les inputs
1) # Pour la convexité
# Gérer l'orientation
if (orientation == "input") {
# Modèle orienté input: pas d'expansion des outputs (R_y = 0)
[Link][1:s, 1] <- 0
} else if (orientation == "output") {
# Modèle orienté output: pas de réduction des inputs (R_x = 0)
[Link][(s+1):(s+m), 1] <- 0
}
# Résoudre le problème de programmation linéaire
lp_result <- lp("max", [Link], [Link], [Link], [Link])
# Récupérer les résultats
beta <- lp_result$solution[1]
lambda <- lp_result$solution[-1]
# Calculer les targets
targets_x <- X[dmu, ] - beta * R_x[dmu, ]
targets_y <- Y[dmu, ] + beta * R_y[dmu, ]
# Score d'efficience (1 - beta)
efficiency <- 1 - beta
# Retourner les résultats
return(list(
efficiency = efficiency,
beta = beta,
lambda = lambda,
targets_x = targets_x,
targets_y = targets_y,
status = lp_result$status
))
}
## Étape 4: Appliquer le modèle RDM à toutes les DMUs
# Nous utilisons une orientation "output" comme dans l'étude bancaire
results <- lapply(1:n, function(i) {
solve_rdm(i, X, Y, R_x, R_y, orientation = "output")
})
# Extraire les scores d'efficience
efficiency_scores <- sapply(results, function(x) x$efficiency)
# Créer un data frame avec les résultats
results_df <- [Link](
DMU = 1:n,
Efficiency = efficiency_scores,
Beta = sapply(results, function(x) x$beta)
)
# Ajouter les targets
targets_x <- t(sapply(results, function(x) x$targets_x))
colnames(targets_x) <- paste0("Target_", colnames(X))
targets_y <- t(sapply(results, function(x) x$targets_y))
colnames(targets_y) <- paste0("Target_", colnames(Y))
results_df <- cbind(results_df, targets_x, targets_y)
# Identifier les DMUs efficientes (efficiency = 1)
efficient_dmus <- which(results_df$Efficiency == 1)
## Étape 5: Analyse des résultats
# Afficher les scores d'efficience
print(results_df %>% arrange(desc(Efficiency)))
# Statistiques descriptives
summary(results_df$Efficiency)
# Histogramme des scores d'efficience
hist(results_df$Efficiency,
main = "Distribution des scores d'efficience RDM",
xlab = "Score d'efficience",
ylab = "Nombre de banques",
col = "lightblue")
## Étape 6: Sauvegarder les résultats
[Link](results_df, "rdm_efficiency_results.csv", [Link] = FALSE)