Contexto

En este proyecto contamos con diferentes datos sobre los estados de la Republica. Consumo de alcohol per capita, población y temperatura promedio anual.

Con esto realizaré un agrupamiento para ver que tipo de similitudes comparten estos estados o que diferencias principales hay.

Paso 1. Instalar paquetes y llamar librerías

#install.packages("cluster") # Análisis de Agrupamiento
library(cluster)
#install.packages("ggplot2") #Graficar
library(ggplot2)
#install.packages("data.table") #Manejo de muchos datos
library(data.table)
#install.packages("factoextra") #Gráfico optimización de número de clusters
library(factoextra)

Paso 2. Obtener los datos

df1 <- read.csv("C:/Users/corsa/OneDrive - CORSA Transportes SA de CV/Escritorio/TEC/alcohol_mexico2.csv")

df1_numeric <- df1[,c("consumo_anual","poblacion","temp_prom")]

Paso 3. Entender los datos

summary(df1_numeric)
##  consumo_anual     poblacion         temp_prom    
##  Min.   :2.100   Min.   : 370769   Min.   :14.50  
##  1st Qu.:3.950   1st Qu.: 926140   1st Qu.:18.00  
##  Median :4.700   Median :1557615   Median :21.50  
##  Mean   :4.812   Mean   :2016895   Mean   :21.48  
##  3rd Qu.:5.500   3rd Qu.:2541349   3rd Qu.:25.25  
##  Max.   :7.400   Max.   :8741123   Max.   :27.50
str(df1_numeric)
## 'data.frame':    32 obs. of  3 variables:
##  $ consumo_anual: num  7.3 4.7 4.5 6.2 4.3 2.1 5.4 6.7 5.8 5.3 ...
##  $ poblacion    : int  728924 1868431 392568 471424 4805017 2837881 1888047 1583102 370769 927784 ...
##  $ temp_prom    : num  18 19.5 24 26.5 25 18 16 19.5 27 17 ...

Paso 4. Escalar los datos

# Solo si los datos no están en la misma escala
datos_escalados <- scale(df1_numeric)

Paso 5. Determinar número de grupos

# Siempre es un valor inicial "cualquiera", luego se optimiza.
plot(datos_escalados)

grupos1 <- 5

Paso 6. Generar los grupos

set.seed(123)
clusters1 <- kmeans(datos_escalados,grupos1)
clusters1
## K-means clustering with 5 clusters of sizes 12, 3, 5, 7, 5
## 
## Cluster means:
##   consumo_anual  poblacion  temp_prom
## 1   -0.04588495 -0.5708340  1.0110239
## 2   -0.57203243  2.3011991  0.4607362
## 3    1.59129021  0.2142330 -0.5443176
## 4    0.17960682 -0.2338498 -1.0284522
## 5   -1.38939641  0.1024388 -0.7187485
## 
## Clustering vector:
##  [1] 3 4 1 1 2 5 4 3 1 4 4 5 1 3 2 3 1 1 3 5 5 4 1 4 1 1 1 1 5 2 1 4
## 
## Within cluster sum of squares by cluster:
## [1] 8.122385 5.723513 3.679083 2.975502 4.120859
##  (between_SS / total_SS =  73.5 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Paso 7. Optimizar el número de grupos

set.seed(123)
optimización <- clusGap(datos_escalados,FUN=kmeans,nstart=1,K.max=10)
#El K.max normalmente es 10, en este ejercicio al ser 8 datos se dejó en 7.
plot(optimización,xlab="Número de clusters k")

# Se selecciona como óptimo el primer númeor de clusters

Paso 8. Graficar los grupos

fviz_cluster(clusters1,data=datos_escalados)

Paso 9. Agregar clusters a la base de datos

df1clusters <- cbind(df1,cluster = clusters1$cluster)
head(df1clusters)
##                estado consumo_anual poblacion temp_prom cluster
## 1      Aguascalientes           7.3    728924      18.0       3
## 2     Baja California           4.7   1868431      19.5       4
## 3 Baja California Sur           4.5    392568      24.0       1
## 4            Campeche           6.2    471424      26.5       1
## 5    Ciudad de México           4.3   4805017      25.0       2
## 6             Chiapas           2.1   2837881      18.0       5

Conclusiones

La técnica de clustering permite identificar patrones o grupos naturales en los datos sin necesidad de etiquetas previas.En este caso si fue necesario utilizar la escala de datos para poder trabajar con ellos durante el analisis y el agrupamiento de los clusters.