1. Introducción

La ciencia de datos ha desempeñado un papel fundamental en la evolución del mercado inmobiliario, aportando herramientas avanzadas para abordar desafíos críticos al analizar extensas bases de datos y extraer información clave que oriente la toma de decisiones. En este contexto de crecimiento constante en el sector de bienes raíces, este informe se sumerge en un análisis meticuloso de un conjunto de datos que alberga información valiosa para el mercado inmobiliario en Cali. A través de un enfoque focalizado, se exploraran las características del conjunto de datos y se examinaran las relaciones entre variables, buscando identificar tendencias y patrones significativos. Aunque este análisis descriptivo no será exhaustivo, proporcionará un actor influyente en el mercado e información esencial para tomar decisiones estratégicas.

2. Objetivo

Realizar un análisis descriptivo a partir de la base de datos vivienda_faltantes recopilada por la empresa B&C, con el fin de identificar las tendencias y patrones en los datos sobre las viviendas.

3. Métodos

Para llevar a cabo el análisis descriptivo, procederemos siguiendo una serie de pasos fundamentales:

  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. Visualizacion de la distribucion de los datos

a. Estructura de los datos

Para conocer el tipo de datos de las variables y el tamaño de la base de datos se usó la siguiente función.

tiposdatos<-glimpse(vivienda_faltantes)
## Rows: 8,330
## Columns: 13
## $ id        <dbl> 8312, 8311, 8307, 8296, 8297, 8298, 8299, 8300, 8286, 8287, …
## $ zona      <chr> "Zona Oeste", "Zona Oeste", "Zona Oeste", "Zona Sur", "Zona …
## $ piso      <dbl> 4, 1, NA, 2, NA, NA, 2, NA, NA, 2, 1, NA, 6, NA, 2, 8, NA, 6…
## $ estrato   <dbl> 6, 6, 5, 3, 5, 5, 6, 5, 5, 5, 5, 3, 6, 3, 5, 6, 5, 6, 6, 6, …
## $ preciom   <dbl> 1300, 480, 1200, 220, 330, 1350, 305, 480, 275, 285, 310, 17…
## $ areaconst <dbl> 318, 300, 800, 150, 112, 390, 125, 280, 74, 120, 166, 155, 1…
## $ parquea   <dbl> 2, 1, 4, 1, 2, 8, 2, 4, 1, 2, 2, NA, 2, NA, 1, 2, 2, 2, 4, 1…
## $ banios    <dbl> 4, 4, 7, 2, 4, 10, 3, 4, 2, 4, 4, 4, 3, 2, 2, 3, 3, 5, 7, 1,…
## $ habitac   <dbl> 2, 4, 5, 4, 3, 10, 3, 4, 3, 3, 3, 6, 3, 3, 2, 4, 3, 4, 3, 2,…
## $ tipo      <chr> "Apartamento", "Casa", "Casa", "Casa", "Casa", "Casa", "Apar…
## $ barrio    <chr> "arboleda", "normandía", "miraflores", "el guabal", "bella s…
## $ longitud  <dbl> -76576, -76571, -76568, -76565, -76565, -76565, -76565, -765…
## $ latitud   <dbl> 3454.00000, 3454.00000, 3455.00000, 3417.00000, 3408.00000, …

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 10
Categoricas 3
Total 13
Total de observaciones: 8330

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.

vivienda_faltantes <- select(vivienda_faltantes,estrato ,areaconst ,banios ,habitac ,parquea ,piso , preciom, zona, tipo, barrio, longitud, latitud)

b. Procesamiento de datos faltantes

A continuación, se detallará la cantidad de datos faltantes por cada variable. Este análisis reviste una gran relevancia, 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.

En el siguiente fragmento de código, se mostrará una tabla que despliega la cantidad de datos faltantes para cada variable, brindando una representación visual de esta evaluación.

faltantes_por_columna <- colSums(is.na(vivienda_faltantes))
knitr::kable(faltantes_por_columna, caption = "Datos faltantes por variable")
Datos faltantes por variable
x
estrato 3
areaconst 3
banios 3
habitac 3
parquea 1606
piso 2641
preciom 2
zona 3
tipo 3
barrio 3
longitud 3
latitud 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_faltantes, 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))

A partir del análisis de la gráfica y la tabla anteriores, se observó que las variables “zona”, “estrato”, “areaconst”, “banios”, “habitac”, “tipo”, “barrio”, “longitud”, “latitud” 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 estas variables, 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. Esta acción nos permitió trabajar con una base de datos más limpia y completa.

# Eliminacion de observaciones con datos faltantes 
datos_sin_na <- vivienda_faltantes[complete.cases(vivienda_faltantes$id,
vivienda_faltantes$zona ,vivienda_faltantes$estrato ,vivienda_faltantes$areaconst ,vivienda_faltantes$banios ,vivienda_faltantes$habitac ,vivienda_faltantes$tipo ,vivienda_faltantes$barrio ,vivienda_faltantes$longitud ,vivienda_faltantes$latitud,vivienda_faltantes$preciom), ]

Se constató que en el nuevo conjunto de datos se registraron 8327 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 las variables.

En relación a las variables “parquea” y “piso”, que presentan tasas de datos faltantes del 19.3% y 31.7%, respectivamente, se tomó la decisión de abordarlas excluyendo los valores ausentes. Esta elección se basa en la consideración de que eliminar estas variables en su totalidad resultaría en la pérdida de información significativa, ya que su presencia no supera el 50% de los datos en cada caso.

Asimismo, se optó por no imputar los valores faltantes utilizando la media u otro método. Esto se debe a que dicha imputación podría introducir un sesgo de considerable magnitud en todo el conjunto de datos. Por lo tanto, se llevará a cabo un análisis enfocado exclusivamente en los datos completos, con el propósito de preservar la integridad y representatividad de las variables involucradas.

c. Descripción estadistica variables cuantitativas

Inicialmente, se generó un resumen estadístico mediante el siguiente código, proporcionándonos una visión panorámica de las variables cuantitativas en la base de datos.

#Seleccionar las variables cuantitativas
columnas_seleccionadas <- select(datos_sin_na,estrato ,areaconst ,banios ,habitac ,parquea ,piso , 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 habitac parquea piso preciom
Min. :3.000 Min. : 30 Min. : 0.000 Min. : 0.000 Min. : 1.000 Min. : 1.000 Min. : 58.0
1st Qu.:4.000 1st Qu.: 80 1st Qu.: 2.000 1st Qu.: 3.000 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 220.0
Median :5.000 Median : 123 Median : 3.000 Median : 3.000 Median : 2.000 Median : 3.000 Median : 330.0
Mean :4.634 Mean : 175 Mean : 3.112 Mean : 3.605 Mean : 1.836 Mean : 3.772 Mean : 434.3
3rd Qu.:5.000 3rd Qu.: 229 3rd Qu.: 4.000 3rd Qu.: 4.000 3rd Qu.: 2.000 3rd Qu.: 5.000 3rd Qu.: 540.0
Max. :6.000 Max. :1745 Max. :10.000 Max. :10.000 Max. :10.000 Max. :12.000 Max. :1999.0
NA NA NA NA NA’s :1603 NA’s :2638 NA
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 habitac parquea piso preciom
DesviacionEstandar 1.029327 142.9498 1.428346 1.459095 1.125084 2.615013 329.0335
RangoIntercuartil 1.000000 149.0000 2.000000 1.000000 1.000000 3.000000 320.0000

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 habitac, 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. Con un RI de 1.000 en parquea, se aprecia uniformidad en los espacios de estacionamiento, y en piso con RI de 3.000 se identifica variabilidad en el número de pisos. 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, habitac, parquea y piso indican agrupamiento de datos en torno a la media, mientras que desviaciones más altas en areaconst, longitud, latitud 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 habitac parquea piso preciom
Media 4.634322 174.9876 3.112045 3.60514 1.835961 3.772368 434.2532
Mediana 5.000000 123.0000 3.000000 3.00000 2.000000 3.000000 330.0000
Moda 5.000000 60.0000 2.000000 3.00000 1.000000 2.000000 350.0000

Las medidas de tendencia central para las variables exhiben cierta variabilidad. En todos los casos, la media supera a la mediana, lo cual puede indicar la influencia de valores extremos o atípicos en el cálculo de la media, una suposición que se reafirma con los resultados previos de desviación estándar y rango intercuartil. Este patrón plantea ciertas reservas sobre la fiabilidad de la media como medida representativa en estas variables. Un ejemplo concreto de esta situación se observa en estrato, banios, habitac y parquea, donde la diferencia entre la media y la mediana es notable, señalando la posible influencia de valores atípicos en la media. Por otro lado, en variables como areaconst y preciom, donde la diferencia es más moderada, la media podría ofrecer una medida más confiable. En resumen, la consideración de la mediana junto con la media se vuelve crucial para una interpretación integral de la tendencia central en estas variables.

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, 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, aplicaremos precisamente estas herramientas visuales para un análisis más detallado.

#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"))

En esta instancia, se optó por representar gráficamente únicamente las variables “zona” y “tipo”, debido a que poseían una cantidad manejable de categorías. Sin embargo, se tomó la decisión de no incluir la variable “barrio” en el gráfico de barras debido a su abundancia de categorías, lo cual podría dificultar la interpretación visual y limitar su efectividad como herramienta representativa.

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 5106
casa 3221
# 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 en Cali en comparación con las casas.

knitr::kable(tabla2, caption = "Tabla Zona")
Tabla Zona
Var1 Freq
Zona Centro 124
Zona Norte 1922
Zona Oeste 1204
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 1922 observaciones. Las demás zonas, como “Zona Oeste”, “Zona Oriente” y “Zona Centro”, presentan frecuencias más bajas, con 1204, 351 y 124 observaciones respectivamente.

e. Visualizacion de la distribucion de los datos

Variable Preciom
grafico_boxplot <- ggplot(columnas_seleccionadas, aes(y = preciom)) +
                  geom_boxplot() +
                  theme_minimal() +
                  labs(title = "Gráfico de Boxplot", y = "preciom")

print(grafico_boxplot)

histpreciom<-hist(columnas_seleccionadas$preciom, col = "green", breaks = 14, main="Histograma Variable: Preciom", xlab="Intervalos")

Variable piso

Variable parquea

Variable habitac

Variable banios

Variable areaconst

Variable estrato

Al analizar los gráficos boxplot y los histogramas, se identifica la presencia de valores atípicos en las variables habitac, parquea, preciom, areaconst, piso y banios, siguiendo los principios estadísticos. No obstante, emerge un escenario particular en el que se hace evidente la aparición de varios puntos que, a primera vista, podrían clasificarse como valores atípicos debido a su marcada separación de la distribución general, tal como se observa en parquea, habitac, banios y areaconst. Estos puntos incluso alcanzan cifras notables, como precios de hasta 2000 millones, 10 baños o 10 habitaciones, y áreas construidas de hasta 1500 metros cuadrados para ciertas propiedades.

Sin embargo, es esencial subrayar que esta aparente contradicción entre la definición estadística de valores atípicos y su interpretación en el contexto del mundo real adquiere relevancia en el ámbito del mercado inmobiliario. En realidad, valores de esta magnitud, aunque puedan parecer atípicos desde un enfoque meramente estadístico, son plenamente viables y comprensibles en el contexto de la dinámica inmobiliaria.

4. Analisis y resultados

* Precio de las viviendas Vs Área en m2
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.

* Precio de las viviendas en diferentes zonas
ggplot(datos_sin_na, aes(x = datos_sin_na$zona, y =datos_sin_na$preciom)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Distribución de Precios de Viviendas por Zona",
       x = "Zona",
       y = "Precio") +
  theme_minimal()

A partir del gráfico anterior, se destacan patrones interesantes en relación con los precios de las viviendas en diferentes zonas. Es evidente que en la zona oeste, los precios de las viviendas ocupadas tienden a ser más altos en comparación con otras zonas. Alrededor del 50% de las viviendas en esta zona se valoran por encima de los 500 millones. Por otro lado, la zona oriente exhibe precios más bajos en general, con la mayoría de las viviendas valuadas en menos de 500 millones.

Un aspecto notable es la similitud en la mediana de los precios entre las zonas sur, norte y centro. Esto sugiere una cierta estabilidad en los precios de las viviendas en estas áreas, a pesar de las variaciones en las características y ubicaciones.

Asimismo, en las zonas sur y norte, aunque no se concentran la mayoría de las viviendas más caras, se identifican algunas propiedades que podrían ser consideradas valores atípicos. Estas viviendas poseen precios en un rango aproximado de 1000 a 1800 millones. Es importante considerar que estos valores podrían indicar características excepcionales o atributos únicos en estas propiedades, justificando su posición atípica en términos de precios.

*En respuesta a la pregunta sobre las características más buscadas en las viviendas ofertadas en Cali, se destaca que los valores de moda en cada variable son indicativos de las preferencias predominantes. Estas son:

  • Tipo de vivienda: Apartamento
  • Estrato: 5
  • Área construida: 60 m²
  • Número de baños: 2
  • Número de habitaciones: 3
  • Número de parqueaderos: 1
  • Número de pisos: 2
  • Lugar: Zona oeste
  • Precio: 350 millones Estos valores de moda representan las características que son más comunes y buscadas en las viviendas disponibles en el mercado inmobiliario de Cali. Al considerar estas preferencias, las personas interesadas en adquirir una vivienda podrían enfocar su búsqueda en propiedades que se ajusten a estos criterios, lo que podría facilitar la identificación de opciones adecuadas de manera más eficiente.

*Para obtener una comprensión más profunda de la evolución del mercado de bienes raíces en Cali, resulta fundamental abordar ciertas características temporales que, lamentablemente, no se encuentran reflejadas en la base de datos actual. A pesar de esta limitación, es viable realizar inferencias que arrojen luz sobre las tendencias vigentes en las preferencias de vivienda, especialmente considerando las características previamente identificadas como las más buscadas en las propiedades.

5. Conclusiones

  1. Es relevante considerar que diversos factores, que van desde la ubicación geográfica hasta las características propias de las propiedades y las dinámicas del mercado, podrían influir en la dinámica o relación bivariable observada. Por lo tanto, a pesar de que la correlación y la densidad aporten ciertas señales de patrones en rangos específicos, es necesario abordar un enfoque analítico que incluya variables múltiples y el contexto general. Esta aproximación más completa es esencial para lograr una comprensión mas solida.

  2. Los valores atípicos no siempre deben traducirse en suposiciones erróneas o errores en los datos. Su interpretación debe enmarcarse en un contexto analítico que permita discernir si poseen relevancia o coherencia en el contexto específico. La presencia de valores atípicos puede deberse a circunstancias únicas o características singulares de ciertas propiedades. Un análisis más detenido y contextualizado es fundamental para evitar conjeturas apresuradas y para capturar todas las dimensiones que intervienen en la evaluación.

  3. A través del análisis de las medidas de tendencia central, es posible descubrir información relevante, tal como lo evidenció este informe, en relación a las preferencias por ciertos tipos de viviendas con características específicas. Estas medidas no solo proporcionan una visión amplia de las preferencias predominantes, sino que también permiten identificar patrones emergentes en los datos. Este enfoque permite adentrarse en las preferencias y tendencias que pueden guiar decisiones informadas en el ámbito del mercado inmobiliario.