Se analiza la satisfacción laboral (1 a 4) usando tres métodos de clasificación supervisada: Árboles de decisión, Máquinas de Soporte Vectorial (SVM) y Redes Neuronales Artificiales (ANN).
Para comenzar, se cargaron los datos de empleados de IBM. Se eliminaron filas con datos faltantes y se convirtió la variable ‘Satisfaction’ en un factor para permitir su uso en modelos de clasificación. También se dividieron los datos en entrenamiento y prueba, y se escalaron las variables numéricas para que tuvieran igual peso.
library(tidyverse)
library(caret)
library(rpart)
library(e1071)
library(nnet)
library(rpart.plot)
employee <- read.csv("Employee-IBM.csv")
employee <- na.omit(employee)
employee$Satisfaction <- as.factor(employee$Satisfaction)
set.seed(123)
index <- createDataPartition(employee$Satisfaction, p = 0.7, list = FALSE)
train <- employee[index, ]
test <- employee[-index, ]
# Escalar datos para SVM y ANN
train_scaled <- train
test_scaled <- test
numeric_cols <- sapply(train_scaled, is.numeric)
train_scaled[, numeric_cols] <- scale(train_scaled[, numeric_cols])
test_scaled[, numeric_cols] <- scale(test_scaled[, numeric_cols])
Se utilizó un árbol de decisión como uno de los métodos principales de clasificación. Esta técnica es útil porque permite generar reglas claras de predicción a partir de las variables, facilitando la interpretación de los resultados. Se entrenó el modelo y se generó una matriz de confusión para evaluar su rendimiento.
modelo_arbol <- rpart(Satisfaction ~ ., data = train, method = "class")
rpart.plot(modelo_arbol)
pred_arbol <- predict(modelo_arbol, test, type = "class")
confusionMatrix(pred_arbol, test$Satisfaction)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3 4
## 1 0 0 0 0
## 2 0 0 0 0
## 3 38 37 69 57
## 4 44 53 68 72
##
## Overall Statistics
##
## Accuracy : 0.3219
## 95% CI : (0.2784, 0.3679)
## No Information Rate : 0.3128
## P-Value [Acc > NIR] : 0.3571
##
## Kappa : 0.0273
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3 Class: 4
## Sensitivity 0.0000 0.0000 0.5036 0.5581
## Specificity 1.0000 1.0000 0.5615 0.4660
## Pos Pred Value NaN NaN 0.3433 0.3038
## Neg Pred Value 0.8128 0.7945 0.7131 0.7164
## Prevalence 0.1872 0.2055 0.3128 0.2945
## Detection Rate 0.0000 0.0000 0.1575 0.1644
## Detection Prevalence 0.0000 0.0000 0.4589 0.5411
## Balanced Accuracy 0.5000 0.5000 0.5326 0.5121
Se entrenó un modelo de máquinas de soporte vectorial utilizando los datos escalados. Este método es útil para encontrar fronteras óptimas entre clases, especialmente cuando las relaciones entre variables no son lineales. Se generaron predicciones y se evaluó su rendimiento.
modelo_svm <- svm(Satisfaction ~ ., data = train_scaled)
pred_svm <- predict(modelo_svm, test_scaled)
confusionMatrix(pred_svm, test$Satisfaction)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3 4
## 1 1 0 1 2
## 2 2 1 0 1
## 3 44 48 84 79
## 4 35 41 52 47
##
## Overall Statistics
##
## Accuracy : 0.3037
## 95% CI : (0.2609, 0.3491)
## No Information Rate : 0.3128
## P-Value [Acc > NIR] : 0.6768
##
## Kappa : 4e-04
##
## Mcnemar's Test P-Value : <2e-16
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3 Class: 4
## Sensitivity 0.012195 0.011111 0.6131 0.3643
## Specificity 0.991573 0.991379 0.4319 0.5858
## Pos Pred Value 0.250000 0.250000 0.3294 0.2686
## Neg Pred Value 0.813364 0.794931 0.7104 0.6882
## Prevalence 0.187215 0.205479 0.3128 0.2945
## Detection Rate 0.002283 0.002283 0.1918 0.1073
## Detection Prevalence 0.009132 0.009132 0.5822 0.3995
## Balanced Accuracy 0.501884 0.501245 0.5225 0.4751
Se implementó una red neuronal artificial para modelar patrones complejos entre las variables y la satisfacción de los empleados. Se utilizaron los datos escalados y se configuró la red con un número limitado de nodos ocultos para evitar sobreajuste. Luego, se generaron las predicciones y se analizó su precisión.
modelo_ann <- nnet(Satisfaction ~ ., data = train_scaled, size = 5, maxit = 500, trace = FALSE)
pred_ann <- predict(modelo_ann, test_scaled, type = "class")
pred_ann <- factor(pred_ann, levels = levels(test$Satisfaction))
confusionMatrix(pred_ann, test$Satisfaction)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3 4
## 1 3 6 4 2
## 2 24 17 34 35
## 3 26 22 50 44
## 4 29 45 49 48
##
## Overall Statistics
##
## Accuracy : 0.2694
## 95% CI : (0.2284, 0.3136)
## No Information Rate : 0.3128
## P-Value [Acc > NIR] : 0.9789
##
## Kappa : -0.0069
##
## Mcnemar's Test P-Value : 5.741e-10
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3 Class: 4
## Sensitivity 0.036585 0.18889 0.3650 0.3721
## Specificity 0.966292 0.73276 0.6944 0.6019
## Pos Pred Value 0.200000 0.15455 0.3521 0.2807
## Neg Pred Value 0.813239 0.77744 0.7061 0.6966
## Prevalence 0.187215 0.20548 0.3128 0.2945
## Detection Rate 0.006849 0.03881 0.1142 0.1096
## Detection Prevalence 0.034247 0.25114 0.3242 0.3904
## Balanced Accuracy 0.501439 0.46082 0.5297 0.4870
Se agrupan los países según variables económicas como población, ingreso nacional, paridad del poder adquisitivo y PIB.
Para analizar la estructura económica de los países, se cargaron los datos disponibles y se eliminaron los registros con valores faltantes. Luego se estandarizaron las variables numéricas para asegurar que todas tuvieran la misma influencia en los algoritmos de agrupamiento.
economy <- read.csv("Size of the economy.csv")
economy <- na.omit(economy)
datos_cluster <- scale(economy[, 2:7])
rownames(datos_cluster) <- economy$Country
El agrupamiento jerárquico se utilizó para observar cómo se relacionan los países entre sí en base a variables como población, ingreso y producto interno bruto. Este método genera un dendrograma que permite visualizar cómo se van formando los grupos paso a paso.
d <- dist(datos_cluster)
hc <- hclust(d, method = "ward.D2")
# Dendrograma sin etiquetas (más limpio)
plot(hc, labels = FALSE, main = "Dendrograma - Agrupamiento Jerárquico")
rect.hclust(hc, k = 4, border = 2:5)
# Mostrar los países agrupados por cada clúster
groups <- cutree(hc, k = 4)
split(names(groups), groups)
## $`1`
## [1] "Afghanistan" "Albania"
## [3] "Algeria" "Angola"
## [5] "Antigua and Barbuda" "Argentina"
## [7] "Armenia" "Aruba"
## [9] "Australia" "Austria"
## [11] "Azerbaijan" "Bahamas, The"
## [13] "Bahrain" "Bangladesh"
## [15] "Barbados" "Belarus"
## [17] "Belgium" "Belize"
## [19] "Benin" "Bermuda"
## [21] "Bhutan" "Bolivia"
## [23] "Bosnia and Herzegovina" "Botswana"
## [25] "Brazil" "Brunei Darussalam"
## [27] "Bulgaria" "Burkina Faso"
## [29] "Burundi" "Cambodia"
## [31] "Cameroon" "Canada"
## [33] "Cabo Verde" "Cayman Islands"
## [35] "Central African Republic" "Chad"
## [37] "Chile" "Hong Kong SAR, China"
## [39] "Colombia" "Comoros"
## [41] "Congo, Dem. Rep." "Congo, Rep."
## [43] "Costa Rica" "Cote d'Ivoire"
## [45] "Croatia" "Curacao"
## [47] "Cyprus" "Czechia"
## [49] "Denmark" "Djibouti"
## [51] "Dominica" "Dominican Republic"
## [53] "Ecuador" "Egypt, Arab Rep."
## [55] "El Salvador" "Equatorial Guinea"
## [57] "Estonia" "Eswatini"
## [59] "Ethiopia" "Fiji"
## [61] "Finland" "France"
## [63] "Gabon" "Gambia, The"
## [65] "Georgia" "Germany"
## [67] "Ghana" "Greece"
## [69] "Grenada" "Guatemala"
## [71] "Guinea" "Guinea-Bissau"
## [73] "Guyana" "Haiti"
## [75] "Honduras" "Hungary"
## [77] "Iceland" "India"
## [79] "Indonesia" "Iran, Islamic Rep."
## [81] "Iraq" "Ireland"
## [83] "Israel" "Italy"
## [85] "Jamaica" "Japan"
## [87] "Jordan" "Kazakhstan"
## [89] "Kenya" "Kiribati"
## [91] "Korea, Rep." "Kuwait"
## [93] "Kyrgyz Republic" "Lao PDR"
## [95] "Latvia" "Lebanon"
## [97] "Lesotho" "Liberia"
## [99] "Libya" "Lithuania"
## [101] "Luxembourg" "Madagascar"
## [103] "Malawi" "Malaysia"
## [105] "Maldives" "Mali"
## [107] "Malta" "Marshall Islands"
## [109] "Mauritania" "Mauritius"
## [111] "Mexico" "Micronesia, Fed. Sts."
## [113] "Moldova" "Mongolia"
## [115] "Montenegro" "Morocco"
## [117] "Mozambique" "Myanmar"
## [119] "Namibia" "Nauru"
## [121] "Nepal" "Netherlands"
## [123] "New Zealand" "Nicaragua"
## [125] "Niger" "Nigeria"
## [127] "North Macedonia" "Norway"
## [129] "Oman" "Pakistan"
## [131] "Palau" "Panama"
## [133] "Papua New Guinea" "Paraguay"
## [135] "Peru" "Philippines"
## [137] "Poland" "Portugal"
## [139] "Puerto Rico" "Qatar"
## [141] "Romania" "Russian Federation"
## [143] "Rwanda" "Samoa"
## [145] "San Marino" "Sao Tome and Principe"
## [147] "Saudi Arabia" "Senegal"
## [149] "Serbia" "Seychelles"
## [151] "Sierra Leone" "Singapore"
## [153] "Slovak Republic" "Slovenia"
## [155] "Solomon Islands" "Somalia"
## [157] "South Africa" "Spain"
## [159] "Sri Lanka" "St. Kitts and Nevis"
## [161] "St. Lucia" "St. Vincent and the Grenadines"
## [163] "Sudan" "Suriname"
## [165] "Sweden" "Switzerland"
## [167] "Tajikistan" "Tanzania"
## [169] "Thailand" "Timor-Leste"
## [171] "Togo" "Tonga"
## [173] "Trinidad and Tobago" "Tunisia"
## [175] "Turkiye" "Turkmenistan"
## [177] "Turks and Caicos Islands" "Tuvalu"
## [179] "Uganda" "Ukraine"
## [181] "United Arab Emirates" "United Kingdom"
## [183] "Uruguay" "Uzbekistan"
## [185] "Vanuatu" "Vietnam"
## [187] "West Bank and Gaza" "Zambia"
## [189] "Zimbabwe" "Latin America & Caribbean"
## [191] "Middle East & North Africa" "South Asia"
## [193] "Sub-Saharan Africa" "Low income"
##
## $`2`
## [1] "China" "United States" "East Asia & Pacific"
## [4] "Europe & Central Asia" "North America" "Lower middle income"
## [7] "Upper middle income" "High income"
##
## $`3`
## [1] "Macao SAR, China"
##
## $`4`
## [1] "World"
Se eliminaron las etiquetas del dendrograma para mejorar la visualización en el reporte. La tabla siguiente muestra qué países forman parte de cada uno de los 4 grupos definidos.
Como segunda técnica de agrupamiento, se aplicó el método de particionamiento K-means para dividir los países en un número específico de clústeres. Este método es útil porque asigna cada país a un grupo específico y permite una clasificación más directa.
library(factoextra)
set.seed(123)
kmeans_result <- kmeans(datos_cluster, centers = 4, nstart = 25)
fviz_cluster(list(data = datos_cluster, cluster = kmeans_result$cluster))
Esta visualización representa los clústeres formados a partir del agrupamiento jerárquico, proyectados en dos dimensiones mediante un análisis de componentes principales (PCA). Aunque no muestra con exactitud todas las distancias entre países, permite observar cómo los grupos tienden a agruparse según sus características económicas. La dispersión desigual también sugiere que ciertos países como “World” o regiones específicas podrían actuar como valores atípicos.
En este análisis se aplicaron varias técnicas de clasificación tanto supervisada como no supervisada para entender patrones en datos de empleados y economías globales.
Clasificación Supervisada:
Los tres modelos utilizados (árboles de decisión, SVM y redes
neuronales) presentaron desafíos para clasificar correctamente la
satisfacción de los empleados. Aunque los porcentajes de precisión
fueron relativamente bajos en todos los casos, el árbol de decisión
destacó por su capacidad de ser interpretado fácilmente. El modelo de
SVM tuvo un desempeño ligeramente mejor en la detección de una de las
clases principales. Las redes neuronales, a pesar de su potencial para
captar patrones complejos, no lograron mejorar los resultados.
Clasificación No Supervisada:
Al agrupar países según sus características económicas, los métodos
jerárquico y de particionamiento (K-means) lograron identificar patrones
similares. El agrupamiento jerárquico permitió visualizar la estructura
de relaciones entre países, mientras que K-means proporcionó una
clasificación práctica y útil para análisis futuros. Ambos métodos
resultaron coherentes y útiles para entender las diferencias entre
economías.
En general, el análisis mostró que la elección del método debe adaptarse a los objetivos: claridad e interpretación cuando se requiere entender el modelo (árboles), y precisión cuando se busca mejorar la clasificación (SVM o ANN). Para análisis exploratorios como el de países, ambos métodos de agrupamiento ofrecieron resultados consistentes y valiosos.