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.
Esta etapa es crucial para asegurar que los datos estén listos para su análisis, ayudando a obtener insights más precisos y a construir modelos predictivos más eficaces. La calidad y preparación de los datos pueden tener un impacto significativo en la fiabilidad y validez de los resultados obtenidos en fases posteriores.
# Leer el archivo xlsx
datos_de_viviendas_original <- read_excel("vivienda.xlsx", sheet = 1)
# Ver los primeros registros del DataFrame para verificar
head(datos_de_viviendas_original)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona O… <NA> 3 250 70 1 3 6
## 2 1169 Zona O… <NA> 3 320 120 1 2 3
## 3 1350 Zona O… <NA> 3 350 220 2 2 4
## 4 5992 Zona S… 02 4 400 280 3 5 3
## 5 1212 Zona N… 01 5 260 90 1 2 3
## 6 1724 Zona N… 01 5 240 87 1 3 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
str(datos_de_viviendas_original)
## tibble [8,322 × 13] (S3: tbl_df/tbl/data.frame)
## $ id : num [1:8322] 1147 1169 1350 5992 1212 ...
## $ zona : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr [1:8322] NA NA NA "02" ...
## $ estrato : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
Dimensiones: La información cargada contiene 8,322 registros y 13 variables.
Variables y Tipos de Datos:
En resumen, hay dos tipos de datos: numérico y carácter, con un total de 9 variables numéricas y 4 variables tipo carácter.
total_nulos_por_columna <- colSums(is.na(datos_de_viviendas_original))
# Imprimir el total de valores nulos por columna
print(total_nulos_por_columna)
## id zona piso estrato preciom areaconst
## 3 3 2638 3 2 3
## parqueaderos banios habitaciones tipo barrio longitud
## 1605 3 3 3 3 3
## latitud
## 3
Observaciones:
Variables con mínimos valores nulos (3 registros nulos, 0.036%): id, zona, estrato, banios, habitaciones, tipo, barrio, longitud, y latitud. Estas variables tienen una cantidad minima de valores nulos en relación con el total de registros.
Variable preciom (2 registros nulos, 0.024%):* Esta variable tiene el menor número de valores nulos.
Variable parqueaderos (1,605 registros nulos, 19.286%): Contiene una cantidad alta de registros nulos sobre los parqueaderos, lo que podría afectar análisis relacionados con esta variable.
Variable piso (2,638 registros nulos, 31.699%): Esta variable tiene la mayor cantidad de valores nulos. Dado que más del 30% de los registros carecen de esta información, esto podría limitar los análisis que dependen de esta variable, a menos que se imputen los datos o se eliminen.
Se dicide eliminar las columnas “parqueaderos” y “piso” del set de datos debido a varias consideraciones clave. Primero, ambas columnas presentan un alto porcentaje de datos faltantes, con “piso” afectado por un 31.699% y “parqueaderos” por un 19.286% de valores nulos. Esta significativa ausencia de datos sugiere que mantener estas variables podría no aportar valor sustancial al análisis y podría, de hecho, sesgar los resultados debido a la falta de información. Además, la alta proporción de datos faltantes en estas variables puede indicar problemas en la recolección o en la integridad de la fuente de datos, lo que pone en duda la calidad del análisis si se incluyen estas columnas. Finalmente, considerando el impacto en la precisión del modelo, la presencia de tantos valores nulos en estas variables podría comprometer la fiabilidad de cualquier modelo predictivo desarrollado a partir de este dataset.
datos_de_viviendas_filtrado <- datos_de_viviendas_original[, -c(3, 7, 11, 12, 13)]
duplicados <- duplicated(datos_de_viviendas_filtrado) | duplicated(datos_de_viviendas_filtrado, fromLast = TRUE)
# Para ver los registros duplicados
datos_de_viviendas_filtrado[duplicados, ]
## # A tibble: 2 × 8
## id zona estrato preciom areaconst banios habitaciones tipo
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 NA <NA> NA NA NA NA NA <NA>
## 2 NA <NA> NA NA NA NA NA <NA>
Observaciones:
El resultado obtenido al identificar registros duplicados de la información cargada fueron dos (2) registros, donde todas sus filas son NA.
# Eliminar registros duplicados, manteniendo solo la primera aparición
datos_de_viviendas_unicos <- datos_de_viviendas_filtrado[!duplicated(datos_de_viviendas_filtrado), ]
#Eliminar registros con alguna variable nula
datos_de_viviendas_final <- na.omit(datos_de_viviendas_unicos)
Observaciones:
Se eliminaron los registros duplicados y aquellos que contenían valores nulos en alguna de sus variables. Inicialmente, se contaba con 8,322 registros; tras este proceso de limpieza, el conjunto de datos se redujo a 8,319 registros, los cuales están listos para el análisis subsiguiente.
La actulización de los nombres de las variables es una práctica común y útil en la manipulación y análisis de datos. Facilita la legibilidad, la consistencia, la preparación para el análisis, y puede mejorar la estética de los informes y gráficos generados.
# Nombres originales
nombres_originales <- colnames(datos_de_viviendas_final)
# Nombres nuevos
nombres_nuevos <- c("Id", "Zona", "Estrato","PrecioVivienda","AreaConstruccion","CantidadBanos","CantidadHabitaciones","TipoVivienda")
# Cambiar los nombres de las columnas
colnames(datos_de_viviendas_final) <- nombres_nuevos
# Imprimir los nombres anteriores y los actuales
for (i in 1:length(nombres_originales)) {
cat("El nombre de Columna", nombres_originales[i], "fue actualizado por:", nombres_nuevos[i], "\n")
}
## El nombre de Columna id fue actualizado por: Id
## El nombre de Columna zona fue actualizado por: Zona
## El nombre de Columna estrato fue actualizado por: Estrato
## El nombre de Columna preciom fue actualizado por: PrecioVivienda
## El nombre de Columna areaconst fue actualizado por: AreaConstruccion
## El nombre de Columna banios fue actualizado por: CantidadBanos
## El nombre de Columna habitaciones fue actualizado por: CantidadHabitaciones
## El nombre de Columna tipo fue actualizado por: TipoVivienda
datos_de_viviendas_final$Zona <- as.factor(datos_de_viviendas_final$Zona)
datos_de_viviendas_final$Estrato <- as.factor(datos_de_viviendas_final$Estrato)
datos_de_viviendas_final$TipoVivienda <- as.factor(datos_de_viviendas_final$TipoVivienda)
# Variables categóricas a graficar
cols_cat <- c('Zona', 'Estrato', 'TipoVivienda')
# Crear los gráficos
for (col in cols_cat) {
print(ggplot(datos_de_viviendas_final, aes(x = !!sym(col), fill = !!sym(col))) +
geom_bar() +
theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
labs(title = col, x = col, y = 'Count') +
scale_fill_viridis_d())
}
Observaciones:
Una vez revisada las variables categóricas (Visualmente) en nuestro conjunto de datos, confirmamos que todos los subniveles están correctamente etiquetados y no existen discrepancias en su escritura. No se requiere acción adicional para unificar subniveles, permitiéndonos avanzar en nuestro análisis con datos consistentes y precisos.
# Definir las columnas a evaluar
columnas_a_evaluar <- c('id', 'PrecioVivienda', 'AreaConstruccion', 'CantidadBanos', 'CantidadHabitaciones')
for(col in columnas_a_evaluar) {
# Verificar si la columna es numérica
if(is.numeric(datos_de_viviendas_final[[col]])) {
# Índices de valores negativos
negativos <- which(datos_de_viviendas_final[[col]] < 0)
# Si hay valores negativos
if(length(negativos) > 0) {
#cat("Valores negativos en", col, "en los índices:", negativos, "\n")
} else {
# cat("No hay valores negativos en", col, "\n")
}
} else {
# Indicar la presencia de valores que no son numéricos
#cat("La columna", col, "contiene valores que no son numéricos.\n")
}
}
Observaciones:
Una vez revisada las columnas específicas id, PrecioVivienda, AreaConstruccion, CantidadBanos, y CantidadHabitaciones en el conjunto de datos, se ha concluido que no existen valores negativos en ninguna de estas columnas. Además, todas las variables mencionadas han sido verificadas y confirmadas como numéricas, asegurando que son adecuadas para cualquier análisis estadístico o matemático que se pretenda realizar.
TipoVivienda | total_inmuebles | porcentaje_tipo |
|---|---|---|
Apartamento | 5,100 | 61.31 |
Casa | 3,219 | 38.69 |
Observaciones:
El análisis del mercado inmobiliario muestra una clara división entre dos tipos principales de propiedades: apartamentos y casas. De un total de 8,319 inmuebles analizados, los apartamentos comprenden el 61.31% del mercado con 5,100 unidades, mientras que las casas representan el 38.69%, sumando 3,219 unidades. Esta distribución muestra la predominancia de los apartamentos, lo que podría indicar una tendencia hacia la densificación urbana y una preferencia por viviendas más compactas en áreas metropolitanas (Cali).
A continuacion, se detalla las ventas de apartamentos y casas teniendo en cuenta las diferentes zonas de la ciudad:
Zona | TipoVivienda | total_inmuebles | porcentaje_zona_tipo |
|---|---|---|---|
Zona Centro | Apartamento | 24 | 0.29% |
Zona Centro | Casa | 100 | 1.20% |
Zona Norte | Apartamento | 1,198 | 14.40% |
Zona Norte | Casa | 722 | 8.68% |
Zona Oeste | Apartamento | 1,029 | 12.37% |
Zona Oeste | Casa | 169 | 2.03% |
Zona Oriente | Apartamento | 62 | 0.75% |
Zona Oriente | Casa | 289 | 3.47% |
Zona Sur | Apartamento | 2,787 | 33.50% |
Zona Sur | Casa | 1,939 | 23.31% |
Observaciones:
Dominancia de la zona Sur: La Zona Sur muestra la mayor concentración de inmuebles, tanto en apartamentos (33.50%) como en casas (23.31%), sumando más de la mitad del total del mercado inmobiliario analizado. Esto indica que la Zona Sur es la región más densamente poblada o con mayor actividad de desarrollo inmobiliario, lo cual podría reflejar una alta demanda de vivienda o una oferta amplia debido a políticas de urbanización o atractivos específicos de esta área.
Preferencia por apartamentos en zonas urbanizadas: En general, los apartamentos son más prevalentes que las casas en todas las zonas, destacando especialmente en la Zona Norte (14.40%) y la Zona Oeste (12.37%). Esto podría sugerir una tendencia hacia la verticalización y el aprovechamiento del espacio en áreas urbanas.
Zona Centro con menor densidad de inmuebles: La Zona Centro tiene la menor cantidad de inmuebles, con solo un 1.49% del total combinado de apartamentos y casas.
Variabilidad regional en tipos de vivienda: Mientras que la Zona Sur y la Zona Norte muestran una significativa mezcla de apartamentos y casas, las Zonas Oeste y Oriente tienen una marcada preferencia por apartamentos sobre casas, con la Zona Oriente mostrando el menor porcentaje de apartamentos.
Observaciones:
Predominio del estrato 5: El estrato 5 representa el segmento más grande dentro de la distribución, con 2,750 viviendas que constituyen el 33.06% del total. Esto indica una significativa concentración de viviendas en este estrato, sugiriendo que una porción considerable de la población reside en zonas clasificadas como de alto nivel socioeconómico, posiblemente reflejando un mercado inmobiliario orientado a la clase media-alta.
Distribución por estrato: Los estratos 4 y 6 también presentan proporciones importantes, con el 25.59% y 23.89% respectivamente, mostrando una amplia distribución de viviendas en los estratos medio-alto y alto. El estrato 3, por su parte, representa el 17.47%, siendo el menos representado en esta muestra pero aún constituyendo una porción significativa, lo que indica una diversidad en las condiciones de vivienda y accesibilidad económica en la población analizada.
Implicaciones socioeconómicas: La distribución de viviendas por estrato refleja la estratificación socioeconómica y las preferencias habitacionales dentro de la sociedad. La concentración de viviendas en estratos más altos (4, 5, y 6) sugiere que existe una demanda robusta en el segmento de vivienda de media a alta gama, posiblemente impulsada por factores como ingresos familiares más altos, búsqueda de mejores servicios y ubicaciones preferenciales.
Oportunidades de mercado: Para desarrolladores e inversores inmobiliarios, el alto porcentaje de viviendas en estratos 5 y 6 destaca un mercado potencialmente lucrativo para proyectos residenciales de lujo y media-alta gama. Sin embargo, la presencia no despreciable de viviendas en el estrato 3 subraya también la importancia de considerar proyectos que aborden las necesidades de la población con menor capacidad económica.
## [1] "Análisis Original"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 366.9435 279 250 58 1950 175 279 430 255
## [1] "Análisis Filtrado"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 298.8171 260 250 58 810 175 260 430 255
Observaciones:
Reducción en los valores extremos: La aplicación del RIQ ha reducido significativamente el valor máximo de los precios de los apartamentos de 1950 a 810 millones, lo que indica una efectiva eliminación de valores extremos superiores que pueden distorsionar el análisis.
Disminución de la media: La media de los precios ha disminuido de 366.9435 a 298.8171 millones después de aplicar el RIQ. Esto sugiere que los valores extremos tenían un impacto considerable en aumentar el promedio de precios de los apartamentos.
Cambio en la mediana: La mediana ha disminuido ligeramente de 279 a 260 millones. La mediana es menos sensible a los valores extremos que la media, por lo que este cambio, aunque presente, es menos pronunciado.
Estabilidad de la moda: La moda permanece sin cambios en 250 millones en ambos análisis. Esto indica que el valor más frecuente de los precios de los apartamentos no fue afectado por la eliminación de valores extremos.
Consistencia en los cuartiles y el RIQ: Los valores de Q1, Q3, y el RIQ permanecen constantes (175, 430, y 255 millones, respectivamente) en ambos análisis. Esto sugiere que la aplicación del RIQ de 1.5 no alteró la distribución central de los datos, sino que se enfocó en ajustar los valores extremos.
Impacto en el rango de precios: El rango de precios (diferencia entre el máximo y el mínimo) ha disminuido considerablemente después de aplicar el RIQ, de 1892 (1950-58) a 752 (810-58) millones. Esto refleja una concentración más estrecha de los precios de los apartamentos alrededor de valores más típicos, eliminando los valores atípicos que distorsionan.
La aplicación del Rango Intercuartílico de 1.5 ha demostrado ser efectiva en mitigar el impacto de los valores atípicos en el análisis, resultando en una representación más precisa y menos sesgada de los precios de los apartamentos. Esto es particularmente útil para evitar conclusiones erróneas basadas en unos pocos valores extremadamente altos o bajos.
## [1] "Análisis Original"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 539.9935 430 350 77 1999 300 430 670 370
## [1] "Análisis Filtrado"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 469.6859 400 350 77 1200 300 400 670 370
Observaciones:
Impacto en los valores extremos: Al igual que con los apartamentos, el valor máximo de los precios de las casas ha disminuido significativamente de 1999 a 1200 millones tras aplicar el RIQ, lo que indica una eliminación efectiva de valores extremos que podrían distorsionar el análisis general.
Reducción de la media: La media de los precios ha disminuido de 539.9935 a 469.6859 millones después de la filtración, reflejando el impacto significativo de los valores extremos en el promedio original y cómo su eliminación conduce a una media más representativa de la mayoría de los datos.
Disminución leve en la mediana: La mediana se ha reducido de 430 a 400 millones. Este cambio, aunque menor que el observado en la media, sugiere que la distribución central de los precios de las casas ha sido ligeramente ajustada hacia abajo tras la eliminación de valores atípicos.
Estabilidad de la moda: La moda se mantiene constante en 350 millones en ambos análisis, lo que indica que el precio más comúnmente observado en las casas no se ha visto afectado por el proceso de filtrado.
Consistencia en cuartiles y el RIQ: Los valores de Q1, Q3, y el RIQ permanecen iguales (300, 670, y 370 millones, respectivamente) antes y después de la aplicación del RIQ. Esto muestra que el ajuste de valores atípicos se centró en los extremos de la distribución sin alterar la estructura central de los datos.
Reducción del rango de precios: El rango de precios (diferencia entre el máximo y el mínimo) ha disminuido de 1922 (1999-77) a 1123 (1200-77) millones, indicando una distribución de precios de casas más concentrada y menos influenciada por valores atípicos extremos.
La aplicación del Rango Intercuartílico de 1.5 en el análisis de precios de casas ha demostrado ser efectiva para moderar el efecto de los valores extremos, llevando a conclusiones más representativas y confiables. Al igual que con los apartamentos, este método de filtrado ayuda a obtener una visión más precisa del mercado inmobiliario, eliminando distorsiones causadas por valores anormalmente altos o bajos.
## [1] "Análisis Original"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 2.63361 3 3 1 4 2 3 3 1
Observaciones:
Estas métricas sugieren una distribución relativamente concentrada de los datos, con una tendencia clara hacia el valor 3. Este patrón indica que, dentro del contexto analizado, existe una preferencia o tendencia predominante hacia el nivel representado por el valor 3. La similitud entre la media, mediana y moda, junto con un rango intercuartílico estrecho, refleja una distribución equilibrada con una variabilidad moderada.
## [1] "Análisis Original"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 174.9349 123 60 30 1745 80 123 229 149
## [1] "Análisis Filtrado"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 153.4955 118 60 30 452 80 118 229 149
Observaciones:
La aplicación del RIQ de 1.5 ha tenido un efecto notable en la reducción de los valores extremos, especialmente en el valor máximo del área de construcción, lo que resulta en una media más representativa de la población general sin alterar significativamente la mediana, la moda, ni los cuartiles. Esto indica que el método fue efectivo para concentrar el análisis en un rango más típico y menos distorsionado de áreas de construcción, lo cual es crucial para obtener una comprensión más precisa del mercado inmobiliario. La consistencia en la moda y los cuartiles muestra que la distribución central de los datos permanece estable, lo que sugiere que la aplicación del RIQ se enfocó correctamente en ajustar los valores extremos sin alterar la estructura general de la distribución.
## [1] "Análisis Original"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 3.111311 3 2 0 10 2 3 4 2
## [1] "Análisis Filtrado"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 3.06463 3 2 0 7 2 3 4 2
Observaciones:
La aplicación de un filtro basado en el RIQ de 1.5 para manejar valores atípicos en la cantidad de baños resulta en una ligera reducción de la media, mientras que la mediana, moda, y el RIQ se mantienen estables. Este ajuste efectivamente reduce la variabilidad extrema (reduciendo el valor máximo de baños de 10 a 7) sin alterar significativamente la distribución central de los datos. Esto sugiere que la mayoría de las propiedades se concentran alrededor de tener 2 a 4 baños, y los valores extremos por encima de 7 baños son relativamente raros y pueden considerarse atípicos en este contexto.
## [1] "Análisis Original"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 3.605361 3 3 0 10 3 3 4 1
## [1] "Análisis Filtrado"
## Media Mediana Moda Minimo Maximo Q1 Q2 Q3 RIQ
## 25% 3.290809 3 3 2 5 3 3 4 1
Observaciones:
La aplicación del filtro basado en el RIQ de 1.5 conduce a una notable reducción en la variabilidad extrema de la cantidad de habitaciones, limitando el máximo a 5 y estableciendo un mínimo en 2. Este ajuste hace que la media disminuya ligeramente, aunque la mediana, la moda, y el RIQ se mantienen estables. Este análisis resalta una distribución más concentrada y representativa de la cantidad de habitaciones en las propiedades, eliminando los casos extremos y enfocando la atención en el rango más común de 2 a 5 habitaciones.
El objetivo es determinar si existe una asociación lineal entre las variables y cuán fuerte es esa asociación.
# Filtrar para seleccionar solo las filas donde TipoVivienda es "Casa"
Casa_filtrada <- filter(datos_de_viviendas_final, TipoVivienda == "Casa")
# Seleccionar las variables de interés
Casa_seleccionada <- select(Casa_filtrada,
PrecioVivienda,
AreaConstruccion,
CantidadBanos,
CantidadHabitaciones)
# Calcular la matriz de correlación
Casa_cor <- cor(Casa_seleccionada)
# Visualizar la matriz de correlación
ggcorrplot(Casa_cor, type = "upper", lab = TRUE) +
labs(title = "Mapa de Correlación de Características de Viviendas - CASAS") +
theme(plot.title = element_text(hjust = 0.5))
print(Casa_cor)
## PrecioVivienda AreaConstruccion CantidadBanos
## PrecioVivienda 1.00000000 0.6529498 0.5581002
## AreaConstruccion 0.65294983 1.0000000 0.4871721
## CantidadBanos 0.55810021 0.4871721 1.0000000
## CantidadHabitaciones 0.09683573 0.2866020 0.4757406
## CantidadHabitaciones
## PrecioVivienda 0.09683573
## AreaConstruccion 0.28660204
## CantidadBanos 0.47574058
## CantidadHabitaciones 1.00000000
Observaciones:
La matriz de correlación sugiere que el precio de la vivienda (Casas) está más estrechamente vinculado al área de construcción y la cantidad de baños que al número de habitaciones. Además, se evidencia que las características físicas como el área de construcción, la cantidad de baños y habitaciones están interrelacionadas, lo que refleja cómo se estructuran y valoran las viviendas en el mercado.
# Filtrar para seleccionar solo las filas donde TipoVivienda es "Casa"
apto_filtrada <- filter(datos_de_viviendas_final, TipoVivienda == "Apartamento")
# Seleccionar las variables de interés
apto_seleccionada <- select(Casa_filtrada,
PrecioVivienda,
AreaConstruccion,
CantidadBanos,
CantidadHabitaciones)
# Calcular la matriz de correlación
apto_cor <- cor(apto_seleccionada)
# Visualizar la matriz de correlación
ggcorrplot(apto_cor, type = "upper", lab = TRUE) +
labs(title = "Mapa de Correlación de Características de Viviendas Tipo - (Apartamentos)") +
theme(plot.title = element_text(hjust = 0.5))
print(Casa_cor)
## PrecioVivienda AreaConstruccion CantidadBanos
## PrecioVivienda 1.00000000 0.6529498 0.5581002
## AreaConstruccion 0.65294983 1.0000000 0.4871721
## CantidadBanos 0.55810021 0.4871721 1.0000000
## CantidadHabitaciones 0.09683573 0.2866020 0.4757406
## CantidadHabitaciones
## PrecioVivienda 0.09683573
## AreaConstruccion 0.28660204
## CantidadBanos 0.47574058
## CantidadHabitaciones 1.00000000
Observaciones:
La correlación entre el precio de la vivienda (Apartamentos) y sus características físicas destaca la importancia del área de construcción y la cantidad de baños como predictores significativos del valor de una propiedad. Mientras que el número de habitaciones tiene una influencia menor en el precio, su relación con otras características de la vivienda, como el número de baños, subraya cómo la funcionalidad y el diseño afectan la percepción de valor en el mercado inmobiliario.
El Coeficiente de Cramér es una medida estadística que se utiliza para cuantificar la fuerza y la significación de la asociación entre dos variables categóricas.
# Crear tablas de contingencia
tabla_TipoVivienda_Zona <- table(datos_de_viviendas_final$TipoVivienda, datos_de_viviendas_final$Zona)
tabla_TipoVivienda_Estrato <- table(datos_de_viviendas_final$TipoVivienda, datos_de_viviendas_final$Estrato)
tabla_Zona_Estrato <- table(datos_de_viviendas_final$Zona, datos_de_viviendas_final$Estrato)
# Mostrar una de las tablas de contingencia como ejemplo
print(tabla_TipoVivienda_Zona)
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## Apartamento 24 1198 1029 62 2787
## Casa 100 722 169 289 1939
# Calcular y mostrar el coeficiente de Cramér para cada par de variables
cramer_TipoVivienda_Zona <- assocstats(tabla_TipoVivienda_Zona)$cramer
cramer_TipoVivienda_Estrato <- assocstats(tabla_TipoVivienda_Estrato)$cramer
cramer_Zona_Estrato <- assocstats(tabla_Zona_Estrato)$cramer
print(paste("Coeficiente de Cramér - TipoVivienda y Zona:", cramer_TipoVivienda_Zona))
## [1] "Coeficiente de Cramér - TipoVivienda y Zona: 0.288191639436686"
print(paste("Coeficiente de Cramér - TipoVivienda y Estrato:", cramer_TipoVivienda_Estrato))
## [1] "Coeficiente de Cramér - TipoVivienda y Estrato: 0.164213592268196"
print(paste("Coeficiente de Cramér - Zona y Estrato:", cramer_Zona_Estrato))
## [1] "Coeficiente de Cramér - Zona y Estrato: 0.391767009686814"
Observaciones:
Interpretación de Coeficientes de Cramér
Los coeficientes de Cramér nos ofrecen una medida de la fuerza de asociación entre las variables categóricas analizadas.
TipoVivienda y Zona (0.288): Este valor indica una asociación moderada, lo que sugiere que la distribución de tipos de vivienda (Apartamento vs. Casa) varía significativamente entre diferentes zonas. Esto puede reflejar diferencias en la planificación urbana, la demanda de vivienda, o las preferencias de los habitantes en distintas áreas.
TipoVivienda y Estrato (0.164): Una asociación más débil entre el tipo de vivienda y el estrato indica que, aunque hay alguna relación, el estrato socioeconómico no determina de manera significativa si una vivienda será un apartamento o una casa. Esto sugiere que dentro de los mismos estratos socioeconómicos, puede haber una diversidad de tipos de vivienda disponibles.
Zona y Estrato (0.391): Este es el valor más alto entre los coeficientes calculados, lo que sugiere una asociación más fuerte entre la ubicación geográfica de la vivienda (Zona) y su estrato socioeconómico. Esto puede indicar patrones de segregación residencial, donde ciertas zonas son predominantemente de ciertos estratos, reflejando diferencias en el acceso a recursos, servicios y calidad de vida.
Los coeficientes de Cramér, al analizarlos en conjunto con estos porcentajes, nos ayudan a comprender mejor cómo el tipo de vivienda se relaciona con la zona y el estrato socioeconómico, revelando patrones de distribución urbana y segregación socioeconómica. La moderada asociación entre tipo de vivienda y zona puede reflejar una diversidad de preferencias y necesidades habitacionales, mientras que la fuerte asociación entre zona y estrato destaca cómo el espacio urbano está estratificado socioeconómicamente.
Iniciaremos un análisis de componentes principales (ACP) centrado en variables cruciales del mercado inmobiliario: PrecioVivienda, AreaConstruccion, CantidadBanos, y CantidadHabitaciones. Excluimos la información geográfica (longitud y latitud) y el ID, al ser datos de coordenadas e identificadores únicos que poco aportan al análisis. Este enfoque nos permitirá identificar las principales influencias en los precios y la oferta de viviendas, simplificando la complejidad de los datos para una interpretación más directa y eficaz de las tendencias del mercado.
# Escalado de los datos
datos_escalados <- scale(datos_de_viviendas_final[, 3:7])
# Detalle de los datos escalados
#head(datos_escalados)
# Análisis de patrones de datos faltantes
md.pattern(datos_escalados)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## Estrato PrecioVivienda AreaConstruccion CantidadBanos CantidadHabitaciones
## 8319 1 1 1 1 1
## 0 0 0 0 0
##
## 8319 0
## 0
# Analisis de componentes principales
#prcomp(datos_escalados) # Componentes pricipales
#Ejecución de Análisis de Componentes Principales (ACP) y Almacenamiento de Resultados
datos_de_viviendas_acp <- prcomp(datos_escalados)
#---------------------------------------------------------
# Obtener los valores propios y el porcentaje de varianza explicada
valores_propios <- datos_de_viviendas_acp$sdev^2
porcentaje_varianza_explicada <- valores_propios / sum(valores_propios) * 100
# Visualización de Valores Propios y Porcentaje de Varianza Explicada por Cada Componente Principal
fviz_eig(datos_de_viviendas_acp, addlabels = TRUE)
# Mostrar los detalles
print(valores_propios)
## [1] 2.9331575 1.1883211 0.4453505 0.2416783 0.1914925
print(porcentaje_varianza_explicada)
## [1] 58.663151 23.766422 8.907009 4.833567 3.829851
#---------------------------------------------------------
El proceso inicia con el escalado de datos de viviendas para estandarizar las escalas de las variables y permitir una comparación equitativa entre ellas. Se realiza un análisis de los patrones de datos faltantes para evaluar cómo los valores ausentes podrían afectar el análisis. Posteriormente, se aplica un Análisis de Componentes Principales (ACP) sobre los datos escalados, una técnica que reduce la dimensionalidad de los datos y transforma las variables originales en componentes principales independientes, capturando la mayor varianza posible. A través de varias visualizaciones, se examina la importancia de cada componente principal, la contribución de las variables a estos componentes y cómo cada una influye en la estructura de los datos.
Observaciones:
Valores nulos:
Valores propios:
Porcentaje de varianza explicada:
# Visualización de la Contribución de Variables al Primer Componente Principal
fviz_contrib(datos_de_viviendas_acp, choice = "var", axes = 1)
#Visualización de la Contribución de Variables al Segundo Componente Principal
fviz_contrib(datos_de_viviendas_acp, choice = "var", axes = 2)
fviz_pca_var(datos_de_viviendas_acp,
col.var = "contrib",
gradient.cols = c("blue", "red"),
repel = TRUE)
print (datos_de_viviendas_acp)
## Standard deviations (1, .., p=5):
## [1] 1.7126464 1.0901014 0.6673458 0.4916079 0.4375986
##
## Rotation (n x k) = (5 x 5):
## PC1 PC2 PC3 PC4 PC5
## Estrato 0.3300032 -0.6744363 0.4208934 -0.4795545 0.1706159
## PrecioVivienda 0.5068715 -0.2807656 -0.3015468 0.2213868 -0.7240921
## AreaConstruccion 0.4940473 0.1638135 -0.6525373 -0.2984641 0.4628138
## CantidadBanos 0.5189619 0.1092831 0.3767649 0.6647648 0.3672488
## CantidadHabitaciones 0.3475270 0.6538568 0.4051685 -0.4359154 -0.3122700
Los resultados muestran las cargas (o coeficientes) de las variables originales en cada componente principal. Las cargas indican la fuerza y dirección de la relación entre cada variable original y cada componente principal:
Componente Principal 1 (PC1):
Variables con cargas más altas: * CantidadBanos (0.5189619) * AreaConstruccion (0.4940473) * PrecioVivienda (0.5068715)
Interpretación: El PC1 está fuertemente influenciado por las variables relacionadas con el tamaño y precio de la vivienda, así como la cantidad de baños. Esto sugiere que el PC1 puede representar el tamaño y valor de la vivienda.
Componente Principal 2 (PC2):
Variables con cargas más altas: * CantidadHabitaciones (0.6538568) * Estrato (-0.6744363)
Interpretación: El PC2 está dominado por las variables de cantidad de habitaciones y estrato. Una carga negativa para estrato indica una relación inversa, lo que sugiere que este componente puede representar características relacionadas con el estrato y el tamaño de la vivienda.
Componente Principal 3 (PC3), Componente Principal 4 (PC4) y Componente Principal 5 (PC5):
Interpretación: Estos componentes tienen cargas menores en comparación con los primeros dos componentes principales. Esto indica que las variables originales tienen una influencia relativamente menor en estos componentes. Sin embargo, aún pueden proporcionar información sobre otros aspectos de la estructura de los datos.
Porcentaje suficiente para retener la información relevante:
Por lo general, se busca retener suficiente varianza para preservar la estructura y las relaciones importantes entre las variables del conjunto de datos. Esto implica seleccionar un número suficiente de componentes principales para explicar la mayor parte de la variabilidad en los datos. En muchos casos, se considera que retener al menos el 70-80% de la varianza total es adecuado para preservar la estructura subyacente de los datos.
Conclusiones:
En este análisis de agrupamiento, nuestro objetivo es segmentar las propiedades residenciales en grupos homogéneos con características similares. Esto nos permitirá comprender las dinámicas y demandas específicas en diferentes partes de la ciudad y en diferentes estratos socioeconómicos. Utilizaremos el mismo set de datos que se utilizó en el análisis de componentes principales, centrándonos en encontrar una relación entre el precio y el estrato socioeconómico como punto de partida.
# Escalado de los datos
datos_escalados <- scale(datos_de_viviendas_final[, 3:7])
# Detalle de los datos escalados
head(datos_escalados)
## Estrato PrecioVivienda AreaConstruccion CantidadBanos
## [1,] -1.5872276 -0.5595498 -0.7339949 -0.07793773
## [2,] -1.5872276 -0.3465670 -0.3842568 -0.77811479
## [3,] -1.5872276 -0.2552886 0.3152194 -0.77811479
## [4,] -0.6156201 -0.1031580 0.7349051 1.32241640
## [5,] 0.3559875 -0.5291236 -0.5940997 -0.77811479
## [6,] 0.3559875 -0.5899759 -0.6150839 -0.07793773
## CantidadHabitaciones
## [1,] 1.6406840
## [2,] -0.4147626
## [3,] 0.2703863
## [4,] -0.4147626
## [5,] -0.4147626
## [6,] -0.4147626
k_numbers <- numeric(10)
for (k in 1:10) {
kmeans_result <- kmeans(datos_de_viviendas_final[, 3:7], centers = k, nstart = 10)
k_numbers [k] <- kmeans_result$tot.withinss
}
# Crear un data frame con los resultados
resultados_codo <- data.frame(
numero_de_clusters = 1:10,
inercia = k_numbers
)
# Mostrar el data frame
print(resultados_codo)
## numero_de_clusters inercia
## 1 1 1068569117
## 2 2 399834213
## 3 3 228370848
## 4 4 166324515
## 5 5 138329120
## 6 6 119135828
## 7 7 105199863
## 8 8 88150572
## 9 9 75880735
## 10 10 67022955
plot(1:10, k_numbers, type = "b", pch = 19, frame = FALSE,
xlab = "Numero de Clusters", ylab = "Inercia",
main = "Analisis de Codo")
Observaciones:
Para determinar el número de clusters apropiados usando la técnica del análisis de codo y los valores de inercia, debemos buscar el punto en el cual el descenso en la inercia se “suaviza” o se reduce la tasa de cambio.
Disminución de la inercia de un número de clusters al siguiente:
Al observar los cambios en la inercia ocurre cuando pasamos de 1 a 2 clusters, lo cual es esperado ya que el primer cluster agrupa todos los datos y al introducir un segundo cluster, se puede capturar una gran cantidad de la estructura de datos. Sin embargo, buscamos el punto donde la disminución adicional en la inercia se vuelve más pequeña, que es donde se supone que está el “codo”. La disminución se reduce considerablemente después del tercer cluster (desde 171463365 a 62046333), y luego sigue una tendencia de disminuciones más graduales. Entre el 4 y el 5, la disminución es aún notable, pero comienza a ser menos pronunciada. Sin embargo, basándonos únicamente en los números, un buen candidato podría ser 4 clusters, ya que después de este punto las disminuciones en la inercia se vuelven menos pronunciadas, indicando que agregar más clusters no está mejorando significativamente la compactación de los mismos.
# Se establece el número óptimo de clusters
k_opt <- 4
# Seleccionamos solo las columnas numéricas para el clustering
datos_de_viviendas_cluster <- datos_de_viviendas_final[, 3:7]
# Aplicamos kmeans
kmeans_result <- kmeans(datos_de_viviendas_cluster, centers = k_opt, nstart = 10)
# Agregamos la asignación de clusters al data frame
datos_de_viviendas_cluster$cluster <- kmeans_result$cluster
# Calculamos el resumen por cluster, excluyendo la columna 'cluster' del cálculo de la media
cluster_summary <- aggregate(datos_de_viviendas_cluster[, -ncol(datos_de_viviendas_cluster)], # Excluyes la última columna 'cluster'
by = list(cluster = datos_de_viviendas_cluster$cluster),
FUN = mean)
print(cluster_summary)
## cluster Estrato PrecioVivienda AreaConstruccion CantidadBanos
## 1 1 3.531969 780.4893 306.57116 4.538789
## 2 2 2.851106 436.4115 198.16067 3.521722
## 3 3 2.095412 212.7789 88.99817 2.187408
## 4 4 3.798450 1389.8740 444.22180 5.189922
## CantidadHabitaciones
## 1 4.255754
## 2 4.032780
## 3 3.065642
## 4 4.315891
ggplot(datos_de_viviendas_cluster, aes(x = PrecioVivienda, y = AreaConstruccion, color = cluster)) +
geom_point() +
labs(x = "Precio",
y = "Area Construida",
title = "Área construida y precio por cluster",
color = "Cluster",
shape = "Cluster") +
theme_minimal()
ggplot(datos_de_viviendas_cluster, aes(x = PrecioVivienda, y = CantidadBanos, color = cluster)) +
geom_point() +
labs(x = "Precio",
y = "Número de Baños",
title = "Número de baños y precios por Cluster",
color = "Cluster") +
theme_minimal()
ggplot(datos_de_viviendas_cluster, aes(x = PrecioVivienda, y = CantidadHabitaciones, color = cluster)) +
geom_point() +
labs(x = "Precio",
y = "Parqueaderos",
title = "Número de habitaciones y precio por cluster",
color = "Cluster") +
theme_minimal()
resumen_cluster <- datos_de_viviendas_cluster %>%
group_by(cluster) %>%
summarise(
Count = n(),
PrecioMin = min(PrecioVivienda),
PrecioMax = max(PrecioVivienda),
BanosMin = min(CantidadBanos),
BanosMax = max(CantidadBanos),
AreaMin = min(AreaConstruccion),
AreaMax = max(AreaConstruccion),
HabitacionesMin = min(CantidadHabitaciones),
HabitacionesMax = max(CantidadHabitaciones)
)
# Visualizamos el resultado
print(resumen_cluster)
## # A tibble: 4 × 10
## cluster Count PrecioMin PrecioMax BanosMin BanosMax AreaMin AreaMax
## <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 1173 255 1110 0 10 100 1745
## 2 2 2532 170 650 0 10 47 1365
## 3 3 4098 58 360 0 10 30 410
## 4 4 516 980 1999 0 10 153 1600
## # ℹ 2 more variables: HabitacionesMin <dbl>, HabitacionesMax <dbl>
Observaciones:
Cluster 1: Con 516 viviendas, este grupo se caracteriza por tener propiedades con un rango de precio de 980 a 1999 millones, lo que sugiere que podrían ser viviendas de gama media a alta. El número de baños y habitaciones varía de 0 a 10, indicando una gran diversidad en el tamaño y posiblemente en el lujo o capacidades de las viviendas. El área de construcción varía entre 153 y 1600 mt2, lo que refleja una amplia gama de tamaños de propiedades, desde apartamentos pequeños hasta grandes casas.
Cluster 2: Es el segundo grupo más grande con 2532 viviendas. Las viviendas aquí tienen precios más bajos, de 170 a 650 millones, lo que indica que este cluster podría consistir principalmente en viviendas económicas. Al igual que el Cluster 1, la cantidad de baños y habitaciones varía de 0 a 10, aunque el rango de área de construcción es de 47 a 1365 mt2, sugiriendo que, a pesar de los precios más bajos, hay una considerable variación en el tamaño de las viviendas.
Cluster 3: Con 1173 viviendas, este grupo tiene un rango de precio de 255 a 1110 millones, colocándose en un segmento de precio medio. La variación en el número de baños y habitaciones es igual a los otros clusters (0 a 10), y el área de construcción oscila entre 100 y 1745 mt2, lo que indica que este cluster podría incluir una mezcla de viviendas de varios tamaños, incluyendo algunas de las propiedades más grandes en términos de área.
Cluster 4: Este es el grupo más numeroso con 4098 viviendas, pero también es el que tiene el rango de precios más bajo, de 58 a 360 millones, sugiriendo que consiste en viviendas muy económicas. La cantidad de baños y habitaciones también varía de 0 a 10, pero el área de construcción es notablemente menor, de 30 a 410 mt2, lo que implica que este cluster está compuesto principalmente por viviendas pequeñas.
Diversidad dentro de los clusters: Cada cluster muestra una amplia gama de viviendas en términos de tamaño (área de construcción y cantidad de habitaciones/baños), pero hay claras diferencias en los rangos de precios. Esto indica que el precio fue el factor determinante significativo en la formación de clusters.
Segmentación del mercado de viviendas: Los clusters reflejan diferentes segmentos del mercado, desde viviendas económicas (Cluster 4) hasta propiedades de gama media y alta (Clusters 1 y 3). El Cluster 2, siendo el más grande, podría representar el segmento económico con mayor diversidad en términos de tamaño.
En el análisis propuesto, se examinarán las relaciones entre las zonas y los estratos de un conjunto de datos de viviendas, así como el impacto de la zona en el precio de las viviendas.
Primero, se seleccionarán específicamente las variables relacionadas con la zona y el estrato para un análisis detallado. A través de un Análisis de Correspondencias, se identificarán y visualizarán las asociaciones entre las distintas zonas y estratos, revelando cómo estas categorías interactúan entre sí. Este proceso permitirá descubrir patrones y conexiones subyacentes que podrían no ser evidentes a primera vista.
Posteriormente, se explorará cómo varía el precio de las viviendas en función de la zona, utilizando un enfoque visual a través de diagramas de caja. Este análisis destacará las diferencias en la distribución de precios entre las zonas, enfocándose en aspectos como la mediana, la variabilidad y la presencia de valores atípicos. La aplicación de colores distintivos para cada zona facilitará la comparación y comprensión de estas diferencias.
datos_de_viviendas_categoricos <- datos_de_viviendas_final[, c(2,3)] #Zona y Estrato
set.seed(1234)
md.pattern(datos_de_viviendas_categoricos, rotate.names = TRUE)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## Zona Estrato
## 8319 1 1 0
## 0 0 0
tabla_1 <- table(datos_de_viviendas_categoricos$Zona, datos_de_viviendas_categoricos$Estrato)
res_ac <- CA(tabla_1)
val_prop <-res_ac$eig
fviz_screeplot(res_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
xxxx <- datos_de_viviendas_final[, c(2,4)]
ggplot(datos_de_viviendas_final[, c(2,4)], aes(x = Zona, y = PrecioVivienda, fill = Zona)) +
geom_boxplot(alpha = 0.75) + # Ajusta la opacidad si es necesario
labs(title = "Precios por zona") +
theme(legend.position = "none",
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
scale_fill_brewer(palette = "Set3") # Utiliza una paleta de colores predefinida
Observaciones:
A partir de un análisis detallado de 8319 observaciones, se ha identificado una clara asociación entre el estrato socioeconómico y la ubicación de las viviendas dentro de la ciudad. Específicamente, el estrato 4 domina en la zona oeste, mientras que los estratos 4 y 5 se distribuyen predominantemente en las zonas sur y norte. Por su parte, el estrato 3 se encuentra más concentrado en las zonas centro y oriente, revelando patrones específicos de asentamiento según el nivel socioeconómico.
Adicionalmente, el análisis revela que el 70% de la varianza explicada por la primer componente. Este dato es significativo, ya que indica que una gran parte de la variabilidad en los datos puede ser atribuida a esta principal dimensión de análisis.
En cuanto a los precios de vivienda, la zona oriente destaca por tener los valores promedio más elevados, característica que se alinea con la predominancia del estrato 6, o zona de ingresos altos. Le sigue la zona sur con los segundos precios más altos, lo cual concuerda con la presencia frecuente de los estratos socioeconómicos 4 y 5. Contrariamente, la zona oriente registra los precios más bajos, situación influenciada no solo por la prevalencia del estrato 3 sino también por ser reconocida como la zona de ingresos más bajos de la ciudad en estudio. Este panorama subraya la coherencia entre la ubicación geográfica de las viviendas, su estrato socioeconómico y el nivel de precios, ofreciendo una perspectiva integral de la dinámica inmobiliaria de la ciudad.
Observaciones:
Estas observaciones se basan en la distribución y características de las propiedades, la segmentación del mercado, el estrato socioeconómico, la ubicación geográfica, y los patrones de precios identificados:
Preferencias y tendencias del mercado
Segmentación del mercado
Importancia de las características físicas
Uso del análisis estadístico para la toma de decisiones
Conclusión global
La información analizada revela un mercado de viviendas urbanas complejo y segmentado, donde la ubicación, el estrato socioeconómico, y características específicas de las propiedades como el tamaño y la cantidad de baños juegan roles cruciales en la determinación del valor de las propiedades. Para la empresa inmobiliaria, entender estas dinámicas es esencial para tomar decisiones informadas sobre desarrollo de proyectos, estrategias de inversión, y posicionamiento de mercado.
Recomendaciones estratégicas