#

El acceso a internet por estado muestra diferencias significativas relacionadas con factores como el nivel de urbanización, la infraestructura y el desarrollo económico.

Un análisis con clusters permite agrupar a los estados de acuerdo con su porcentaje de usuarios de internet, identificando en cuáles se concentra un acceso más alto y en cuáles persisten rezagos.

Ejemplos prácticos de aplicación de este análisis son:

Paso 1. Instalar paquetes y llamar librerías

library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(cluster)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

Paso 2. Obtener los datos / Entender los datos

df1 <- read_excel("/Users/miguel/Desktop/Internet_Estados_con_smartphones.xlsx")
head(df1)
## # A tibble: 6 × 3
##   Estado              `ID Estado` Porc_Usuarios_Internet_2023
##   <chr>                     <dbl>                       <dbl>
## 1 Quintana Roo                  1                        91.6
## 2 Baja California               2                        90.9
## 3 Jalisco                       3                        89.7
## 4 Baja California Sur           4                        89.5
## 5 Ciudad de México              5                        88.8
## 6 Tamaulipas                    6                        86.8
str(df1)
## tibble [32 × 3] (S3: tbl_df/tbl/data.frame)
##  $ Estado                     : chr [1:32] "Quintana Roo" "Baja California" "Jalisco" "Baja California Sur" ...
##  $ ID Estado                  : num [1:32] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Porc_Usuarios_Internet_2023: num [1:32] 91.6 90.9 89.7 89.5 88.8 86.8 86.6 86.6 85.5 85.5 ...

Paso 3. Escalar los datos

df_num <- df1 %>%
  mutate(`ID Estado` = as.numeric(`ID Estado`),
         Porc_Usuarios_Internet_2023 = as.numeric(Porc_Usuarios_Internet_2023)) %>%
  select(where(is.numeric)) %>%
  na.omit()
datos_escalados <- scale(df_num)

Paso 4. Determinar números de grupos

grupos2 <- 3
grupos2
## [1] 3

Paso 5: Construcción de X

if ("ID Estado" %in% colnames(df_num)) {
  X <- df_num[, setdiff(colnames(df_num), "ID Estado"), drop = FALSE]
} else {
  X <- df_num
}
X <- na.omit(X)

Paso 6: Gap Statistic

set.seed(123)
gap <- clusGap(as.matrix(X), FUN = kmeans, nstart = 25, K.max = 10, B = 200)
plot(gap, xlab = "Número de clusters (k)")

# Paso 7: K-means

set.seed(123)
clusters2 <- kmeans(x = X, centers = grupos2, nstart = 25)
clusters2
## K-means clustering with 3 clusters of sizes 8, 5, 6
## 
## Cluster means:
##   Porc_Usuarios_Internet_2023
## 1                    83.75000
## 2                    90.10000
## 3                    86.08333
## 
## Clustering vector:
##  [1] 2 2 2 2 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1
## 
## Within cluster sum of squares by cluster:
## [1] 6.560000 5.100000 2.068333
##  (between_SS / total_SS =  90.0 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Paso 8: Asignación de clusters

df1$Cluster <- NA_integer_
df1$Cluster[as.numeric(rownames(X))] <- clusters2$cluster
table(df1$Cluster, useNA = "ifany")
## 
##    1    2    3 <NA> 
##    8    5    6   13
head(df1)
## # A tibble: 6 × 4
##   Estado              `ID Estado` Porc_Usuarios_Internet_2023 Cluster
##   <chr>                     <dbl>                       <dbl>   <int>
## 1 Quintana Roo                  1                        91.6       2
## 2 Baja California               2                        90.9       2
## 3 Jalisco                       3                        89.7       2
## 4 Baja California Sur           4                        89.5       2
## 5 Ciudad de México              5                        88.8       2
## 6 Tamaulipas                    6                        86.8       3

Paso 9: Paso 9: Visualización por ID

ggplot(df1, aes(x = `ID Estado`, y = Porc_Usuarios_Internet_2023,
                color = factor(Cluster))) +
  geom_point(size = 3) +
  scale_color_discrete(name = "Cluster") +
  labs(title = "Clusters por % de Usuarios con Internet",
       x = "ID Estado", y = "% Usuarios Internet 2023") +
  theme_minimal()
## Warning: Removed 13 rows containing missing values or values outside the scale range
## (`geom_point()`).

# Paso 10: Visualizacion con Eclipse

df1 <- read_excel("/Users/miguel/Desktop/Internet_Estados_con_smartphones.xlsx")
df1 <- df1 %>%
  mutate(`ID Estado` = as.numeric(`ID Estado`),
         Porc_Usuarios_Internet_2023 = as.numeric(Porc_Usuarios_Internet_2023))
X <- df1["Porc_Usuarios_Internet_2023"] %>% na.omit()
idx <- as.numeric(rownames(X))
k <- 3
set.seed(123)
km <- kmeans(X, centers = k, nstart = 25)
df1$cluster <- NA_integer_
df1$cluster[idx] <- km$cluster
df1$cluster <- factor(df1$cluster)
fviz_cluster(clusters2, data = datos_escalados,
             geom = "point",
             ellipse.type = "euclid",
             main = paste0("Clusters de Estados (k=", k, ")"))