En este informe se presenta un análisis detallado de la solicitud de compra de viviendas en la ciudad de Cali por parte de una compañía internacional. Se utilizaron técnicas de modelación y análisis estadístico para evaluar las opciones disponibles y proporcionar recomendaciones basadas en datos.
El objetivo principal de este informe es proporcionar a María, propietaria de C&A (Casas y Apartamentos) en Cali, información relevante y análisis estadístico para tomar decisiones informadas sobre las viviendas que cumplen con las especificaciones de la solicitud.
Se utilizaron los siguientes pasos metodológicos para realizar el análisis:
• Se observa que el conjunto de datos contiene información sobre viviendas en Cali, con variables como zona, tipo, estrato, precio, área de construcción, número de parqueaderos, número de baños, número de habitaciones, ubicación geográfica (latitud y longitud) y el barrio. • Se identifican variables categóricas (zona, tipo, barrio) y numéricas (estrato, precio, área de construcción, etc.). • Se muestra un gráfico de barras que representa la distribución de tipos de variables en el conjunto de datos.
• Se identifican las variables con datos faltantes y se muestra el número de datos faltantes por variable en un gráfico de barras y una tabla. • Se observa que las variables “piso” y “parqueaderos” tienen un porcentaje significativo de datos faltantes.
• Se muestra un resumen estadístico para las variables numéricas, lo que proporciona información como la media, mediana, mínimo, máximo y cuartiles para cada variable.
• Se imputan los valores faltantes para la variable categórica “piso” utilizando la moda, es decir, el valor más frecuente. • Se imputan los valores faltantes para la variable numérica “parqueaderos” utilizando la mediana, que es menos sensible a valores atípicos que la media. • Se convierte la variable “piso” a tipo numérico para futuros cálculos. • Se eliminan los registros con datos faltantes en otras variables, lo que ayuda a mantener la integridad de los datos restantes.
• Se elimina la variable “id” del conjunto de datos, ya que no parece ser relevante para el análisis posterior y no aporta información útil.
• Se calcula la matriz de correlación entre las variables numéricas, lo que proporciona información sobre las relaciones lineales entre las variables. • Se observa que algunas variables tienen correlaciones positivas o negativas moderadas o fuertes entre sí. • Correlaciones positivas más fuertes: o Entre “areaconst” (área de construcción) y “preciom” (precio), con un valor de 0.687, lo que indica que a medida que aumenta el área de construcción, tiende a aumentar el precio de la vivienda. o Entre “parqueaderos” y “areaconst”, con un valor de 0.523, lo que sugiere que las viviendas con más parqueaderos tienden a tener un área de construcción más grande. • Correlaciones positivas moderadas: o Entre “parqueaderos” y “preciom”, con un valor de 0.616, lo que indica que las viviendas con más parqueaderos tienden a tener precios más altos. o Entre “banios” (número de baños) y “areaconst”, con un valor de 0.648, sugiriendo que las viviendas con más baños tienden a tener un área de construcción más grande. • Correlaciones negativas más fuertes: o Entre “estrato” y “longitud”, con un valor de -0.444, lo que sugiere una relación inversa entre el estrato y la longitud (ubicación geográfica). o Entre “preciom” y “longitud”, con un valor de -0.344, sugiriendo una relación inversa entre el precio y la longitud. • Correlaciones negativas moderadas: o Entre “piso” (número de pisos) y “areaconst”, con un valor de -0.179, lo que sugiere que las viviendas con más pisos tienden a tener un área de construcción menor. o Entre “habitaciones” y “longitud”, con un valor de -0.008, indicando una relación leve pero negativa entre el número de habitaciones y la longitud. • Correlaciones más débiles: o La correlación entre “piso” y “estrato” es bastante baja (0.114), lo que indica una relación débil entre el número de pisos y el estrato. o La correlación entre “latitud” y “longitud” es también bastante baja (0.236), lo que sugiere una relación débil entre la latitud y la longitud, lo cual es esperado ya que son coordenadas geográficas.
Filtrado de datos: Se seleccionan únicamente las viviendas que cumplen con ciertos criterios predefinidos, como la ubicación geográfica (Zona Norte o Zona Sur) y otras características relevantes.
Clasificación con k-means: Se emplea el algoritmo k-means para agrupar los puntos geográficos de las viviendas en cada zona y así identificar áreas similares. Los puntos que no pertenecen al cluster predominante se etiquetan como outliers.
Análisis estadístico descriptivo: Se realizan estadísticas descriptivas para caracterizar las propiedades dentro y fuera del conglomerado en cada zona. Esto incluye calcular medidas como precios medios, áreas de construcción, estratos, número de baños y habitaciones.
Gráficos interactivos de dispersión: Se utilizan gráficos interactivos para visualizar dinámicamente la relación entre el precio y el área construida en las zonas Norte y Sur. Estos gráficos proporcionan información valiosa sobre la distribución de las viviendas y las relaciones entre las variables.
Modelo de regresión lineal múltiple: Se ajusta un modelo de regresión lineal múltiple para cada zona, utilizando variables como el área construida, el estrato, el número de habitaciones, baños y parqueaderos para predecir el precio de las viviendas. Se realiza una interpretación detallada de los coeficientes del modelo y se evalúa el ajuste del mismo.
Mapas: Se generan mapas que muestran la distribución geográfica de las viviendas en cada zona, resaltando visualmente la ubicación de las propiedades y su precio estimado. Estos mapas son útiles para comprender la distribución espacial de las viviendas y las tendencias del mercado.
En resumen, se utilizó un enfoque integral que combina análisis estadístico, modelado y visualización de datos para caracterizar y comparar las propiedades en las diferentes zonas. Esto proporciona una comprensión profunda del mercado inmobiliario en cada área y ayuda a tomar decisiones informadas.
Análisis para casas en la Zona Norte:
Filtrado de datos: Se seleccionan únicamente las casas ubicadas en la Zona Norte de acuerdo con los criterios especificados.
Clasificación con k-means: Se agrupan los puntos geográficos de las casas en la Zona Norte utilizando el algoritmo k-means para identificar áreas similares. Se etiquetan los puntos que no pertenecen al cluster predominante como outliers.
Resultados específicos:
• Se clasificaron 606 puntos como ‘Dentro’ (dentro del conglomerado) y 232 como ‘Fuera’ (outliers) en la Zona Norte. • La cantidad total de puntos antes de la clasificación en la Zona Norte fue de 1920. • Las estadísticas descriptivas muestran características específicas de las casas ‘Dentro’ del conglomerado en la Zona Norte, como precios medios, áreas de construcción, estratos, número de baños y habitaciones.
Análisis para apartamentos en la Zona Sur:
Filtrado de datos: Se seleccionan únicamente los apartamentos ubicados en la Zona Sur según los criterios especificados.
Clasificación con k-means: Se agrupan los puntos geográficos de los apartamentos en la Zona Sur utilizando k-means para identificar áreas similares y se etiquetan los puntos que no pertenecen al cluster predominante como outliers.
Resultados específicos: • Se clasificaron 1917 puntos como ‘Dentro’ (dentro del conglomerado) y 1740 como ‘Fuera’ (outliers) en la Zona Sur. • La cantidad total de puntos antes de la clasificación en la Zona Sur fue de 2787. • Las estadísticas descriptivas muestran características específicas de los apartamentos ‘Dentro’ del conglomerado en la Zona Sur, como precios medios, áreas de construcción, estratos, número de baños y habitaciones.
En resumen, estos análisis proporcionan información detallada sobre la distribución espacial y las características de las viviendas en la Zona Norte (casas) y la Zona Sur (apartamentos), lo que puede ser útil para comprender mejor el mercado inmobiliario en cada área y tomar decisiones informadas.
Basándome en la comparación de las variables estadísticas de las casas en la Zona Norte y los apartamentos en la Zona Sur, aquí están las conclusiones que se pueden extraer:
• La distribución geográfica de las casas en la Zona Norte y los apartamentos en la Zona Sur difiere significativamente, lo que indica una segregación espacial en la distribución de los tipos de viviendas en la ciudad.
• Las casas en la Zona Norte tienden a tener precios más altos en comparación con los apartamentos en la Zona Sur. Esto puede atribuirse a factores como el tamaño de la propiedad, las comodidades adicionales y la ubicación.
• Las casas en la Zona Norte tienen áreas de construcción generalmente más grandes en comparación con los apartamentos en la Zona Sur. Esto puede reflejar las preferencias de espacio y el estilo de vida de los residentes en cada zona.
• En promedio, las casas tienden a tener un estrato ligeramente más alto que los apartamentos. Esto puede sugerir que las casas en la Zona Norte están asociadas con un nivel socioeconómico ligeramente más alto en comparación con los apartamentos en la Zona Sur.
• Ambas zonas muestran una amplia variedad en el número de baños y habitaciones. Sin embargo, las casas en la Zona Norte tienden a tener más habitaciones en promedio que los apartamentos en la Zona Sur, lo que puede reflejar las preferencias de tamaño de las familias en cada tipo de vivienda.
• Ambas zonas presentan una variabilidad significativa en todas las variables estudiadas, lo que sugiere que hay una diversidad de opciones disponibles para los compradores en ambas áreas.
• Se encontró una correlación positiva entre el precio de las viviendas y variables como el área construida, estrato, número de baños y número de habitaciones. • El modelo de regresión lineal múltiple mostró un coeficiente de determinación (R^2) de 0.7177, lo que indica que el modelo explica aproximadamente el 71.77% de la variabilidad en los precios de las viviendas. • Se identificaron varias ofertas potenciales que cumplen con las especificaciones de la solicitud y se encuentran dentro del presupuesto establecido.
Los gráficos interactivos de dispersión proporcionan una visualización dinámica de la relación entre el precio y el área construida en las zonas Norte y Sur, lo que puede ser útil para que María comprenda mejor el mercado inmobiliario en cada área. Aquí hay algunas conclusiones basadas en los gráficos y las estadísticas descriptivas:
Zona Norte:
• Relación Precio-Área: Existe una variabilidad significativa en los precios de las casas en función del área construida. No parece haber una relación lineal clara entre el precio y el área construida. • Estrato y Baños: La coloración y el tamaño de los puntos indican el estrato y el número de baños respectivamente. Se observa que hay una distribución variada en términos de estrato y cantidad de baños en las viviendas de la Zona Norte. • Matriz de Correlación: La matriz de correlación muestra las relaciones entre las variables, donde se observa una correlación moderada entre el precio y el área construida, y una correlación más débil con el estrato, los baños y las habitaciones.
Zona Sur:
• Relación Precio-Área: Al igual que en la Zona Norte, hay una variabilidad considerable en los precios de los apartamentos en función del área construida. No parece haber una relación lineal clara entre el precio y el área construida. • Estrato y Baños: La coloración y el tamaño de los puntos indican el estrato y el número de baños respectivamente. Se observa una distribución variada en términos de estrato y cantidad de baños en los apartamentos de la Zona Sur. • Matriz de Correlación: Al igual que en la Zona Norte, la matriz de correlación muestra una correlación moderada entre el precio y el área construida, y una correlación más débil con el estrato, los baños y las habitaciones. En resumen, los gráficos interactivos y las estadísticas proporcionan información valiosa sobre la relación entre el precio y el área construida, así como otras características de las viviendas en las zonas Norte y Sur. Esto puede ayudar a María a comprender mejor las tendencias del mercado y a tomar decisiones informadas al buscar vivienda en cada área.
Vamos a interpretar los coeficientes del modelo de regresión lineal múltiple y discutir la significancia estadística, el coeficiente de determinación �2R2 y las implicaciones del ajuste del modelo para ambas zonas (Norte y Sur). Zona Norte:
• Intercepto (Intercept): El coeficiente es -287.35, lo que significa que se espera un precio base de -287.35 unidades monetarias para una casa con un área construida, estrato, habitaciones, parqueaderos y baños iguales a cero. Sin embargo, como no tiene sentido interpretar un precio negativo, este coeficiente no es muy útil en la práctica.
• Área Construida (areaconst): Por cada unidad adicional en el área construida, el precio de la casa aumenta en promedio $0.83541, manteniendo constante el efecto de las otras variables.
• Estrato (estrato): Por cada unidad adicional en el estrato, el precio de la casa aumenta en promedio $88.87, manteniendo constante el efecto de las otras variables.
• Habitaciones (habitaciones): Por cada unidad adicional en el número de habitaciones, el precio de la casa disminuye en promedio $7.61, manteniendo constante el efecto de las otras variables.
• Parqueaderos (parqueaderos): Por cada unidad adicional en el número de parqueaderos, el precio de la casa aumenta en promedio $24.52, manteniendo constante el efecto de las otras variables.
• Baños (banios): Por cada unidad adicional en el número de baños, el precio de la casa aumenta en promedio $36.45, manteniendo constante el efecto de las otras variables.
• �2R2 y Ajuste del Modelo: El coeficiente de determinación �2R2 es 0.7177, lo que significa que el modelo explica el 71.77% de la variabilidad en los precios de las casas en la Zona Norte. Esto sugiere que el modelo tiene un buen ajuste, pero aún queda un 28.23% de variabilidad sin explicar.
Zona Sur:
• Intercepto (Intercept): El coeficiente es -397.83, lo que significa que se espera un precio base de -397.83 unidades monetarias para un apartamento con un área construida, estrato, habitaciones, parqueaderos y baños iguales a cero. Como en el caso de la Zona Norte, este coeficiente no es muy útil en la práctica.
• Área Construida (areaconst): Por cada unidad adicional en el área construida, el precio del apartamento aumenta en promedio $0.91087, manteniendo constante el efecto de las otras variables.
• Estrato (estrato): Por cada unidad adicional en el estrato, el precio del apartamento aumenta en promedio $94.98, manteniendo constante el efecto de las otras variables.
• Habitaciones (habitaciones): Por cada unidad adicional en el número de habitaciones, el precio del apartamento disminuye en promedio $19.02, manteniendo constante el efecto de las otras variables.
• Parqueaderos (parqueaderos): Por cada unidad adicional en el número de parqueaderos, el precio del apartamento aumenta en promedio $67.50, manteniendo constante el efecto de las otras variables.
• Baños (banios): Por cada unidad adicional en el número de baños, el precio del apartamento aumenta en promedio $50.83, manteniendo constante el efecto de las otras variables.
• �2R2 y Ajuste del Modelo: El coeficiente de determinación �2R2 es 0.7721, lo que significa que el modelo explica el 77.21% de la variabilidad en los precios de los apartamentos en la Zona Sur. Esto sugiere que el modelo tiene un buen ajuste, pero aún queda un 22.79% de variabilidad sin explicar.
Implicaciones y Mejoras del Modelo:
• Ambos modelos tienen un buen ajuste, pero todavía hay una parte significativa de la variabilidad que no está siendo explicada. Esto sugiere que podrían incluirse más variables explicativas en el modelo para mejorar la capacidad de explicación. • Las variables incluidas en el modelo tienen coeficientes estadísticamente significativos, lo que indica que todas ellas contribuyen de manera significativa a la predicción de los precios de las viviendas. • La interpretación de los coeficientes sugiere que características como el estrato, el número de habitaciones, parqueaderos y baños tienen un impacto significativo en el precio de las viviendas en ambas zonas. Por ejemplo, en la Zona Norte, un aumento en el número de baños o parqueaderos aumenta el precio, mientras que un aumento en el número de habitaciones puede disminuirlo. En la Zona Sur, las mismas variables tienen efectos similares en el precio, pero con magnitudes ligeramente diferentes. • Se podría considerar la inclusión de interacciones entre variables o la exploración de otras técnicas de modelado más avanzadas para mejorar la capacidad predictiva del modelo y reducir la cantidad de variabilidad no explicada.
• Graficar residuos versus valores ajustados y verificar si la dispersión de los residuos es constante en todos los niveles de las variables independientes. Si la varianza de los residuos cambia con los valores ajustados, podríamos necesitar transformaciones o ajustes adicionales en el modelo.
Normalidad de Residuos: • Podemos realizar pruebas de normalidad de residuos, como la prueba de Shapiro-Wilk, y graficar cuantiles normales para los residuos. Si los residuos siguen aproximadamente una distribución normal, el supuesto de normalidad está satisfecho. De lo contrario, podríamos explorar transformaciones de variables o modelos alternativos.
Independencia de Residuos: • Graficar la autocorrelación de los residuos y realizar la prueba de Durbin-Watson para verificar la independencia de los residuos. Si no hay patrones evidentes en los gráficos de autocorrelación y el valor de Durbin-Watson está cerca de 2, el supuesto de independencia está satisfecho.
Colinealidad: • Calcular los VIF para cada variable independiente en el modelo. Si alguno de los VIF es significativamente mayor que 10, podría indicar colinealidad entre las variables independientes, lo que podría requerir la eliminación o transformación de algunas variables. Validación de Supuestos para el Modelo de Zona Sur: Podemos seguir los mismos pasos mencionados anteriormente, aplicados al modelo de regresión lineal múltiple estimado para la zona Sur.
Realizar estas verificaciones nos ayudará a asegurarnos de que los supuestos del modelo de regresión lineal múltiple se cumplan adecuadamente y, en caso de encontrar violaciones, nos dará una idea de las posibles acciones correctivas que podríamos tomar.
En este informe, se presentan las predicciones de precios de viviendas en las zonas Norte y Sur de una ciudad, utilizando modelos de regresión lineal múltiple. Se estimaron dos modelos separados para cada zona, utilizando datos históricos de ventas de viviendas. Luego, se realizaron predicciones de precios para dos nuevas viviendas en cada zona, con diferentes estratos y características.
• Para una vivienda de estrato 4 en Zona Norte, con un área construida de 200 metros cuadrados, 1 parqueadero, 2 baños y 4 habitaciones, se predice un precio de aproximadamente $302.2 millones. • Para una vivienda de estrato 5 en Zona Norte, con características similares a la anterior, se predice un precio de alrededor de $391.0 millones.
• Para un apartamento de estrato 5 en Zona Sur, con un área construida de 300 metros cuadrados, 3 parqueaderos, 3 baños y 5 habitaciones, se estima un precio de aproximadamente $610.2 millones. • Para un apartamento de estrato 6 en Zona Sur, con características similares, se proyecta un precio de alrededor de $705.2 millones.
Comparación de Resultados:
• En general, los precios predichos para las viviendas en Zona Sur son considerablemente más altos que los de Zona Norte, independientemente del estrato. • Para viviendas con características similares, el estrato parece tener un impacto significativo en el precio, con precios más altos para estratos más altos. • Las viviendas en Zona Sur tienden a tener precios más altos que las de Zona Norte, posiblemente debido a diferencias en la demanda y ubicación. • Los modelos de regresión utilizados parecen ajustarse bien a los datos disponibles, con altos valores de R-cuadrado ajustados.
Análisis Comparativo:
• Área Construida: Las viviendas en la Zona Sur tienden a tener un área construida mayor en comparación con las de la Zona Norte. Esto puede deberse a diferencias en la disponibilidad de terreno y la densidad de población en cada área. • Precio Estimado: Las viviendas en la Zona Sur tienen precios estimados más altos en promedio en comparación con las de la Zona Norte. Esto podría reflejar diferencias en la demanda, la ubicación y las características de las propiedades en cada zona. • Estrato y Crédito Preaprobado: Ambas zonas tienen viviendas de estrato alto (4 y 5), pero las de la Zona Sur tienen un crédito preaprobado considerablemente mayor en comparación con las de la Zona Norte. Esto sugiere que las viviendas en la Zona Sur pueden estar dirigidas a un segmento de mercado de mayor poder adquisitivo. En resumen, mientras que las viviendas en la Zona Norte tienden a ser más accesibles en términos de precio y crédito preaprobado, las de la Zona Sur ofrecen propiedades más grandes y lujosas, lo que las hace más atractivas para compradores con un mayor poder adquisitivo.
Los mapas muestran la distribución geográfica de las ofertas potenciales en cada zona, resaltando visualmente la ubicación de las propiedades y su precio estimado. Las viviendas en la Zona Sur tienden a estar más concentradas en áreas con precios más altos, mientras que las de la Zona Norte tienen una distribución más dispersa y precios más accesibles.
Se analizaron las ofertas potenciales de viviendas en ambas zonas para proporcionar una visión detallada de las diferencias entre ellas.
Comparación de Propiedades:
• Las propiedades en la Zona Norte tienen un área construida promedio de 200 metros cuadrados, mientras que en la Zona Sur el promedio es de 300 metros cuadrados. • La Zona Sur tiende a tener propiedades más espaciosas y con áreas construidas significativamente mayores que las de la Zona Norte.
• En la Zona Norte, los precios estimados varían entre $285.75 millones y $316.56 millones, mientras que en la Zona Sur varían entre $551.8 millones y $610.2 millones. • Las propiedades en la Zona Sur tienen precios estimados considerablemente más altos en comparación con las de la Zona Norte.
• Ambas zonas tienen propiedades de estrato alto (4 y 5). • Sin embargo, las propiedades en la Zona Sur tienen un crédito preaprobado mayor en comparación con las de la Zona Norte. • Esto sugiere que las propiedades en la Zona Sur pueden estar dirigidas a un segmento de mercado de mayor poder adquisitivo.
Las propiedades en la Zona Sur ofrecen un estilo de vida más lujoso y espacioso, con precios más altos y créditos preaprobados mayores.
Por otro lado, las propiedades en la Zona Norte son más accesibles en términos de precio y crédito preaprobado, pero también tienen áreas construidas más pequeñas en comparación con las de la Zona Sur.
La elección entre las dos zonas dependerá de las preferencias individuales del comprador, su presupuesto y las características específicas que estén buscando en una propiedad.
Recomendaciones:
En el análisis de los datos recopilados sobre los precios inmobiliarios en la plataforma OLX, se han observado varias tendencias y patrones interesantes que merecen un análisis detenido. Sin embargo, durante el proceso de análisis, surgieron algunas consideraciones importantes que deben tenerse en cuenta para interpretar adecuadamente los resultados. Uno de los hallazgos más destacados de nuestro estudio fue la discrepancia entre los precios anunciados en OLX y los precios reales del mercado inmobiliario. Esta discrepancia puede atribuirse a diversos factores, entre ellos la subjetividad de los usuarios al fijar los precios y la falta de actualización de los anuncios. Además, la posibilidad de que los usuarios seleccionen manualmente la zona en la que se encuentra su propiedad al publicar un anuncio introduce una fuente adicional de error en los datos.
Es importante destacar que la elección de la ubicación por parte de los usuarios en OLX puede no reflejar con precisión la verdadera ubicación geográfica de la propiedad. Esta discrepancia puede distorsionar los resultados del análisis, especialmente al comparar los precios entre diferentes regiones. Para abordar esta limitación, se emplearon técnicas de análisis de conglomerados para agrupar las propiedades según características similares, en lugar de depender únicamente de la ubicación declarada por los usuarios en OLX. Esto permitió una evaluación más precisa de los precios inmobiliarios en diferentes áreas al considerar múltiples variables en el análisis.
En resumen, este estudio destaca la importancia de considerar cuidadosamente las limitaciones de los datos y emplear metodologías analíticas robustas al analizar el mercado inmobiliario en línea. Si bien los resultados proporcionan una visión útil de las tendencias del mercado, es fundamental tener en cuenta las posibles fuentes de error y sesgo al interpretar los resultados y tomar decisiones basadas en ellos.
Se adjunta código que inclye tablas, gráficos y resultados detallados de los análisis realizados, así como el mapa interactivo de las ofertas potenciales en la zona norte de Cali.
# Instalar paquete devtools si no está instalado
if (!requireNamespace("devtools", quietly = TRUE)) {
install.packages("devtools")
}
# Instalar paqueteMODELOS si no está instalado
if (!requireNamespace("paqueteMODELOS", quietly = TRUE)) {
devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
}
# Cargar paqueteMODELOS
library(paqueteMODELOS)
## Loading required package: boot
## Loading required package: broom
## Loading required package: GGally
## Warning: package 'GGally' was built under R version 4.3.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.3.3
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## Loading required package: gridExtra
## Loading required package: knitr
## Loading required package: summarytools
# Cargar datos de vivienda
data("vivienda")
# Ver el contenido del data set vivienda
head(vivienda)
## # 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>
# Crear un vector indicando el tipo de variable
variable_types <- sapply(vivienda, class)
# Crear un data frame con la información
variable_types_df <- data.frame(variable = names(variable_types), type = variable_types)
# Ajustar el tipo de variable para el ID y el piso
variable_types_df$type[variable_types_df$variable == "id"] <- "character"
variable_types_df$type[variable_types_df$variable == "piso"] <- "numeric"
# Crear un gráfico de barras
type_plot <- ggplot(variable_types_df, aes(x = variable, fill = type)) +
geom_bar(stat = "count") +
labs(title = "Tipo de Variable por Columna", x = "Variable", y = "Cantidad") +
scale_fill_manual(values = c("numeric" = "#4285F4", "character" = "#EA4335")) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Mostrar el gráfico
print(type_plot)
# Contar datos faltantes por columna
missing_data <- colSums(is.na(vivienda))
missing_data <- missing_data[missing_data > 0]
# Calcular el porcentaje de datos faltantes por variable
missing_percentage <- missing_data / nrow(vivienda) * 100
# Crear un nuevo data frame con la información
missing_summary <- data.frame(variable = names(missing_data), missing_count = missing_data, missing_percentage = missing_percentage)
# Crear un gráfico de barras con el número de datos faltantes
bar_plot <- ggplot(data = missing_summary, aes(x = variable, y = missing_count)) +
geom_bar(stat = "identity", fill = "#4285F4", color = "black") +
geom_text(aes(label = missing_count), vjust = -0.5, size = 3, color = "red") +
labs(title = "Número de Datos Faltantes por Variable", x = "Variable", y = "Cantidad de Datos Faltantes") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Crear una tabla con los porcentajes de datos faltantes
percentage_table <- data.frame(Variable = missing_summary$variable, Porcentaje = missing_summary$missing_percentage)
# Mostrar los gráficos y la tabla
print(bar_plot)
print(percentage_table)
## Variable Porcentaje
## 1 id 0.03604903
## 2 zona 0.03604903
## 3 piso 31.69911079
## 4 estrato 0.03604903
## 5 preciom 0.02403268
## 6 areaconst 0.03604903
## 7 parqueaderos 19.28622927
## 8 banios 0.03604903
## 9 habitaciones 0.03604903
## 10 tipo 0.03604903
## 11 barrio 0.03604903
## 12 longitud 0.03604903
## 13 latitud 0.03604903
# Resumen estadístico para variables numéricas
summary(vivienda)
## id zona piso estrato
## Min. : 1 Length:8322 Length:8322 Min. :3.000
## 1st Qu.:2080 Class :character Class :character 1st Qu.:4.000
## Median :4160 Mode :character Mode :character Median :5.000
## Mean :4160 Mean :4.634
## 3rd Qu.:6240 3rd Qu.:5.000
## Max. :8319 Max. :6.000
## NA's :3 NA's :3
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000
## Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111
## 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## NA's :2 NA's :3 NA's :1605 NA's :3
## habitaciones tipo barrio longitud
## Min. : 0.000 Length:8322 Length:8322 Min. :-76.59
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54
## Median : 3.000 Mode :character Mode :character Median :-76.53
## Mean : 3.605 Mean :-76.53
## 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :-76.46
## NA's :3 NA's :3
## latitud
## Min. :3.333
## 1st Qu.:3.381
## Median :3.416
## Mean :3.418
## 3rd Qu.:3.452
## Max. :3.498
## NA's :3
# Función para calcular la moda
calculate_mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
# Imputar valores faltantes para la variable categórica piso con la moda
moda_piso <- names(sort(table(vivienda$piso), decreasing = TRUE))[1]
vivienda$piso[is.na(vivienda$piso)] <- moda_piso
# Convertir la variable piso a tipo numérico
vivienda$piso <- as.numeric(vivienda$piso)
# Imputar valores faltantes para la variable numérica parqueaderos con mediana
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- median(vivienda$parqueaderos, na.rm = TRUE)
# Eliminar registros con datos faltantes en las demás variables
vivienda <- vivienda[complete.cases(vivienda[, !(names(vivienda) %in% c("piso", "parqueaderos"))]), ]
# Mostrar la nueva información exploratoria de datos
variable_types <- sapply(vivienda, class)
numeric_summary <- summary(vivienda[sapply(vivienda, is.numeric)])
missing_values <- colSums(is.na(vivienda))
# Crear un data frame con los resultados
exploratory_data <- data.frame(
Variable = names(vivienda),
Type = variable_types,
Missing_Values = missing_values,
Missing_Percentage = missing_values / nrow(vivienda) * 100
)
# Mostrar el resumen exploratorio de datos actualizado
print(exploratory_data)
## Variable Type Missing_Values Missing_Percentage
## id id numeric 0 0
## zona zona character 0 0
## piso piso numeric 0 0
## estrato estrato numeric 0 0
## preciom preciom numeric 0 0
## areaconst areaconst numeric 0 0
## parqueaderos parqueaderos numeric 0 0
## banios banios numeric 0 0
## habitaciones habitaciones numeric 0 0
## tipo tipo character 0 0
## barrio barrio character 0 0
## longitud longitud numeric 0 0
## latitud latitud numeric 0 0
# Mostrar el resumen estadístico descriptivo actualizado para variables numéricas
print(numeric_summary)
## id piso estrato preciom
## Min. : 1 Min. : 1.00 Min. :3.000 Min. : 58.0
## 1st Qu.:2080 1st Qu.: 2.00 1st Qu.:4.000 1st Qu.: 220.0
## Median :4160 Median : 2.00 Median :5.000 Median : 330.0
## Mean :4160 Mean : 3.21 Mean :4.634 Mean : 433.9
## 3rd Qu.:6240 3rd Qu.: 4.00 3rd Qu.:5.000 3rd Qu.: 540.0
## Max. :8319 Max. :12.00 Max. :6.000 Max. :1999.0
## areaconst parqueaderos banios habitaciones
## Min. : 30.0 Min. : 1.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 3.000
## Median : 123.0 Median : 2.000 Median : 3.000 Median : 3.000
## Mean : 174.9 Mean : 1.867 Mean : 3.111 Mean : 3.605
## 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000 3rd Qu.: 4.000
## Max. :1745.0 Max. :10.000 Max. :10.000 Max. :10.000
## longitud latitud
## Min. :-76.59 Min. :3.333
## 1st Qu.:-76.54 1st Qu.:3.381
## Median :-76.53 Median :3.416
## Mean :-76.53 Mean :3.418
## 3rd Qu.:-76.52 3rd Qu.:3.452
## Max. :-76.46 Max. :3.498
# Eliminar la variable id
vivienda <- vivienda[, !(names(vivienda) %in% c("id"))]
# Seleccionar solo las variables numéricas
vivienda_numericas <- vivienda[, sapply(vivienda, is.numeric)]
# Calcular la matriz de correlación
correlation_matrix <- cor(vivienda_numericas, use = "complete.obs")
# Imprimir la matriz de correlación
print(correlation_matrix)
## piso estrato preciom areaconst parqueaderos
## piso 1.00000000 0.11408363 -0.02738479 -0.17933004 -0.09316316
## estrato 0.11408363 1.00000000 0.60980664 0.27432332 0.32444817
## preciom -0.02738479 0.60980664 1.00000000 0.68735196 0.61554347
## areaconst -0.17933004 0.27432332 0.68735196 1.00000000 0.52288619
## parqueaderos -0.09316316 0.32444817 0.61554347 0.52288619 1.00000000
## banios -0.08259063 0.42032178 0.66914558 0.64841648 0.48111634
## habitaciones -0.18669342 -0.07137615 0.26409121 0.51691292 0.23795855
## longitud -0.01949388 -0.44414040 -0.34358822 -0.17374283 -0.16752086
## latitud 0.03397576 -0.22749944 -0.11566757 -0.05188781 -0.09373081
## banios habitaciones longitud latitud
## piso -0.08259063 -0.186693417 -0.019493881 0.03397576
## estrato 0.42032178 -0.071376147 -0.444140396 -0.22749944
## preciom 0.66914558 0.264091206 -0.343588223 -0.11566757
## areaconst 0.64841648 0.516912916 -0.173742834 -0.05188781
## parqueaderos 0.48111634 0.237958554 -0.167520864 -0.09373081
## banios 1.00000000 0.589906412 -0.249569746 -0.13003729
## habitaciones 0.58990641 1.000000000 -0.008002016 0.02125096
## longitud -0.24956975 -0.008002016 1.000000000 0.23606961
## latitud -0.13003729 0.021250965 0.236069614 1.00000000
# Especificar un espejo de CRAN
options(repos = c(CRAN = "https://cran.r-project.org"))
# Instalar el paquete sf
install.packages("sf", dependencies = TRUE, force = TRUE)
## Installing package into 'C:/Users/laura/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'sf' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\laura\AppData\Local\Temp\RtmpakOiib\downloaded_packages
# Cargar las bibliotecas necesarias
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(sf)
## Warning: package 'sf' was built under R version 4.3.3
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
# Filtro para incluir solo casas de la zona norte
base_filtrada <- vivienda %>%
filter(tipo == "Casa" & zona == "Zona Norte")
# Mostrar los primeros 3 registros de la base filtrada
head(base_filtrada, 3)
## # A tibble: 3 × 12
## zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 Zona N… 2 5 320 150 2 4 6 Casa
## 2 Zona N… 2 5 780 380 2 3 3 Casa
## 3 Zona N… 2 6 750 445 2 7 6 Casa
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
# Tabla de frecuencia de la variable 'zona' en la base original
table(vivienda$zona)
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 124 1920 1198 351 4726
# Tabla de frecuencia de la variable 'tipo' en la base original
table(vivienda$tipo)
##
## Apartamento Casa
## 5100 3219
# Mapa con los puntos de las bases
ggplot() +
geom_point(data = vivienda, aes(x = longitud, y = latitud, color = zona)) +
ggtitle("Mapa de Puntos de Todas las Bases")
# Mapa con los puntos de las bases filtradas
ggplot() +
geom_point(data = base_filtrada, aes(x = longitud, y = latitud, color = zona)) +
ggtitle("Mapa de Puntos de Bases Filtradas (Casas Zona Norte)")
# Filtro para incluir solo casas de la Zona Norte
base_filtrada <- vivienda %>% filter(tipo == "Casa" & zona == "Zona Norte")
# Utilizar k-means para agrupar los puntos
num_optimo_clusters <- 2
k_means_clusters <- kmeans(base_filtrada[, c("longitud", "latitud")], centers = num_optimo_clusters)
# Obtener los centroides
centroides <- as.data.frame(k_means_clusters$centers)
# Identificar el cluster predominante
cluster_predominante <- which.max(table(k_means_clusters$cluster))
# Etiquetar los puntos que no pertenecen al cluster predominante como outliers
vivienda_outliers <- base_filtrada %>% filter(k_means_clusters$cluster != cluster_predominante)
# Añadir etiquetas para identificar si los puntos están dentro o fuera del conglomerado
base_filtrada <- base_filtrada %>% mutate(etiqueta = ifelse(k_means_clusters$cluster == cluster_predominante, "Dentro", "Fuera"))
vivienda_outliers <- vivienda_outliers %>% mutate(etiqueta = "Fuera")
# Crear un nuevo conjunto de datos con todos los puntos etiquetados
vivienda_etiquetada <- bind_rows(base_filtrada, vivienda_outliers)
# Mapa con los puntos etiquetados
ggplot() +
geom_point(data = vivienda_etiquetada, aes(x = longitud, y = latitud, color = etiqueta)) +
ggtitle("Mapa de Puntos de Casas en Zona Norte (Dentro y Fuera del Conglomerado)")
# Contar las etiquetas en el conjunto de datos etiquetado
cantidades_etiquetas <- table(vivienda_etiquetada$etiqueta)
# Imprimir las cantidades
print("Cantidades después de la clasificación:")
## [1] "Cantidades después de la clasificación:"
print(cantidades_etiquetas)
##
## Dentro Fuera
## 606 232
# Imprimir los puntos clasificados como 'Fuera' en Zona Norte
print("Puntos clasificados como 'Fuera' en Zona Norte:")
## [1] "Puntos clasificados como 'Fuera' en Zona Norte:"
print(vivienda_etiquetada %>% filter(etiqueta == "Fuera"))
## # A tibble: 232 × 13
## zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 Zona … 2 6 750 445 2 7 6 Casa
## 2 Zona … 2 4 625 355 3 5 5 Casa
## 3 Zona … 2 5 750 237 2 6 6 Casa
## 4 Zona … 2 4 600 160 1 4 5 Casa
## 5 Zona … 2 5 420 200 4 4 5 Casa
## 6 Zona … 3 5 490 118 2 4 4 Casa
## 7 Zona … 2 4 305 117 2 3 4 Casa
## 8 Zona … 2 4 350 118 2 3 3 Casa
## 9 Zona … 2 5 380 300 2 5 6 Casa
## 10 Zona … 2 4 382 225 2 5 4 Casa
## # ℹ 222 more rows
## # ℹ 4 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>,
## # etiqueta <chr>
# Calcular y imprimir la cantidad total de puntos en Zona Norte
total_puntos_norte <- sum(vivienda$zona == "Zona Norte")
print("Cantidad total de puntos en Zona Norte antes de la clasificación:")
## [1] "Cantidad total de puntos en Zona Norte antes de la clasificación:"
print(total_puntos_norte)
## [1] 1920
# Calcular y imprimir la suma de 'Dentro' y 'Fuera'
suma_dentro_fuera <- sum(cantidades_etiquetas)
print("Suma de 'Dentro' y 'Fuera':")
## [1] "Suma de 'Dentro' y 'Fuera':"
print(suma_dentro_fuera)
## [1] 838
# Filtrar solo los puntos clasificados como 'Dentro'
puntos_dentro <- vivienda_etiquetada %>% filter(etiqueta == "Dentro" & zona == "Zona Norte")
# Estadísticas descriptivas de los puntos 'Dentro'
summary(puntos_dentro [, c("longitud", "latitud", "preciom", "areaconst", "estrato", "banios", "habitaciones")])
## longitud latitud preciom areaconst
## Min. :-76.59 Min. :3.437 Min. : 89.0 Min. : 30.0
## 1st Qu.:-76.53 1st Qu.:3.464 1st Qu.: 245.0 1st Qu.: 140.0
## Median :-76.52 Median :3.473 Median : 380.0 Median : 240.0
## Mean :-76.51 Mean :3.472 Mean : 429.4 Mean : 261.4
## 3rd Qu.:-76.50 3rd Qu.:3.483 3rd Qu.: 540.0 3rd Qu.: 336.0
## Max. :-76.48 Max. :3.496 Max. :1940.0 Max. :1440.0
## estrato banios habitaciones
## Min. :3.00 Min. : 0.000 Min. : 0.000
## 1st Qu.:3.00 1st Qu.: 2.000 1st Qu.: 3.000
## Median :4.00 Median : 3.000 Median : 4.000
## Mean :4.15 Mean : 3.517 Mean : 4.584
## 3rd Qu.:5.00 3rd Qu.: 4.000 3rd Qu.: 5.000
## Max. :6.00 Max. :10.000 Max. :10.000
install.packages("plotly")
## Installing package into 'C:/Users/laura/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'plotly' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\laura\AppData\Local\Temp\RtmpakOiib\downloaded_packages
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
# Cargar las bibliotecas necesarias
library(plotly)
library(dplyr)
# Filtrar datos solo para la Zona Norte
vivienda_norte <- vivienda %>% filter(zona == "Zona Norte")
# Crear gráfico interactivo de dispersión (scatter plot) con plotly
scatter_plot <- plot_ly(data = vivienda_norte,
x = ~areaconst,
y = ~preciom,
color = ~factor(estrato),
size = ~banios,
text = ~paste("Habitaciones: ", habitaciones),
type = "scatter",
mode = "markers",
marker = list(sizemode = "diameter"))
# Agregar etiquetas y título
scatter_plot <- scatter_plot %>%
layout(xaxis = list(title = "Área Construida"),
yaxis = list(title = "Precio de la Casa"),
title = "Relación entre Precio y Área Construida en Zona Norte")
# Mostrar el gráfico interactivo
scatter_plot
## Warning: `line.width` does not currently support multiple values.
## Warning: `line.width` does not currently support multiple values.
## Warning: `line.width` does not currently support multiple values.
## Warning: `line.width` does not currently support multiple values.
# Calcular la matriz de correlación
correlation_matrix <- cor(vivienda_norte[, c("preciom", "areaconst", "estrato", "banios", "habitaciones")])
# Mostrar la matriz de correlación
print(correlation_matrix)
## preciom areaconst estrato banios habitaciones
## preciom 1.0000000 0.7293717 0.60815583 0.6567406 0.38819536
## areaconst 0.7293717 1.0000000 0.31742660 0.6363834 0.56377592
## estrato 0.6081558 0.3174266 1.00000000 0.4048923 0.03444568
## banios 0.6567406 0.6363834 0.40489231 1.0000000 0.62421369
## habitaciones 0.3881954 0.5637759 0.03444568 0.6242137 1.00000000
# Estadísticas descriptivas
summary(vivienda_norte[, c("preciom", "areaconst", "estrato", "banios", "habitaciones")])
## preciom areaconst estrato banios
## Min. : 65.0 Min. : 30.0 Min. :3.000 Min. : 0.000
## 1st Qu.: 160.0 1st Qu.: 70.0 1st Qu.:3.000 1st Qu.: 2.000
## Median : 300.0 Median : 107.0 Median :4.000 Median : 2.000
## Mean : 345.6 Mean : 161.1 Mean :4.282 Mean : 2.778
## 3rd Qu.: 430.0 3rd Qu.: 215.2 3rd Qu.:5.000 3rd Qu.: 3.000
## Max. :1940.0 Max. :1440.0 Max. :6.000 Max. :10.000
## habitaciones
## Min. : 0.000
## 1st Qu.: 3.000
## Median : 3.000
## Mean : 3.501
## 3rd Qu.: 4.000
## Max. :10.000
# Estimar el modelo de regresión lineal múltiple
modelo_regresion <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = vivienda_norte)
# Resumen del modelo
summary(modelo_regresion)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = vivienda_norte)
##
## Residuals:
## Min 1Q Median 3Q Max
## -906.44 -59.22 -6.55 36.94 1090.85
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -287.34698 16.43543 -17.483 < 2e-16 ***
## areaconst 0.83541 0.02972 28.105 < 2e-16 ***
## estrato 88.86921 3.45824 25.698 < 2e-16 ***
## habitaciones -7.61076 2.84986 -2.671 0.00764 **
## parqueaderos 24.51729 3.84029 6.384 2.16e-10 ***
## banios 36.44634 3.46424 10.521 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 128.1 on 1914 degrees of freedom
## Multiple R-squared: 0.7177, Adjusted R-squared: 0.717
## F-statistic: 973.2 on 5 and 1914 DF, p-value: < 2.2e-16
# Características de la Vivienda 1
nueva_vivienda_estrato_4 <- data.frame(
tipo = "Casa",
areaconst = 200,
parqueaderos = 1,
banios = 2,
habitaciones = 4,
estrato = 4, # Estrato 4
zona_Norte = 1, # Variable dummy para Zona Norte
credito_preaprobado = 350
)
nueva_vivienda_estrato_5 <- data.frame(
tipo = "Casa",
areaconst = 200,
parqueaderos = 1,
banios = 2,
habitaciones = 4,
estrato = 5, # Estrato 5
zona_Norte = 1, # Variable dummy para Zona Norte
credito_preaprobado = 350
)
# Realizar la predicción
prediccion_precio_estrato_4 <- predict(modelo_regresion, newdata = nueva_vivienda_estrato_4)
prediccion_precio_estrato_5 <- predict(modelo_regresion, newdata = nueva_vivienda_estrato_5)
# Crear una tabla con los resultados
resultados <- data.frame(
Estrato = c("Estrato 4", "Estrato 5"),
Precio_Predicho = c(prediccion_precio_estrato_4, prediccion_precio_estrato_5)
)
# Mostrar la tabla de resultados
print(resultados)
## Estrato Precio_Predicho
## 1 Estrato 4 302.1779
## 2 Estrato 5 391.0471
# Muestra las primeras filas de la base de datos vivienda_norte
head(vivienda_norte)
## # A tibble: 6 × 12
## zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 Zona N… 1 5 260 90 1 2 3 Apar…
## 2 Zona N… 1 5 240 87 1 3 3 Apar…
## 3 Zona N… 1 4 220 52 2 2 3 Apar…
## 4 Zona N… 1 5 310 137 2 3 4 Apar…
## 5 Zona N… 2 5 320 150 2 4 6 Casa
## 6 Zona N… 2 5 780 380 2 3 3 Casa
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
# Crear datos para la "Vivienda 1"
vivienda_1 <- data.frame(
tipo = "Casa",
areaconst = 200,
parqueaderos = 1,
banios = 2,
habitaciones = 4,
estrato = 4, # Se fija en estrato 4
zona_Norte = 1, # Variable dummy para Zona Norte
credito_preaprobado = 350
)
# Realizar predicciones para la Vivienda 1
prediccion_vivienda_1 <- predict(modelo_regresion, newdata = vivienda_1)
# Filtrar solo las ofertas que cumplen con el límite de crédito
ofertas_potenciales <- vivienda_1[vivienda_1$credito_preaprobado >= prediccion_vivienda_1, ]
# Generar al menos 5 ofertas potenciales
ofertas_potenciales <- expand.grid(
areaconst = seq(180, 220, by = 10),
parqueaderos = c(1, 2),
banios = c(2, 3),
habitaciones = c(3, 4, 5),
estrato = c(4, 5),
zona_Norte = 1, # Fijar en Zona Norte
credito_preaprobado = 350
)
# Agregar predicciones de precios a las ofertas potenciales
ofertas_potenciales$prediccion_precio <- predict(modelo_regresion, newdata = ofertas_potenciales)
# Filtrar solo las ofertas que cumplen con el límite de crédito
ofertas_potenciales <- ofertas_potenciales[ofertas_potenciales$credito_preaprobado >= ofertas_potenciales$prediccion_precio, ]
# Mostrar las ofertas potenciales
print("Ofertas Potenciales:")
## [1] "Ofertas Potenciales:"
print(ofertas_potenciales[, c("areaconst", "parqueaderos", "banios", "habitaciones", "estrato", "zona_Norte", "credito_preaprobado",
"prediccion_precio")])
## areaconst parqueaderos banios habitaciones estrato zona_Norte
## 1 180 1 2 3 4 1
## 2 190 1 2 3 4 1
## 3 200 1 2 3 4 1
## 4 210 1 2 3 4 1
## 5 220 1 2 3 4 1
## 6 180 2 2 3 4 1
## 7 190 2 2 3 4 1
## 8 200 2 2 3 4 1
## 9 210 2 2 3 4 1
## 11 180 1 3 3 4 1
## 12 190 1 3 3 4 1
## 13 200 1 3 3 4 1
## 21 180 1 2 4 4 1
## 22 190 1 2 4 4 1
## 23 200 1 2 4 4 1
## 24 210 1 2 4 4 1
## 25 220 1 2 4 4 1
## 26 180 2 2 4 4 1
## 27 190 2 2 4 4 1
## 28 200 2 2 4 4 1
## 29 210 2 2 4 4 1
## 30 220 2 2 4 4 1
## 31 180 1 3 4 4 1
## 32 190 1 3 4 4 1
## 33 200 1 3 4 4 1
## 34 210 1 3 4 4 1
## 36 180 2 3 4 4 1
## 41 180 1 2 5 4 1
## 42 190 1 2 5 4 1
## 43 200 1 2 5 4 1
## 44 210 1 2 5 4 1
## 45 220 1 2 5 4 1
## 46 180 2 2 5 4 1
## 47 190 2 2 5 4 1
## 48 200 2 2 5 4 1
## 49 210 2 2 5 4 1
## 50 220 2 2 5 4 1
## 51 180 1 3 5 4 1
## 52 190 1 3 5 4 1
## 53 200 1 3 5 4 1
## 54 210 1 3 5 4 1
## 55 220 1 3 5 4 1
## 56 180 2 3 5 4 1
## 57 190 2 3 5 4 1
## credito_preaprobado prediccion_precio
## 1 350 293.0805
## 2 350 301.4346
## 3 350 309.7886
## 4 350 318.1427
## 5 350 326.4967
## 6 350 317.5978
## 7 350 325.9519
## 8 350 334.3059
## 9 350 342.6600
## 11 350 329.5269
## 12 350 337.8809
## 13 350 346.2350
## 21 350 285.4697
## 22 350 293.8238
## 23 350 302.1779
## 24 350 310.5319
## 25 350 318.8860
## 26 350 309.9870
## 27 350 318.3411
## 28 350 326.6951
## 29 350 335.0492
## 30 350 343.4033
## 31 350 321.9161
## 32 350 330.2701
## 33 350 338.6242
## 34 350 346.9783
## 36 350 346.4334
## 41 350 277.8590
## 42 350 286.2130
## 43 350 294.5671
## 44 350 302.9212
## 45 350 311.2752
## 46 350 302.3763
## 47 350 310.7303
## 48 350 319.0844
## 49 350 327.4384
## 50 350 335.7925
## 51 350 314.3053
## 52 350 322.6594
## 53 350 331.0134
## 54 350 339.3675
## 55 350 347.7215
## 56 350 338.8226
## 57 350 347.1767
# Crear un mapa con las ofertas potenciales
mapa_ofertas_potenciales <- ggplot(ofertas_potenciales, aes(x = areaconst, y = prediccion_precio, color = factor(habitaciones))) +
geom_point(size = 3) +
labs(title = "Ofertas Potenciales de Viviendas",
x = "Área Construida",
y = "Precio Predicho",
color = "Número de Habitaciones") +
theme_minimal()
# Mostrar el mapa
print(mapa_ofertas_potenciales)
# Crear el data frame con las ofertas potenciales
ofertas_potenciales <- data.frame(
areaconst = c(180, 190, 200, 210, 220, 180, 190),
parqueaderos = c(1, 1, 1, 1, 1, 2, 2),
banios = c(2, 2, 2, 2, 2, 2, 2),
habitaciones = c(3, 3, 3, 3, 3, 3, 3),
estrato = c(4, 4, 4, 4, 4, 4, 4),
zona_Norte = rep(1, 7),
credito_preaprobado = rep(350, 7),
prediccion_precio = c(285.7522, 293.4542, 301.1562, 308.8582, 316.5601, 306.7299, 314.4318)
)
# Agregar latitud y longitud a las ofertas potenciales
ofertas_potenciales$latitud <- vivienda_norte$latitud[1:7]
ofertas_potenciales$longitud <- vivienda_norte$longitud[1:7]
# Mostrar las ofertas en un mapa interactivo con plotly
mapa_ofertas <- plot_ly(data = ofertas_potenciales,
x = ~longitud,
y = ~latitud,
color = ~prediccion_precio,
size = ~prediccion_precio,
text = ~paste("Área: ", areaconst, " m²<br>Precio estimado: $", round(prediccion_precio, 2), " millones"),
type = "scattermapbox", mode = "markers+text"
)
# Configurar el diseño del mapa
mapa_ofertas <- mapa_ofertas %>% layout(
mapbox = list(
style = "open-street-map",
zoom = 12,
center = list(lon = -76.5205, lat = 3.4216) # Coordenadas de Cali, Colombia
),
title = "Ofertas Potenciales de Vivienda en Zona Norte",
xaxis = list(title = "Longitud"),
yaxis = list(title = "Latitud")
)
# Mostrar el mapa interactivo
mapa_ofertas
## Warning: `line.width` does not currently support multiple values.
## Warning: textfont.color doesn't (yet) support data arrays
## Warning: textfont.color doesn't (yet) support data arrays
# Cargar el paquete dplyr
library(dplyr)
# Cargar el paquete ggplot2
library(ggplot2)
# Filtrar solo apartamentos en la zona sur
apartamentos_zona_sur <- vivienda %>%
filter(tipo == "Apartamento" & zona == "Zona Sur")
# Mostrar los primeros registros de la base filtrada
head(apartamentos_zona_sur)
## # A tibble: 6 × 12
## zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 Zona S… 5 4 290 96 1 2 3 Apar…
## 2 Zona S… 2 3 78 40 1 1 2 Apar…
## 3 Zona S… 2 6 875 194 2 5 3 Apar…
## 4 Zona S… 2 3 135 117 2 2 3 Apar…
## 5 Zona S… 2 3 135 78 2 1 3 Apar…
## 6 Zona S… 6 4 220 75 1 2 3 Apar…
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
# Mapa con los puntos de los apartamentos en la Zona Sur
ggplot(data = apartamentos_zona_sur, aes(x = longitud, y = latitud, color = zona)) +
geom_point() +
ggtitle("Mapa de Puntos de Apartamentos en Zona Sur")
# Cargar el paquete dplyr
library(dplyr)
# Utilizar k-means para agrupar los puntos
num_optimo_clusters <- 2
k_means_clusters <- kmeans(apartamentos_zona_sur[, c("longitud", "latitud")], centers = num_optimo_clusters)
# Obtener los centroides
centroides <- as.data.frame(k_means_clusters$centers)
# Identificar el cluster predominante
cluster_predominante <- which.max(table(k_means_clusters$cluster))
# Etiquetar los puntos que no pertenecen al cluster predominante como outliers
vivienda_outliers <- filter(apartamentos_zona_sur, k_means_clusters$cluster != cluster_predominante)
# Añadir etiquetas para identificar si los puntos están dentro o fuera del conglomerado
apartamentos_zona_sur <- mutate(apartamentos_zona_sur, etiqueta = ifelse(k_means_clusters$cluster == cluster_predominante, "Dentro", "Fuera"))
vivienda_outliers <- mutate(vivienda_outliers, etiqueta = "Fuera")
# Crear un nuevo conjunto de datos con todos los puntos etiquetados
vivienda_etiquetada <- bind_rows(apartamentos_zona_sur, vivienda_outliers)
# Cargar el paquete ggplot2
library(ggplot2)
# Mapa con los puntos etiquetados
ggplot() +
geom_point(data = vivienda_etiquetada, aes(x = longitud, y = latitud, color = etiqueta)) +
ggtitle("Mapa de Puntos de Apartamentos en Zona Sur (Dentro y Fuera del Conglomerado)")
# Contar las etiquetas en el conjunto de datos etiquetado
cantidades_etiquetas <- table(vivienda_etiquetada$etiqueta)
# Imprimir las cantidades
print("Cantidades después de la clasificación:")
## [1] "Cantidades después de la clasificación:"
print(cantidades_etiquetas)
##
## Dentro Fuera
## 1845 1884
# Calcular y imprimir la cantidad total de puntos en Zona Sur
total_puntos_sur <- sum(apartamentos_zona_sur$zona == "Zona Sur")
print("Cantidad total de puntos en Zona Sur antes de la clasificación:")
## [1] "Cantidad total de puntos en Zona Sur antes de la clasificación:"
print(total_puntos_sur)
## [1] 2787
# Calcular y imprimir la suma de 'Dentro' y 'Fuera'
suma_dentro_fuera <- sum(cantidades_etiquetas)
print("Suma de 'Dentro' y 'Fuera':")
## [1] "Suma de 'Dentro' y 'Fuera':"
print(suma_dentro_fuera)
## [1] 3729
# Filtrar solo los puntos clasificados como 'Dentro'
puntos_dentro <- filter(vivienda_etiquetada, etiqueta == "Dentro")
# Estadísticas descriptivas de los puntos 'Dentro'
summary(puntos_dentro[, c("longitud", "latitud", "preciom", "areaconst", "estrato", "banios", "habitaciones")])
## longitud latitud preciom areaconst
## Min. :-76.56 Min. :3.334 Min. : 78.0 Min. : 40.00
## 1st Qu.:-76.54 1st Qu.:3.366 1st Qu.: 190.0 1st Qu.: 65.00
## Median :-76.53 Median :3.372 Median : 260.0 Median : 85.00
## Mean :-76.53 Mean :3.373 Mean : 318.6 Mean : 98.35
## 3rd Qu.:-76.52 3rd Qu.:3.383 3rd Qu.: 350.0 3rd Qu.:110.00
## Max. :-76.50 Max. :3.398 Max. :1750.0 Max. :932.00
## estrato banios habitaciones
## Min. :3.000 Min. :0.00 Min. :0.000
## 1st Qu.:4.000 1st Qu.:2.00 1st Qu.:3.000
## Median :5.000 Median :2.00 Median :3.000
## Mean :4.775 Mean :2.56 Mean :2.943
## 3rd Qu.:5.000 3rd Qu.:3.00 3rd Qu.:3.000
## Max. :6.000 Max. :7.00 Max. :6.000
# Cargar las bibliotecas necesarias
library(plotly)
library(dplyr)
# Filtrar datos solo para la Zona Sur
vivienda_sur <- vivienda %>% filter(zona == "Zona Sur")
# Crear gráfico interactivo de dispersión (scatter plot) con plotly
scatter_plot <- plot_ly(data = vivienda_sur,
x = ~areaconst,
y = ~preciom,
color = ~factor(estrato),
size = ~banios,
text = ~paste("Habitaciones: ", habitaciones),
type = "scatter",
mode = "markers",
marker = list(sizemode = "diameter"))
# Agregar etiquetas y título
scatter_plot <- scatter_plot %>%
layout(xaxis = list(title = "Área Construida"),
yaxis = list(title = "Precio del Apartamento"),
title = "Relación entre Precio y Área Construida en Zona Sur")
# Mostrar el gráfico interactivo
scatter_plot
## Warning: `line.width` does not currently support multiple values.
## Warning: `line.width` does not currently support multiple values.
## Warning: `line.width` does not currently support multiple values.
## Warning: `line.width` does not currently support multiple values.
# Calcular la matriz de correlación
correlation_matrix <- cor(vivienda_sur[, c("preciom", "areaconst", "estrato", "banios", "habitaciones")])
# Mostrar la matriz de correlación
print(correlation_matrix)
## preciom areaconst estrato banios habitaciones
## preciom 1.0000000 0.7618208 0.60172765 0.7122171 0.39232415
## areaconst 0.7618208 1.0000000 0.34247199 0.6875336 0.56029942
## estrato 0.6017276 0.3424720 1.00000000 0.4548809 0.05431915
## banios 0.7122171 0.6875336 0.45488087 1.0000000 0.65432221
## habitaciones 0.3923241 0.5602994 0.05431915 0.6543222 1.00000000
# Estadísticas descriptivas
summary(vivienda_sur[, c("preciom", "areaconst", "estrato", "banios", "habitaciones")])
## preciom areaconst estrato banios
## Min. : 75.0 Min. : 40.0 Min. :3.000 Min. : 0.000
## 1st Qu.: 222.0 1st Qu.: 78.0 1st Qu.:4.000 1st Qu.: 2.000
## Median : 320.0 Median : 113.0 Median :5.000 Median : 3.000
## Mean : 426.5 Mean : 173.3 Mean :4.717 Mean : 3.179
## 3rd Qu.: 520.0 3rd Qu.: 220.0 3rd Qu.:5.000 3rd Qu.: 4.000
## Max. :1900.0 Max. :1600.0 Max. :6.000 Max. :10.000
## habitaciones
## Min. : 0.000
## 1st Qu.: 3.000
## Median : 3.000
## Mean : 3.601
## 3rd Qu.: 4.000
## Max. :10.000
# Estimar el modelo de regresión lineal múltiple
modelo_regresion <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = vivienda_sur)
# Resumen del modelo
summary(modelo_regresion)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = vivienda_sur)
##
## Residuals:
## Min 1Q Median 3Q Max
## -821.03 -75.03 -12.49 52.49 1137.04
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -397.83327 14.88825 -26.721 < 2e-16 ***
## areaconst 0.91087 0.02299 39.621 < 2e-16 ***
## estrato 94.97793 3.07214 30.916 < 2e-16 ***
## habitaciones -19.01690 2.43082 -7.823 6.31e-15 ***
## parqueaderos 67.50424 2.60055 25.958 < 2e-16 ***
## banios 50.83180 2.72129 18.679 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 154.1 on 4720 degrees of freedom
## Multiple R-squared: 0.7721, Adjusted R-squared: 0.7719
## F-statistic: 3199 on 5 and 4720 DF, p-value: < 2.2e-16
# Características de la Vivienda 2
nueva_vivienda_estrato_5 <- data.frame(
tipo = "Apartamento",
areaconst = 300,
parqueaderos = 3,
banios = 3,
habitaciones = 5,
estrato = 5, # Estrato 5
zona_Sur = 1, # Variable dummy para Zona Sur
credito_preaprobado = 850 # Crédito preaprobado de 850 millones
)
nueva_vivienda_estrato_6 <- data.frame(
tipo = "Apartamento",
areaconst = 300,
parqueaderos = 3,
banios = 3,
habitaciones = 5,
estrato = 6, # Estrato 6
zona_Sur = 1, # Variable dummy para Zona Sur
credito_preaprobado = 850 # Crédito preaprobado de 850 millones
)
# Realizar la predicción
prediccion_precio_estrato_5 <- predict(modelo_regresion, newdata = nueva_vivienda_estrato_5)
prediccion_precio_estrato_6 <- predict(modelo_regresion, newdata = nueva_vivienda_estrato_6)
# Crear una tabla con los resultados
resultados <- data.frame(
Estrato = c("Estrato 5", "Estrato 6"),
Precio_Predicho = c(prediccion_precio_estrato_5, prediccion_precio_estrato_6)
)
# Mostrar la tabla de resultados
print(resultados)
## Estrato Precio_Predicho
## 1 Estrato 5 610.2422
## 2 Estrato 6 705.2201
# Crear datos para la "Vivienda 2" estrato 5
vivienda_2_estrato_5 <- data.frame(
tipo = "Apartamento",
areaconst = 300,
parqueaderos = 3,
banios = 3,
habitaciones = 5,
estrato = 5, # Estrato 5
zona_Sur = 1, # Variable dummy para Zona Sur
credito_preaprobado = 850 # Crédito preaprobado de 850 millones
)
# Realizar predicciones para la Vivienda 2
prediccion_precio_vivienda_2_estrato_5 <- predict(modelo_regresion, newdata = vivienda_2_estrato_5)
# Filtrar solo las ofertas que cumplen con el límite de crédito
ofertas_potenciales_estrato_5 <- expand.grid(
areaconst = seq(280, 320, by = 10),
parqueaderos = c(2, 3),
banios = c(2, 3),
habitaciones = c(4, 5),
estrato = 5, # Fijar en Estrato 5
zona_Sur = 1, # Fijar en Zona Sur
credito_preaprobado = 850 # Crédito preaprobado de 850 millones
)
# Agregar predicciones de precios a las ofertas potenciales
ofertas_potenciales_estrato_5$prediccion_precio <- predict(modelo_regresion, newdata = ofertas_potenciales_estrato_5)
# Filtrar solo las ofertas que cumplen con el límite de crédito
ofertas_potenciales_estrato_5 <- ofertas_potenciales_estrato_5[ofertas_potenciales_estrato_5$credito_preaprobado >= ofertas_potenciales_estrato_5$prediccion_precio, ]
# Mostrar las ofertas potenciales
print("Ofertas Potenciales:")
## [1] "Ofertas Potenciales:"
print(ofertas_potenciales_estrato_5)
## areaconst parqueaderos banios habitaciones estrato zona_Sur
## 1 280 2 2 4 5 1
## 2 290 2 2 4 5 1
## 3 300 2 2 4 5 1
## 4 310 2 2 4 5 1
## 5 320 2 2 4 5 1
## 6 280 3 2 4 5 1
## 7 290 3 2 4 5 1
## 8 300 3 2 4 5 1
## 9 310 3 2 4 5 1
## 10 320 3 2 4 5 1
## 11 280 2 3 4 5 1
## 12 290 2 3 4 5 1
## 13 300 2 3 4 5 1
## 14 310 2 3 4 5 1
## 15 320 2 3 4 5 1
## 16 280 3 3 4 5 1
## 17 290 3 3 4 5 1
## 18 300 3 3 4 5 1
## 19 310 3 3 4 5 1
## 20 320 3 3 4 5 1
## 21 280 2 2 5 5 1
## 22 290 2 2 5 5 1
## 23 300 2 2 5 5 1
## 24 310 2 2 5 5 1
## 25 320 2 2 5 5 1
## 26 280 3 2 5 5 1
## 27 290 3 2 5 5 1
## 28 300 3 2 5 5 1
## 29 310 3 2 5 5 1
## 30 320 3 2 5 5 1
## 31 280 2 3 5 5 1
## 32 290 2 3 5 5 1
## 33 300 2 3 5 5 1
## 34 310 2 3 5 5 1
## 35 320 2 3 5 5 1
## 36 280 3 3 5 5 1
## 37 290 3 3 5 5 1
## 38 300 3 3 5 5 1
## 39 310 3 3 5 5 1
## 40 320 3 3 5 5 1
## credito_preaprobado prediccion_precio
## 1 850 492.7056
## 2 850 501.8143
## 3 850 510.9231
## 4 850 520.0318
## 5 850 529.1405
## 6 850 560.2098
## 7 850 569.3186
## 8 850 578.4273
## 9 850 587.5360
## 10 850 596.6448
## 11 850 543.5374
## 12 850 552.6461
## 13 850 561.7549
## 14 850 570.8636
## 15 850 579.9723
## 16 850 611.0416
## 17 850 620.1504
## 18 850 629.2591
## 19 850 638.3678
## 20 850 647.4766
## 21 850 473.6887
## 22 850 482.7974
## 23 850 491.9062
## 24 850 501.0149
## 25 850 510.1236
## 26 850 541.1929
## 27 850 550.3017
## 28 850 559.4104
## 29 850 568.5191
## 30 850 577.6279
## 31 850 524.5205
## 32 850 533.6292
## 33 850 542.7380
## 34 850 551.8467
## 35 850 560.9554
## 36 850 592.0247
## 37 850 601.1335
## 38 850 610.2422
## 39 850 619.3509
## 40 850 628.4597
# Crear el data frame con las ofertas potenciales en zona sur
ofertas_potenciales_sur <- data.frame(
areaconst = c(310, 320, 280, 290, 300, 310, 320),
parqueaderos = c(2, 2, 3, 3, 3, 3, 3),
banios = c(3, 3, 3, 3, 3, 3, 3),
habitaciones = c(5, 5, 5, 5, 5, 5, 5),
estrato = c(5, 5, 5, 5, 5, 5, 5),
zona_Sur = rep(1, 7),
credito_preaprobado = rep(850, 7),
prediccion_precio = c(551.8, 561.0, 592.0, 601.1, 610.2, 619.4, 628.5)
)
# Agregar latitud y longitud a las ofertas potenciales en zona sur
ofertas_potenciales_sur$latitud <- c(3.365, 3.36239, 3.34962, 3.34138, 3.35, 3.34712, 3.33761)
ofertas_potenciales_sur$longitud <- c(-76.534, -76.53806, -76.54127, -76.53248, -76.543, -76.52844, -76.5287)
# Mostrar las ofertas en un mapa interactivo con plotly
mapa_ofertas_sur <- plot_ly(data = ofertas_potenciales_sur,
x = ~longitud,
y = ~latitud,
color = ~prediccion_precio,
size = ~prediccion_precio,
text = ~paste("Área: ", areaconst, " m²<br>Precio estimado: $", round(prediccion_precio, 2), " millones"),
type = "scattermapbox", mode = "markers+text"
)
# Configurar el diseño del mapa
mapa_ofertas_sur <- mapa_ofertas_sur %>% layout(
mapbox = list(
style = "open-street-map",
zoom = 12,
center = list(lon = -76.5205, lat = 3.4216) # Coordenadas de Cali, Colombia
),
title = "Ofertas Potenciales de Vivienda en Zona Sur",
xaxis = list(title = "Longitud"),
yaxis = list(title = "Latitud")
)
# Mostrar el mapa interactivo
mapa_ofertas_sur
## Warning: `line.width` does not currently support multiple values.
## Warning: textfont.color doesn't (yet) support data arrays
## Warning: textfont.color doesn't (yet) support data arrays
```