1. Problema

Una empresa inmobiliaria líder en una gran ciudad está buscando comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas más informadas. La empresa posee una base de datos extensa que contiene información detallada sobre diversas propiedades residenciales disponibles en el mercado. Se requiere realizar un análisis holístico de estos datos para identificar patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades.

2. Objetivo

Realizar un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano.

3. Metodologìa

Al abordar un análisis descriptivo, es esencial seguir una metodología cuidadosa que permita explorar y comprender los datos en profundidad.

  1. Estructura de los datos
  2. Procesamiento de datos faltantes
  3. Descripción estadistica para variables cuantitativas
    • Medidas de variabilidad
    • Medidas de tendencia central
  4. Descripcion estadistica para variables cualitativas
  5. Anàlisis Multivariado
  6. Anàlisis de componentes principales
  7. Anàlisis de conglomerados
  8. Anàlisis de correspondencia
  9. Conclusiones
  10. recomendaciones generales

a. Estructura de los datos

Librerìas usadas

#cargar librerias

library(FactoMineR)
library(textshape)
library("cluster")
library(plotly)
library(tidyverse)
library(ggplot2) 
library(knitr)
library(paqueteMODELOS)
library(dplyr)
library(tidyr) 
library(treemap)
library(stats)
library(factoextra)

A continuación se describe el tipo de datos de las variables y el tamaño de la base de datos.

tiposdatos<-glimpse(vivienda)
## 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…

La información anterior se sintetiza en la siguiente tabla, la cual ofrece una visión panorámica del tipo de conjunto de datos disponible y facilita la comprensión de sus rasgos primordiales.

|
Variables Cantidad
Numéricas 9
Categoricas 4
Total 13
Total de registros: 8322

De acuerdo con la tabla anterior, se observa que el atributo “piso” aparece como tipo de dato “chr” (carácter), sin embargo, al examinar sus registros se encuentran valores numéricos que representan la cantidad de pisos en una casa. Por lo tanto, se procede a cambiar el tipo de datos de esta columna a “numérico” para reflejar con mayor precisión su naturaleza numérica.

También es importante destacar que la columna “ID” puede ser omitida o eliminada, ya que su contenido no aportará información relevante debido a que se trata de una numeración asignada a las observaciones y ademas se decidió no incluir las variables de longitud y latitud en este resumen, ya que no se planea realizar un análisis espacial ni utilizar la ubicación geográfica en el estudio.

vivienda <- mutate(vivienda, piso = as.numeric(piso))
vivienda<- vivienda %>%
  select(-longitud, -latitud, -id)

b. Procesamiento de datos faltantes

A continuación, se detallará la cantidad de datos faltantes por cada variable. Este análisis es relevante, ya que permite evaluar si la base de datos contiene información válida. Además, este conocimiento puede ejercer influencia en las decisiones futuras basadas en el análisis y proporcionar orientación al decidir si es conveniente descartar ciertas variables.

faltantes_por_columna <- colSums(is.na(vivienda))
knitr::kable(faltantes_por_columna, caption = "Datos faltantes por variable")
Datos faltantes por variable
x
zona 3
piso 2638
estrato 3
preciom 2
areaconst 3
parqueaderos 1605
banios 3
habitaciones 3
tipo 3
barrio 3

A partir de los datos presentes en esta tabla, se genera el gráfico de barras que se muestra a continuación, el cual proporciona una representación visual significativa.

# porcentaje de datos perdidos para cada variable
porcentaje_perdidos <- sapply(vivienda, function(x) sum(is.na(x)) / length(x) * 100)

# data frame con los porcentajes
df_porcentaje <- data.frame(variable = names(porcentaje_perdidos), porcentaje = porcentaje_perdidos)

# Gráfica de barras
ggplot(df_porcentaje, aes(x = variable, y = porcentaje)) +
  geom_bar(stat = "identity", fill = "dodgerblue") +
  labs(title = "Porcentaje de Datos Perdidos por Variable", x = "Variable", y = "Porcentaje (%)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Tras analizar la gráfica y la tabla anteriores, se observa que las variables “parqueaderos” y “piso” presentan tasas de datos faltantes del 19.3% y 31.7%, respectivamente. En consecuencia, se ha decidido descartar estos atributos en el análisis. Esta elección se fundamenta en la necesidad de evitar una posible pérdida significativa de información si se optara por utilizar únicamente los datos disponibles en estas variables. Eliminar estos atributos por completo evitará la necesidad de eliminar un porcentaje equivalente de datos en otras columnas para mantener un análisis coherente y conjunto. Además, se ha optado por no imputar los valores faltantes utilizando la media u otros métodos, ya que esto podría introducir sesgos considerables en el conjunto de datos, particularmente debido a la naturaleza discreta de los datos.

#Eliminaciòn de columnas parqueaaderos y piso
vivienda<- vivienda %>%
  select(-parqueaderos, -piso)

Ademas se observó que las variables “zona”, “estrato”, “areaconst”, “banios”, “habitaciones”, “tipo”, “barrio” y “preciom” presentaron un porcentaje de datos faltantes que se aproxima a cero por ciento. Esto implica que en prácticamente todas las observaciones de la base de datos, estas variables cuentan con información completa . Debido a que el porcentaje de datos faltantes es extremadamente bajo para, es razonable concluir que su falta no tendrá un impacto significativo en el análisis posterior. La eliminación de un número tan reducido de registros que contienen valores faltantes en estas variables no introducirá un sesgo importante en los resultados generales. Por lo tanto, se ha decidió llevar a cabo la eliminación de estos registros con datos faltantes en las variables mencionadas.

# Eliminacion de observaciones con datos faltantes 
datos_sin_na <- vivienda[complete.cases(
vivienda$zona ,vivienda$estrato ,vivienda$areaconst ,vivienda$banios ,vivienda$habitaciones ,vivienda$tipo ,vivienda$barrio ,vivienda$preciom), ]

A partir de la eliminaciòn de esos registros Se constató que en el nuevo conjunto de datos se registraron 8319 observaciones, lo que implica que únicamente se encontraron tres casos con valores faltantes, y precisamente en estos tres casos se concentraban todas las ausencias de datos para los atributos.

c. Descripción estadistica variables cuantitativas

Se realizó un resumen estadístico inicial para obtener una visión general de las variables cuantitativas presentes en la base de datos.

#Seleccionar las variables cuantitativas
columnas_seleccionadas <- select(datos_sin_na,estrato ,areaconst ,banios ,habitaciones, preciom)
# Aplicar la función summary solo a las columnas seleccionadas
resumen<-summary(columnas_seleccionadas)

knitr::kable(resumen, caption = "Resumen indicadores")
Resumen indicadores
estrato areaconst banios habitaciones preciom
Min. :3.000 Min. : 30.0 Min. : 0.000 Min. : 0.000 Min. : 58.0
1st Qu.:4.000 1st Qu.: 80.0 1st Qu.: 2.000 1st Qu.: 3.000 1st Qu.: 220.0
Median :5.000 Median : 123.0 Median : 3.000 Median : 3.000 Median : 330.0
Mean :4.634 Mean : 174.9 Mean : 3.111 Mean : 3.605 Mean : 433.9
3rd Qu.:5.000 3rd Qu.: 229.0 3rd Qu.: 4.000 3rd Qu.: 4.000 3rd Qu.: 540.0
Max. :6.000 Max. :1745.0 Max. :10.000 Max. :10.000 Max. :1999.0

A partir de la tabla anterior, se pueden extraer algunas observaciones relevantes sobre las características de las viviendas. Por ejemplo, al examinar los atributos de baños y habitaciones, se identifican tanto los valores mínimos como máximos que presentan estas variables en las viviendas de la muestra. Respecto al atributo de estrato, se observa que el valor mínimo es 1 y el máximo es 6, lo que sugiere la existencia de seis niveles de estrato diferentes.

Además, al analizar las medidas de tendencia central, como la media y la mediana, se puede destacar que, en la mayoría de los casos, la media es mayor que la mediana. Esta disparidad entre la media y la mediana indica que la distribución de los datos tiende a sesgarse hacia la derecha o hacia valores superiores a la media. En otras palabras, hay valores extremadamente altos que están influyendo en la media y desplazando la distribución hacia ese extremo. Este fenómeno puede sugerir la presencia de viviendas con características excepcionales o atípicas que están elevando el promedio de baños, habitaciones y otras variables analizadas.

Medidas de variabilidad

Se aplicaron las siguientes medidas, considerando la naturaleza discreta de todas las variables cuantitativas en la base de datos. Esto permite obtener las siguientes medidas de variabilidad: desviación estándar y rango intercuartil. Estas medidas no solo brindan información sobre la dispersión de los datos, sino que también contribuyen a evaluar la confiabilidad de los indicadores de tendencia central.

# Calcular la desviación estándar y el rango intercuartil para cada columna
resultados <- sapply(columnas_seleccionadas, function(col) c(sd(col, na.rm = TRUE), IQR(col, na.rm = TRUE)))
# Convertir los resultados en un data frame y agregar nombres de filas
resultados_df <- data.frame(resultados)
rownames(resultados_df) <- c("DesviacionEstandar", "RangoIntercuartil")

# Mostrar los resultados
knitr::kable(resultados_df, caption = "Desviacion estandar y Rango intercuartil")
Desviacion estandar y Rango intercuartil
estrato areaconst banios habitaciones preciom
DesviacionEstandar 1.029222 142.9641 1.42821 1.459537 328.665
RangoIntercuartil 1.000000 149.0000 2.00000 1.000000 320.000

El análisis del Rango Intercuartil (RI) revela diferentes niveles de dispersión en las variables. Un RI de 1.000 en estrato indica una concentración estrecha de datos, mientras que en areaconst con un RI de 149.0000 se observa una mayor variabilidad en las áreas de construcción. Para banios y habitaciones, un RI de 2.000 y 1.000 respectivamente sugiere similitud en la mayoría de propiedades, es decirla misma cantidad de habitaciones, con posibles valores atípicos.En preciom, el RI de 320.0000 señala amplia dispersión en los precios de propiedades debido a diversas características. Respecto a la Desviación Estándar, valores cercanos a uno en estrato, banios, habitaciones, indican agrupamiento de datos en torno a la media, mientras que desviaciones más altas en areaconst y preciom sugieren mayor dispersión y posible presencia de valores atípicos, influyendo en la confiabilidad de las medidas de tendencia central.

Medidas de tendencia central
calcular_moda <- function(vector) {
  tabla_frecuencia <- table(vector)
  moda <- as.numeric(names(tabla_frecuencia)[which.max(tabla_frecuencia)])
  return(moda)
}

resultadoss <- sapply(columnas_seleccionadas, function(col) c(mean(col, na.rm = TRUE), median(col, na.rm = TRUE), calcular_moda(col)))

resultados_dff <- data.frame(resultadoss)
rownames(resultados_dff) <- c("Media", "Mediana", "Moda")

# Mostrar los resultados
knitr::kable(resultados_dff, caption = "Media, Mediana y Moda")
Media, Mediana y Moda
estrato areaconst banios habitaciones preciom
Media 4.63361 174.9349 3.111311 3.605361 433.9044
Mediana 5.00000 123.0000 3.000000 3.000000 330.0000
Moda 5.00000 60.0000 2.000000 3.000000 350.0000

Con base en la tabla previa y centrándose en el análisis de la moda, se pueden identificar patrones claros que reflejan las preferencias predominantes en el mercado de viviendas. La moda, al indicar los valores más frecuentes en los datos, revela una tendencia notable hacia ciertas características entre los compradores potenciales. Específicamente, parece haber una fuerte preferencia por propiedades ubicadas en estrato 5, con un área construida aproximada de 60 metros cuadrados, dos baños, tres habitaciones y un precio cercano a los 350 millones. Estos resultados sugieren que estas especificaciones son altamente demandadas por los compradores en este mercado inmobiliario, lo que es útil para orientar las estrategias de oferta y demanda en este sector.

d. Descripcion estadistica para variables cualitativas

Para el caso de datos cualitativos o categóricos, no resulta viable calcular medidas de tendencia central o variabilidad (excepto la moda), ya que estas métricas carecen de sentido en un contexto no numérico. En cambio, es más efectivo analizar este tipo de datos utilizando representaciones gráficas, como gráficos de barras o tablas de frecuencia.En el siguiente segmento, se aplicaran estas herramientas visuales para un análisis más detallado.

Es importante tener en cuenta que el atributo “barrio” cuenta con un total de 436 valores únicos. Esta gran cantidad de valores podría dificultar la realización de un análisis efectivo mediante representaciones gráficas convencionales. Sin embargo, a pesar de esta complejidad, se ha optado por generar un gráfico de Treemap para visualizar los barrios con mayor número de casas, lo que permitirá obtener una perspectiva general sobre la distribución de las propiedades en diferentes áreas.

#Seleccionar las variables cualitativas
columnas_seleccionadas2 <- select(datos_sin_na,zona ,tipo,barrio)
# Estandarizar los valores de la variable "tipo"
columnas_seleccionadas2 <- columnas_seleccionadas2 %>% mutate(tipo = recode(tipo, "Apartamento" = "apartamento", "APARTAMENTO" = "apartamento", "apto" = "apartamento", "Casa" = "casa", "casa" = "casa", "CASA" = "casa", "NA" = "NA"))
Tipos de vivienda
tabla1<-table(columnas_seleccionadas2$tipo)
tabla2<-table(columnas_seleccionadas2$zona)
tabla3<-table(columnas_seleccionadas2$barrio)
knitr::kable(tabla1, caption = "Tabla de Tipos de Vivienda")
Tabla de Tipos de Vivienda
Var1 Freq
apartamento 5100
casa 3219
# Graficar tabla1
barplot(tabla1, main = "Gráfico de Barras - Tipos de Vivienda", xlab = "Tipo de Vivienda", ylab = "Frecuencia")

A partir del gráfico y la tabla para la variable “tipo”, se revela una diferencia notable en la frecuencia de las dos categorías, “apartamento” y “casa”. El hecho de que “apartamento” tenga una frecuencia de 5106 y “casa” tenga una frecuencia de 3221 sugiere que los apartamentos son significativamente más el tipo de vivienda mas ofertado y con mas preferencia por los compradores en comparación con las casas.

Barrios
# Convertir la tabla de frecuencias en un dataframe
df_frecuencias_barrio <- as.data.frame(tabla3)

# Renombrar las columnas del dataframe
colnames(df_frecuencias_barrio) <- c("barrio", "frecuencia")

# Ordenar el dataframe por frecuencia
df_frecuencias_barrio <- df_frecuencias_barrio[order(df_frecuencias_barrio$frecuencia, decreasing = TRUE),]

# Crear el gráfico de treemap
treemap(df_frecuencias_barrio, index = "barrio", vSize = "frecuencia", title = "Gráfico de Treemap para Barrios")

cantidad_valores_unicos <- length(unique(columnas_seleccionadas2$barrio))
print(cantidad_valores_unicos)
## [1] 436

El análisis del gráfico treemap revela una notable concentración de viviendas en los barrios Valle del Lili, Ciudad Jardín, Pance y La Flora, sugiriendo que estos son los más representativos en términos de oferta inmobiliaria. Aunque hay una diversidad de barrios adicionales que no se visualizan claramente debido a su cantidad, la representación gráfica ofrece una valiosa visión sobre los barrios más prominentes. Esta distribución espacial podría indicar una preferencia de los compradores potenciales por estas áreas, dada su mayor disponibilidad de viviendas y posiblemente otras características deseables del entorno.

Distribuciòn de zonas
knitr::kable(tabla2, caption = "Tabla Zona")
Tabla Zona
Var1 Freq
Zona Centro 124
Zona Norte 1920
Zona Oeste 1198
Zona Oriente 351
Zona Sur 4726
# Graficar tabla2

resumen_genero <- table(columnas_seleccionadas2$zona)


# Crea el gráfico de pastel utilizando ggplot2
grafico_pastel <- ggplot(data = as.data.frame(resumen_genero), aes(x = "", y = Freq, fill = Var1)) +
                 geom_bar(stat = "identity", width = 1) +
                 coord_polar(theta = "y") +
                 theme_void() +
                 labs(title = "Distribución de zonas")+
                 geom_text(aes(label = Freq), position = position_stack(vjust = 0.5), size = 4)

# Imprime el gráfico
print(grafico_pastel)

A partir del gráfico y la tabla para la variable “zona”, Se observa una distribución desigual en la frecuencia de las categorías geográficas. con mayor densidad en la “Zona Sur” ya que tiene la frecuencia más alta, con 4726 observaciones, siendo un poco mas del 50% de los datos, lo que sugiere una preeminencia significativa. Por otro lado, “Zona Norte” sigue con una frecuencia considerable de 1920 observaciones. Las demás zonas, como “Zona Oeste”, “Zona Oriente” y “Zona Centro”, presentan frecuencias más bajas, con 1198, 351 y 124 observaciones respectivamente.

e. Anàlisis multivariado

Para llevar a cabo un análisis más completo y esclarecedor, optaré por utilizar gráficos de boxplot. Estos gráficos proporcionan una visión clara de las relaciones entre los distintos atributos, centrándome especialmente en el precio. El precio es un indicador crucial que refleja el valor percibido de las viviendas en el mercado inmobiliario.

# Crear la boxplot

ggplot(datos_sin_na, aes(x = tipo, y = preciom)) +
  geom_boxplot() +
  labs(x = "Tipo de propiedad", y = "Precio") +
  ggtitle("Boxplot de Precio según Tipo de Propiedad")

A partir del análisis de la gráfica boxplot anterior, se observa que el 50% de las casas tienen precios más altos que el 75% de los apartamentos, lo que sugiere que en general, las casas tienden a ser más costosas que los apartamentos. Además, se identifica que tambien hay algunas casas con precios similares a los de los apartamentos.

Es importante destacar la presencia de outliers en ambos tipos de vivienda. Estos valores atípicos pueden representar casos excepcionales, donde algunas propiedades tienen precios significativamente más altos que el resto debido a características únicas o condiciones especiales. Por ejemplo, es posible encontrar casas o apartamentos con precios cercanos a los 2000 millones, lo que sugiere que ciertas propiedades pueden justificar precios extraordinarios basados en sus características particulares.

# Crear la boxplot

ggplot(datos_sin_na, aes(x = zona, y = preciom)) +
  geom_boxplot() +
  labs(x = "Zona", y = "Precio") +
  ggtitle("Boxplot de Precio según la zona")

ggplot(datos_sin_na, aes(x = tipo, y = preciom, fill = zona)) +
  geom_boxplot() +
  labs(x = "Tipo de propiedad", y = "Precio", fill = "Zona") +
  ggtitle("Boxplot de Precio según Tipo de Propiedad y Zona")

Teniendo en cuenta tanto el tipo de vivienda como la zona, se pueden extraer varias conclusiones importantes del gráfico boxplot anterior. En primer lugar, se observa que las viviendas ubicadas en la zona oeste son las de mayor precio, independientemente de si son casas o apartamentos. Esto sugiere que la ubicación en la zona oeste está asociada con propiedades más costosas en general. Al analizar la zona sur, se destaca que las casas tienden a tener precios más altos que los apartamentos en esa misma zona. Esto indica una preferencia por las casas en la zona sur, posiblemente debido a factores como el tamaño del terreno, la privacidad o la calidad de vida asociada con este tipo de viviendas.

Por otro lado, se observa que las zonas centro y oriente tienen precios más bajos tanto para casas como para apartamentos en comparación con otras zonas. Es interesante notar que, si recordamos el gráfico de pastel que muestra la popularidad de las zonas, la zona sur era la más popular. Esto sugiere que aunque la demanda de viviendas en la zona sur es alta, el precio de las casas allí supera significativamente el de los apartamentos, lo que podría deberse a una combinación de factores como la oferta limitada de casas en esa zona y la preferencia de los compradores.

Además, es importante tener en cuenta la presencia de outliers en ambos tipos de vivienda y en todas las zonas. Estos valores atípicos pueden estar asociados con características especiales de las propiedades que justifican precios más altos. En las zonas centro y oriente, donde se presentan menos outliers, los precios de los apartamentos tienden a ser más consistentes en comparación con las casas, lo que sugiere una menor variabilidad en los precios de los apartamentos en esas zonas.

ggplot(datos_sin_na, aes(x = tipo, y = areaconst, fill = zona)) +
  geom_boxplot() +
  labs(x = "Tipo de propiedad", y = "Area construida", fill = "Zona") +
  ggtitle("Boxplot de Area construida según Tipo de Propiedad y Zona")

A partir del análisis del boxplot anterior, se pueden extraer varias conclusiones importantes, considerando la distribución de las viviendas en diferentes zonas y tipos.

En primer lugar, se observa una tendencia consistente en todas las zonas, donde las casas tienden a tener un área construida mayor en comparación con los apartamentos. Esta diferencia sugiere que los compradores pueden preferir casas por su tamaño y espacio habitable adicional.

Al analizar la distribución por zonas, se destaca que las viviendas en la zona oeste tienden a tener el área construida más grande en comparación con otras zonas. Esto podría indicar una mayor disponibilidad de espacio en esta área, posiblemente debido a un desarrollo urbano más expansivo.

En cuanto al precio, se observa que los apartamentos en la zona sur tienden a ser más asequibles en comparación con otras zonas. Esto podría estar relacionado con el hecho de que la zona sur tiene una mayor proporción de apartamentos en comparación con las casas. Los apartamentos tienden a tener un precio más bajo en general.

En general, el análisis de los boxplots sugiere que la distribución de las viviendas en diferentes zonas y tipos está relacionada con el tamaño del área construida y el precio.

ggplot(datos_sin_na, aes(x = tipo, y = habitaciones, fill = zona)) +
  geom_boxplot() +
  labs(x = "Tipo de propiedad", y = "Habitaciones", fill = "Zona") +
  ggtitle("Boxplot de numero de habitaciones según Tipo de Propiedad y Zona")

Tras analizar el gráfico anterior, se destaca que la mayoría de los apartamentos, sin importar su ubicación geográfica, suelen tener aproximadamente tres habitaciones, lo que coincide con la moda en el número de habitaciones. Este patrón sugiere una preferencia generalizada por apartamentos con este numero de habitaciones. En contraste, las casas muestran una mayor variabilidad en cuanto al número de habitaciones, con algunos casos que llegan hasta diez habitaciones. En la zona sur, el 75% de las casas tienen cinco habitaciones o menos, lo que sugiere una preferencia por viviendas de tamaño moderado en esta área.

Àrea VS Precio

grafico_dispersion<-ggplot(columnas_seleccionadas, aes(x = columnas_seleccionadas$areaconst, y = columnas_seleccionadas$preciom)) +
  geom_point(color = "blue", shape = 16) +
  labs(title = "Área Vs Precio", x = "Área en m2", y = "Precio en millones")

# Calcular el índice de correlación
indice_correlacion <- cor(columnas_seleccionadas$areaconst, columnas_seleccionadas$preciom)

# Agregar el índice de correlación al gráfico
grafico_dispersion +
  geom_text(aes(label = paste("Correlación:", round(indice_correlacion, 2))),
            x = max(columnas_seleccionadas$areaconst), y = max(columnas_seleccionadas$preciom),
            hjust = 1, vjust = 1, color = "red")

Al examinar el gráfico previo, fue evidenete la concentración significativa de observaciones dentro del rango de áreas de 0 a 500 metros cuadrados y precios entre 0 y 1000 millones de pesos. Esta observación sugiere que la mayoría de las viviendas disponibles se encuentran en este intervalo específico de precios y áreas. Esta concentración podría indicar una preferencia o demanda considerable por viviendas que se ajustan a este rango.

Además, al considerar el índice de correlación lineal de 0.69 entre el precio y el área, se toma en cuenta la posibilidad de una relación lineal moderada entre estas dos variables. Esta cifra indica que, en general, cuando el área de una vivienda aumenta, existe una tendencia a que el precio también aumente. Sin embargo, es importante destacar que la correlación no implica necesariamente causalidad. Si bien existe una conexión lineal, no se puede concluir directamente que un aumento en el área sea la única razón detrás del aumento en el precio.

f. Anàlisis de componentes principales

Lo primero que se realiza es la estandarización de los datos, dado que algunos atributos tienen valores en rangos significativamente mayores que otros. Esto es importante para garantizar que todas las variables contribuyan de manera equitativa al análisis y para evitar que las diferencias en la escala de los datos afecten de manera desproporcionada el resultado del análisis.

# Estandarizar todas las columnas numéricas del dataframe 
datos_estandarizados <- as.data.frame(scale(columnas_seleccionadas))

# Mostrar los primeros registros del dataframe estandarizado
head(datos_estandarizados)
##      estrato  areaconst      banios habitaciones    preciom
## 1 -1.5872276 -0.7339949 -0.07793773    1.6406840 -0.5595498
## 2 -1.5872276 -0.3842568 -0.77811479   -0.4147626 -0.3465670
## 3 -1.5872276  0.3152194 -0.77811479    0.2703863 -0.2552886
## 4 -0.6156201  0.7349051  1.32241640   -0.4147626 -0.1031580
## 5  0.3559875 -0.5940997 -0.77811479   -0.4147626 -0.5291236
## 6  0.3559875 -0.6150839 -0.07793773   -0.4147626 -0.5899759
# Aplicar PCA al dataframe
resultado_pca <- prcomp(columnas_seleccionadas, scale = TRUE)

# Mostrar el resumen del resultado
summary(resultado_pca)
## Importance of components:
##                           PC1    PC2     PC3     PC4    PC5
## Standard deviation     1.7126 1.0901 0.66735 0.49161 0.4376
## Proportion of Variance 0.5866 0.2377 0.08907 0.04834 0.0383
## Cumulative Proportion  0.5866 0.8243 0.91337 0.96170 1.0000

La tabla proporcionada ofrece información valiosa sobre la importancia de los componentes en un análisis de datos mediante componentes principales (PCA), considerando tanto la desviación estándar como la proporción de varianza explicada por cada componente. Al observar los valores presentados, se puede notar una tendencia clara: a medida que se avanza de la primera componente hasta la última, tanto la proporción de varianza como la desviación estándar tienden a disminuir. Este patrón puede explicarse debido a que la primera componente principal, con una proporción de varianza del 58.7%, capta la mayor parte de la variabilidad en los datos. Al representar la dirección principal de variación en el espacio de las variables originales, es natural que su desviación estándar sea relativamente alta. Esto sugiere que las observaciones individuales en esta componente están más dispersas alrededor de su media. Como resultado, las siguientes componentes principales tienden a explicar menos variabilidad y, por lo tanto, muestran desviaciones estándar más bajas en comparación con la primera componente principal.

La segunda componente principal, aunque todavía significativa con una proporción de varianza del 23.8%, explica una cantidad menor de variabilidad en comparación con la primera. Sin embargo, al considerar la proporción acumulada, que indica el total de varianza explicada por las dos primeras componentes, se destaca que juntas explican el 82.4% de la variabilidad en los datos. Esto resalta la importancia de estas dos primeras componentes principales en la comprensión de la estructura de los datos.

# Visualizar las cargas de los componentes principales
print(resultado_pca$rotation)
##                    PC1        PC2        PC3        PC4        PC5
## estrato      0.3300032 -0.6744363 -0.4208934 -0.4795545 -0.1706159
## areaconst    0.4940473  0.1638135  0.6525373 -0.2984641 -0.4628138
## banios       0.5189619  0.1092831 -0.3767649  0.6647648 -0.3672488
## habitaciones 0.3475270  0.6538568 -0.4051685 -0.4359154  0.3122700
## preciom      0.5068715 -0.2807656  0.3015468  0.2213868  0.7240921

En la tabla previa, las cargas de las componentes principales proporcionan información sobre cómo cada variable contribuye a la definición de cada componente principal, considerando que los datos han sido estandarizados.

#####Elección del número de componentes principales

fviz_eig(resultado_pca, addlabels = TRUE)

La gráfica confirma de manera clara y concisa la información anteriormente mencionada. Visualmente, se aprecia que la dimensión 1 (PC1) tiene una contribución más significativa, representando un 58.7% de variabilidad, mientras que la dimensión 2 (PC2) muestra una contribución menor, con un 23.8% de variabilidad explicada.

fviz_pca_var(resultado_pca,
              col.var = "contrib", # Color by contributions to the PC
       gradient.cols = c("#FF7F00", "#034D94"),
       repel = TRUE,   # Avoid text overlapping
       xlim = c(-1, 1), # Establecer límites en el eje x
       ylim = c(-1, 1)  # Establecer límites en el eje y
             
)
## Coordinate system already present. Adding new coordinate system, which will
## replace the existing one.

var <- get_pca_var(resultado_pca)
var
## Principal Component Analysis Results for variables
##  ===================================================
##   Name       Description                                    
## 1 "$coord"   "Coordinates for the variables"                
## 2 "$cor"     "Correlations between variables and dimensions"
## 3 "$cos2"    "Cos2 for the variables"                       
## 4 "$contrib" "contributions of the variables"
fviz_contrib(resultado_pca, choice = "var", axes = 1)

fviz_contrib(resultado_pca, choice = "var", axes = 2)

Según las tablas anteriores y el grafico de Variables-PCA, se identifica que las variables “habitaciones” y “estrato” exhiben una carga destacada en la segunda dimensión, sugiriendo una contribución significativa a esta dimensión. En contraste, “precio”, “areacont” y “baños” muestran cargas más bajas, indicando una contribución menor. Respecto a la primera dimensión, “areaconst” y “precio” sobresalen como las variables principales. La proximidad observada entre estas dos variables en el gráfico sugiere una posible correlación y una relación similar con las dimensiones. Es importante destacar que todas las variables exhiben una magnitud cercana al borde del círculo en el gráfico, lo que indica una contribución sustancial a las componentes principales y una explicación significativa de la variabilidad en los datos. En general la dimensión 2 muestra una fuerte asociación con el estrato y el número de habitaciones, mientras que la dimensión 2 está más vinculada con la superficie construida, el número de baños y el precio.

# Graficar el PCA
pca_plot <- fviz_pca_ind(resultado_pca, geom = "point", pointsize = 1.0)

# Convertir el gráfico a un gráfico interactivo de Plotly
pca_plot_interactivo <- ggplotly(pca_plot, tooltip = c("text"))

# Mostrar el gráfico interactivo
pca_plot_interactivo

A partir del anterior grafico a simple vista se pueden ver muchos puntos juntos no se puede diferenciar mucho ya que son muchos registros, solo se puede evr una tendencia hacia la derecha es decir a lo largo de Dim1 , para hacer una anlisis mas espesifico se van a señalar cuatro caso extremos como viene a ocntinuacion

datos<- rbind(columnas_seleccionadas[5342,], 
columnas_seleccionadas[3354,],
columnas_seleccionadas[41,],
columnas_seleccionadas[1762,])

datos <- as.data.frame(datos)
rownames(datos) = c("5342","3354","41","1762")
datos
##      estrato areaconst banios habitaciones preciom
## 5342       6       296      0            0    1200
## 3354       3       150      2            9     250
## 41         3        60      1            1      92
## 1762       6      1586      4            5    1800
casos1 <- rbind(resultado_pca$x[41,1:2],resultado_pca$x[1762,1:2]) # CP1
rownames(casos1) = c("98","299")
casos1 <- as.data.frame(casos1)

casos2 <- rbind(resultado_pca$x[3354,1:2], resultado_pca$x[5342,1:2]) # CP2
rownames(casos2) = c("6","190")
casos2 <- as.data.frame(casos2)

fviz_pca_ind(resultado_pca, col.ind = "#DEDEDE", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) +
geom_point(data = casos1, aes(x = PC1, y = PC2), color = "red", size = 3) +
geom_point(data = casos2, aes(x = PC1, y = PC2), color = "blue", size = 3)

En el análisis realizado, se observa una clara tendencia en la primera dimensión del PCA, donde los valores aumentan de izquierda a derecha. El caso extremo a la izquierda (41) muestra un área construida de 60 metros cuadrados y un precio de 92 millones, mientras que el caso extremo a la derecha (1762) exhibe un área construida considerablemente mayor, de 1586 metros cuadrados, y un precio significativamente superior, de 1800 millones. En cuanto a la segunda componente principal, también identificamos una tendencia clara. El caso extremo inferior (5342) muestra una disminución tanto en el área construida como en el precio en comparación con el caso extremo superior (3354).

fviz_pca_biplot(resultado_pca,geom = "point", pointsize = 1.0)

g. Anàlisis de conglomerados

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.

Dado que las variables tienen rangos diferentes, se opta por estandarizarlas.

viviendag= datos_sin_na[1:6]
Vivienda_std = scale(viviendag)
Vivienda_estan= as.data.frame(Vivienda_std)
head(Vivienda_estan,10)
##          zona    estrato    preciom  areaconst      banios habitaciones
## 1   0.9786060 -1.5872276 -0.5595498 -0.7339949 -0.07793773    1.6406840
## 2   0.9786060 -1.5872276 -0.3465670 -0.3842568 -0.77811479   -0.4147626
## 3   0.9786060 -1.5872276 -0.2552886  0.3152194 -0.77811479    0.2703863
## 4  -0.0732058 -0.6156201 -0.1031580  0.7349051  1.32241640   -0.4147626
## 5  -1.1250176  0.3559875 -0.5291236 -0.5940997 -0.77811479   -0.4147626
## 6  -1.1250176  0.3559875 -0.5899759 -0.6150839 -0.07793773   -0.4147626
## 7  -1.1250176 -0.6156201 -0.6508281 -0.8599006 -0.77811479   -0.4147626
## 8  -1.1250176  0.3559875 -0.3769931 -0.2653459 -0.07793773    0.2703863
## 9  -1.1250176  0.3559875 -0.3465670 -0.1744140  0.62223934    1.6406840
## 10 -1.1250176  0.3559875  1.0530344  1.4343813 -0.07793773   -0.4147626

A continuación, se llevará a cabo el análisis del codo de distribución para determinar el número óptimo de clusters. En el gráfico resultante, el “codo” representa el punto en el que la reducción en la variación total dentro de los clusters comienza a aplanarse. Este fenómeno indica que agregar más clusters no conduce a una mejora significativa en la agrupación de los datos. Por lo tanto, el número óptimo de clusters, en este caso, se identifica en el punto del codo, el cual se observa en 3 clusters.

fviz_nbclust(Vivienda_estan, kmeans, method = "wss") + geom_vline(xintercept = 3, linetype = 2)

A continuación, se procede a aplicar el algoritmo K-Means con el objetivo de agrupar los datos en tres grupos distintos (centers = 3). Es importante destacar que la función K-Means también ofrece el parámetro nstart, el cual realiza múltiples inicializaciones y selecciona la mejor solución encontrada.

k3 <- kmeans(Vivienda_estan, centers = 3, nstart = 25)
str(k3)
## List of 9
##  $ cluster     : int [1:8319] 2 2 2 2 2 2 2 2 1 1 ...
##  $ centers     : num [1:3, 1:6] -0.194 -0.334 1.037 0.146 -0.451 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:3] "1" "2" "3"
##   .. ..$ : chr [1:6] "zona" "estrato" "preciom" "areaconst" ...
##  $ totss       : num 49908
##  $ withinss    : num [1:3] 10551 10409 6436
##  $ tot.withinss: num 27395
##  $ betweenss   : num 22513
##  $ size        : int [1:3] 1481 4962 1876
##  $ iter        : int 3
##  $ ifault      : int 0
##  - attr(*, "class")= chr "kmeans"

En resumen, esta salida proporciona información sobre cómo se agruparon los datos, la ubicación de los centroides de los clusters, la variabilidad dentro y entre los grupos, así como detalles sobre la convergencia del algoritmo.Se observa tambien que las agrupaciones resultan en 3 tamaños de clústers de 1481, 4962 y 1876.

El comando fviz_cluster es una herramienta útil para visualizar los grupos identificados en un análisis de clustering. Si el conjunto de datos tiene más de dos dimensiones, esta función realiza un análisis de componentes principales (PCA) para reducir la dimensionalidad y trazar los puntos de datos en el espacio bidimensional de los dos primeros componentes principales, que explican la mayor parte de la varianza en los datos. Esta visualización proporciona una representación gráfica de cómo estos grupos se distribuyen en función de las variables originales.

fviz_cluster(k3, data = Vivienda_estan)

A continuation se agrega una nueva columna al dataframe en donde cada fila se etiqueta con el número de cluster al que pertenece según el resultado del algoritmo de clustering.

Vivienda_estan$clus<-as.factor(k3$cluster)
head(Vivienda_estan,10)
##          zona    estrato    preciom  areaconst      banios habitaciones clus
## 1   0.9786060 -1.5872276 -0.5595498 -0.7339949 -0.07793773    1.6406840    2
## 2   0.9786060 -1.5872276 -0.3465670 -0.3842568 -0.77811479   -0.4147626    2
## 3   0.9786060 -1.5872276 -0.2552886  0.3152194 -0.77811479    0.2703863    2
## 4  -0.0732058 -0.6156201 -0.1031580  0.7349051  1.32241640   -0.4147626    2
## 5  -1.1250176  0.3559875 -0.5291236 -0.5940997 -0.77811479   -0.4147626    2
## 6  -1.1250176  0.3559875 -0.5899759 -0.6150839 -0.07793773   -0.4147626    2
## 7  -1.1250176 -0.6156201 -0.6508281 -0.8599006 -0.77811479   -0.4147626    2
## 8  -1.1250176  0.3559875 -0.3769931 -0.2653459 -0.07793773    0.2703863    2
## 9  -1.1250176  0.3559875 -0.3465670 -0.1744140  0.62223934    1.6406840    1
## 10 -1.1250176  0.3559875  1.0530344  1.4343813 -0.07793773   -0.4147626    1

Se transforma el formato del dataframe a un Long format.

Vivienda_estan$clus<-factor(Vivienda_estan$clus)
data_long <- gather(Vivienda_estan,caracteristica,valor,zona:habitaciones,factor_key=TRUE)
head(data_long,10)
##    clus caracteristica      valor
## 1     2           zona  0.9786060
## 2     2           zona  0.9786060
## 3     2           zona  0.9786060
## 4     2           zona -0.0732058
## 5     2           zona -1.1250176
## 6     2           zona -1.1250176
## 7     2           zona -1.1250176
## 8     2           zona -1.1250176
## 9     1           zona -1.1250176
## 10    1           zona -1.1250176
ggplot(data_long, aes(as.factor(x = caracteristica), y = valor,group=clus, colour = clus)) + stat_summary(fun = mean, geom="pointrange", size = 1)+stat_summary(geom="line")

Para una comprensión completa de la gráfica, es más efectivo analizar cómo cada cluster se compara con los otros clusters en relación con una variable específica, en lugar de basarse exclusivamente en los valores del eje y.Esto se debe a que lo más importante es identificar si un cluster muestra valores más altos o más bajos para una variable en particular en comparación con otros clusters, sin necesariamente enfocarse en los valores. Esta metodología resulta importante debido a la transformación de los datos al formato largo, que complica la asociación directa con las variables originales, además, al considerar la estandarización de los datos, los valores específicos pueden no ser tan significativos como las tendencias generales y las diferencias relativas entre los clusters.

La interpretación de la gráfica revela la presencia de tres claros grupos distintivos. En el primer cluster, se observa que los estratos para las viviendas de este grupo son mayores que los del cluster 2 y menores que los del cluster 3. Asimismo, el precio es mayor que en los otros dos clusters, al igual que el área construida, número de baños y habitaciones.

Respecto al cluster 2, todas las variables para las viviendas en este grupo son menores en comparación con los otros dos clusters.

Para el cluster 3, se observa que el estrato es mayor en comparación con los otros dos clusters, mientras que el precio es mayor que en el cluster 2 y menor que en el cluster 1. Asimismo, el área construida, número de baños y habitaciones siguen un patrón similar.

A partir de esto, se puede concluir que existen tres grupos distintos de viviendas, cada uno con sus propias características. Esta variabilidad entre los clusters sugiere que la oferta inmobiliaria se segmenta en grupos bien definidos.

h. Anàlisis de correspondencia

Examinar la relación entre las variables categóricas (tipo de vivienda, zona y barrio) y las variables numéricas para identificar patrones de comportamiento del mercado inmobiliario.

A continuaciòn se ven las tablas de contingencia para las variables zona vs estrato y zona vs tipo de vivienda

tabla <- table(datos_sin_na$zona, datos_sin_na$estrato)
print(tabla)
##    
##        3    4    5    6
##   1  105   14    4    1
##   2  572  407  769  172
##   3  382 1616 1685 1043
##   4  340    8    2    1
##   5   54   84  290  770
tabla1 <- table(datos_sin_na$zona, datos_sin_na$tipo)
print(tabla1)
##    
##        1    2
##   1  100   24
##   2  722 1198
##   3 1939 2787
##   4  289   62
##   5  169 1029
chisq.test(tabla)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla
## X-squared = 3830.4, df = 12, p-value < 2.2e-16
chisq.test(tabla1)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla1
## X-squared = 690.93, df = 4, p-value < 2.2e-16

El resultado de este test para ambos casos indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), ya que es muy cercano a 0, indicando grado tipo de relación entre ellas.

Con este análisis se procede a realizar el análisis de correspondencia, la cual consiste en estimar las coordenadas para cada uno de los niveles de ambas variables y representarlas en un plano cartesiano. Es importante mencionar que este análisis se llevará a cabo únicamente para las variables “zona” vs “estrato”. Es necesario destacar que la función CA() del paquete FactoMineR está diseñada específicamente para análisis de correspondencia múltiple y no para tablas de contingencia simples como la de “zona” vs “tipo”. Por lo tanto, para este último caso, se realizará un gráfico de barras para su representación.

library(FactoMineR)
library(factoextra)
library(gridExtra)
resultados_ac <- CA(tabla)

# Crear la tabla de datos
datos <- data.frame(
  Zona = c("Centro", "Norte", "Oeste", "Oriente", "Sur"),
  Apartamento = c(24, 1198, 1029, 62, 2787),
  Casa = c(100, 722, 169, 289, 1939)
)

# Asignar colores a cada zona
colores <- c("red", "blue", "green", "orange", "purple")

# Graficar la tabla de contingencia con colores y leyenda más pequeña
barplot(as.matrix(datos[, -1]), 
        beside = TRUE, 
        legend.text = datos$Zona, 
        col = colores,  # Asignar colores
        main = "Cantidad de Apartamentos y Casas por Zona",
        xlab = "Tipo", 
        ylab = "Cantidad",
        ylim = c(0, 3000),
        cex.legend = 0.7)  # Ajustar tamaño de la leyenda

Para la grafica CA factor map:

  • Los circulos azules son las zonas
  • Los triangulos rojos son los estratos

Las relaciones geográficas y socioeconómicas se evidencian de la siguiente manera: los estratos más altos, como el 6, se concentran en la Zona Oeste(5), mientras que los estratos 4 y 5 predominan en las Zonas Norte(2) y Sur(3) . Por otro lado, el estrato 3 se distribuye entre las Zonas Oriente(4) y Centro(1), delineando una estructura socioespacial definida en la ciudad.

A partir de la gráfica de barras, se observa que la menor cantidad de viviendas, tanto apartamentos como casas, se encuentran en la zona Centro, mientras que la mayor cantidad se encuentra en la zona Sur para ambos tipos de vivienda. Además, la segunda zona con más viviendas de ambos tipos es la zona Norte. Para los apartamentos, la tercera zona con mayor cantidad es la zona Oeste, seguida por la zona Oriente y luego la zona Centro. En el caso de las casas, la tercera zona con mas casas es la zona Oriente, seguida por la zona Oeste y luego la zona Centro.

Anàlisis de las dimensiones
valores_prop <-resultados_ac$eig ; valores_prop
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.32215213              69.965515                          69.96551
## dim 2 0.12745096              27.680002                          97.64552
## dim 3 0.01084108               2.354483                         100.00000
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
  ylab("Porcentaje de varianza explicado") + xlab("Dimensiones")

Los resultados indican que la primera componente explica el 70% devariabilidad, la segunda componente el 27.7% , entre las dos se explica el 97,7%

Con base en las graficas, se observa una estrecha relación entre el estrato y las zonas de la ciudad. Esta relación permite hacer recomendaciones específicas: ciertos estratos están asociados a áreas particulares de la ciudad. Además, se destaca una clara clasificación de las variables estrato y zona, lo que indica una agrupación efectiva y significativa.

i. Conclusiones

  1. Al analizar el mercado inmobiliario urbano, es importante considerar diversos factores para tomar decisiones informadas en la compra, venta y valoración de propiedades. Aspectos como la ubicación geográfica, el estrato socioeconómico, la cantidad de baños y habitaciones, y el tipo de vivienda, juegan un papel fundamental en determinar el valor y la demanda de una propiedad. Estar al tanto de estas variables permite a los compradores, vendedores y agentes inmobiliarios comprender mejor las dinámicas del mercado y tomar decisiones estratégicas que se ajusten a sus necesidades y objetivos

  2. En síntesis, existe una marcada relación entre la ubicación geográfica, el estrato socioeconómico y el valor de las propiedades. Mientras que la zona oeste tiende a tener propiedades de estrato más alto, las áreas orientales y centrales ofrecen alternativas más accesibles. Factores como la cantidad de baños y habitaciones, así como el tipo de vivienda, también impactan significativamente en los precios y la demanda. Los apartamentos son la elección predominante entre los compradores, indicando una tendencia hacia este tipo de propiedad en el mercado inmobiliario actual.

j. Recomendaciones generales

Al analizar la compra, venta y valoración de propiedades, es esencial considerar varios aspectos clave:

En la zona oeste de la ciudad, generalmente se encuentran propiedades con un estrato clasificado como 6. En contraste, para aquellos que buscan opciones con estratos más bajos que se ajusten a sus presupuestos, las áreas orientales y centrales suelen ser más adecuadas.

La cantidad de baños en una vivienda es un factor crucial que influye notablemente en su precio. Por tanto, al evaluar opciones de compra o venta, es fundamental tener en cuenta este aspecto.

En cuanto a la distribución de habitaciones, la mayoría de las viviendas presentan un promedio de tres habitaciones. Este dato puede ser relevante al considerar las preferencias y necesidades de los compradores.

Ees importante tener en cuenta que el precio de la vivienda está estrechamente relacionado con el área construida,

Los apartamentos la opción más demandada por los compradores.