Liberias Necesarias
# Cargar las bibliotecas necesarias
library(readxl)
library(dplyr)
library(ggplot2)
library(cluster) # Para el análisis de silueta
library(factoextra) # Para visualizar la silueta
df <- read_excel("C:/Users/juanj/Downloads/OneDrive_2024-09-19/Prueva tecnica profesional modelos v2/1_Informe cultivos de coca UNDOC 2022.xlsx")
1) Estructuramos datos:
# Eliminar la columna de nombres de departamentos
df_numeric <- df %>%
select(-Departamento)
# Convertir a numérico
df_numeric <- df_numeric %>%
mutate(across(everything(), ~as.numeric(.)))
# Reemplazar los NA por ceros
df_numeric <- df_numeric %>%
replace(is.na(.), 0)
# Escalar los datos (normalización)
df_scaled <- scale(df_numeric)
3) Validamos numero de clusters
# Definir un rango de clusters para evaluar
num_clusters <- 2:10
# 1. Calcular el método del codo (inertia/wss)
wss <- sapply(num_clusters, function(k){
kmeans(df_scaled, centers = k, nstart = 25)$tot.withinss
})
# Graficar el método del codo
plot(num_clusters, wss, type = "b", pch = 19, frame = FALSE,
xlab = "Número de clusters K",
ylab = "Suma de cuadrados dentro de los clusters (WSS)",
main = "Método del Codo para determinar el número óptimo de K")

# 2. Calcular el puntaje de silueta para diferentes valores de K
sil_scores <- sapply(num_clusters, function(k){
model <- kmeans(df_scaled, centers = k, nstart = 25)
silhouette_score <- silhouette(model$cluster, dist(df_scaled))
mean(silhouette_score[, 3]) # Promedio del puntaje de silueta
})
# Graficar el puntaje de silueta para cada número de clusters
plot(num_clusters, sil_scores, type = "b", pch = 19, frame = FALSE,
xlab = "Número de clusters K", ylab = "Puntaje de Silueta Promedio",
main = "Análisis de Silueta para determinar el número óptimo de K")

4) Aplicamos algoritmo
# 3. Elegir el número de clusters óptimo ( 3 clusters)
set.seed(123)
kmeans_result <- kmeans(df_scaled, centers = 3, nstart = 25)
# Agregar la columna de cluster al dataframe original
df$Cluster <- as.factor(kmeans_result$cluster)
# Calcular el promedio de producción por departamento
df$Promedio <- rowMeans(df_numeric, na.rm = TRUE) # Calcular el promedio por fila
# Visualización de los clusters por departamento con diferentes formas para cada cluster
ggplot(df, aes(x = Departamento, y = Promedio, shape = Cluster)) + # Usar forma en lugar de color
geom_point(size = 3) +
scale_shape_manual(values = c(16, 17, 15)) + # Usar círculos, triángulos y cuadrados
labs(title = "Clasificación de Departamentos según nivel de producción (3 Clusters)",
x = "Departamento",
y = "Producción promedio (área cultivada)",
shape = "Cluster") + # Etiqueta para las formas
theme(axis.text.x = element_text(angle = 90, hjust = 1))

4) Consumo promedio por cluster
# 1. Calcular la producción promedio por cluster
produccion_por_cluster <- df %>%
group_by(Cluster) %>%
summarise(Promedio_Cluster = mean(Promedio, na.rm = TRUE)) # Promedio por cluster
# Visualizar la producción promedio por cluster
ggplot(produccion_por_cluster, aes(x = Cluster, y = Promedio_Cluster, fill = Cluster)) +
geom_bar(stat = "identity") +
labs(title = "Producción promedio por Cluster",
x = "Cluster",
y = "Producción promedio (área cultivada)") +
theme_minimal()
