```{r knitr::opts_chunk$set(echo = TRUE)


### Se cargar las librerias



### Se cargan los datos

``` r
data(vivienda)

Se genera un resumen descriptivo

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.

Se filtan los datos para identicar los datos nulos que mas se repite en la fila

# 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

Se ilimina la filas nulos

vivienda <- vivienda %>%
  filter(!is.na(id))

Se grafica los valores faltantes de cada variable

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.

Se filtra la variable zona

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.

Se filtra la variable piso

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.

Se filtra la variable tipo

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.

Se filtran los cinco primeros pisos

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

Se identifcan los 5 barrios con mas viviendas en venta

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.

Variable precion

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.

Se ajustan los valores faltante con la regresion lineal de la variable Parqueadero y adicionalmente se convirten los datos a enteros

# 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

Redondeamos para que todos los valores de parqueaderos queden en valores enteros.

vivienda$parqueaderos <- round(vivienda$parqueaderos)

Lo anterior se realiza para tener numero enteros

Estadisticas Descriptivas de los datos

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

Se elimina la variable piso, longitud y latitud, dado que esta variables son significabas para el modelo.

vivienda_limpia <- vivienda[, !(names(vivienda) %in% c("longitud", "latitud", "piso"))]

Se elimina las variables

Variables escaladas

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

Se procede a realizar la estimación de los componentes comunes.

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
)

ANÁLISIS DE CONGLOMERADOS

# 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.

ANÁLISIS DE CORRESPONDENCIAS

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.

Transformar la variable estrato de categórica a numérica

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,…

Verificar datos faltantes en el conjunto correspondencia

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

Acortar los nombres de los valores de las variables

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

Se construye una tabla de referencia cruzada con las variables de interés para este análisis

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

Hipótesis de independencia entre las variables Apto y Casa

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.

Análisis de correspondencia

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.