library(ggplot2)
library(psych)
library(factoextra)
library(PerformanceAnalytics)
library(corrplot)
El conjunto de datos USArrests contiene estadísticas sobre arrestos en cada uno de los 50 estados de EE. UU. en el año 1973 por cada 100,000 residentes. Incluye las siguientes variables:
data("USArrests")
print(head(USArrests))
## Murder Assault UrbanPop Rape
## Alabama 13.2 236 58 21.2
## Alaska 10.0 263 48 44.5
## Arizona 8.1 294 80 31.0
## Arkansas 8.8 190 50 19.5
## California 9.0 276 91 40.6
## Colorado 7.9 204 78 38.7
Vista previa de la estructura del dataset
print(str(USArrests))
## 'data.frame': 50 obs. of 4 variables:
## $ Murder : num 13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
## $ Assault : int 236 263 294 190 276 204 110 238 335 211 ...
## $ UrbanPop: int 58 48 80 50 91 78 77 72 80 60 ...
## $ Rape : num 21.2 44.5 31 19.5 40.6 38.7 11.1 15.8 31.9 25.8 ...
## NULL
# Histogramas
par(mar=c(5, 8, 4, 2) + 0.1)
hist(USArrests$Murder, main="Asesinatos", xlab="Asesinatos por 100,000 habitantes", col="blue")
hist(USArrests$Assault, main="Asaltos", xlab="Asaltos por 100,000 habitantes", col="red")
hist(USArrests$UrbanPop, main="Población Urbana", xlab="Porcentaje de Población Urbana", col="green")
hist(USArrests$Rape, main="Violaciones", xlab="Violaciones por 100,000 habitantes", col="yellow")
# Boxplots
# Ajustar el tamaño de la figura (opciones de tamaño de punto de etiqueta más grandes)
boxplot(USArrests, main = "Boxplot de USArrests", col=c("blue", "red", "green", "yellow"),
cex.axis=1.0, # Tamaño de las etiquetas del eje
cex.lab=1.2, # Tamaño de las etiquetas de los ejes x y y
cex.main=1.5) # Tamaño del título principal
Se puede apreciar que “Asaltos” tiene mayor frecuencia.
cor_mat <- cor(USArrests)
corrplot(cor_mat, method = "circle")
Al observar la matriz de correlación de USArrests, notamos que algunas variables muestran correlaciones significativas entre sí. Por ejemplo, existe una correlación alta entre ‘Murder’ y ‘Assault’, así como entre ‘Assault’ y ‘Rape’. Estas correlaciones fuertes sugieren que las variables están relacionadas y podrían estar midiendo aspectos similares de la criminalidad en los Estados Unidos.
En resumen, la presencia de correlaciones significativas entre las variables en el conjunto de datos ‘USArrests’ justifica el uso del ACP para obtener una comprensión más profunda de las tendencias y patrones en los datos, simplificando la complejidad de los mismos mientras se retiene la esencia de la información.
pca <- prcomp(USArrests, scale = TRUE)
print(summary(pca))
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.5749 0.9949 0.59713 0.41645
## Proportion of Variance 0.6201 0.2474 0.08914 0.04336
## Cumulative Proportion 0.6201 0.8675 0.95664 1.00000
Análisis de los Resultados del ACP Los datos que has proporcionado muestran la importancia de los componentes en el ACP. La “Desviación Estándar” de cada componente principal indica la cantidad de varianza que cada uno captura de los datos. La “Proporción de Varianza” y la “Proporción Acumulativa” nos dicen cuánta varianza de los datos originales se explica por cada componente principal y de manera acumulativa, respectivamente.
PC1: Explica el 62.01% de la varianza.
PC2: Añade un 24.74%, llevando la varianza acumulada al 86.75%.
PC3 y PC4: Aportan cantidades más pequeñas de varianza adicional
# Agregar la variable categórica
USArrests$CrimeLevel <- ifelse(USArrests$Murder > median(USArrests$Murder), "Alto", "Bajo")
# Biplot con la variable categórica
fviz_pca_biplot(pca, label = "none", addEllipses = TRUE, ellipse.level = 0.95,
geom.ind = "point", geom.var = "arrow",
col.ind = USArrests$CrimeLevel, palette = c("blue", "red"))
Los outliers pueden distorsionar la dirección y la varianza explicada de los componentes principales, lo cual puede llevar a interpretaciones erróneas. Es importante evaluar si estos outliers representan anomalías que deben ser removidas o corregidas, o si son variaciones naturales dentro de los datos.
# Identificación de Outliers con Boxplots
boxplot(USArrests[, c("Murder", "Assault", "UrbanPop", "Rape")],
main = "Boxplot para Identificación de Outliers en USArrests")
Basado en la visualización de boxplots, observamos outliers en las variables ‘Murder’, ‘Assault’, y ‘Rape’. Estos valores extremos pueden tener un impacto significativo en el ACP debido a que el ACP es sensible a la magnitud de los datos.
# Biplot con etiquetas de variables
fviz_pca_biplot(pca, label = "var", col.ind = "black", col.var = "steelblue", addEllipses = TRUE, ellipse.level = 0.95)
El biplot del ACP muestra una clara distinción en las tasas de crímenes violentos entre los estados. Los estados que se extienden hacia la derecha del gráfico tienden a tener tasas más altas de ‘Murder’, ‘Assault’, y ‘Rape’, lo que sugiere que estas áreas experimentan niveles de violencia más altos.
Por otro lado, los estados hacia la izquierda, con valores más bajos en el primer componente principal, parecen tener tasas más bajas de estos crímenes.
La variable ‘UrbanPop’ parece contribuir menos a la variabilidad de los crímenes violentos en comparación con las otras variables, como se evidencia por su orientación más vertical en el biplot. Esto sugiere que el nivel de urbanización no está tan directamente asociado con las tasas de crímenes violentos como lo están las otras variables entre sí.
print(summary(pca))
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.5749 0.9949 0.59713 0.41645
## Proportion of Variance 0.6201 0.2474 0.08914 0.04336
## Cumulative Proportion 0.6201 0.8675 0.95664 1.00000
El ACP revela que el primer componente principal explica un 62% de la varianza total, lo cual es significativo, ya que indica que gran parte de la información contenida en las cuatro variables puede ser resumida por este componente.
Esto se ve reflejado en el biplot, donde las flechas correspondientes a ‘Murder’, ‘Assault’ y ‘Rape’ son más largas y apuntan en la misma dirección general, indicando que estas variables contribuyen de manera similar al primer componente principal.
El segundo componente principal añade un 24.7% adicional a la varianza explicada, lo cual sugiere que captura otra dimensión importante de los datos, posiblemente relacionada con el aspecto de urbanización, como lo sugiere la orientación de la flecha ‘UrbanPop’.
Al sumar la varianza explicada por los dos primeros componentes principales, tenemos que representan casi el 87% de la información total, lo que demuestra que el ACP es bastante efectivo para representar las variables originales.
Basándonos en esta información y en la visualización del biplot, podemos concluir que las variables ‘Murder’, ‘Assault’ y ‘Rape’ están bien representadas por los componentes principales y que ‘UrbanPop’, aunque menos correlacionada con el primer componente, también es una contribución significativa en el segundo componente.
Se ha creado una nueva variable categórica basada en el primer componente principal (PC1),
que representa la tasa general de crímenes violentos (Murder, Assault, Rape),llamada ‘CrimeLevel’ con categorías ‘Alto’, ‘Medio’ y ‘Bajo’.
dataset2 <- USArrests
dataset2$CrimeLevel <- ifelse(dataset2$Murder > median(dataset2$Murder), "Alto", "Bajo")
head(dataset2)
## Murder Assault UrbanPop Rape CrimeLevel
## Alabama 13.2 236 58 21.2 Alto
## Alaska 10.0 263 48 44.5 Alto
## Arizona 8.1 294 80 31.0 Alto
## Arkansas 8.8 190 50 19.5 Alto
## California 9.0 276 91 40.6 Alto
## Colorado 7.9 204 78 38.7 Alto
# Visualización de los Componentes Principales con la Variable Categórica
pca2 <- prcomp(dataset2[, c("Murder", "Assault", "UrbanPop", "Rape")], scale = TRUE)
dataset2$CrimeLevel <- cut(dataset2$Murder,
breaks=quantile(dataset2$Murder, probs = c(0, 1/3, 2/3, 1), na.rm = TRUE),
include.lowest = TRUE,
labels = c("Bajo", "Medio", "Alto"))
# Visualización de la variable categórica en el ACP con fviz_pca_biplot
fviz_pca_biplot(pca2,
geom.ind = aes(color = dataset2$CrimeLevel), # Usar la coloración basada en CrimeLevel
addEllipses = TRUE) # Añadir elipses de confianza si es necesario
Los estados con niveles altos de crímenes (‘Alto’) pueden estar principalmente ubicados en la parte derecha del biplot, lo que indica una mayor contribución a las tasas de ‘Murder’, ‘Assault’ y ‘Rape’.
Esto podría sugerir que los estados con un ‘CrimeLevel’ alto tienen patrones de crimen que son bien capturados por el primer componente principal.
Por otro lado, los estados con un ‘CrimeLevel’ bajo podrían estar más dispersos o agrupados hacia la izquierda, indicando tasas más bajas de estos crímenes.
La posición relativa de los estados en el segundo componente principal (Dim2), influenciada principalmente por ‘UrbanPop’, podría reflejar el grado de urbanización y su relación con las tasas de crímenes.
Se evalua la cantidad codo que sea mas optimo y se clustering.
# Realizar el ACP para reducir la dimensionalidad antes del clustering
pca_result <- prcomp(USArrests[, c("Murder", "Assault", "UrbanPop", "Rape")], scale = TRUE)
# Extraer las puntuaciones (scores) de los dos primeros componentes principales
scores <- pca_result$x[, 1:2]
# Calcular WCSS para un rango de números de clusters
wcss <- sapply(1:10, function(k) {
set.seed(123)
kmeans(scores, centers = k, nstart = 20)$tot.withinss
})
# Graficar el método del codo
plot(1:10, wcss, type = "b", pch = 19, frame = FALSE,
xlab = "Número de clusters", ylab = "WCSS",
main = "Método del Codo para Determinar el Número Óptimo de Clusters")
# Realizar el agrupamiento jerárquico
hc <- hclust(dist(scores))
# Graficar el dendrograma
plot(hc, main = "Agrupamiento Jerárquico de Estados", xlab = "Estados", ylab = "Distancia")
#Si tres es el número adecuado de clusters, esperarías ver un "codo","agrupamiento jerárquico" en el gráfico cerca de k=3, lo que indicaría que aumentar el #número de clusters más allá de tres no mejora significativamente la varianza explicada dentro de los clusters.
# Realizar clustering con k-means en los scores de los componentes principales
set.seed(123) # Para reproducibilidad
kmeans_result <- kmeans(scores, centers = 3) # Elige el número de clusters
# Añadir los resultados del clustering al conjunto de datos para su visualización
USArrests$cluster <- as.factor(kmeans_result$cluster)
# Visualizar los clusters en el espacio de los componentes principales
fviz_cluster(kmeans_result, data = scores)
En los clusters identificados, podríamos interpretar cada grupo como representativo de diferentes perfiles de criminalidad. Cluster 1 podría contener estados con altas tasas de asalto y asesinato, mientras que el cluster 2 podría agrupar estados con tasas más bajas de crímenes violentos. El cluster 3 podría estar compuesto por estados con características intermedias o con alta urbanización.
En resumen, el análisis realizado proporciona una visión integral de las tendencias y patrones en la criminalidad y la urbanización en los Estados Unidos. Resalta la utilidad del ACP y el clustering en la simplificación y comprensión de conjuntos de datos complejos y multidimensionales.