La evaluación de la oferta inmobiliaria urbana se ha convertido en una prioridad estratégica para las empresas del sector, especialmente en grandes ciudades donde el dinamismo del mercado y la diversidad de opciones generan desafíos únicos. En este contexto, una empresa inmobiliaria líder busca profundizar su comprensión del mercado de viviendas urbanas para tomar decisiones informadas y estratégicas. Para ello, dispone de una base de datos exhaustiva que recoge información detallada sobre diversas propiedades residenciales disponibles en la ciudad de Cali.
El objetivo principal de este análisis es identificar patrones, relaciones y segmentaciones relevantes dentro del mercado, con el fin de optimizar la compra, venta y valoración de propiedades. A través de un análisis integral y multidimensional de los datos, se espera proporcionar una visión holística del mercado inmobiliario, facilitando así la toma de decisiones estratégicas. Este informe presentará un análisis detallado utilizando diversas técnicas de análisis de datos, como Análisis de Componentes Principales, Análisis de Conglomerados y Análisis de Correspondencia, así como visualizaciones de los resultados obtenidos.
Los hallazgos y recomendaciones que se deriven de este estudio proporcionarán a la empresa una ventaja competitiva en un entorno dinámico y en constante evolución, permitiéndole optimizar sus inversiones y maximizar los beneficios.
Realizar un análisis integral de la oferta inmobiliaria urbana para identificar patrones, relaciones y segmentaciones clave en el mercado de propiedades residenciales en la ciudad de Cali.
Para llevar a cabo el análisis de los datos, se empleó el software estadístico R en su versión 4.3.2, siguiendo los siguientes pasos:
Analisis exploratorio de datos(EDA): Se realizó un análisis exploratorio exhaustivo de las variables en la base de datos. Este análisis permitió una caracterización detallada de cada variable y la identificación de problemas de calidad, como la parametrización inadecuada, valores no estandarizados, valores atípicos y valores faltantes. Se utilizaron gráficos y estadísticas descriptivas para obtener una visión preliminar y completa del conjunto de datos.
Preparación de los datos: Se llevó a cabo una limpieza y transformación de datos para asegurar su calidad y fiabilidad. De esta manera, se garantizó que el conjunto de datos estuviera listo para un análisis preciso.
Análisis integral y multidimensional: Con los datos preparados, se procedió a un análisis integral utilizando varias técnicas. Se empleó el Análisis de Componentes Principales (PCA) para reducir la dimensionalidad del conjunto de datos y visualizar las variables principales que afectan la variación de precios y la oferta del mercado. Se realizó un análisis de agrupamiento para segmentar las propiedades en grupos homogéneos, facilitando la comprensión de las dinámicas de oferta en distintas áreas y estratos socioeconómicos. Finalmente, se llevó a cabo un Análisis de Correspondencia para explorar las relaciones entre variables categóricas como tipo de vivienda, zona y estrato, identificando patrones en la oferta del mercado inmobiliario.
La importación de los datos se obtuvo mediante el siguiente repositorio:
devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
library(paqueteMODELOS)
data(vivenda)
La base de datos vivienda presenta la siguiente estructura:
st_options(
dfSummary.custom.2 =
expression(
paste(
"Q1 - Q3 :",
round(
quantile(column_data, probs = .25, type = 2,
names = FALSE, na.rm = TRUE), digits = 1
), " - ",
round(
quantile(column_data, probs = .75, type = 2,
names = FALSE, na.rm = TRUE), digits = 1
)
)
)
)
dfSummary(vivienda,
valid.col = FALSE,
style = "grid",
plain.ascii = FALSE,
headings = FALSE,
graph.magnif = 0.75,
tmp.img.dir = "/tmp"
)
| No | Variable | Stats / Values | Freqs (% of Valid) | Graph | Missing |
|---|---|---|---|---|---|
| 1 | id [numeric] |
Mean (sd) : 4160 (2401.6) min < med < max: 1 < 4160 < 8319 IQR (CV) : 4159 (0.6) Q1 - Q3 : 2080 - 6240 |
8319 distinct values | 3 (0.0%) |
|
| 2 | zona [character] |
1. Zona Centro 2. Zona Norte 3. Zona Oeste 4. Zona Oriente 5. Zona Sur |
124 ( 1.5%) 1920 (23.1%) 1198 (14.4%) 351 ( 4.2%) 4726 (56.8%) |
3 (0.0%) |
|
| 3 | piso [character] |
1. 02 2. 03 3. 01 4. 04 5. 05 6. 06 7. 08 8. 07 9. 09 10. 10 [ 2 others ] |
1450 (25.5%) 1097 (19.3%) 860 (15.1%) 607 (10.7%) 567 (10.0%) 245 ( 4.3%) 211 ( 3.7%) 204 ( 3.6%) 146 ( 2.6%) 130 ( 2.3%) 167 ( 2.9%) |
2638 (31.7%) |
|
| 4 | estrato [numeric] |
Mean (sd) : 4.6 (1) min < med < max: 3 < 5 < 6 IQR (CV) : 1 (0.2) Q1 - Q3 : 4 - 5 |
3 : 1453 (17.5%) 4 : 2129 (25.6%) 5 : 2750 (33.1%) 6 : 1987 (23.9%) |
3 (0.0%) |
|
| 5 | preciom [numeric] |
Mean (sd) : 433.9 (328.6) min < med < max: 58 < 330 < 1999 IQR (CV) : 320 (0.8) Q1 - Q3 : 220 - 540 |
539 distinct values | 2 (0.0%) |
|
| 6 | areaconst [numeric] |
Mean (sd) : 174.9 (143) min < med < max: 30 < 123 < 1745 IQR (CV) : 149 (0.8) Q1 - Q3 : 80 - 229 |
652 distinct values | 3 (0.0%) |
|
| 7 | parqueaderos [numeric] |
Mean (sd) : 1.8 (1.1) min < med < max: 1 < 2 < 10 IQR (CV) : 1 (0.6) Q1 - Q3 : 1 - 2 |
1 : 3155 (47.0%) 2 : 2475 (36.8%) 3 : 520 ( 7.7%) 4 : 384 ( 5.7%) 5 : 68 ( 1.0%) 6 : 68 ( 1.0%) 7 : 18 ( 0.3%) 8 : 17 ( 0.3%) 9 : 4 ( 0.1%) 10 : 8 ( 0.1%) |
1605 (19.3%) |
|
| 8 | banios [numeric] |
Mean (sd) : 3.1 (1.4) min < med < max: 0 < 3 < 10 IQR (CV) : 2 (0.5) Q1 - Q3 : 2 - 4 |
11 distinct values | 3 (0.0%) |
|
| 9 | habitaciones [numeric] |
Mean (sd) : 3.6 (1.5) min < med < max: 0 < 3 < 10 IQR (CV) : 1 (0.4) Q1 - Q3 : 3 - 4 |
11 distinct values | 3 (0.0%) |
|
| 10 | tipo [character] |
1. Apartamento 2. Casa |
5100 (61.3%) 3219 (38.7%) |
3 (0.0%) |
|
| 11 | barrio [character] |
1. valle del lili 2. ciudad jardín 3. pance 4. la flora 5. santa teresita 6. el caney 7. el ingenio 8. la hacienda 9. acopi 10. los cristales [ 426 others ] |
1008 (12.1%) 516 ( 6.2%) 409 ( 4.9%) 366 ( 4.4%) 262 ( 3.1%) 208 ( 2.5%) 202 ( 2.4%) 164 ( 2.0%) 158 ( 1.9%) 154 ( 1.9%) 4872 (58.6%) |
3 (0.0%) |
|
| 12 | longitud [numeric] |
Mean (sd) : -76.5 (0) min < med < max: -76.6 < -76.5 < -76.5 IQR (CV) : 0 (0) Q1 - Q3 : -76.5 - -76.5 |
2928 distinct values | 3 (0.0%) |
|
| 13 | latitud [numeric] |
Mean (sd) : 3.4 (0) min < med < max: 3.3 < 3.4 < 3.5 IQR (CV) : 0.1 (0) Q1 - Q3 : 3.4 - 3.5 |
3679 distinct values | 3 (0.0%) |
De acuerdo con el resumen estadístico anterior, se observa que la base de datos contiene 8,322 registros (filas) y 13 variables (columnas). La caracterización de la base de datos es la siguiente:
a. Id: Variable de identificación.
b. Zona: Variable cualitativa nominal.
c. Piso: Variable cuantitativa discreta; sin embargo, en el conjunto de datos está representada como una variable categórica.
d. Estrato: Variable cualitativa ordinal; sin embargo, en el conjunto de datos está representada como una variable numérica.
e. Precio (millones): Variable cuantitativa continua.
f. Área construida: Variable cuantitativa continua.
g. Parqueaderos: Variable cuantitativa discreta.
h. Baños: Variable cuantitativa discreta.
i. Habitaciónes: Variable cuantitativa discreta.
j. Tipo: Variable cualitativa nominal.
k. Barrio: Variable cualitativa nominal.
l. Longitud y Latitud: Variables cuantitativas continuas.
Por otro lado, se verificó gráficamente la presencia de valores atípicos en las variables numericas. Esta evaluación visual permite identificar observaciones que se desvían significativamente del patrón general de los datos, lo que puede afectar la calidad del análisis general.
vivienda_num = vivienda[,c(5,6,7,8,9,12,13)]
par(mfrow = c(3, 3))
par(mar = c(1, 3, 2, 1))
for (i in seq_along(vivienda_num)) {
boxplot(vivienda_num[[i]], main = colnames(vivienda_num)[i],
col = "lightblue", las = 2, cex.axis = 0.8)
}
Se identificó que la mayoría de las variables numéricas presentan
valores atípicos, con la excepción de la variable latitud. Esto
se debe a que, dado que la base de datos corresponde a viviendas en la
ciudad de Cali, se espera que los registros de latitud se
encuentren en un rango muy restringido. Entre las variables,
precio y área construida exhiben la mayor cantidad de
valores atípicos, lo que sugiere que estos datos pueden tener una amplia
variabilidad. En contraste, las variables parqueaderos,
baños y habitaciones presentan una menor cantidad de
valores atípicos, indicando una distribución más homogénea en estas
características.
Finalmente, se verificó la ausencia de redundancia en el conjunto de datos. Para ello, se construyó una matriz de correlación para las variables numéricas.
matriz_cor = cor(vivienda_num, use = "complete.obs")
corrplot(matriz_cor, method = "circle", type = "lower", title = "Matriz de correlación", diag = TRUE, number.cex = 0.6, number.digits = 2, addCoef.col = "gray4", mar = c(0,0,2,0))
Como se observa, las correlaciones mas altas estan asociadas con la
varible precio, que muestra las relaciones más fuertes con
área contruida, parqueaderos y baños. Sin
embargo, los coeficientes de correlación no superan el 69%, lo que
indica una asociación débil.
Como resultado de este análisis exploratorio, se llevaron a cabo los siguientes pasos para solucionar los problemas de calidad detectados en el conjunto de datos.
- Modificación de tipo de variable: Se cambió el tipo de la variable piso a numérico y se verificó su correcta actualización.
vivienda$piso = as.numeric(vivienda$piso)
vivienda$estrato = as.character(vivienda$estrato)
kable(sapply(vivienda,class))
| x | |
|---|---|
| id | numeric |
| zona | character |
| piso | numeric |
| estrato | character |
| preciom | numeric |
| areaconst | numeric |
| parqueaderos | numeric |
| banios | numeric |
| habitaciones | numeric |
| tipo | character |
| barrio | character |
| longitud | numeric |
| latitud | numeric |
- Limpieza e imputación de registros con datos faltantes: Se corroboraron los datos faltantes previamente identificados en la base de datos.
faltantes = md.pattern(vivienda, rotate.names = TRUE)
Con lo anterior, se identificaron 3 registros que no contenían ningún tipo de información. Por lo tanto, se llevó a cabo un proceso de limpieza para eliminar estas filas.
# Eliminacion de filas con Id vacio
vivienda = vivienda[!is.na(vivienda$id),]
faltantes = md.pattern(vivienda, rotate.names = TRUE)
Para los registros restantes, se realizó la imputación de los datos faltantes en las variables de parqueaderos y pisos utilizando la mediana, debido a las asimetrías observadas en estas variables. Dado que la imputación no se puede generalizar fácilmente debido a las complejas interacciones con otras variables, como zona, estrato y tipo de apartamento, se creó una tabla de agrupación para relacionar estos datos y asegurar una imputación más precisa.
#Analisis por agrupamiento
Analisis = vivienda %>%
group_by(zona, estrato, tipo) %>%
summarise(
parqueaderos = round(median(parqueaderos, na.rm = TRUE), digits = 0),
Piso = round(median(piso, na.rm = TRUE), digits = 0)
)
datatable(Analisis, list(pageLength=10))
A partir de este análisis, se procedió a imputar los datos faltantes. Este enfoque permitió rellenar la mayoría de los valores faltantes. Sin embargo, quedaron 4 registros que no pudieron ser imputados debido a la falta de información en sus respectivas agrupaciones. Por lo tanto, estos registros fueron eliminados. La eficacia del proceso de imputación se verificó mediante la gráfica correspondiente.
# Imputación de variable parqueaderos
vivienda = vivienda %>%
mutate(parqueaderos = case_when(
is.na(parqueaderos) & zona == "Zona Centro" & estrato == "3" ~ 1,
is.na(parqueaderos) & zona == "Zona Centro" & estrato == "4" ~ 1,
is.na(parqueaderos) & zona == "Zona Centro" & estrato == "5" & tipo == "Apartamento" ~ 1,
is.na(parqueaderos) & zona == "Zona Norte" & estrato == "3" ~ 1,
is.na(parqueaderos) & zona == "Zona Norte" & estrato == "4" & tipo == "Apartamento" ~ 1,
is.na(parqueaderos) & zona == "Zona Norte" & estrato == "4" & tipo == "Casa" ~ 2,
is.na(parqueaderos) & zona == "Zona Norte" & estrato == "5" & tipo == "Apartamento" ~ 1,
is.na(parqueaderos) & zona == "Zona Norte" & estrato == "5" & tipo == "Casa" ~ 2,
is.na(parqueaderos) & zona == "Zona Norte" & estrato == "6" ~ 2,
is.na(parqueaderos) & zona == "Zona Oeste" & estrato == "3" ~ 1,
is.na(parqueaderos) & zona == "Zona Oeste" & estrato == "4" ~ 1,
is.na(parqueaderos) & zona == "Zona Oeste" & estrato == "5" ~ 2,
is.na(parqueaderos) & zona == "Zona Oeste" & estrato == "6" ~ 2,
is.na(parqueaderos) & zona == "Zona Oriente" & estrato == "3" ~ 1,
is.na(parqueaderos) & zona == "Zona Oriente" & estrato == "4" ~ 1,
is.na(parqueaderos) & zona == "Zona Oriente" & estrato == "5" & tipo == "Apartamento" ~ 1,
is.na(parqueaderos) & zona == "Zona Oriente" & estrato == "6" & tipo == "Apartamento" ~ 3,
is.na(parqueaderos) & zona == "Zona Sur" & estrato == "3" ~ 1,
is.na(parqueaderos) & zona == "Zona Sur" & estrato == "4" ~ 1,
is.na(parqueaderos) & zona == "Zona Sur" & estrato == "5" & tipo == "Apartamento" ~ 1,
is.na(parqueaderos) & zona == "Zona Sur" & estrato == "5" & tipo == "Casa" ~ 2,
is.na(parqueaderos) & zona == "Zona Sur" & estrato == "6" & tipo == "Apartamento" ~ 2,
is.na(parqueaderos) & zona == "Zona Sur" & estrato == "6" & tipo == "Casa" ~ 3,
TRUE ~ parqueaderos
))
# Imputación de variable piso
vivienda = vivienda %>%
mutate(piso = case_when(
is.na(piso) & zona == "Zona Centro" & estrato == "3" & tipo == "Apartamento" ~ 4,
is.na(piso) & zona == "Zona Centro" & estrato == "3" & tipo == "Casa" ~ 1,
is.na(piso) & zona == "Zona Centro" & estrato == "4" & tipo == "Apartamento" ~ 8,
is.na(piso) & zona == "Zona Centro" & estrato == "4" & tipo == "Casa" ~ 2,
is.na(piso) & zona == "Zona Norte" & tipo == "Casa" ~ 2,
is.na(piso) & zona == "Zona Norte" & estrato == "3" & tipo == "Apartamento" ~ 4,
is.na(piso) & zona == "Zona Norte" & estrato == "4" & tipo == "Apartamento" ~ 4,
is.na(piso) & zona == "Zona Norte" & estrato == "5" & tipo == "Apartamento" ~ 5,
is.na(piso) & zona == "Zona Norte" & estrato == "6" & tipo == "Apartamento" ~ 4,
is.na(piso) & zona == "Zona Oeste" & tipo == "Casa" ~ 2,
is.na(piso) & zona == "Zona Oeste" & estrato == "3" & tipo == "Apartamento" ~ 4,
is.na(piso) & zona == "Zona Oeste" & estrato == "4" & tipo == "Apartamento" ~ 3,
is.na(piso) & zona == "Zona Oeste" & estrato == "5" & tipo == "Apartamento" ~ 4,
is.na(piso) & zona == "Zona Oeste" & estrato == "6" & tipo == "Apartamento" ~ 5,
is.na(piso) & zona == "Zona Oriente" & estrato == "3" ~ 2,
is.na(piso) & zona == "Zona Oriente" & estrato == "4" & tipo == "Apartamento" ~ 4,
is.na(piso) & zona == "Zona Oriente" & estrato == "4" & tipo == "Casa" ~ 2,
is.na(piso) & zona == "Zona Oriente" & estrato == "5" & tipo == "Apartamento" ~ 5,
is.na(piso) & zona == "Zona Oriente" & estrato == "5" & tipo == "Casa" ~ 1,
is.na(piso) & zona == "Zona Sur" & tipo == "Apartamento" ~ 4,
is.na(piso) & zona == "Zona Sur" & tipo == "Casa" ~ 2,
TRUE ~ piso
))
vivienda = na.omit(vivienda)
gg_miss_var(vivienda)
- Limpieza de Valores Atípicos: Se incorporo una nueva variable al conjunto de datos que relaciona el precio de las viviendas con su área construida, con el fin de hacer comparable los inmuebles en términos de precio por \(m^{2}\). Esta inclusión facilitó la identificación de precios atípicos en las viviendas, lo cual condujo a una depuración de la base de datos, reduciéndola a 8219 registros válidos al eliminar aquellos con precios por metro cuadrado que excedían los valores esperados según la distribución de datos.
vivienda = vivienda %>% mutate(Preciometro=round(preciom/areaconst,digits = 1))
vivienda = vivienda %>%
group_by(zona) %>%
filter(Preciometro >= quantile(Preciometro, 0.25) - 1.5 * IQR(Preciometro) &
Preciometro <= quantile(Preciometro, 0.75) + 1.5 * IQR(Preciometro)) %>%
ungroup()
vivienda$Preciometro = NULL
- Estandarización de nombres de barrios: Se realizó una investigación mediante geolocalización para garantizar una agrupación adecuada de los barrios en torno a sus localizaciones, reduciendo el numero de barrio de 430 a 304.
# Dejar todo en miniscula y sin tildes
limpiar_barrios = function(names){nombres<-tolower(
trimws(iconv(names,from="UTF-8",to="ASCII//TRANSLIT")))
nombres<-gsub("[_]","",nombres)
return(nombres)
}
vivienda$barrio<-limpiar_barrios(vivienda$barrio)
# Estandarizar nombres
vivienda = vivienda %>%
mutate(barrio = case_when(
barrio %in% c("aguablanca") ~ "agua blanca",
barrio %in% c("alamos","los alamos") ~ "ciudad los alamos",
barrio %in% c("bajo aguacatal","miradol del aguacatal","sector aguacatal") ~ "aguacatal",
barrio %in% c("alameda") ~ "alameda del rio",
barrio %in% c("alf?crez real") ~ "alferez real",
barrio %in% c("alfonso lopez i") ~ "alfonso lopez",
barrio %in% c("arboleda") ~ "arboledas",
barrio %in% c("altos de menga","colinas de menga") ~ "menga",
barrio %in% c("la alborada") ~ "alborada",
barrio %in% c("barrio 7de agosto","siete de agosto") ~ "7 de agosto",
barrio %in% c("barrio el recuerdo") ~ "recuerdo",
barrio %in% c("barrio eucaristico") ~ "eucaristico",
barrio %in% c("barrio obrero") ~ "obrero",
barrio %in% c("base a?crea") ~ "base aerea",
barrio %in% c("ed benjamin herrera") ~ "benjamin herrera",
barrio %in% c("bella suiza alta") ~ "bella suiza",
barrio %in% c("bloques del limonar") ~ "bosques del limonar",
barrio %in% c("el gran limonar") ~ "gran limonar",
barrio %in% c("brisas de los") ~ "brisas de los alamos",
barrio %in% c("ciudad bochalema") ~ "bochalema",
barrio %in% c("cali","cali bella") ~ "calibella",
barrio %in% c("cali canto","calicanto viii") ~ "calicanto",
barrio %in% c("caney especial","el caney"," el caney") ~ "caney",
barrio %in% c("cañaverales los samanes") ~ "cañaverales",
barrio %in% c("Chiminangosr","chiminangos 1 etapa","chiminangos 2 etapa") ~ "chiminangos",
barrio %in% c("capri") ~ "ciudad capri",
barrio %in% c("ciudad cordoba reservado") ~ "ciudad cordoba",
barrio %in% c("ciudad jardin pance","ciudad antejardin") ~ "ciudad jardin",
barrio %in% c("ciudadela paso ancho") ~ "ciudadela pasoancho",
barrio %in% c("ciudad mel?cndez","ciudadela melendez","meléndez","melendez") ~ "ciudad melendez",
barrio %in% c("colseguros") ~ "colseguros andes",
barrio %in% c("colon") ~ "cristobal colon",
barrio %in% c("cristales","los cristales","tejares cristales") ~ "los cristales tejares",
barrio %in% c("centro") ~ "zona centro",
barrio %in% c("el ingenio i","ingenio i") ~ "ingenio I",
barrio %in% c("ingenio ii","el ingenio ii") ~ "ingenio II",
barrio %in% c("el ingenio 3","el ingenio iii","ingenio iii") ~ "ingenio III",
barrio %in% c("el tr?cbol") ~ "el trebol",
barrio %in% c("fuentes de la") ~ "fuentes",
barrio %in% c("brisas del guabito") ~ "el guabito",
barrio %in% c("el ingenio","el ingenio") ~ "ingenio",
barrio %in% c("altos de guadalupe","brisas de guadalupe","cerros de guadalupe","guadalupe alto","sector cañaveralejo guadalupe") ~ "guadalupe",
barrio %in% c("juanamb??") ~ "juanambu",
barrio %in% c("jamundi alfaguara") ~ "jamundi",
barrio %in% c("la ceibas","las ceibas") ~ "ceibas",
barrio %in% c("la primavera") ~ "primavera",
barrio %in% c("laflora","norte la flora","flora") ~ "la flora",
barrio %in% c("la riviera") ~ "la rivera",
barrio %in% c("la rivera i") ~ "la rivera I",
barrio %in% c("la rivera ii") ~ "la rivera II",
barrio %in% c("lares de comfenalco") ~ "comfenalco",
barrio %in% c("las am?cricas") ~ "las americas",
barrio %in% c("las vegas de","mayapan las vegas") ~ "las vegas",
barrio %in% c("los alcazares","los alcázares") ~ "alcazares",
barrio %in% c("cambulos") ~ "los cambulos",
barrio %in% c("guaduales") ~ "los guaduales",
barrio %in% c("libertadores") ~ "los libertadores",
barrio %in% c("marroquin iii") ~ "marroquin III",
barrio %in% c("normandía west point") ~ "normandia",
barrio %in% c("nueva base") ~ "la base",
barrio %in% c("rep??blica de israel") ~ "republica de israel",
barrio %in% c("san judas tadeo") ~ "san judas",
barrio %in% c("santa elene","santa helena de") ~ "santa helena",
barrio %in% c("tequendema","urbanización tequendama") ~ "tequendama",
barrio %in% c("refugio") ~ "el refugio",
barrio %in% c("las quintas de") ~ "quintas de salomia",
barrio %in% c("quintas de don") ~ "quintas de don simon",
barrio %in% c("valle de lili") ~ "valle del lili",
barrio %in% c("san bosco") ~ "san juan bosco",
barrio %in% c("san fernando nuevo") ~ "san fernando",
barrio %in% c("santa anita sur") ~ "santa anita",
barrio %in% c("santafe") ~ "santa fe",
barrio %in% c("sierras de normandia") ~ "normandia",
barrio %in% c("villa de veracruz") ~ "villas de veracruz",
barrio %in% c("zona norte los","norte") ~ "zona norte",
TRUE ~ barrio # Mantener valores que no necesitan agrupación
))
El Análisis de Componentes Principales (PCA) se aplica a las variables cuantitativas, por lo que se filtró el conjunto de datos vivienda para incluir únicamente las siguientes variables: piso (3), preciom (5), areaconst (6), parqueaderos (7), baños (8) y habitaciones (9).
vivienda_num = vivienda[,c(3,5,6,7,8,9)]
kable(head(vivienda_num))
| piso | preciom | areaconst | parqueaderos | banios | habitaciones |
|---|---|---|---|---|---|
| 2 | 320 | 120 | 1 | 2 | 3 |
| 2 | 350 | 220 | 2 | 2 | 4 |
| 2 | 400 | 280 | 3 | 5 | 3 |
| 1 | 260 | 90 | 1 | 2 | 3 |
| 1 | 240 | 87 | 1 | 3 | 3 |
| 1 | 220 | 52 | 2 | 2 | 3 |
Con el fin de evitar que las variables que tiene una escala con valores más grandes afecten las estimaciones realizadas (sesgos) se realizó la estandarización de las variables antes de proceder a realizar el proceso de estimación de los componentes principales.
vivienda_numZ = scale(vivienda_num)
Se procedió a realizar el análisis de componentes principales utilizando la función prcomp, obteniendo los porcentajes de variabilidad explicada por cada componente.
res.pca = prcomp(vivienda_numZ)
fviz_eig(res.pca, addlabels = TRUE)
En este caso, el primer componente principal explica el 54.6% de la
variabilidad en la base de datos, y entre los dos primeros componentes
explican en conjunto el 73.3%. Esto indica que, utilizando solo estos
dos componentes, los cuales se obtienen mediante combinaciones lineales
de las variables, es posible capturar una gran parte de la variabilidad
contenida en el conjunto de datos.
Al analizar el grado de contribución de los dos primeros componentes, se determina:
fviz_contrib(res.pca,choice = "var",axes = 1)
fviz_contrib(res.pca,choice = "var",axes = 2)
Para el Componente Principal 1 (CP1), las variables que mayormente
contribuyen a la variabilidad son área construida,
baños, precio y parqueaderos, sumando
aproximadamente el 85% de la variabilidad del componente. En el
Componente Principal 2 (CP2), las principales contribuciones provienen
de piso y habitaciones, que en conjunto explican
alrededor del 78% de la variabilidad del componente.
También se construyó el círculo de correlaciones, para validar los comportamientos previamente descritos:
fviz_pca_var(res.pca, axes = c(1, 2), col.var = "contrib", gradient.cols = c("#FF7F00", "#034D94"), repel = TRUE)
Al analizar las variables en el plano de los componentes principales, se puede identificar la dirección y la caracterización de los componentes, permitiendo formular las siguientes conjeturas:
Componente Principal 1 (CP1): Los vectores con mayor longitud en este componente corresponden a variables con alta contribución, como área construida, baños, precio y parqueaderos. Estas variables están positivamente correlacionadas entre sí, destacando especialmente la fuerte relación entre precio y parqueaderos, así como entre área construida y baños. En contraste, los vectores en color naranja, que representan variables con menor contribución en el primer componente, son piso y habitaciones, sugiriendo una correlación débil o inexistente con las variables de mayor influencia.
Componente Principal 2 (CP2): Los vectores con mayor longitud en este componente corresponden a variables importantes como piso y habitaciones. Estas variables presentan una correlación negativa, lo que indica que a medida que aumenta el número de pisos, el número de habitaciones tiende a disminuir. A diferencia del Componente Principal 1, las variables que eran más representativas para CP1 tienen una menor contribución en CP2.
Complementando el análisis, se realizó un gráfico biplot que combina la información de las variables y los individuos, permitiendo visualizar simultáneamente la proyección de las observaciones (individuos) y las variables en el espacio definido por los componentes principales.
En esta primera gráfica, se incluye la variable categórica tipo para entender mejor las relaciones existentes.
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = vivienda$tipo,
col.var = "#034A94", # Variables color
col.ind = c("#DEDEDE", "#034A94"), # Individuals color
geom = c("point")
)
Se observa la presencia de dos conglomerados claramente marcados. La
clase apartamentos está influenciada en gran medida por el piso
en el que se ubican, mientras que la clase casa muestra una mayor
relación con las habitaciones, área construida y
baños. Otras variables como parqueaderos y
precio no están claramente asociadas con una clase particular,
ya que sus vectores se posicionan en el límite entre las dos clases.
Esto indica que estas variables tienen una influencia más difusa y no se
agrupan claramente en torno a una categoría específica.
Para la segunda gráfica, se realizó análisis teniendo en cuenta la variable categórica zona.
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = vivienda$zona,
col.var = "#034A94", # Variables color
col.ind = c("#DEDEDE", "#034A94"), # Individuals color
geom = c("point")
)
El análisis revela que la zona sur tiene la mayor cantidad de viviendas
ofertadas, con una distribución en forma de “U” y una alta correlación
con la mayoría de las variables. La zona norte muestra una distribución
similar pero con mayor dispersión y menos viviendas. La zona oeste se
concentra en el cuadrante inferior izquierdo, destacándose por su
relación significativa con las variables de parqueaderos y
precio. En contraste, las zonas oriente y centro presentan la
menor concurrencia y están fuertemente influenciadas por la variable de
habitaciones.
Para la tercera gráfica, se realizó análisis teniendo en cuenta la variable categórica estrato.
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = vivienda$estrato,
col.var = "#034A94", # Variables color
col.ind = c("#DEDEDE", "#034A94"), # Individuals color
geom = c("point")
)
Se observa que el agrupamiento de los individuos según el estrato es más
pronunciado, con una disposición ordenada a lo largo de las dimensiones
1 y 2. Comenzando con el estrato 3 en la parte superior derecha, la
distribución avanza hasta el estrato 6 en el cuadrante inferior
izquierdo. Además, a medida que se desciende por los estratos, la
dispersión de los individuos en sus componentes aumenta
notablemente.
Para determinar el número óptimo de clústeres se utilizó la función fviz_nbclust con el método WSS (Within-Cluster Sum of Squares). Este método mide la suma de las distancias cuadradas entre cada punto y el centroide de su clúster, ayudando a evaluar la calidad de la partición.
La función fviz_nbclust grafica el WSS para diferentes números de clústeres, permitiendo identificar el “codo” en la gráfica. Este punto indica el número óptimo de clústeres al equilibrar la variabilidad interna y la complejidad del modelo.
El gráfico obtenido es el siguiente:
fviz_nbclust(vivienda_numZ, kmeans, method = "wss")
Como se observa, el punto de inflexión se alcanza aproximadamente con dos o cuatro agrupaciones, ya que a partir de estos números no se nota una reducción significativa en el WSS. Para validar esta elección, se utilizó el método de Silhouette, que evalúa la calidad de la partición en grupos. El coeficiente de Silhouette proporciona una medida adicional de cuán bien se ajustan los puntos a sus agrupaciones y si están claramente separados de los demás grupos. Este análisis ayuda a corroborar la selección del número óptimo de agrupaciones y a asegurar que los grupos formados sean interpretables y útiles.
fviz_nbclust(vivienda_numZ, kmeans, method = "silhouette")
A partir del gráfico, es evidente que el número óptimo de clústeres es 2, ya que para valores mayores, el coeficiente de Silhouette muestra una disminución significativa. No obstante, para realizar una comparación más exhaustiva, se llevará a cabo el análisis para 2 y 4 clústeres, que son los dos números que obtuvieron las mejores puntuaciones.
- Análisis con 2 clústeres: Se aplicó el método k-means con dos centroides, conforme a los resultados previos. Los resultados se graficaron en el espacio de componentes principales (PCA) para facilitar la visualización y la identificación de los mismos.
set.seed(2024)
kmeans_2 = kmeans(vivienda_numZ, centers = 2)
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = as.factor(kmeans_2$cluster),
col.var = "#034A94",
geom = c("point"),
addEllipses = TRUE
)
En la gráfica anterior, se distinguen claramente los dos agrupamientos
generados por el modelo:
Se procedió a realizar un análisis descriptivo de cada grupo:
vivienda_k2 = vivienda
vivienda_k2$cluster = as.factor(kmeans_2$cluster)
Estadisticas_por_grupo = describeBy(vivienda_k2[,c(3,5,6,7,8,9)], mat = TRUE, group = vivienda_k2$cluster, digits= 1)
kable(Estadisticas_por_grupo) %>% kable_styling(full_width = TRUE)
| item | group1 | vars | n | mean | sd | median | trimmed | mad | min | max | range | skew | kurtosis | se | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| piso1 | 1 | 1 | 1 | 2380 | 2.8 | 1.9 | 2 | 2.5 | 0.0 | 1 | 12 | 11 | 2.3 | 6.2 | 0.0 |
| piso2 | 2 | 2 | 1 | 5839 | 3.9 | 2.4 | 4 | 3.6 | 1.5 | 1 | 12 | 11 | 1.3 | 1.7 | 0.0 |
| preciom1 | 3 | 1 | 2 | 2380 | 774.5 | 372.8 | 690 | 734.6 | 343.2 | 150 | 1999 | 1849 | 0.9 | 0.3 | 7.6 |
| preciom2 | 4 | 2 | 2 | 5839 | 287.7 | 142.5 | 260 | 271.5 | 133.4 | 58 | 1200 | 1142 | 1.1 | 1.7 | 1.9 |
| areaconst1 | 5 | 1 | 3 | 2380 | 332.6 | 166.9 | 300 | 309.0 | 118.6 | 50 | 1745 | 1695 | 2.5 | 10.9 | 3.4 |
| areaconst2 | 6 | 2 | 3 | 5839 | 110.7 | 57.0 | 94 | 101.4 | 43.0 | 40 | 624 | 584 | 1.9 | 5.9 | 0.7 |
| parqueaderos1 | 7 | 1 | 4 | 2380 | 2.7 | 1.4 | 2 | 2.5 | 1.5 | 1 | 10 | 9 | 1.6 | 3.9 | 0.0 |
| parqueaderos2 | 8 | 2 | 4 | 5839 | 1.3 | 0.5 | 1 | 1.3 | 0.0 | 1 | 4 | 3 | 1.1 | 0.4 | 0.0 |
| banios1 | 9 | 1 | 5 | 2380 | 4.7 | 1.2 | 5 | 4.7 | 1.5 | 0 | 10 | 10 | 0.7 | 2.1 | 0.0 |
| banios2 | 10 | 2 | 5 | 5839 | 2.4 | 0.8 | 2 | 2.4 | 1.5 | 0 | 5 | 5 | 0.4 | 0.2 | 0.0 |
| habitaciones1 | 11 | 1 | 6 | 2380 | 4.9 | 1.7 | 4 | 4.7 | 1.5 | 0 | 10 | 10 | 1.0 | 0.7 | 0.0 |
| habitaciones2 | 12 | 2 | 6 | 5839 | 3.1 | 0.9 | 3 | 3.0 | 0.0 | 0 | 9 | 9 | 0.9 | 5.6 | 0.0 |
Desde una perspectiva general, el clúster 1 contiene 2380 individuos, mientras que el clúster 2 tiene más del doble, con 5839 individuos. Además, la distribución de todas las variables en ambos grupos muestra características similares en términos de forma, ya que ambas son leptocúrticas y presentan asimetrías a la derecha. A continuación, se presenta una comparación específica de cada variable en términos de sus características cuantitativas.
Por otro lado, se examinó la distribución de los clústeres en relación con su posición geográfica y su estrato. En cuanto a la primera, se observó lo siguiente:
par(mfrow = c(1, 2))
ggplot(vivienda_k2, aes(x = longitud, y = latitud, color = cluster)) +
geom_point() +
labs(title = "Mapa de Clusters", x = "Longitud", y = "Latitud", color = "Cluster") +
theme_minimal()
ggplot(vivienda_k2, aes(x = zona, fill = cluster)) +
geom_bar() +
labs(title = "Distribución de viviendas por zona y cluster", color = "Cluster") +
theme_minimal()
Se evidencia una mayor presencia de individuos asociados al clúster 2,
con una concentración significativa en las zonas sur, norte y oeste. En
contraste, el clúster 1 mantiene una distribución similar pero con un
número de individuos notablemente menor, resultando en una menor
concentración. La zona centro presenta la menor participación, con una
proporción equitativa de individuos en todos los clústeres.
Para la distribución de los clústeres respecto al estrato se encontró lo siguiente:
ggplot(vivienda_k2, aes(x = estrato, fill = cluster)) +
geom_bar() +
labs(title = "Distribución de viviendas por estrato y cluster", color = "Cluster") +
theme_minimal()
Desde el estrato 3 al 5, la proporción de los clústeres es similar,
siendo predominante el clúster 2. Sin embargo, en el estrato 6, la
relación se invierte, con el clúster 1 alcanzando la mayor
participación.
Finalmente, se construyó una gráfica de dispersión que relaciona el precio con el área construida, utilizando diferentes colores para representar los clústeres generados. Esta visualización tiene el objetivo de complementar el análisis de estas dos variables clave en la oferta de una vivienda.
ggplot(vivienda_k2, aes(x = areaconst, y = preciom, color = cluster)) +
geom_point(alpha = 0.5) +
labs(title = "Distribución de Precio/m² por Cluster", x = "Area construida (m²)", y = "Precio (MM)") +
theme_minimal()
En la gráfica se observa claramente la presencia de dos grupos
diferenciados, con una ligera dispersión en el límite que los separa.
Para el clúster 2, las áreas construidas se concentran en un rango de
hasta 250 \(m^{2}\) , con precios que
alcanzan hasta 750 MM, mostrando una alta concentración de individuos en
este segmento. En contraste, el clúster 1 presenta áreas construidas
principalmente entre 250 y 750 \(m^{2}\), con precios que llegan hasta 1,750
millones, lo que indica una mayor dispersión en esta categoría.
- Análisis con 4 clústeres: Se aplicó el método k-means con cuatro centroides. Los resultados se graficaron en el espacio de componentes principales (PCA) para facilitar la visualización y la identificación de los mismos.
set.seed(2026)
kmeans_4 = kmeans(vivienda_numZ, centers = 4)
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = as.factor(kmeans_4$cluster),
col.var = "#034A94",
geom = c("point"),
addEllipses = TRUE
)
En la gráfica anterior, se distinguen claramente los cuatro
agrupamientos generados por el modelo.
Se procedió a realizar un análisis descriptivo de cada grupo:
vivienda_k4 = vivienda
vivienda_k4$cluster = as.factor(kmeans_4$cluster)
Estadisticas_por_grupo <- describeBy(vivienda_k4[,c(3,5,6,7,8,9)], mat = TRUE, group = vivienda_k4$cluster, digits = 1)
kable(Estadisticas_por_grupo) %>% kable_styling(full_width = TRUE)
| item | group1 | vars | n | mean | sd | median | trimmed | mad | min | max | range | skew | kurtosis | se | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| piso1 | 1 | 1 | 1 | 4148 | 3.2 | 1.4 | 3 | 3.2 | 1.5 | 1 | 6 | 5 | -0.1 | -1.1 | 0.0 |
| piso2 | 2 | 2 | 1 | 2272 | 2.5 | 1.1 | 2 | 2.4 | 0.0 | 1 | 8 | 7 | 1.1 | 1.0 | 0.0 |
| piso3 | 3 | 3 | 1 | 879 | 3.0 | 2.1 | 2 | 2.6 | 0.0 | 1 | 12 | 11 | 2.0 | 3.9 | 0.1 |
| piso4 | 4 | 4 | 1 | 920 | 8.4 | 1.8 | 8 | 8.4 | 1.5 | 5 | 12 | 7 | 0.3 | -0.8 | 0.1 |
| preciom1 | 5 | 1 | 2 | 4148 | 248.3 | 116.0 | 230 | 236.1 | 117.9 | 58 | 1200 | 1142 | 1.2 | 2.6 | 1.8 |
| preciom2 | 6 | 2 | 2 | 2272 | 509.1 | 186.0 | 480 | 495.4 | 177.9 | 127 | 1200 | 1073 | 0.7 | 0.1 | 3.9 |
| preciom3 | 7 | 3 | 2 | 879 | 1113.3 | 349.2 | 1100 | 1102.1 | 370.6 | 190 | 1999 | 1809 | 0.2 | -0.5 | 11.8 |
| preciom4 | 8 | 4 | 2 | 920 | 388.8 | 222.3 | 320 | 354.5 | 140.8 | 125 | 1500 | 1375 | 1.7 | 3.5 | 7.3 |
| areaconst1 | 9 | 1 | 3 | 4148 | 96.5 | 45.8 | 86 | 89.1 | 35.6 | 40 | 624 | 584 | 2.8 | 14.7 | 0.7 |
| areaconst2 | 10 | 2 | 3 | 2272 | 244.3 | 97.7 | 226 | 233.9 | 97.1 | 70 | 870 | 800 | 1.0 | 1.3 | 2.1 |
| areaconst3 | 11 | 3 | 3 | 879 | 430.2 | 208.8 | 380 | 397.4 | 142.3 | 50 | 1745 | 1695 | 2.1 | 6.7 | 7.0 |
| areaconst4 | 12 | 4 | 3 | 920 | 113.5 | 54.0 | 98 | 105.2 | 38.5 | 45 | 660 | 615 | 2.4 | 12.8 | 1.8 |
| parqueaderos1 | 13 | 1 | 4 | 4148 | 1.2 | 0.4 | 1 | 1.2 | 0.0 | 1 | 4 | 3 | 1.6 | 1.7 | 0.0 |
| parqueaderos2 | 14 | 2 | 4 | 2272 | 1.8 | 0.7 | 2 | 1.8 | 0.0 | 1 | 5 | 4 | 0.7 | 0.9 | 0.0 |
| parqueaderos3 | 15 | 3 | 4 | 879 | 3.8 | 1.5 | 4 | 3.7 | 1.5 | 1 | 10 | 9 | 1.2 | 2.6 | 0.1 |
| parqueaderos4 | 16 | 4 | 4 | 920 | 1.5 | 0.6 | 1 | 1.5 | 0.0 | 1 | 4 | 3 | 0.8 | 0.7 | 0.0 |
| banios1 | 17 | 1 | 5 | 4148 | 2.2 | 0.7 | 2 | 2.2 | 0.0 | 0 | 4 | 4 | 0.0 | 0.4 | 0.0 |
| banios2 | 18 | 2 | 5 | 2272 | 4.1 | 1.1 | 4 | 4.1 | 1.5 | 0 | 10 | 10 | 0.8 | 2.9 | 0.0 |
| banios3 | 19 | 3 | 5 | 879 | 5.2 | 1.4 | 5 | 5.1 | 1.5 | 0 | 10 | 10 | 0.2 | 1.5 | 0.0 |
| banios4 | 20 | 4 | 5 | 920 | 2.8 | 0.9 | 3 | 2.6 | 1.5 | 0 | 10 | 10 | 1.3 | 3.6 | 0.0 |
| habitaciones1 | 21 | 1 | 6 | 4148 | 2.9 | 0.7 | 3 | 2.9 | 0.0 | 0 | 7 | 7 | -0.6 | 4.0 | 0.0 |
| habitaciones2 | 22 | 2 | 6 | 2272 | 4.8 | 1.6 | 4 | 4.6 | 1.5 | 0 | 10 | 10 | 1.1 | 0.8 | 0.0 |
| habitaciones3 | 23 | 3 | 6 | 879 | 4.5 | 1.6 | 4 | 4.3 | 1.5 | 0 | 10 | 10 | 1.3 | 2.5 | 0.1 |
| habitaciones4 | 24 | 4 | 6 | 920 | 2.9 | 0.7 | 3 | 2.9 | 0.0 | 0 | 6 | 6 | -0.5 | 3.4 | 0.0 |
Desde una perspectiva general, el clúster 1 contiene el 50% de los inviduos con 4148, el cluster 2 el 27 % con 2272, y el cluster 3 y 4 el 23% restante con 1799 individuos en total. A continuación, se presenta una comparación específica de cada variable en términos de sus características cuantitativas.
Por otro lado, se examinó la distribución de los clústeres en relación con su posición geográfica y su estrato. En cuanto a la primera, se observó lo siguiente:
par(mfrow = c(1, 2), mar = c(2, 2, 2, 1))
ggplot(vivienda_k4, aes(x = longitud, y = latitud, color = cluster)) +
geom_point() +
labs(title = "Mapa de Clusters", x = "Longitud", y = "Latitud", color = "Cluster") +
theme_minimal()
ggplot(vivienda_k4, aes(x = zona, fill = cluster)) +
geom_bar() +
labs(title = "Distribución de viviendas por zona y cluster", color = "Cluster") +
theme_minimal()
Se evidencia una mayor presencia de individuos asociados al clúster 1,
con una concentración significativa en las zonas sur, norte y oeste. En
segundo lugar, se posiciona el clúster 2, con una distribución similar a
la del clúster 1, pero en menor proporción. Los clústeres 3 y 4
presentan cantidades similares de individuos, con el clúster 3 mostrando
una proporción constante en las zonas norte, oeste y sur, mientras que
el clúster 4 tiene una mayor concentración en la zona sur. Las zonas
centro y oriente están representadas únicamente por los clústeres 1 y
2.
Para la distribución de los clústeres respecto al estrato se encontró lo siguiente:
ggplot(vivienda_k4, aes(x = estrato, fill = cluster)) +
geom_bar() +
labs(title = "Distribución de viviendas por estrato y cluster", color = "Cluster") +
theme_minimal()
El estrato 3 está principalmente representado por los clústeres 1 y 3.
En los estratos 4 y 5, se mantiene la proporción de viviendas por cada
clúster, destacando los clústeres 1 y 2 con mayor presencia. En el
estrato 6, aumenta notablemente la presencia del clúster 3, teniendo una
proporción igual con el cluster 2.
ggplot(vivienda_k4, aes(x = areaconst, y = preciom, color = cluster)) +
geom_point(alpha = 0.5) +
labs(title = "Distribución de Precio/m² por Cluster", x = "Area construida (m²)", y = "Precio (MM)") +
theme_minimal()
En la gráfica, a diferencia del análisis con K-means y 2 centroides, no
se observa claramente la presencia de los cuatro grupos, ya que el
clúster 4 se encuentra distribuido entre los demás, lo que dificulta su
visualización. En el clúster 1 se agrupan las viviendas con las áreas
más pequeñas, de hasta 200 \(m^{2}\) y
precios máximos de 500 MM, con una dispersión muy baja. El clúster 2
actúa como un puente entre las agrupaciones, con áreas que oscilan entre
200 y 450 \(m^{2}\) y precios entre 200
y 850 MM, mostrando una dispersión media. Finalmente, el clúster 3
incluye las áreas y precios más altos, con áreas entre 200 y 750 \(m^{2}\) y precios entre 500 y 1750 MM,
presentando una alta dispersión.
El Análisis de Correspondencia Múltiple (MCA) se aplica a variables cualitativas con el objetivo de identificar posibles asociaciones. Por ello, se filtró inicialmente el conjunto de datos vivienda para incluir únicamente las variables zona (2), estrato (4) y tipo (10).
vivienda_chr = vivienda[,c(2,4,10)]
kable(head(vivienda_chr))
| zona | estrato | tipo |
|---|---|---|
| Zona Oriente | 3 | Casa |
| Zona Oriente | 3 | Casa |
| Zona Sur | 4 | Casa |
| Zona Norte | 5 | Apartamento |
| Zona Norte | 5 | Apartamento |
| Zona Norte | 4 | Apartamento |
Para verificar la independencia de las tres variables analizadas, se realizó una prueba de hipótesis para cada uno de los tres tipos de relación que se pueden dar entre las variables, utilizando el estadístico de prueba Chi-cuadrado. Los resultados obtenidos son los siguientes:
tabla1 = table(vivienda_chr$zona,vivienda_chr$estrato)
tabla2 = table(vivienda_chr$zona,vivienda_chr$tipo)
tabla3 = table(vivienda_chr$estrato,vivienda_chr$tipo)
chisq.test(tabla1)
##
## Pearson's Chi-squared test
##
## data: tabla1
## X-squared = 3849.1, df = 12, p-value < 2.2e-16
chisq.test(tabla2)
##
## Pearson's Chi-squared test
##
## data: tabla2
## X-squared = 683.46, df = 4, p-value < 2.2e-16
chisq.test(tabla3)
##
## Pearson's Chi-squared test
##
## data: tabla3
## X-squared = 214.52, df = 3, p-value < 2.2e-16
Como se observa, el valor p para cada una de las pruebas realizadas es extremadamente pequeño (2.2e-16). Esto indica que hay evidencia estadísticamente significativa para rechazar la hipótesis nula en cada caso. En consecuencia, se confirma la existencia de una dependencia entre las variables analizadas, sugiriendo que las variables zona, estrato y tipo están asociadas entre sí y no son independientes. Esta dependencia sugiere que el análisis de correspondencia múltiple puede revelar patrones o estructuras relevantes en los datos, proporcionando una comprensión más profunda de las relaciones entre estas variables cualitativas.
Se realizó el Análisis de Correspondencia Múltiple utilizando la función MCA().
resultados_mca = MCA(vivienda_chr, graph = FALSE)
Para visualizar la correlación entre variables y las dimensiones principales de ACM:
fviz_mca_var(resultados_mca, choice = "mca.cor")
Esta gráfica facilita la identificación de las variables que tienen una
mayor correlación con cada dimensión y revela sus interrelaciones. En
particular, la variable zona muestra la mayor correlación tanto
con la Dimensión 1 como con la Dimensión 2, seguida de cerca por la
variable estrato. Ambas variables se encuentran cercanas entre
sí en el gráfico, indicando una asociación significativa. En contraste,
la variable tipo no presenta una alta correlación con las
dimensiones ni con las otras variables, sugiriendo una relación más
débil en el contexto del análisis.
Además, se generó un mapa de categorías que visualiza la distribución y las relaciones entre las diferentes categorías en el espacio de dimensiones. Este mapa proporciona una representación clara de cómo se agrupan y se relacionan las categorías.
fviz_mca_var(resultados_mca, repel = TRUE, col.var = "blue", shape.var = 16)
De acuerdo con el gráfico, las categorías Zona Oeste y Estrato 6
muestran un perfil similar. Por lo tanto, es probable que las viviendas
en esta zona correspondan mayoritariamente al Estrato 6, y dado su
proximidad con la categoría Apartamento, se espera una mayor proporción
de este tipo de vivienda en la zona. Por otro lado, las Zonas Oriente y
Centro presentan una fuerte afinidad con el Estrato 3 y el tipo de
vivienda Casa. Finalmente, las Zonas Norte y Sur exhiben una mezcla de
los Estratos 4 y 5 y tipos de viviendas Apartamento y Casa.
Para medir el grado de representatividad del análisis, se calcularon los valores de la varianza acumulada utilizando los valores propios de la matriz de discrepancias. A partir de estos cálculos, se obtuvo la gráfica que ilustra la distribución de la varianza explicada a lo largo de las dimensiones. Esta gráfica permite visualizar claramente la proporción de variabilidad que cada dimensión captura, facilitando la comprensión de cuántas dimensiones son necesarias para representar adecuadamente los datos.
fviz_screeplot(resultados_mca, addlabels = TRUE)
Los resultados muestran que la primera componente explica el 21.1% de la
variabilidad total. Además, los cinco primeros componentes combinados
explican el 77.0% de la variabilidad. Esto sugiere que al menos las
cinco primeras dimensiones son necesarias para describir adecuadamente
el conjunto de datos.
Finalmente, para entender el grado de contribución de cada categoría a las cinco primeras dimensiones, se graficaron los resultados. Esta visualización permite apreciar cómo cada categoría contribuye a las dimensiones principales del análisis.
fviz_contrib(resultados_mca,choice = "var",axes = 1:5)
Como se observa, las categorías Zona Centro y Zona Oriente presentan las
mayores contribuciones en las primeras cinco dimensiones del análisis,
acumulando aproximadamente el 28.5% del total. Estas categorías son, por
lo tanto, las más relevantes para explicar la variabilidad en estas
dimensiones. A continuación, los estratos 4 y 3 contribuyen con
alrededor del 11% cada uno, y la Zona Oeste aporta un 10%. En conjunto,
estas cinco categorías explican el 61.5% de la variabilidad total en el
análisis de correspondencia múltiple. Esto indica que estas categorías
son clave para entender la estructura subyacente en los datos
analizados.
El Análisis de Componentes Principales (PCA) aplicado al conjunto de datos vivienda permitió una simplificación profunda y una comprensión detallada de la variabilidad en las características de las propiedades. Este método resumió efectivamente el conjunto de datos en dos componentes principales que explicaron en conjunto el 73.3% de la variabilidad total, demostrando la eficacia del PCA en la reducción dimensional y la extracción de información clave.
El primer componente principal (CP1), que explicó el 54.6% de la variabilidad, demostró ser el más significativo. La alta contribución de las variables área construida, baños, precio y parqueaderos reveló una estrecha interrelación entre estas características. Se espera que las propiedades con mayor área construida cuenten con un mayor número de baños y parqueaderos, lo que a su vez incrementa su precio de venta. En contraste, el segundo componente principal (CP2), que contribuyó con un 18.7% de la variabilidad, ofreció una perspectiva adicional al destacar la relación inversa entre el número de pisos y el número de habitaciones. En contextos urbanos, esto se explica por el hecho de que, generalmente, a medida que los inmuebles se ubicaban en pisos más altos, su tamaño tiende a disminuir, lo que lleva a una reducción en el número de habitaciones.
El análisis también mostró que la variable categórica tipo generó dos grupos distintivos: apartamentos y casas. Los apartamentos tienden a estar ubicados en pisos superiores, mientras que las casas estan asociadas con áreas construidas más grandes y, por ende, con un mayor número de habitaciones y baños. En cuanto a la variable zona, el análisis reveló una alta densidad de viviendas en la zona sur, que se correlaciona con la mayoría de las variables. Esto se explicó por una mayor concentración de desarrollos inmobiliarios en esta área, lo que refleja una oferta inmobiliaria más extensa. Además, el patrón observado en los estratos, con una distribución ordenada a lo largo de las dimensiones principales del PCA, sugiere una jerarquía en la calidad o el valor de las propiedades según el estrato. Este patrón resaltó la relevancia del análisis estratificado para entender cómo diferentes segmentos del mercado inmobiliario estan representados en el conjunto de datos.
El análisis de conglomerados, realizado con el método k-means y evaluado mediante la suma de cuadrados dentro de los clústeres (WSS), sugirió que el número óptimo de clústeres se encontraba entre dos y cuatro. La elección final de dos clústeres, confirmada por el coeficiente de Silhouette, resultó ser la más efectiva para capturar la variabilidad en los datos.
En el análisis con dos clústeres, se identificaron dos grupos diferenciados. El primer clúster, con propiedades de mayor área construida, precios elevados y un mayor número de baños, habitaciones y parqueaderos, representa el segmento de mayor valor y tamaño. En contraste, el segundo clúster agrupa propiedades en pisos superiores con menor área construida, mostrando características más compactas y menos costosas. Geográficamente, el clúster 1 se concentró en las zonas sur, norte y oeste, mientras que el clúster 2 tuvo una distribución más dispersa. En términos de estratos, el clúster 1 predominó en estratos altos, mientras que el clúster 2 se destacó en los estratos 3 a 5.
El análisis con cuatro clústeres, aunque proporcionó una mayor resolución, mostró una complejidad añadida sin una mejora significativa en la interpretación. Los cuatro grupos revelaron patrones distintos de dispersión: el primer clúster mostró baja dispersión sin asociación clara con variables específicas; el segundo clúster, con dispersión media, estuvo influenciado por el número de habitaciones; el tercer clúster, con alta dispersión, se relacionó con área construida, parqueaderos, baños y precio; y el cuarto clúster mostró dispersión media, correlacionándose principalmente con la variable de piso. Desde una perspectiva geográfica, el clúster 1 se concentró en las zonas sur, norte y oeste, el clúster 2 mostró una distribución similar pero en menor proporción, el clúster 3 mantuvo una proporción constante en zonas norte, oeste y sur, y el clúster 4 tuvo una mayor concentración en la zona sur. En términos de estratos, el clúster 1 predominó en los estratos 3 a 5, mientras que el cluster 3 en el estrato 6.
El Análisis de Correspondencia Múltiple (MCA) se aplicó para examinar las asociaciones entre las variables cualitativas zona, estrato y tipo en el conjunto de datos de viviendas. La prueba de independencia con el estadístico Chi-cuadrado reveló valores p extremadamente bajos (2.2e-16), lo que confirma la existencia de dependencias significativas entre estas variables. Esto sugiere que las variables zona, estrato y tipo están interrelacionadas y que el MCA es adecuado para identificar patrones en los datos.
En el análisis, se observó que la variable zona mostró una fuerte correlación con las primeras dimensiones del MCA, destacándose como un factor principal en la explicación de las relaciones entre las variables. La variable estrato también presentó una asociación notable, aunque menor en comparación con zona. Por su parte, la variable tipo mostró una influencia relativamente débil, indicando que su relación con las demás variables es menos significativa.
Tambien se reveló que las categorías de zona y estrato están asociadas de manera particular, lo que sugiere patrones claros en la distribución de viviendas según estas variables. Por ejemplo, ciertas zonas tienden a estar asociadas con estratos específicos, y estas asociaciones afectan el tipo de vivienda predominante en cada área.
La contribución de las categorías al análisis muestra que las variables zona y estrato son cruciales para explicar la variabilidad en los datos. En particular, las categorías de Zona Centro y Zona Oriente tienen una contribución destacada, acumulando aproximadamente el 28.5% de la variabilidad total en las primeras cinco dimensiones del análisis. Estas zonas están asociadas principalmente con el Estrato 3 y el tipo de vivienda Casa. Además, los Estratos 4 y 5 también juegan un papel significativo, con cada uno contribuyendo alrededor del 11% a la variabilidad explicada. La Zona Oeste aporta un 10% adicional. En conjunto, estas categorías explican aproximadamente el 61.5% de la variabilidad total, lo que resalta su importancia en la estructura de los datos y en la comprensión de las asociaciones entre las variables cualitativas analizadas.