#
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:
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
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 ...
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)
grupos2 <- 3
grupos2
## [1] 3
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)
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"
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
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, ")"))