```{r knitr::opts_chunk$set(echo = TRUE)
### Se cargar las librerias
### Se cargan los datos
``` r
data(vivienda)
summary(vivienda)
## id zona piso estrato
## Min. : 1 Length:8322 Length:8322 Min. :3.000
## 1st Qu.:2080 Class :character Class :character 1st Qu.:4.000
## Median :4160 Mode :character Mode :character Median :5.000
## Mean :4160 Mean :4.634
## 3rd Qu.:6240 3rd Qu.:5.000
## Max. :8319 Max. :6.000
## NA's :3 NA's :3
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000
## Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111
## 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## NA's :2 NA's :3 NA's :1605 NA's :3
## habitaciones tipo barrio longitud
## Min. : 0.000 Length:8322 Length:8322 Min. :-76.59
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54
## Median : 3.000 Mode :character Mode :character Median :-76.53
## Mean : 3.605 Mean :-76.53
## 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :-76.46
## NA's :3 NA's :3
## latitud
## Min. :3.333
## 1st Qu.:3.381
## Median :3.416
## Mean :3.418
## 3rd Qu.:3.452
## Max. :3.498
## NA's :3
El resumen estadístico muestra que los datos de vivienda incluyen 8322 registros con variables como estrato, preciom, areaconst, y parqueaderos. Los estratos oscilan entre 3 y 6, con un promedio de 4.6. El precio de las viviendas varía de 58 a 1999, con una media de 433.9. El área construida va de 30 a 1745 m², con un promedio de 174.9 m². La mayoría de las viviendas tienen entre 2 y 4 parqueaderos, aunque 1605 registros carecen de esta información. Variables adicionales, como banios y habitaciones, muestran que la mayoría de las viviendas tienen 3 baños y entre 3 y 4 habitaciones. Algunos valores faltantes están presentes en varias columnas, como id, estrato, preciom, y longitud.
# Instala y carga el paquete knitr
#install.packages("knitr")
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
datos_faltantes <- vivienda %>% summarise_all(~sum(is.na(.)))
kable(datos_faltantes, format = "markdown")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3 | 3 | 2638 | 3 | 2 | 3 | 1605 | 3 | 3 | 3 | 3 | 3 | 3 |
vivienda <- vivienda %>%
filter(!is.na(id))
vivienda_new = vivienda[,c(4:9)]
md.pattern(vivienda_new, rotate.names = TRUE)
## estrato preciom areaconst banios habitaciones parqueaderos
## 6717 1 1 1 1 1 1 0
## 1602 1 1 1 1 1 0 1
## 0 0 0 0 0 1602 1602
El análisis del patrón de datos faltantes muestra diferentes combinaciones de valores presentes y ausentes en las variables preciom, estrato, areaconst, banios, habitaciones y parqueaderos. En algunos registros, todas las variables están completas, mientras que en otros faltan una o más variables, como en el caso de los 1605 valores ausentes en parqueaderos. La última fila del resultado destaca la cantidad total de valores faltantes por variable, revelando que parqueaderos es la variable con más datos faltantes.
vivienda %>%
group_by(zona) %>%
summarise(n = n(), .groups = "drop")
## # A tibble: 5 × 2
## zona n
## <chr> <int>
## 1 Zona Centro 124
## 2 Zona Norte 1920
## 3 Zona Oeste 1198
## 4 Zona Oriente 351
## 5 Zona Sur 4726
La distribución de viviendas revela una mayor concentración en la Zona Sur, con 4726 registros, seguida de la Zona Norte con 1920 y la Zona Oeste con 1198. Las Zonas Oriente y Centro tienen una menor representación, con 351 y 124 viviendas, respectivamente. Además, hay 3 registros con datos faltantes sobre la zona. Esto sugiere que la mayoría de las viviendas se encuentran en la Zona Sur, con menos presencia en las demás zonas, especialmente en la Zona Centro.
vivienda %>%
group_by(piso) %>%
summarise(n = n(), .groups = "drop")
## # A tibble: 13 × 2
## piso n
## <chr> <int>
## 1 01 860
## 2 02 1450
## 3 03 1097
## 4 04 607
## 5 05 567
## 6 06 245
## 7 07 204
## 8 08 211
## 9 09 146
## 10 10 130
## 11 11 84
## 12 12 83
## 13 <NA> 2635
La distribución de viviendas por piso muestra que el Piso 02 tiene la mayor cantidad de viviendas con 1450 registros, seguido por el Piso 03 con 1097 y el Piso 01 con 860. Los pisos 04 y 05 tienen 607 y 567 viviendas, respectivamente. A medida que el número de piso aumenta, la cantidad de viviendas disminuye, con 245 en el Piso 06, y menos de 250 en los pisos 07, 08, 09, y 10, siendo estos últimos los que tienen la menor representación con 204, 211, 146 y 130 viviendas, respectivamente. Esto indica una clara preferencia por los pisos más bajos.
vivienda %>%
group_by(tipo) %>%
summarise(n = n(), .groups = "drop")
## # A tibble: 2 × 2
## tipo n
## <chr> <int>
## 1 Apartamento 5100
## 2 Casa 3219
El análisis de la variable tipo revela que la mayoría de las viviendas son Apartamentos, con 5100 registros, mientras que Casas representan 3219 viviendas. También hay 3 registros con datos faltantes sobre el tipo de vivienda (NA). Esto indica una predominancia significativa de apartamentos en el conjunto de datos, con una menor proporción de casas y un pequeño número de registros incompletos.
vivienda %>%
group_by(piso) %>%
summarise(n = n(), .groups = "drop") %>%
arrange(desc(n)) %>%
head(5)
## # A tibble: 5 × 2
## piso n
## <chr> <int>
## 1 <NA> 2635
## 2 02 1450
## 3 03 1097
## 4 01 860
## 5 04 607
vivienda %>%
group_by(barrio) %>%
summarise(n = n(), .groups = "drop") %>%
arrange(desc(n)) %>%
head(5)
## # A tibble: 5 × 2
## barrio n
## <chr> <int>
## 1 valle del lili 1008
## 2 ciudad jardín 516
## 3 pance 409
## 4 la flora 366
## 5 santa teresita 262
La distribución de viviendas por barrio muestra una concentración significativa en el barrio Valle del Lili, con 1008 registros, lo que lo convierte en el área con la mayor cantidad de viviendas en este conjunto de datos. Le sigue Ciudad Jardín con 516 viviendas, y Pance con 409. La Flora y Santa Teresita tienen 366 y 262 viviendas, respectivamente. Estos resultados indican que Valle del Lili es el barrio con mayor oferta inmobiliaria, mientras que Santa Teresita tiene la menor cantidad de viviendas registradas en comparación con los otros barrios mencionados.
resumen <- describe(vivienda$preciom)
resumen
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 8319 433.9 328.67 330 374.48 207.56 58 1999 1941 1.85 3.67
## se
## X1 3.6
El análisis de los precios de las viviendas revela que, con 8320 registros, el precio promedio es de 433.89, pero la desviación estándar de 328.65 indica una alta variabilidad en los precios. La mediana es significativamente menor, a 330, lo que sugiere que el precio medio es arrastrado hacia arriba por algunos precios extremos altos. La media recortada, que es de 374.43, muestra que los precios más extremos están afectando el promedio general. El rango de precios, que va desde 58 hasta 1999, es de 1941, lo que también subraya una considerable dispersión. La distribución de precios es sesgada hacia la derecha, con un sesgo de 1.85, y tiene colas más pesadas y una forma más puntiaguda que una distribución normal, con una curtosis de 3.67. El error estándar de la media, 3.6, sugiere una estimación relativamente precisa de la media del precio.
# Separa las observaciones con valores completos y los faltantes en parqueaderos
data_completa <- vivienda %>% dplyr::filter(!is.na(parqueaderos))
data_faltantes <- vivienda %>% dplyr::filter(is.na(parqueaderos))
# Ajusta un modelo de regresión lineal usando las observaciones completas
modelo <- lm(parqueaderos ~ estrato + preciom + areaconst + banios + habitaciones + tipo, data = data_completa)
# Predice los valores faltantes usando el modelo ajustado
data_faltantes <- data_faltantes %>%
mutate(parqueaderos = predict(modelo, newdata = data_faltantes))
# Combina las predicciones con el dataframe original
viviendas_imputadas <- vivienda %>%
mutate(parqueaderos = ifelse(is.na(parqueaderos), round(predict(modelo, newdata = .)), parqueaderos))
# Verifica los cambios
summary(viviendas_imputadas$parqueaderos)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 1.000 1.751 2.000 10.000
Se realiza la correlacion linal para reeemplazar los vales de NA de varaible parqueadero
vivienda <- viviendas_imputadas
datos_faltantes <- vivienda %>% summarise_all(~sum(is.na(.)))
kable(datos_faltantes, format = "markdown")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 2635 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
vivienda$parqueaderos <- round(vivienda$parqueaderos)
Lo anterior se realiza para tener numero enteros
barplot(prop.table(table(vivienda1$zona)),col=c("orange","blue", "red", "green", "yellow"),
legend.text=c("Zona Centro","Zona Norte","Zona Oeste","Zona Oriente", "Zona Sur"),
ylim=c(0,1.2),ylab="Frecuencias Relativas")
Se identifica que la zona sur es la zona donde mas vivienda
vivienda_limpia <- vivienda[, !(names(vivienda) %in% c("longitud", "latitud", "piso"))]
Se elimina las variables
viviendaT <- vivienda_limpia[1:8319, c( "estrato", "preciom", "areaconst", "banios", "habitaciones","parqueaderos")]
viviendaES <- scale(viviendaT)
viviendaES <- as.data.frame(scale(viviendaT))
head(viviendaES)
## estrato preciom areaconst banios habitaciones parqueaderos
## 1 -1.5872276 -0.5595498 -0.7339949 -0.07793773 1.6406840 -0.7034307
## 2 -1.5872276 -0.3465670 -0.3842568 -0.77811479 -0.4147626 -0.7034307
## 3 -1.5872276 -0.2552886 0.3152194 -0.77811479 0.2703863 0.2328637
## 4 -0.6156201 -0.1031580 0.7349051 1.32241640 -0.4147626 1.1691581
## 5 0.3559875 -0.5291236 -0.5940997 -0.77811479 -0.4147626 -0.7034307
## 6 0.3559875 -0.5899759 -0.6150839 -0.07793773 -0.4147626 -0.7034307
prcomp(viviendaES)
## Standard deviations (1, .., p=6):
## [1] 1.8774005 1.1005323 0.7055593 0.5854106 0.4876795 0.4310975
##
## Rotation (n x k) = (6 x 6):
## PC1 PC2 PC3 PC4 PC5 PC6
## estrato 0.3088902 -0.6206045 0.5370897 -0.06644261 -0.4386252 -0.1848377
## preciom 0.4715896 -0.2337199 -0.1378288 -0.22117739 0.1966844 0.7850970
## areaconst 0.4441804 0.2046795 -0.3834177 -0.64373033 -0.1757868 -0.4105012
## banios 0.4595985 0.1657667 0.4119977 0.12174343 0.6996314 -0.2953691
## habitaciones 0.2885024 0.6855850 0.3477900 0.17411748 -0.4771142 0.2604358
## parqueaderos 0.4363822 -0.1443120 -0.5048058 0.69795333 -0.1445686 -0.1608626
En este caso el primer componente principal explica el 58,7% de la variabilidad contenida en el conjunto de datos de entrada y entre los dos primeros se supera el 78.9%, lo cual indicaría que con solo una variable (CP1) que se obtiene mediante una combinación lineal de las variables se puede resumir gran parte de la variabilidad que contiene la base de datos.
res.pca <- prcomp(viviendaES)
fviz_eig(res.pca, addlabels = TRUE)
fviz_pca_var(res.pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)
El análisis del círculo de correlaciones en el plano factorial revela
varias relaciones clave entre las variables:
Precio y parqueaderos: Existe una fuerte relación entre el precio de las viviendas y el número de parqueaderos. Esto significa que las viviendas con más parqueaderos suelen tener precios más altos.
Área construida y número de baños: También se observa una alta correlación entre el área construida y el número de baños, lo que indica que las viviendas con más área construida tienden a tener más baños.
Habitaciones y estrato: Aunque las variables de habitaciones y estrato muestran una baja correlación (casi formando un ángulo recto en el círculo de correlaciones), ambas tienen una alta influencia en la conformación del primer componente principal. Esto significa que, a pesar de no estar estrechamente relacionadas entre sí, son importantes para explicar la variabilidad en los datos. Además, estas variables también están estrechamente relacionadas con el segundo componente principal.
casos1 <- rbind(res.pca$x[5093,1:2],res.pca$x[1258,1:2]) # CP1
rownames(casos1) = c("5093","1258")
casos1 <- as.data.frame(casos1)
casos2 <- rbind(res.pca$x[4060,1:2], res.pca$x[1762,1:2]) # CP2
rownames(casos2) = c("4060","1762")
casos2 <- as.data.frame(casos2)
# Genera el gráfico
fviz_pca_ind(res.pca, col.ind = "#DEDEDE", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) +
geom_point(data = casos1, aes(x = PC1, y = PC2), color = "red", size = 3) +
geom_text(data = casos1, aes(x = PC1, y = PC2, label = rownames(casos1)), color = "red", vjust = -1) +
geom_point(data = casos2, aes(x = PC1, y = PC2), color = "blue", size = 3) +
geom_text(data = casos2, aes(x = PC1, y = PC2, label = rownames(casos2)), color = "blue", vjust = -1)
datos <- rbind(viviendaES[5093,], # ok
viviendaES[1258,],
viviendaES[4060,],
viviendaES[1762,])
datos <- as.data.frame(datos)
rownames(datos) = c("Vivienda 5093","Vivienda 1258","Vivienda 4060","Vivienda 1762")
datos
## estrato preciom areaconst banios habitaciones
## Vivienda 5093 1.3275950 0.4445121 -0.2583511 0.6222393 -2.4702091
## Vivienda 1258 -1.5872276 -0.8060013 -0.1044663 0.6222393 1.6406840
## Vivienda 4060 -0.6156201 -0.8029587 -0.7339949 -0.7781148 -0.4147626
## Vivienda 1762 1.3275950 4.1564981 9.8700639 0.6222393 0.9555352
## parqueaderos
## Vivienda 5093 0.2328637
## Vivienda 1258 -0.7034307
## Vivienda 4060 -0.7034307
## Vivienda 1762 7.7232189
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = viviendaES$estrato,
col.var = "#034A94", # Variables color
col.ind = c("#DEDEDE", "#034A94") # Individuals color
)
# Correlación
cor(viviendaES)
## estrato preciom areaconst banios habitaciones
## estrato 1.00000000 0.6098066 0.2743233 0.4203218 -0.07137615
## preciom 0.60980664 1.0000000 0.6873520 0.6691456 0.26409121
## areaconst 0.27432332 0.6873520 1.0000000 0.6484165 0.51691292
## banios 0.42032178 0.6691456 0.6484165 1.0000000 0.58990641
## habitaciones -0.07137615 0.2640912 0.5169129 0.5899064 1.00000000
## parqueaderos 0.45331751 0.7176958 0.6081063 0.5882889 0.28677768
## parqueaderos
## estrato 0.4533175
## preciom 0.7176958
## areaconst 0.6081063
## banios 0.5882889
## habitaciones 0.2867777
## parqueaderos 1.0000000
Se calcula la correlacion entre las variables
corrplot(cor(viviendaES))
Como se observa en la grafica, se idenfitica que las dos variables que mas se correlacionan son parqueadero y precio
# PCA
res.pca <- PCA(viviendaES, graph = FALSE, scale.unit = TRUE )
# Calculamos la distancia euclidiana
distancia <- dist(res.pca$ind$coord, method = "euclidean")
# Cluster
res.HCPC <- HCPC(res.pca, nb.clust=4)
Para ver si k=4 es el mejor número de clústers se utiliza el siguiente gráfico
# Método del codo
wss <- sapply(1:10, function(k){kmeans(res.pca$ind$coord, k)$tot.withinss})
plot(1:10, wss, type="b", pch = 19, frame = FALSE,
xlab="Número de clusters K", ylab="Total within-clusters sum of squares")
# Realizamos el clustering jerárquico
res.hclust <- hclust(distancia, method = "ward.D2")
# Calculamos el índice de Calinski-Harabasz para diferentes números de clusters
ch <- c()
for (k in 2:10) {
cluster_assignments <- cutree(res.hclust, k)
ch[k] <- cluster.stats(distancia, cluster_assignments)$ch
}
# Graficamos el índice de Calinski-Harabasz
plot(2:10, ch[2:10], type = "b", xlab = "Número de clusters", ylab = "Índice de Calinski-Harabasz")
Tanto el método del codo como el índice de Calinski-Harabasz indican que
k=4 es un valor adecuado para seleccionar el número óptimo de clústers.
A continuación, se procederá a examinar las características de cada
clúster.
# Caracteristicas de las viviendas
res.HCPC$desc.var
##
## Link between the cluster variable and the quantitative variables
## ================================================================
## Eta2 P-value
## estrato 0.5318619 0
## preciom 0.7146869 0
## areaconst 0.5748151 0
## banios 0.5888230 0
## habitaciones 0.5656865 0
## parqueaderos 0.6123458 0
##
## Description of each cluster by quantitative variables
## =====================================================
## $`1`
## v.test Mean in category Overall mean sd in category Overall sd
## habitaciones -41.61983 -0.4886702 -5.074009e-17 0.5008754 0.9999399
## areaconst -50.36123 -0.5913055 1.091881e-17 0.3250699 0.9999399
## estrato -50.93722 -0.5980684 -1.735866e-16 0.7411444 0.9999399
## parqueaderos -51.96737 -0.6101637 -1.074056e-16 0.2945691 0.9999399
## preciom -56.31295 -0.6611863 -3.542222e-17 0.2515159 0.9999399
## banios -62.17812 -0.7300510 1.037623e-16 0.4430794 0.9999399
## p.value
## habitaciones 0
## areaconst 0
## estrato 0
## parqueaderos 0
## preciom 0
## banios 0
##
## $`2`
## v.test Mean in category Overall mean sd in category Overall sd
## estrato 47.395580 0.77697961 -1.735866e-16 0.5746383 0.9999399
## banios 15.130934 0.24804903 1.037623e-16 0.6236492 0.9999399
## preciom 13.557123 0.22224875 -3.542222e-17 0.5596869 0.9999399
## parqueaderos 11.983172 0.19644618 -1.074056e-16 0.4982646 0.9999399
## areaconst -2.458043 -0.04029594 1.091881e-17 0.4918257 0.9999399
## habitaciones -9.580964 -0.15706557 -5.074009e-17 0.5147680 0.9999399
## p.value
## estrato 0.000000e+00
## banios 1.012476e-51
## preciom 7.190126e-42
## parqueaderos 4.353393e-33
## areaconst 1.396964e-02
## habitaciones 9.614337e-22
##
## $`3`
## v.test Mean in category Overall mean sd in category Overall sd
## habitaciones 62.13671 1.9308122 -5.074009e-17 1.0824573 0.9999399
## banios 29.68861 0.9225324 1.037623e-16 0.9727340 0.9999399
## areaconst 26.80425 0.8329050 1.091881e-17 0.8235022 0.9999399
## estrato -23.10481 -0.7179501 -1.735866e-16 0.8167318 0.9999399
## p.value
## habitaciones 0.000000e+00
## banios 1.077316e-193
## areaconst 2.882716e-158
## estrato 4.141904e-118
##
## $`4`
## v.test Mean in category Overall mean sd in category Overall sd
## preciom 68.23879 2.0812421 -3.542222e-17 1.0747822 0.9999399
## parqueaderos 63.32494 1.9313726 -1.074056e-16 1.3530446 0.9999399
## areaconst 56.06269 1.7098784 1.091881e-17 1.4055443 0.9999399
## banios 46.20429 1.4092031 1.037623e-16 0.9098041 0.9999399
## estrato 33.79088 1.0306015 -1.735866e-16 0.5633534 0.9999399
## habitaciones 17.87935 0.5453095 -5.074009e-17 0.9614673 0.9999399
## p.value
## preciom 0.000000e+00
## parqueaderos 0.000000e+00
## areaconst 0.000000e+00
## banios 0.000000e+00
## estrato 2.684992e-250
## habitaciones 1.708130e-71
El análisis se centra en la relación entre las variables cuantitativas y las categorías de conglomerados en un estudio inmobiliario. Los valores de Eta cuadrado y los p-values muestran que todas las variables cuantitativas (estrato, precio, área construida, baños, habitaciones, parqueaderos) tienen una relación significativa con los conglomerados, indicando que estas variables son útiles para diferenciar entre los grupos.
Cada conglomerado tiene su propia descripción basada en las variables cuantitativas:
Cluster 1: Valores negativos significan que las propiedades en este cluster tienden a tener menos habitaciones, área construida, estrato, parqueaderos, precio, y baños comparado con la media general.
Cluster 2: Predominan los valores positivos en estrato, baños, precio y parqueaderos, indicando que las propiedades en este grupo tienden a ser más caras y de mayor estrato.
Cluster 3: Altos valores en habitaciones, baños y área construida, lo que sugiere que las propiedades en este grupo son más grandes, aunque con estratos más bajos.
Cluster 4: Este cluster está marcado por altos valores en precio, parqueaderos, área construida, y baños, lo que sugiere propiedades de lujo o de alta gama.
En general, cada cluster refleja diferentes características del mercado inmobiliario, lo que permite una segmentación efectiva de los datos.
En esta sección, el objetivo es reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables numéricas mediante el análisis de componentes principales. Esto permitirá identificar las características clave que influyen en la variación de precios y la oferta del mercado.
Se procederá a preparar el conjunto de datos, incluyendo únicamente las variables numéricas y aquellas de interés.
correspondencia <- vivienda[, c(2, 4)]
head(correspondencia)
## # A tibble: 6 × 2
## zona estrato
## <chr> <dbl>
## 1 Zona Oriente 3
## 2 Zona Oriente 3
## 3 Zona Oriente 3
## 4 Zona Sur 4
## 5 Zona Norte 5
## 6 Zona Norte 5
Para evitar sesgos causados por variables con escalas más grandes, el método prcomp normaliza cada variable antes de proceder a la estimación de los componentes principales. Este centrado previo asegura que todas las variables contribuyan equitativamente al análisis.
correspondencia$estrato <- as.factor(correspondencia$estrato)
glimpse(correspondencia)
## Rows: 8,319
## Columns: 2
## $ zona <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur", "Z…
## $ estrato <fct> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, 3, 3,…
correspondencia %>%
summarise_all(funs(sum(is.na(.)))) %>%
t()
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
##
## # Simple named list: list(mean = mean, median = median)
##
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
##
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## [,1]
## zona 0
## estrato 0
correspondencia$zona[correspondencia$zona=="Zona Centro"] <- "Centro"
correspondencia$zona[correspondencia$zona=="Zona Norte"] <- "Norte"
correspondencia$zona[correspondencia$zona=="Zona Oeste"] <- "Oeste"
correspondencia$zona[correspondencia$zona=="Zona Oriente"] <- "Oriente"
correspondencia$zona[correspondencia$zona=="Zona Sur"] <- "Sur"
head(correspondencia)
## # A tibble: 6 × 2
## zona estrato
## <chr> <fct>
## 1 Oriente 3
## 2 Oriente 3
## 3 Oriente 3
## 4 Sur 4
## 5 Norte 5
## 6 Norte 5
tabla <- table(correspondencia$zona, correspondencia$estrato)
colnames(tabla) <- c("E3", "E4", "E5", "E6")
tabla
##
## E3 E4 E5 E6
## Centro 105 14 4 1
## Norte 572 407 769 172
## Oeste 54 84 290 770
## Oriente 340 8 2 1
## Sur 382 1616 1685 1043
chisq.test(tabla)
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 3830.4, df = 12, p-value < 2.2e-16
Rechazo de la Hipótesis Nula: Dado el valor p extremadamente bajo, podemos rechazar la hipótesis nula, que sostiene que no hay asociación entre las variables en la tabla de contingencia. Esto implica que las variables analizadas están asociadas de manera significativa.
ac <- CA(tabla)
El estrato 3 se encuentra ubicado en la Zona Oriente y en la Zona
Centro. -Los estratos 4 y 5 se encuentran ubicados mayoritariamente en
la Zona Sur y en la Zona Norte. -El estrato 6 se encuentra ubicado en la
Zona Oeste.
summary(ac)
##
## Call:
## CA(X = tabla)
##
## The chi square of independence between the two variables is equal to 3830.435 (p-value = 0 ).
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3
## Variance 0.322 0.127 0.011
## % of var. 69.966 27.680 2.354
## Cumulative % of var. 69.966 97.646 100.000
##
## Rows
## Iner*1000 Dim.1 ctr cos2 Dim.2 ctr cos2
## Centro | 47.079 | 1.725 13.761 0.942 | 0.364 1.547 0.042 |
## Norte | 46.762 | 0.390 10.887 0.750 | -0.147 3.920 0.107 |
## Oeste | 135.034 | -0.569 14.476 0.345 | 0.783 69.204 0.653 |
## Oriente | 184.564 | 2.015 53.171 0.928 | 0.537 9.563 0.066 |
## Sur | 47.004 | -0.209 7.704 0.528 | -0.188 15.767 0.428 |
## Dim.3 ctr cos2
## Centro 0.228 7.148 0.016 |
## Norte -0.170 61.735 0.143 |
## Oeste -0.037 1.820 0.001 |
## Oriente 0.160 10.006 0.006 |
## Sur 0.061 19.291 0.044 |
##
## Columns
## Iner*1000 Dim.1 ctr cos2 Dim.2 ctr cos2
## E3 | 253.402 | 1.187 76.333 0.970 | 0.207 5.851 0.029 |
## E4 | 47.744 | -0.154 1.895 0.128 | -0.380 28.966 0.773 |
## E5 | 25.471 | -0.132 1.796 0.227 | -0.204 10.824 0.542 |
## E6 | 133.827 | -0.519 19.976 0.481 | 0.539 54.359 0.518 |
## Dim.3 ctr cos2
## E3 0.015 0.350 0.000 |
## E4 0.136 43.547 0.099 |
## E5 -0.133 54.323 0.231 |
## E6 0.028 1.780 0.001 |
El CA descompone la matriz de datos en dimensiones latentes, capturando la varianza entre las categorías.
Dimensión 1: Valor propio: 0.322 Varianza explicada: 69.97% Dimensión 2: Valor propio: 0.127 Varianza explicada: 27.68% Dimensión 3: Valor propio: 0.011 Varianza explicada: 2.35% Juntas, las dos primeras dimensiones explican un 97.65% de la variabilidad total. Desde un punto de vista técnico, esto indica que un modelo bidimensional es suficiente para capturar la estructura subyacente en los datos, lo cual es eficiente y reduce la complejidad del análisis.