I. Clasificación Supervisada: Employee-IBM

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).

Carga de datos y preprocesamiento

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])

1. Árbol de decisión

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

2. Máquinas de Soporte Vectorial (SVM)

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

3. Redes Neuronales Artificiales (ANN)

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

II. Clasificación No Supervisada: Size of the Economy

Se agrupan los países según variables económicas como población, ingreso nacional, paridad del poder adquisitivo y PIB.

Carga y preprocesamiento

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

1. Agrupamiento jerárquico

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.

2. Método de Particionamiento (K-means)

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.

Conclusiones

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.