En un mercado inmobiliario en constante evolución, es fundamental para las empresas del sector entender a profundidad las dinámicas que influyen en la oferta y la demanda de propiedades. Este informe se enfoca en analizar un conjunto de datos extensos proporcionados por una inmobiliaria líder en la ciudad, con el objetivo de identificar patrones y relaciones clave que afectan la variación de precios y otros factores relevantes en el mercado de viviendas urbanas. A través de técnicas avanzadas de análisis de datos, se busca proporcionar insights estratégicos que puedan guiar la toma de decisiones y optimizar las operaciones de la empresa en un entorno competitivo.
Realizar un análisis integral y multidimensional del mercado inmobiliario urbano utilizando un conjunto de datos que contiene información detallada sobre diversas propiedades residenciales en Cali.
Identificar las características clave que influyen en la variación del precio de las viviendas mediante el Análisis de Componentes Principales (PCA).
Agrupar las propiedades en segmentos homogéneos utilizando el Análisis de Conglomerados, para entender mejor las dinámicas de las ofertas en diferentes partes de la ciudad y en distintos estratos socioeconómicos.
Explorar las relaciones entre variables categóricas como el tipo de vivienda, zona y barrio a través del Análisis de Correspondencia, para identificar patrones de comportamiento en la oferta del mercado inmobiliario.
Presentar los resultados de manera clara y visual a través de gráficos y tablas que faciliten la interpretación de los hallazgos.
Discutir los resultados obtenidos y brindar recomendaciones que ayuden a la inmobiliaria a optimizar sus estrategias de negocio y maximizar los beneficios en un mercado en constante cambio.
El análisis comenzó con una limpieza exhaustiva del conjunto de datos, que incluyó la eliminación de valores duplicados, el tratamiento de valores faltantes y la estandarización de variables. Posteriormente, se llevó a cabo un análisis exploratorio de los datos, donde se validaron outliers, se generaron diagramas de barras para visualizar la distribución de variables categóricas, y se utilizó un mapa geoespacial para identificar la ubicación de las propiedades dentro de la ciudad.
Luego, se aplicó el Análisis de Componentes Principales (PCA) para reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables en componentes principales, lo que permitió identificar las características clave que influyen en la variación de precios. Con estas componentes, se realizó un Análisis de Conglomerados para agrupar las propiedades en segmentos homogéneos, y un Análisis de Correspondencia para explorar las relaciones entre variables categóricas. Los resultados se presentaron mediante gráficos y tablas, y se incluyó una discusión detallada con recomendaciones estratégicas para la inmobiliaria.
Se descarga y valida el tipo de datos del dataset vivienda
## id zona piso estrato preciom areaconst
## "numeric" "character" "character" "numeric" "numeric" "numeric"
## parqueaderos banios habitaciones tipo barrio longitud
## "numeric" "numeric" "numeric" "character" "character" "numeric"
## latitud
## "numeric"
El dataset contiene las siguientes columnas con sus respectivos tipos de datos: id es de tipo numeric, zona y piso son de tipo character, estrato es de tipo numeric (pero debe tratarse como character porque representa diferentes niveles socioeconómicos, que no son cuantitativos), preciom y areaconst son de tipo numeric, parqueaderos, banios, y habitaciones son de tipo numeric (pero deben tratarse como character porque representan la cantidad de características presentes, como el número de parqueaderos, baños o habitaciones, las cuales son categorías discretas más que valores continuos), tipo y barrio son de tipo character, y finalmente longitud y latitud son de tipo numeric.
Transformamos las variables de clasificación a character
## id zona piso estrato preciom areaconst
## "numeric" "character" "character" "character" "numeric" "numeric"
## parqueaderos banios habitaciones tipo barrio longitud
## "character" "character" "character" "character" "character" "numeric"
## latitud
## "numeric"
Posteriormente, transformamos los datos de tipo carácter a mayúsculas, lo cual nos permitirá unificar y estandarizar mejor la información
char_columns <- sapply(vivienda, is.character)
vivienda[char_columns] <- lapply(vivienda[char_columns], toupper)
Identificamos el número de valores nulos presentes en cada 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
El resultado generado evidencia la presencia de muchos valores nulos, lo que puede afectar el análisis de los datos, ya que pueden distorsionar los resultados o limitar la cantidad de información utilizable. En este caso, se observa que algunas columnas tienen una cantidad significativa de valores nulos, como las columnas de piso y parqueaderos, que tiene 2638 y 1602 valores nulos respectivamente, lo que podría indicar que esta información no está disponible o no se registró para muchas observaciones. Además de esto se identifica que todas las columnas se tienen un total de 3 datos nullos por lo que se proceden a borrar los datos que no tienen id para limpiar los datos que no representan nada para el dataset.
## id zona piso estrato preciom areaconst
## 0 0 2635 0 0 0
## parqueaderos banios habitaciones tipo barrio longitud
## 1602 0 0 0 0 0
## latitud
## 0
Luego de eliminar los tres registros que no aportaban información relevante al conjunto de datos, se procedió a calcular el porcentaje de datos nulos en las columnas piso y parqueaderos. Esto se realizó con el objetivo de evaluar si es viable eliminar los registros incompletos, o bien, considerar alternativas como reemplazar los valores faltantes por 0 o por la moda, dependiendo de lo que resulte más adecuado para mantener la integridad y representatividad del análisis.
## id zona piso estrato preciom areaconst
## 0.00000 0.00000 31.67448 0.00000 0.00000 0.00000
## parqueaderos banios habitaciones tipo barrio longitud
## 19.25712 0.00000 0.00000 0.00000 0.00000 0.00000
## latitud
## 0.00000
Después de analizar los datos, se identificó que la columna piso presenta un 31.67% de valores nulos, lo que indica una proporción significativa de registros sin información en esta variable. De manera similar, la columna parqueaderos tiene un 19.26% de datos faltantes, lo que también es relevante. Las demás columnas no presentan valores nulos, manteniéndose con un 0% de datos faltantes.
En este contexto, la imputación de los valores nulos en las columnas piso y parqueaderos con el valor 0 es una estrategia justificada por varias razones clave. A diferencia de la eliminación de registros con datos faltantes, que podría reducir significativamente el tamaño de la muestra y comprometer la representatividad de los datos, la imputación con 0 permite conservar todas las observaciones. Esto garantiza que la muestra se mantenga completa y representativa.
Además, imputar con 0 es preferible a utilizar la moda en situaciones donde se busca evitar la introducción de sesgos, especialmente cuando la distribución de los datos no es uniforme. El valor 0 tiene un significado claro y lógico en este contexto, indicando la ausencia de un piso específico o la falta de parqueaderos.
Se modifican los datos por 0
## id zona piso estrato preciom areaconst
## 0 0 0 0 0 0
## parqueaderos banios habitaciones tipo barrio longitud
## 0 0 0 0 0 0
## latitud
## 0
Se realizó una validación del total de datos duplicados en el conjunto de datos, excluyendo la columna id, y se determinó que aproximadamente el 0.69% de los registros estaban duplicados. Para garantizar la consistencia y la calidad en la preparación de los modelos que se presentarán más adelante, se ha tomado la decisión de eliminar estos registros duplicados. Esta acción busca evitar posibles inconsistencias en los resultados del análisis y asegurar que el modelo se base en datos únicos y representativos. Por lo que quedamos con un total de 8.262 registros.
## [1] 57
## [1] 0.6851785
En el análisis de las variables precio de las propiedades y área construida, se identificaron valores atípicos significativos a través de los gráficos boxplot. Estos valores atípicos se presentan como propiedades con precios y áreas construidas que se sitúan considerablemente por encima del rango intercuartílico (IQR), indicando la presencia de inmuebles de características excepcionales dentro del conjunto de datos.
Dado que estos valores atípicos reflejan la realidad del mercado inmobiliario y no son errores de medición ni datos incorrectos, se ha decidido mantenerlos en el análisis. Estos outliers son representativos de segmentos específicos del mercado, como las propiedades de alta gama, y su eliminación podría resultar en una pérdida significativa de información y una distorsión del análisis.
Al conservar estos outliers, se garantiza que el análisis sea integral y representativo, permitiendo una evaluación más precisa de la variabilidad en los precios y tamaños de las propiedades en el mercado inmobiliario.
El análisis univariado de las variables proporciona una visión inicial de la distribución de cada característica relevante del mercado inmobiliario.
La mayoría de las propiedades cuentan con 2 o 3 baños, lo cual es consistente con las configuraciones típicas de viviendas familiares. Es notable que las propiedades con más de 4 baños son relativamente raras, indicando que estas suelen pertenecer a un segmento de lujo.
La distribución del estrato muestra que los estratos 4, 5 y 6 son los más comunes, lo cual refleja un mercado orientado principalmente hacia clases medias y altas. Este patrón es típico en áreas urbanas con desarrollo inmobiliario orientado a sectores socioeconómicos con mayor poder adquisitivo.
El análisis de las habitaciones revela que la mayoría de las propiedades tienen entre 2 y 4 habitaciones. Propiedades con más de 5 habitaciones son menos frecuentes, sugiriendo que las viviendas de gran tamaño son menos comunes en el mercado.
Un gran número de propiedades tienen solo un parqueadero, mientras que la cantidad de propiedades con 2 o más parqueaderos disminuye significativamente. Esto podría indicar que la mayoría de las propiedades están diseñadas para familias con uno o dos vehículos.
La mayoría de las propiedades tienen solo uno o dos pisos, lo que es típico en viviendas unifamiliares y algunos apartamentos. Propiedades con más pisos son menos comunes, lo que puede reflejar un menor número de edificios residenciales altos en el área de estudio.
Hay una predominancia de apartamentos en comparación con casas.
La mayor concentración de propiedades se encuentra en la Zona Sur.
El mapa geoespacial de las zonas más vendidas resalta las áreas con mayor actividad de ventas, con una evidente concentración en la Zona Sur. Esto sugiere que esta área es actualmente la más dinámica en términos de transacciones inmobiliarias, representando una oportunidad clave para la inversión y el desarrollo de nuevas propiedades.
El Componente Principal 1 (PC1) explica el 48.9% de la variabilidad en los datos, lo que indica que casi la mitad de la información total puede ser resumida por este componente. El Componente Principal 2 (PC2) añade un 20% adicional de variabilidad explicada, alcanzando un total acumulado de 68.8% cuando se consideran ambos componentes. Este alto porcentaje sugiere que las dos primeras dimensiones son suficientes para capturar la mayor parte de la variabilidad en los datos.
## Warning: package 'factoextra' was built under R version 4.3.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
Las cargas de las variables en PC1 muestran que las variables más influyentes en la variación de precios (preciom) son:
Área construida (areaconst) con una carga de 0.443, Número de baños (banios) con 0.467, Número de parqueaderos (parqueaderos) con 0.407.
Estas variables están altamente correlacionadas con el precio y contribuyen significativamente al componente principal.
En PC2, las variables piso y estrato son las más dominantes, pero su influencia en el precio es menos directa comparada con la que ejercen en PC1.
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 1.8499 1.1832 0.9307 0.67681 0.65089 0.49046 0.43542
## Proportion of Variance 0.4889 0.2000 0.1237 0.06544 0.06052 0.03436 0.02708
## Cumulative Proportion 0.4889 0.6888 0.8126 0.87803 0.93855 0.97292 1.00000
## PC1 PC2 PC3 PC4 PC5
## preciom 0.47670359 0.1682681 0.11346435 0.008105704 -0.3599433
## areaconst 0.44372471 -0.2203434 -0.03090764 -0.215915031 -0.6467440
## parqueaderos 0.40741172 0.2467589 0.08297701 -0.715387641 0.4978408
## banios 0.46667883 -0.1343795 -0.17654227 0.333837318 0.2091921
## habitaciones 0.28747480 -0.5643286 -0.41042844 0.158022926 0.3397926
## estrato 0.32612984 0.5211761 0.24231547 0.550127390 0.1618776
## piso -0.05555361 0.5040789 -0.84908769 -0.049767204 -0.1374515
## PC6 PC7
## preciom 0.22259976 -0.743229340
## areaconst -0.28499611 0.455501972
## parqueaderos -0.04577798 0.067230729
## banios 0.67636506 0.346853704
## habitaciones -0.44564201 -0.302345693
## estrato -0.45895769 0.154309376
## piso -0.02054940 0.008737097
El Scree Plot confirma que los dos primeros componentes principales son los más relevantes, explicando juntos aproximadamente el 69% de la variabilidad total. La pendiente pronunciada que se aplana después del segundo componente indica que los componentes adicionales añaden información marginal.
El gráfico de variables en el plano de los componentes principales muestra cómo se alinean las variables con PC1 y PC2. Las variables preciom, areaconst, banios, y parqueaderos se agrupan en la misma dirección en PC1, indicando su influencia positiva en el precio. Por otro lado, la variable piso se alinea principalmente con PC2, lo que sugiere una influencia diferente, posiblemente relacionada con la ubicación o características estructurales que no están directamente relacionadas con el precio en el mismo sentido que las otras variables.
El Biplot permite visualizar tanto las variables como las observaciones (propiedades) en el espacio de los componentes principales. Las diferentes agrupaciones por estrato (estrato) reflejan cómo las propiedades se distribuyen en función de sus características y cómo estas influyen en el precio. Se observa que las propiedades con mayor estrato tienden a agruparse en la región donde preciom, areaconst, y banios tienen una fuerte presencia, indicando que las propiedades en estratos más altos tienden a ser más caras y mejor equipadas.
## Warning: Removed 4 rows containing missing values or values outside the scale range
## (`geom_point()`).
El PCA ha revelado que las características físicas de las propiedades, como el área construida, el número de baños y el número de parqueaderos, son las principales variables que influyen en el precio de las viviendas. Estas variables están fuertemente correlacionadas con el primer componente principal, que captura casi el 50% de la variabilidad en los precios. El estrato y el número de pisos también juegan un papel, aunque con una influencia diferente, posiblemente reflejando aspectos de ubicación y estructura.
Estas conclusiones son fundamentales para el análisis del mercado inmobiliario, ya que permiten identificar los factores clave que deben ser considerados en la toma de decisiones estratégicas de compra y venta de propiedades.
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ✔ readr 2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::combine() masks gridExtra::combine()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ tibble::view() masks summarytools::view()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
##
## 1 2 3 4
## ZONA CENTRO 32 91 0 1
## ZONA NORTE 79 1804 4 21
## ZONA OESTE 15 1160 0 20
## ZONA ORIENTE 112 231 2 5
## ZONA SUR 158 4386 22 119
##
## 1 2 3 4
## 3 259 1173 3 10
## 4 72 2023 0 11
## 5 60 2629 2 36
## 6 5 1847 23 109
El análisis de conglomerados realizado sobre el conjunto de datos de propiedades residenciales permitió la identificación de cuatro grupos (clústeres) homogéneos, los cuales agrupan viviendas con características similares en términos de precio, área construida, zona de la ciudad y estrato socioeconómico. A continuación, se detallan los principales hallazgos:
Identificación de Clústeres: Se identificaron cuatro clústeres principales en el mercado inmobiliario, cada uno de los cuales agrupa propiedades con características similares. Esta segmentación es clave para entender las dinámicas específicas del mercado en diferentes partes de la ciudad y en distintos estratos socioeconómicos.
Distribución de Clústeres por Zona:
Clúster 2: Predomina en las zonas Norte y Sur, sugiriendo que estas áreas presentan una mayor homogeneidad en las características de sus propiedades. Zonas Oeste y Oriente: Estas zonas muestran una mayor diversidad en la oferta inmobiliaria, con una presencia notable de otros clústeres, lo que indica una mezcla de propiedades con características variadas. Distribución de Clústeres por Estrato:
Estratos 4, 5 y 6: La mayoría de las propiedades en estos estratos pertenecen al Clúster 2, lo que indica una relativa homogeneidad en las características de las viviendas de estos niveles socioeconómicos. Estrato 3: Presenta una distribución más equilibrada entre los clústeres, con una notable presencia del Clúster 1, lo que sugiere una mayor diversidad en las características de las propiedades en este estrato. Conclusiones Estratégicas:
Las zonas Norte y Sur muestran una mayor segmentación del mercado, con propiedades que en su mayoría pertenecen al Clúster 2. Esto sugiere que las estrategias de marketing y oferta en estas zonas pueden enfocarse en las características compartidas por este clúster. La presencia de otros clústeres, especialmente en las zonas Oeste y Oriente, destaca la necesidad de una estrategia diferenciada para captar la atención de segmentos de mercado más diversos y especializados.
## Warning: package 'FactoMineR' was built under R version 4.3.3
## Warning: package 'mice' was built under R version 4.3.3
## Warning in check_dep_version(): ABI version mismatch:
## lme4 was built with Matrix ABI version 1
## Current Matrix ABI version is 0
## Please re-install lme4 from source or restore original 'Matrix' package
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## tipo zona estrato
## 8262 1 1 1 0
## 0 0 0 0
##
## 3 4 5 6
## ZONA CENTRO 105 14 4 1
## ZONA NORTE 567 406 763 172
## ZONA OESTE 54 83 289 769
## ZONA ORIENTE 339 8 2 1
## ZONA SUR 380 1595 1669 1041
En el análisis de correspondencia realizado, se examinaron las relaciones entre las zonas de la ciudad y los estratos socioeconómicos. Los resultados muestran que el primer eje (Dim1) explica el 70% de la variabilidad, mientras que el segundo eje (Dim2) captura un 27.6%, lo que significa que estos dos ejes combinados explican el 97.6% de la variabilidad en los datos.
En el gráfico de correspondencia, podemos observar claras asociaciones entre ciertas zonas y estratos:
Zona Oeste está fuertemente relacionada con el estrato 6.
Zona Sur y Zona Norte muestran una asociación con los estratos 4 y 5, respectivamente.
Zona Oriente y Zona Centro están asociadas predominantemente con el estrato 3.
Estas asociaciones indican que existe una segmentación geográfica en la ciudad basada en el estrato socioeconómico, con algunas zonas claramente vinculadas a niveles socioeconómicos específicos. Este tipo de análisis es útil para entender cómo se distribuyen las diferentes ofertas inmobiliarias en relación con los estratos socioeconómicos, lo que puede ser un insumo clave para la planificación de estrategias comerciales en el mercado inmobiliario.
El análisis de componentes principales reveló que las variables más influyentes en la variabilidad del precio de las viviendas son el número de parqueaderos, el área construida y el número de baños. Estos factores deben ser priorizados al evaluar el valor de las propiedades, ya que explican una parte significativa de la variabilidad en los precios. Además, se identificó que el primer componente principal explica el 48.9% de la variabilidad total, lo que sugiere que se pueden utilizar combinaciones de estas variables para simplificar la toma de decisiones sobre precios.
El análisis de conglomerados permitió agrupar las propiedades en cuatro segmentos diferenciados en función de sus características similares, como la zona y el estrato socioeconómico. Este análisis mostró que las zonas y los estratos tienen una fuerte influencia en la agrupación de las propiedades. En particular, se observó que: - Las propiedades en estratos más altos (5 y 6) tienden a agruparse en las zonas Norte y Oeste. - Las zonas Centro y Oriente agrupan propiedades de estratos más bajos (3 y 4).
Estos segmentos son cruciales para entender la dinámica de la oferta inmobiliaria, permitiendo la personalización de estrategias comerciales para cada segmento específico.
El análisis de correspondencia confirmó la fuerte relación entre la ubicación geográfica (zonas) y los estratos socioeconómicos. Se identificaron patrones claros: - La Zona Oeste está fuertemente asociada con el estrato 6, reflejando una concentración de viviendas de alto valor. - Las Zonas Sur y Norte están vinculadas a los estratos 4 y 5, respectivamente. - Las Zonas Oriente y Centro están principalmente asociadas con el estrato 3.
Estos hallazgos indican una segmentación geográfica que debe considerarse al diseñar estrategias de marketing y venta, asegurando que las campañas y ofertas estén alineadas con las características socioeconómicas de cada zona.
Estos hallazgos proporcionan una base sólida para la toma de decisiones estratégicas en la dirección de la empresa, permitiendo una mejor alineación entre las ofertas inmobiliarias y las necesidades del mercado.
En esta sección podrás encontrar todo el código realizado para presentar el informe
install.packages("knitr")
library(paqueteMODELOS)
# Descargar la vivienda
data(vivienda)
######################################################### Limpieza de datos
# Validar los tipos de datos
sapply(vivienda, class)
# Transformar a character
vivienda$estrato <- as.character(vivienda$estrato)
vivienda$parqueaderos <- as.character(vivienda$parqueaderos)
vivienda$banios <- as.character(vivienda$banios)
vivienda$habitaciones <- as.character(vivienda$habitaciones)
vivienda$tipo <- as.character(vivienda$tipo)
# Validar los tipos de datos
sapply(vivienda, class)
#convertir a mayusculas los valores
char_columns <- sapply(vivienda, is.character)
vivienda[char_columns] <- lapply(vivienda[char_columns], toupper)
## Validación de datos null
colSums(is.na(vivienda))
#Eliminacioin tres registor null
vivienda <- vivienda[!is.na(vivienda$id),]
##Volvemos a validar que registros continuan nullos
colSums(is.na(vivienda)) ## identificamos que al eliminar los valores nullos de id unicamente quedamos con valores nullos en parquedaros y pisos que a pesar de ser variables numericas en este caso nos funcionaban como variables categoricas, ya que, nos permitia entender que caracteristicas buscaban los posibles compradores ahora es importante saber cual es el procentaje de valores nullos para tomar una desicion
# Calcular el porcentaje de valores nullos por columna
percentage_na_per_column <- colSums(is.na(vivienda)) / nrow(vivienda) * 100
# Mostrar el porcentaje de valores nulos por columna
percentage_na_per_column
## Se identifica que existe un total de 19.26% de datos nulos para parqueadero mientras que para piso tenemos un 31.67 es importante mencionar que en este caso no podemos realizar un ponderado con la media la mediana o la moda
## Se modifican los datos por 0
vivienda$piso[is.na(vivienda$piso)] <- 0
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- 0
colSums(is.na(vivienda))
# Eliminar filas duplicadas considerando todas las columnas excepto 'id'
total_filas <- nrow(vivienda)
duplicados <- sum(duplicated(vivienda[, -which(names(vivienda) == "id")]))
porcentaje_duplicados <- (duplicados / total_filas) * 100
duplicados
porcentaje_duplicados
vivienda_sin_duplicados <- vivienda[!duplicated(vivienda[, -which(names(vivienda) == "id")]), ]
# Mostrar el DataFrame sin duplicados
vivienda_sin_duplicados
setwd("C:/Users/anaso/OneDrive/Desktop")
######################################## Analisis exploratorio de los Datos
## precio y area constuida
boxplot(vivienda_sin_duplicados$preciom, main="Boxplot de Precios", ylab="Precio")
boxplot(vivienda_sin_duplicados$areaconst, main="Boxplot de Área Construida", ylab="Área Construida")
install.packages("ggplot2")
install.packages("dplyr")
library(ggplot2)
library(dplyr)
# Banios
png(filename = "C:/ruta_a_donde_quieres_guardar/plot.png", width = 480, height = 480)
# Aquí tu código para generar la gráfica
dev.off()
ggplot(vivienda_sin_duplicados, aes(x=banios, fill=factor(banios))) +
geom_bar() +
theme_minimal() +
labs(title="Distribución de Baños", x="Número de Baños", y="Frecuencia") +
theme(axis.text.x = element_text(angle=45, hjust=1)) +
scale_fill_brewer(palette="Set3") # Usa una paleta de colores diferente
# Estrato
ggplot(vivienda_sin_duplicados, aes(x=estrato, fill=factor(estrato))) +
geom_bar() +
theme_minimal() +
labs(title="Distribución de Estrato", x="Estrato", y="Frecuencia") +
theme(axis.text.x = element_text(angle=45, hjust=1)) +
scale_fill_brewer(palette="Set3") # Usa una paleta de colores diferente
# Habitaciones
ggplot(vivienda_sin_duplicados, aes(x=habitaciones, fill=factor(habitaciones))) +
geom_bar() +
theme_minimal() +
labs(title="Distribución de Habitaciones", x="Número de Habitaciones", y="Frecuencia") +
theme(axis.text.x = element_text(angle=45, hjust=1)) +
scale_fill_brewer(palette="Set3") # Usa una paleta de colores diferente
# Parqueaderos
ggplot(vivienda_sin_duplicados, aes(x=parqueaderos, fill=factor(parqueaderos))) +
geom_bar() +
theme_minimal() +
labs(title="Distribución de Parqueaderos", x="Número de Parqueaderos", y="Frecuencia") +
theme(axis.text.x = element_text(angle=45, hjust=1)) +
scale_fill_brewer(palette="Set3") # Usa una paleta de colores diferente
# Piso
ggplot(vivienda_sin_duplicados, aes(x=piso, fill=factor(piso))) +
geom_bar() +
theme_minimal() +
labs(title="Distribución de Pisos", x="Número de Pisos", y="Frecuencia") +
theme(axis.text.x = element_text(angle=45, hjust=1)) +
scale_fill_brewer(palette="Set3") # Usa una paleta de colores diferente
# Tipo
ggplot(vivienda_sin_duplicados, aes(x=tipo, fill=factor(tipo))) +
geom_bar() +
theme_minimal() +
labs(title="Distribución de Tipo de Vivienda", x="Tipo de Vivienda", y="Frecuencia") +
theme(axis.text.x = element_text(angle=45, hjust=1)) +
scale_fill_brewer(palette="Set3") # Usa una paleta de colores diferente
# Zona
ggplot(vivienda_sin_duplicados, aes(x=zona, fill=factor(zona))) +
geom_bar() +
theme_minimal() +
labs(title="Distribución por Zona", x="Zona", y="Frecuencia") +
theme(axis.text.x = element_text(angle=45, hjust=1)) +
scale_fill_brewer(palette="Set3") # Usa una paleta de colores diferente
# Creación del mapa interactivo con leaflet
library(leaflet)
mapa <- leaflet(vivienda_sin_duplicados, options = leafletOptions(minZoom = 11, maxZoom = 40)) %>%
addTiles() %>%
addCircleMarkers(
~longitud, ~latitud,
color = "#034A94",
clusterOptions = markerClusterOptions(spiderfyDistanceMultiplier = 1.5)
)
mapa
library(factoextra)
## paso 1
# Asegúrate de que todas las variables están en formato numérico
vivienda_sin_duplicados$preciom <- as.numeric(vivienda_sin_duplicados$preciom)
vivienda_sin_duplicados$areaconst <- as.numeric(vivienda_sin_duplicados$areaconst)
vivienda_sin_duplicados$parqueaderos <- as.numeric(vivienda_sin_duplicados$parqueaderos)
vivienda_sin_duplicados$banios <- as.numeric(vivienda_sin_duplicados$banios)
vivienda_sin_duplicados$habitaciones <- as.numeric(vivienda_sin_duplicados$habitaciones)
vivienda_sin_duplicados$estrato <- as.numeric(vivienda_sin_duplicados$estrato)
vivienda_sin_duplicados$piso <- as.numeric(vivienda_sin_duplicados$piso)
# Estandarizar las variables
viviendaZ <- scale(vivienda_sin_duplicados[, c('preciom', 'areaconst', 'parqueaderos', 'banios', 'habitaciones', 'estrato', 'piso')])
## paso 2
# Aplicar PCA
res.pca <- prcomp(viviendaZ, scale = TRUE)
# Resumen del PCA
summary(res.pca)
# Rotación de los componentes principales (Cargas de las variables)
res.pca$rotation
## paso 3
# Cargar librería para visualización
library(factoextra)
# Visualización de la varianza explicada
fviz_eig(res.pca, addlabels = TRUE)
## paso 4
# Visualización de las variables en el plano de los componentes principales
fviz_pca_var(res.pca,
col.var = "contrib",
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE)
## paso 5
# Selección de casos extremos (puedes seleccionar los más representativos para tu análisis)
casos <- vivienda_sin_duplicados[c(1, 50, 100, 150), ] # Reemplaza con índices de interés
casos_pca <- predict(res.pca, newdata = scale(casos[, c('preciom', 'areaconst', 'parqueaderos', 'banios', 'habitaciones', 'estrato', 'piso')]))
# Visualización de los individuos (propiedades) junto con los casos seleccionados
fviz_pca_ind(res.pca, col.ind = "#DEDEDE") +
geom_point(data = as.data.frame(casos_pca), aes(x = PC1, y = PC2), color = "red", size = 3)
## paso 6
# Biplot para la interpretación global de componentes y observaciones
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = vivienda_sin_duplicados$estrato, # O cualquier otra variable categórica
col.var = "#034A94",
col.ind = c("#DEDEDE", "#034A94"))
# Cargar las librerías necesarias
library(tidyverse)
library(cluster)
library(factoextra)
# Escalar las variables antes de calcular distancias
vivienda_scaled <- scale(vivienda_sin_duplicados[, c("preciom", "areaconst", "banios", "habitaciones", "estrato", "piso")])
# Calcular distancias euclidianas
dist_vivienda <- dist(vivienda_scaled, method = 'euclidean')
# Realizar el clustering jerárquico con el método 'complete'
hc_vivienda <- hclust(dist_vivienda, method = 'complete')
# Determinar a qué clúster pertenece cada observación (k=4 en este caso)
cluster_assignments <- cutree(hc_vivienda, k = 4)
# Asignar los clusters a la base de datos original
assigned_cluster <- vivienda_sin_duplicados %>% mutate(cluster = as.factor(cluster_assignments))
# Gráfico del dendograma
plot(hc_vivienda, cex = 0.6, main = "Dendograma de Viviendas", las=1,
ylab = "Distancia euclidiana", xlab = "Grupos")
rect.hclust(hc_vivienda, k = 4, border = 2:5)
# Gráfico de los clusters en el espacio de las primeras dos dimensiones (PCA)
fviz_cluster(list(data = vivienda_scaled, cluster = cluster_assignments))
# Distribución de los clusters por zona y estrato
cluster_zona <- table(assigned_cluster$zona, assigned_cluster$cluster)
cluster_estrato <- table(assigned_cluster$estrato, assigned_cluster$cluster)
# Mostrar las tablas
print(cluster_zona)
print(cluster_estrato)
# Gráfico de barras para distribución por zona y por estrato
ggplot(assigned_cluster, aes(x = zona, fill = cluster)) +
geom_bar(position = "fill") +
labs(title = "Distribución de Clústeres por Zona", y = "Proporción", x = "Zona") +
theme_minimal()
ggplot(assigned_cluster, aes(x = estrato, fill = cluster)) +
geom_bar(position = "fill") +
labs(title = "Distribución de Clústeres por Estrato", y = "Proporción", x = "Estrato") +
theme_minimal()
# Cargar las librerías necesarias
library(dplyr)
library(FactoMineR)
library(factoextra)
library(mice)
# Seleccionar las variables de interés: tipo, zona, estrato
vivienda_correspondencia <- vivienda_sin_duplicados %>%
select(tipo, zona, estrato)
# Convertir las variables a factores si no lo son
vivienda_correspondencia$estrato <- as.factor(vivienda_correspondencia$estrato)
vivienda_correspondencia$tipo <- as.factor(vivienda_correspondencia$tipo)
vivienda_correspondencia$zona <- as.factor(vivienda_correspondencia$zona)
# Verificar datos faltantes
md.pattern(vivienda_correspondencia, rotate.names = TRUE)
# Eliminar datos faltantes
vivienda_correspondencia <- na.omit(vivienda_correspondencia)
# Crear tabla cruzada con las variables 'zona' y 'estrato'
tabla_correspondencia <- table(vivienda_correspondencia$zona, vivienda_correspondencia$estrato)
print(tabla_correspondencia)
# Realizar el Análisis de Correspondencia
resultados_ac <- CA(tabla_correspondencia)
# Visualizar Scree Plot
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80)) +
ggtitle("Porcentaje de Varianza Explicado por Cada Eje") +
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
# Visualizar el gráfico de correspondencia
fviz_ca_biplot(resultados_ac, repel = TRUE,
col.row = "#00AFBB", # Color de las filas (zona)
col.col = "#FC4E07" # Color de las columnas (estrato)
) +
ggtitle("Gráfico de Correspondencia: Zona y Estrato")