Introducción

En este documento se presentan los procedimientos, métodos y resultados de la evaluación de la oferta inmobiliaria urbana de una gran ciudad, se busca comprender en profundidad el mercado de unidades residenciales urbanas para que los directivos de una empresa inmobiliaria puedan tomar decisiones estratégicas informadas. Se dispone de una base de datos extensa que contiene información detallada sobre diversas propiedades residenciales disponibles en el mercado. Los directivos de la empresa inmobiliaria necesitan realizar un análisis holístico de estos datos donde se identifique patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades.

Este informe consta de las siguientes partes: se inicia con una etapa de entendimiento de los datos donde se explora el dataset dispolnible para conocer su tamaño y el tipo de variables que contiene; después se procede a una etapa de preparación de los datos para intentar solventar algunas falencias identificadas en el entendimiento como faltantes, datos atípicos y estandarización de valores y variables; se continua con un Análisis de Componentes Principales (ACP) con el objetivo de reducir la dimensionalidad del conjunto de datos; también se realiza un Análisis de Conglomerados que busca agrupar las propiedades residenciales en segmentos homogéneos; por último, se realiza un Análisis de Correspondencia para examinar la relación existente entre las variables categóricas del conjunto de datos. En todo el dcumento se incluyen gráficas, tablas y otros recursos visuales para presentar los hallazgos y las conclusiones de manera clara y efectiva a los directivos de la empresa y a los tomadores de decisiones interesados en el mercado inmobiliario.

1. Entendimiento de los datos

Se inicia explorando el conjunto de datos para conocer su tamaño y el tipo de variables que contiene, determinar si las variables tienen los registros completos y si hay presencia de datos atípicos; es importante familiarizarse con el tipo de datos; también se realizan tablas y gráficos para resumir las principales variables con medidas estadísticas básicas. Se destaca que en esta parte no se realiza ninguna modificación sobre el conjunto de datos.

Se cargan los paquetes y librerías necesarias.

#install.packages("devtools")

Se cargan los datos de interés.

## Rows: 8,322
## Columns: 13
## $ id           <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona         <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso         <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato      <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom      <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst    <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios       <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo         <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio       <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud     <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud      <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…

El conjunto de datos está compuesto por 13 variables y 8.322 registros. Las variables zona, piso, tipo de vivienda y barrio son de tipo categórico; las variables id, estrato, preciom, areaconst, parqueaderos, banios, habitaciones, longitud y latitud son de tipo numérico.

Por no aportar ningún valor a este estudio se elimina la variable id del conjunto de datos, quedando 12 variables para el análisis.

data <- data[, -1]

Datos Faltantes

En muy importante conocer los faltantes en el conjunto de datos disponible:

data %>% 
  summarise_all(funs(sum(is.na(.)))) %>% 
  t()
##              [,1]
## zona            3
## piso         2638
## estrato         3
## preciom         2
## areaconst       3
## parqueaderos 1605
## banios          3
## habitaciones    3
## tipo            3
## barrio          3
## longitud        3
## latitud         3

Como se observa, los registros están completos a excepción de las variables piso, con 2.638 y parqueaderos, con 1.605 datos faltantes.

Aunque son variables de tipo numérico, los ceros reportados en habitaciones y banios necesitan alguna transformación, no es coherente que un inmueble no cuente por lo menos con una habitación o con un baño.

Tabla de Frecuencias para la Variable HABITACIONES

table(data$habitaciones, useNA="always")
## 
##    0    1    2    3    4    5    6    7    8    9   10 <NA> 
##   66   59  926 4097 1729  679  318  173  138   83   51    3

Tabla de Frecuencias para la Variable BANIOS

table(data$banios, useNA="always")
## 
##    0    1    2    3    4    5    6    7    8    9   10 <NA> 
##   45  496 2946 1993 1456  890  314  107   48   15    9    3

Resumen de las Variables Categóricas

Tabla de Frecuencias para la Variable ZONA

table(data$zona, useNA="always")
## 
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur         <NA> 
##          124         1920         1198          351         4726            3

Tabla de Frecuencias para la Variable PISO

table(data$piso, useNA="always")
## 
##   01   02   03   04   05   06   07   08   09   10   11   12 <NA> 
##  860 1450 1097  607  567  245  204  211  146  130   84   83 2638

Tabla de Frecuencias para la Variable TIPO DE VIVIENDA

table(data$tipo, useNA="always")
## 
## Apartamento        Casa        <NA> 
##        5100        3219           3

Tabla de Frecuencias para la Variable BARRIO

barrio <- table(data$barrio, useNA="always")

¿Cuántos barrios hay en el conjunto de datos?

length(barrio)
## [1] 437

De las cuatro variables de tipo categórico zona, piso y tipo de vivienda están bien definidas, se podría realizar un proceso de imputación basado en la moda de las variables zona y tipo de vivienda. La variable barrio no se encuentra bien definida y hay 437 valores diferentes inluyendo el NA, hay varios valores únicos que son parecidos, por esta razón es muy complejo utilizar el barrio para apoyar el análisis.

Aunque las variables estrato y parqueaderos son de tipo numérico, inicialmente conviene resumirlas en una tabla de frecuencias:

Tabla de Frecuencias para la Variable ESTRATO

table(data$estrato, useNA="always")
## 
##    3    4    5    6 <NA> 
## 1453 2129 2750 1987    3

Tabla de Frecuencias para la Varible PARQUEADEROS

table(data$parqueaderos, useNA="always")
## 
##    1    2    3    4    5    6    7    8    9   10 <NA> 
## 3155 2475  520  384   68   68   18   17    4    8 1605

Resumen de las Variables Numéricas

Estadísticas de la variable PRECIOM

summary(data$preciom)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    58.0   220.0   330.0   433.9   540.0  1999.0       2
breaks=c(0, 500, 1000, 1500, 2000)
preciom2=cut(data$preciom, breaks)
summarytools::freq(preciom2)
## Frequencies  
## preciom2  
## Type: Factor  
## 
##                         Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## --------------------- ------ --------- -------------- --------- --------------
##               (0,500]   6062    72.861         72.861    72.843         72.843
##           (500,1e+03]   1705    20.493         93.353    20.488         93.331
##       (1e+03,1.5e+03]    421     5.060         98.413     5.059         98.390
##       (1.5e+03,2e+03]    132     1.587        100.000     1.586         99.976
##                  <NA>      2                              0.024        100.000
##                 Total   8322   100.000        100.000   100.000        100.000

Estadísticas de la variable AREACONS

summary(data$areaconst)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    30.0    80.0   123.0   174.9   229.0  1745.0       3
breaks=c(0, 300, 600, 900, 1200, 1500, 1800)
area=cut(data$areaconst, breaks)
summarytools::freq(area)
## Frequencies  
## area  
## Type: Factor  
## 
##                           Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------------------- ------ --------- -------------- --------- --------------
##                 (0,300]   7150    85.948         85.948    85.917         85.917
##               (300,600]   1039    12.489         98.437    12.485         98.402
##               (600,900]     97     1.166         99.603     1.166         99.567
##           (900,1.2e+03]     25     0.301         99.904     0.300         99.868
##       (1.2e+03,1.5e+03]      5     0.060         99.964     0.060         99.928
##       (1.5e+03,1.8e+03]      3     0.036        100.000     0.036         99.964
##                    <NA>      3                              0.036        100.000
##                   Total   8322   100.000        100.000   100.000        100.000

2. Preparación de los datos

Se realiza para solventar algunas falencias identificadas en el entendimiento de los datos, como faltantes, atípicos y estandarización de algunos registros y variables.

Tratamiento de los datos faltantes

Dado que la presencia de datos faltantes en las variables piso y parqueaderos es notablemente alta, con el 31,7% y el 19,3% respectivamente, no se ve conveniente realizar algún proceso de imputación para completar los registros porque se alterarían las observaciones y las conclusiones a las que se pueda llegar no serían confiables. Entonces, para no eliminar una proporción importante de los registros del conjunto de datos se decide eliminar el total de las columnas piso y prqueaderos y por no estar lo suficientemente estandarizada tambien se elimina la columna barrio.

Elimininar columnas incompletas y no estandarizadas

data1 <- data[, -c(2, 6, 10)]
head(data1)
## # A tibble: 6 × 9
##   zona      estrato preciom areaconst banios habitaciones tipo  longitud latitud
##   <chr>       <dbl>   <dbl>     <dbl>  <dbl>        <dbl> <chr>    <dbl>   <dbl>
## 1 Zona Ori…       3     250        70      3            6 Casa     -76.5    3.43
## 2 Zona Ori…       3     320       120      2            3 Casa     -76.5    3.43
## 3 Zona Ori…       3     350       220      2            4 Casa     -76.5    3.44
## 4 Zona Sur        4     400       280      5            3 Casa     -76.5    3.44
## 5 Zona Nor…       5     260        90      2            3 Apar…    -76.5    3.46
## 6 Zona Nor…       5     240        87      3            3 Apar…    -76.5    3.37

Verificar datos faltantes en el conjunto data1

data1 <- na.omit(data1)
data1 %>% 
  summarise_all(funs(sum(is.na(.)))) %>% 
  t()
##              [,1]
## zona            0
## estrato         0
## preciom         0
## areaconst       0
## banios          0
## habitaciones    0
## tipo            0
## longitud        0
## latitud         0
dim(data1)
## [1] 8319    9

Al eliminar las columnas piso, parqueaderos y barrio y los pocos registros faltantes (3 en cada una) de las otras variables, queda por ajustar los registros con cero baños que se cambian por la moda de la distribución y se interpreta que los registros con cero habitaciones son apartaesetudios tipo loft (un solo ambiente). De esta forma, el tamaño del conjunto de datos es de 9 variables por 8.319 registros.

Cambiar los registros con cero baños por la moda (2 baños)

data1$banios[data1$banios == 0] <- 2

Resumen estadístico del conjunto de datos depurado

summary(data1)
##      zona              estrato         preciom         areaconst     
##  Length:8319        Min.   :3.000   Min.   :  58.0   Min.   :  30.0  
##  Class :character   1st Qu.:4.000   1st Qu.: 220.0   1st Qu.:  80.0  
##  Mode  :character   Median :5.000   Median : 330.0   Median : 123.0  
##                     Mean   :4.634   Mean   : 433.9   Mean   : 174.9  
##                     3rd Qu.:5.000   3rd Qu.: 540.0   3rd Qu.: 229.0  
##                     Max.   :6.000   Max.   :1999.0   Max.   :1745.0  
##      banios        habitaciones        tipo              longitud     
##  Min.   : 1.000   Min.   : 0.000   Length:8319        Min.   :-76.59  
##  1st Qu.: 2.000   1st Qu.: 3.000   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Median : 3.000   Mode  :character   Median :-76.53  
##  Mean   : 3.122   Mean   : 3.605                      Mean   :-76.53  
##  3rd Qu.: 4.000   3rd Qu.: 4.000                      3rd Qu.:-76.52  
##  Max.   :10.000   Max.   :10.000                      Max.   :-76.46  
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498

3. Análisis de Componentes Principales (ACP)

En esta parte se busca reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables numéricas en componentes principales para identificar características clave que influyan en la variación de precios y oferta del mercado.

Preparar el conjunto de datos con solo las variables numéricas y las de interés

Por ser de tipo categórico se eliminan las variables zona y tipo, y por no aportar al análisis también se eliminan las variables talitud y longitud.

dataPCA <- data1[, -c(1, 7, 8, 9)]
head(dataPCA)
## # A tibble: 6 × 5
##   estrato preciom areaconst banios habitaciones
##     <dbl>   <dbl>     <dbl>  <dbl>        <dbl>
## 1       3     250        70      3            6
## 2       3     320       120      2            3
## 3       3     350       220      2            4
## 4       4     400       280      5            3
## 5       5     260        90      2            3
## 6       5     240        87      3            3

Estimación de los componentes principales

Con el fin de evitar que las variables que tienen una escala con valores más grandes afecten las estimaciones realizadas (sesgos), prcomp centra cada variable como paso previo al proceso de estimación de los componentes principales.

vivienda_PCA <- prcomp(dataPCA, scale=TRUE)
names(vivienda_PCA)
## [1] "sdev"     "rotation" "center"   "scale"    "x"

Las medias, previa la normalización de las variables (en la escala original) son:

vivienda_PCA$center
##      estrato      preciom    areaconst       banios habitaciones 
##     4.633610   433.904436   174.934938     3.122130     3.605361

Las desviaciones, previa la normalización de las variables (en la escala original) son:

vivienda_PCA$scale
##      estrato      preciom    areaconst       banios habitaciones 
##     1.029222   328.665025   142.964126     1.412083     1.459537

El elemento rotation almacenado en el objeto vivienda_PCA contiene el valor de las cargas para cada componente (eigenvector).

vivienda_PCA$rotation
##                    PC1        PC2        PC3        PC4        PC5
## estrato      0.3294370 -0.6743334  0.4372443 -0.4595551  0.1853975
## preciom      0.5070293 -0.2777198 -0.2987254  0.1901997 -0.7351056
## areaconst    0.4947207  0.1684491 -0.6444239 -0.3216029  0.4562518
## banios       0.5206248  0.1038611  0.3384971  0.6882647  0.3603806
## habitaciones 0.3443745  0.6549686  0.4355665 -0.4189230 -0.2953094

En la siguiente matriz se calcula el valor de las componentes principales para cada observación (principal component scores) multiplicando los datos por los vectores de carga:

head(vivienda_PCA$x)
##             PC1        PC2        PC3         PC4         PC5
## [1,] -0.6497408  2.1676916  0.6315001  0.11219953 -0.73350473
## [2,] -1.4452657  0.7476504 -0.7925013  0.41389497 -0.37872036
## [3,] -0.8169917  1.2888777 -0.9720997 -0.08072210 -0.32901318
## [4,]  0.6579840  0.4340404 -0.4424545  1.11599091  0.89873768
## [5,] -1.0014740 -0.5473727  0.2469204 -0.44635566  0.02000406
## [6,] -0.6740165 -0.4604560  0.5183360  0.03622974  0.31037478

El tamaño de la matriz resultante es igual a la de entrada, o sea, 8.319 registros por 5 variables.

dim(vivienda_PCA$x)
## [1] 8319    5

Elección del número de compotentes principales

¿Cuántos componentes elegir?

Si el objetivo es reducir la dimensión de los datos, se debe decidir cuántos componentes principales seleccionar. El plnateamiento más frecuente es utilizar una regla ad hoc para seleccionar los componentes que explican la mayor parte de la viarianza. Se puede hacer esto a través de un diagrama de barras. Opcionalmente, se puede seleccionar los componentes superiores de manera que la varianza acumulada exceda un umbral, por ejmplo el 80%. Además, se puede inspeccionar las cargas para determinar si el compoente tiene una interpretación intuitiva.

P. Bruce, A. Bruce, P. Gedeck. Estadística práctica para ciencia de datos con R y Python. Pág. 285.

Entonces, el objetivo principal del ACP es poder ver si los dos o tres primeros componentes explican la mayor parte de la variación de las variables iniciales. Si es así, se pueden considerar estos dos componentes, reduciendo la dimensión de los datos a \(R^2\) y considerar su representación gráfica en el plano cartesiano.

fviz_eig(vivienda_PCA, addlabels = TRUE)

En este caso el primer componente principal explica el 58,9% de la variabilidad contenida en el conjunto de datos de entrada y entre los dos primeros se supera el 80% (82,6%), 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.

Gráfico de correlaciones de variables

fviz_pca_var(vivienda_PCA, col.var = "black")

El gráfico anterior muestra las relaciones entre todas las variables y permite identificar el sentido y la caracterización de los componentes, en el caso de las viviendas es de esperar que el área de un inmueble tenga una correlación directa fuerte con el número de baños y de habitaciones que tenga, es decir, a mayor número de habitaciones y de baños se espera una mayor área de la vivienda; de la misma forma, el precio de un inmuble dependerá en buena medida del estrato socioeconómico donde se ubique.

Representación gráfica de los dos primeros componentes

fviz_pca_biplot(vivienda_PCA, repel = TRUE, habillage = data1$tipo, col.var = "#034A94", col.ind = c("#DEDEDE", "#034A94"))

La representación gráfica de los dos primeros componetes principales permite observar la relación existente entre las variables.

Conclusión de Análisis de Componentes Princiaples

En este caso el primer componente principal explica el 58,9% de la variabilidad contenida en el conjunto de datos de entrada y entre los dos primeros se supera el 80% (82,6%), lo cual indicaría que con solo una variable (CP1) que se obtiene mediante una combinación lineal de las variables disponibles se puede resumir gran parte de la variabilidad que contiene la base de datos.

En este caso, es de esperar que el área de un inmueble tenga una correlación directa fuerte con el número de baños y de habitaciones que incluya, es decir, a mayor número de habitaciones y de baños se espera una mayor área de la vivienda; de la misma forma, el precio de un inmuble dependerá en buena medida del estrato socioeconómico donde se ubique.

4. Análisis de conglomerados

Este análsis se realiza para agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes partes de la ciudad y en diferentes estratos socioeconómicos.

Para este punto se utiliza las variables estrato, preciom y areaconst.

conglo <- data1[, c(2, 3, 4)]
head(conglo)
## # A tibble: 6 × 3
##   estrato preciom areaconst
##     <dbl>   <dbl>     <dbl>
## 1       3     250        70
## 2       3     320       120
## 3       3     350       220
## 4       4     400       280
## 5       5     260        90
## 6       5     240        87

Dado que los rangos de las variables de interés son diferentes y con el fin de que estas diferencias en las dimensiones de las variables no afecten los cálculos de las distancias se estandariza las variables.

conglo_z <- scale(conglo)
conglo_z <- as.data.frame(conglo_z)
head(conglo_z)
##      estrato    preciom  areaconst
## 1 -1.5872276 -0.5595498 -0.7339949
## 2 -1.5872276 -0.3465670 -0.3842568
## 3 -1.5872276 -0.2552886  0.3152194
## 4 -0.6156201 -0.1031580  0.7349051
## 5  0.3559875 -0.5291236 -0.5940997
## 6  0.3559875 -0.5899759 -0.6150839

Distancias euclidianas corresppondientes a los valores estandarizados

dist_conglo <- dist(conglo_z, method = "euclidean")

Cluster jerárquico con el método comlete

hc_conglo <- hclust(dist_conglo, method = "complete")

Determinar a qué cluster pertence cada observación

clu_assigments <- cutree(hc_conglo, k=3)

Asignación de los clusters

asignacion <- conglo_z %>% mutate(cluster = as.factor(clu_assigments))

Graficar los puntos

ggplot(asignacion, aes(x = preciom, y = areaconst, color = cluster)) +
geom_point(size = 3) +
geom_text(aes(label = cluster), vjust = -0.8) +
theme_classic()

Graficar el dendograma

plot(hc_conglo, cex = 0.6, main = "Dendograma de Inmuebles", las = 1,
ylab = "Distancia Euclidiana", xlab = "Grupos")
rect.hclust(hc_conglo, k = 2, border = 2:5)

Clasificar los inmuebles

dendograma <- hclust(dist_conglo, method = "average")
grupo = cutree(dendograma, k = 3)
table(grupo)
## grupo
##    1    2    3 
## 8226   86    7

Definir el número de conglomerados

barplot(sort(dendograma$height, decreasing = TRUE), horiz = TRUE,
main = "Agregaciones (distancias euclidianas)",
col = "blue", ylab = "Nodo", xlab = "Peso", xlim = c(0, 5))

*Calcular el coeficiente de Silhouette**

library(cluster)
sil <- silhouette(clu_assigments, dist(conglo_z))
prom_sil <- mean(sil[,3])
cat("Promedio del Coeficiente de Silhouette para k=3: ", prom_sil)
## Promedio del Coeficiente de Silhouette para k=3:  0.5096536

Coclusión del Análisis de Conglomerados

Al tener en cuenta las variables estrato, preciom y areaconst se esperaría observar unas agrupaciones más definidas, porque el precio de un inmueble está muy relacionada con su área y con su ubicación, pero esto no se logra en los resultados de este Análisis de Conglomerados, realizando varios grupos k, los resultados no mejoran y se observa que los datos se concentran en un solo grupo. Entonces, para el conjunto de datos, teniendo en cuenta los registros de casas y apartamentos con las 3 variables mencionadas, no fue posible formar estadísticamente agrupaciones acordes a la realidad.

5. Análisis de correspondecia

Para poder realizar un análisis gráfico con esta técnica, es necesario que las variables que se use tengan más de 2 categorías, por tal razón no se puede utilizar directamente la variable tipo. Entonces, para examinar e identificar patrones de comportamiento en el mercado inmobiliario se utilizan las variables estrato y zona.

De esta forma, se toman los 8.319 registros del conjunto de datos preparado para el punto de Análisis de Componentes Princiales, a su vez, dicho conjunto de datos se tomó de la base de datos de vivienda contenida en el paqueteMET.

correspondencia <- data1[, c(1, 2)]
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

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()
##         [,1]
## zona       0
## estrato    0

Acortar los nombres de los valores de las variables

En la variable zona se deja solo la ubicación y en la variable tipo se cambia el valor Apartamento por Apto.

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

Por el resultado obtenido (p-value = 0.0000) se rechaza la hipótesis nula indicando que existe algún tipo de relación entre las dos variables.

Análisis de correspondencia

Ahora se preocede a realizar el análisis de correspondecia que consiste en estimar las coordenadas para cada uno de los niveles de las dos variables y representarlas en un plano cartesiano.

ac <- CA(tabla)

Coclusión del Análisis de Correspondencia

A través de los resultados y los gráficos del Análisis de Correspondencia es posible establecer las siguientes relaciones:

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

También es conveniente revisar los resultados numéricos del Análisis de Correspondencia:

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 |

Dado que la tabla de referencia cruzada con las variables utilizadas para este Análisis de Correspondencia es de cinco categorías en las filas (Centro, Norte, Oeste, Oriente y Sur) y de cuatro categorías en las columenas (Estrato 3, Estrato 4, Estrato 5 y Estrato 6) el número de dimensiones resultante corresponde al menor número de filas y columnas, o sea, 3 dimensiones. Como se observa en la primera tabla del resumen estadístico anterior, la primera dimensión explica el 69.9% de la variablidad y entre la primera y la segunda el 97,6% y, se concluye que con las dos primeras dimensiones es suficiente para explicar las afinidades.

En el resumen estadístico del Análisis de Correspondencia para cada atributo (fila y columna) se presentan las inercias de cada nivel del atributo, y para cada dimensión su coordenada y dos medidas más: la contribución a esa coordenada concreta y la medida de calidad cos2 (coseno cuadrado, coordenadas cuadradas).