Actividad 1 de Métodos y Simulación Estadística
Elaborado por: Harvey D. Bastidas C.
En el contexto actual del mercado inmobiliario de Cali, la comprensión detallada de sus dinámicas se presenta como un requisito indispensable para la toma de decisiones estratégicas en B&C. La fluctuación de precios, las variaciones en los tipos de inmuebles, y la distribución geográfica representan factores clave que influyen directamente en el posicionamiento y éxito de la empresa dentro del sector. Por tanto, este documento busca proporcionar un análisis descriptivo que permita identificar patrones, características y anomalías relevantes, apoyando así la optimización de estrategias comerciales y de inversión de B&C.
Se emplearon una variedad de técnicas analíticas, la sección 3 describe la metodología usada para realizar el análisis, incluyendo la adquisición de datos, su preparación y limpieza, y las técnicas estadísticas empleadas para examinar las variables clave, junto con el resultado de cada paso de la metodología. En la sección 4 se presentan los resultados, en forma de un Resumen Ejecutivo destacando tablas y gráficos mas relevantes para el negcio de B&C. La Discusión en la sección 5 resume el análisis, las decisiones tomadas y los hallazgos, considerando su impacto en la toma de decisiones de B&C.Las conclusiones en la sección 6 describen la principal contribución de este análisis, junto con perspectivas de futuros trabajos con el mismo dataset.
Este informe pretende ser una guía para B&C, equipando a los ejecutivos de la agencia con el conocimiento para tomar decisiones informadas y mantener una ventaja competitiva en el mercado inmobiliario de Cali.
El objetivo general es proporcionar un análisis descriptivo de las características del mercado inmobiliario en Cali, utilizando el dataset proporcionado para identificar patrones, tendencias y anomalías en los precios de las propiedades, tipos de inmuebles y otros que puedan beneficiar el negocio de B&C.
Los objetivos específicos presentan los requerimientos para que se cumpla el objetivo general.
Conocer el negocio de B&C : Establecer los objetivos del negocio de B&C buscando información sobre los datos más relevantes para la toma de decisiones informadas.
Revisión inicial de datos : Importar y realizar una revisión preliminar del dataset para verificar sus principales características.
Preparación y Calidad de los Datos : Limpiar los datos tratando valores faltantes y outliers, y transformar variables para facilitar su análisis, asegurando así la precisión y fiabilidad de los hallazgos analíticos.
Aplicación de Técnicas Descriptivas : Utilizar técnicas estadísticas para obtener una comprensión de las tendencias centrales, la dispersión y las distribuciones de frecuencia de las características importantes del mercado inmobiliario.
Elaboración de Informes y Visualizaciones : Consolidar, sintetizar y visualizar los hallazgos del análisis para destacar las tendencias importantes, interpretar anomalías y proporcionar una descripción de la dinámica del mercado inmobiliario en Cali, que pueda ser entendida fácilmente por los ejecutivos para mejorar su toma de decisiones.
Recomendaciones Estratégicas : Traducir los resultados analíticos en recomendaciones estratégicas y prácticas para la empresa, ofreciendo orientación de cómo usar los resultados del análisis para la toma de decisiones en el mercado.
La metodología usada implementa los pasos necesarios para cumplir los objetivos específicos, al mismo tiempo que se busca cumplir con el objetivo general de usar los datos provistos para beneficio del negocio de B&C.
Este paso busca enfocar el análisis en las características relevantes para el negocio del B&C. Este paso se usó para establecer una dirección clara para las fases posteriores del análisis.Se identificaron los principales objetivos del negocio de B&C para comprender que información puede ser útil para el análisis de datos.Los siguientes son los objetivos identificados:
Expansión de la Cartera Inmobiliaria: Identificar y adquirir nuevas propiedades con potencial de valorización a largo plazo.
Maximización del Valor de la Propiedad: Incrementar el valor de las propiedades en cartera a través de estrategias de compra eficaces, también renovaciones y mejoras que aumenten su atractivo en el mercado.
Maximización de Ganancias por Comision variable proporcional al Precio: Optimizar las ganancias de la empresa por comisiones, dado que estas comunmente varían desde %3 hasta 7% dependiendo del precio de venta, contando con que se paga de esta comisión aproximadamente 40% a empleados y 10% en gastos operativos.
Diversificación de la Cartera Inmobiliaria: Diversificar la cartera inmobiliaria para mitigar riesgos y aprovechar diferentes segmentos del mercado.
Análisis de Mercado y Toma de Decisiones basados en Datos: Utilizar el análisis de datos para comprender las tendencias del mercado, identificar oportunidades y tomar decisiones estratégicas informadas.
La fase de adquisición de datos y revisión inicial se llevó a cabo para verificar que el dataset proporcionado fuera adecuado para el análisis descriptivo destinado a explorar la dinámica del mercado inmobiliario de Cali.
El dataset se importó desde GitHub a R mediante instrucciones de la guía de actividad.
devtools::install_github("dgonxalex80/paqueteMETODOS")
## Skipping install of 'paqueteMETODOS' from a github remote, the SHA1 (341036c5) has not changed since last install.
## Use `force = TRUE` to force installation
library(paqueteMETODOS)
## Loading required package: cubature
## Loading required package: dplyr
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## Loading required package: flextable
## Loading required package: ggplot2
## Loading required package: lmtest
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
## Loading required package: psych
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
## Loading required package: summarytools
## Loading required package: randtests
## Loading required package: rapportools
##
## Attaching package: 'rapportools'
## The following objects are masked from 'package:summarytools':
##
## label, label<-
## The following object is masked from 'package:dplyr':
##
## n
## The following objects are masked from 'package:stats':
##
## IQR, median, sd, var
## The following objects are masked from 'package:base':
##
## max, mean, min, range, sum
data(vivienda_faltantes)
Descripción general del dataset: se realizó una exploración inicial de la estructura de los datos utilizando la función str(),esta proporcionó información sobre los tipos de datos, la composición de las variables y las indicaciones iniciales de valores faltantes como en la columna “piso”.
str(vivienda_faltantes)
## spc_tbl_ [8,330 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : num [1:8330] 8312 8311 8307 8296 8297 ...
## $ zona : chr [1:8330] "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
## $ piso : num [1:8330] 4 1 NA 2 NA NA 2 NA NA 2 ...
## $ estrato : num [1:8330] 6 6 5 3 5 5 6 5 5 5 ...
## $ preciom : num [1:8330] 1300 480 1200 220 330 1350 305 480 275 285 ...
## $ areaconst: num [1:8330] 318 300 800 150 112 390 125 280 74 120 ...
## $ parquea : num [1:8330] 2 1 4 1 2 8 2 4 1 2 ...
## $ banios : num [1:8330] 4 4 7 2 4 10 3 4 2 4 ...
## $ habitac : num [1:8330] 2 4 5 4 3 10 3 4 3 3 ...
## $ tipo : chr [1:8330] "Apartamento" "Casa" "Casa" "Casa" ...
## $ barrio : chr [1:8330] "arboleda" "normandía" "miraflores" "el guabal" ...
## $ longitud : num [1:8330] -76576 -76571 -76568 -76565 -76565 ...
## $ latitud : num [1:8330] 3454 3454 3455 3417 3408 ...
## - attr(*, "spec")=List of 3
## ..$ cols :List of 13
## .. ..$ id : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ zona : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ piso : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ estrato : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ preciom : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ areaconst: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ parquea : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ banios : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ habitac : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ tipo : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ barrio : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ longitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ latitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## ..$ default: list()
## .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
## ..$ delim : chr ","
## ..- attr(*, "class")= chr "col_spec"
## - attr(*, "problems")=<externalptr>
Se verificó que:
Las columnas fueron identificadas por su nombre de la siguiente forma:
También se generaron resúmenes estadísticos preliminares para cada variable utilizando la función summary(), esta muestra las tendencias centrales, la dispersión y los posibles valores atípicos, para comprender las características principales de cada columna del dataset.
summary(vivienda_faltantes)
## id zona piso estrato
## Min. : 1 Length:8330 Min. : 1.000 Min. :3.000
## 1st Qu.:2082 Class :character 1st Qu.: 2.000 1st Qu.:4.000
## Median :4164 Mode :character Median : 3.000 Median :5.000
## Mean :4164 Mean : 3.772 Mean :4.634
## 3rd Qu.:6246 3rd Qu.: 5.000 3rd Qu.:5.000
## Max. :8319 Max. :12.000 Max. :6.000
## NA's :3 NA's :2641 NA's :3
## preciom areaconst parquea banios
## Min. : 58.0 Min. : 30 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 123 Median : 2.000 Median : 3.000
## Mean : 434.2 Mean : 175 Mean : 1.836 Mean : 3.112
## 3rd Qu.: 540.0 3rd Qu.: 229 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745 Max. :10.000 Max. :10.000
## NA's :2 NA's :3 NA's :1606 NA's :3
## habitac tipo barrio longitud
## Min. : 0.000 Length:8330 Length:8330 Min. :-76576.00
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76506.00
## Median : 3.000 Mode :character Mode :character Median : -76.54
## Mean : 3.605 Mean :-21845.13
## 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.390
## Median : 3.450
## Mean : 970.370
## 3rd Qu.:3367.000
## Max. :3497.000
## NA's :3
Se puede observar las mayores cantidades de datos faltantes en las columnas “piso” y “parquea”, también valores extraños en “longitud” y “latitud”, dado que los mínimos y máximos respectivamente no corresponden con el rango de valores reales de latitudes(-90° a 90°) y longitudes(-180 a 180°), indicando la presencia de errores de digitación o outliers.
Se realiza un conteo de registros con datos faltantes y valores atípicos(outliers).
La siguiente función calcula el número de filas con al menos un valor faltante.
# Calcula el número de filas con al menos un valor NA
num_filas_con_NA <- sum(apply(vivienda_faltantes, 1, function(x) any(is.na(x))))
# Imprime el número de filas con al menos un valor NA
cat("Filas con valores faltantes: ", num_filas_con_NA)
## Filas con valores faltantes: 3518
Estos 3518 registros con al menos un valor faltante, representan el 42.2% del total de registros(8330).
Se buscaron valores atípicos utilizando el Z-score para las columnas numéricas. Esta inspección ayudó a identificar valores atípicos para un posible tratamiento.
Con los Z-scores calculados, se buscan los que tienen Z-score mayor a 3 ya que están a mas de 3 veces la desviación estándar de la media.
# Contar el número de valores atípicos en cada columna de Z-score excepto id
num_outliers_por_columna <- sapply(vivienda_z_scores[,-1], function(x) sum(abs(x) > 3, na.rm = TRUE))
# Imprimir el número de valores atípicos por columna
cat("Outliers por columna: ",num_outliers_por_columna)
## Outliers por columna: 84 1 178 131 116 73 273 1 1
Se puede ver que hay Outliers en todas las columnas excepto “precio_m”, “latitud” y también se aprecia extrañamente que la “longitud” no tiene outliers, a pesar de mostrar valores grandes extremos y de media en la sección anterior, posiblemente debido a que la desviación estándar está siendo influenciada en gran medida por los grandes valores y gran cantidad de los outliers en esta columna, que pueden ser errores de digitación por la coincidencia de que los outliers parecen una coordenada que ha sido multiplicada por 1000.
Se calculó el total de filas con al menos un outlier:
# Crea un vector para identificar filas con al menos un valor atípico, excluyendo id
filas_con_outliers <- apply(vivienda_z_scores[,-1], 1, function(x) any(abs(x) > 3, na.rm = TRUE))
# Contar el número total de filas con al menos un valor atípico
num_total_filas_outliers <- sum(filas_con_outliers)
# Imprime el número total de filas con al menos un valor atípico
cat("Filas con valores atípicos: ",num_total_filas_outliers)
## Filas con valores atípicos: 676
Estos 676 registros con al menos un valor atípico representan el 8.1% del total de registros(8330).
Los hallazgos clave, los posibles problemas de datos y las observaciones realizadas durante esta revisión inicial se resumieron en esta sección. Esta documentación guiará los pasos posteriores del análisis.
Existen registros con valores ausentes (42.2% del total) y se debe decidir que hacer con ellos.
Las mayores cantidades de datos faltantes se dan en las columnas “piso”(2641 registros) y “parquea(1606 registros).
De los 8330 registros, 676(8.1% del total) tienen al menos un valor atípico. Se debe decidir que hacer con ellos.
Existen valores muy grandes para una coordenada real en latitud y “longitud”. Aparecen sin outliers con el método de Z-score, y los valores extremos parecen una coordenada multiplicada por mil, lo que amerita mayor escrutinio de esta columna, para verificar una posible corrección.
La columna de “barrio” puede contener errores de escritura y diferencias en letras mayúsculas y minúsculas.
La columna “id” es un serial de cada registro, que no debe tenerse en cuenta para el análisis, entonces, de las 13 columnas, 12(92.3%) son relevantes.
Luego de la revisión inicial de los datos, esta fase se enfocó en preparar el dataset para un análisis descriptivo. Esto implicó limpiar, transformar y garantizar la calidad de los datos, teniendo en cuenta problemas identificados en la revisión inicial.
En esta sección se decidió la acción a tomar tanto con datos faltantes, como con outliers. Finalmente se consideró si eliminar la columna “id” y se decidió si se pueden corregir los valores que parecen erroneos en “latitud”, “longitud” y “barrio”.
Se decide eliminar todos los valores que tengan datos faltantes, debido a que es dificil imputar valores tanto a “piso”, como a “parquea”que son los que mas faltantes tienen, debido a que la media o moda no aplican para estimar adecuadamente estas características y no hay otros datos en los que basarse para obtener una estimación confiable. Como los datos faltantes de las otras columnas no son significativos respecto al total de registros ya que estos son menos del 0.04% del total, también se decide eliminarlos. El siguiente código muestra como se realizó esta eliminación:
# elimina filas con al menos un valor NA
vivienda_sin_NA <- na.omit(vivienda_faltantes)
Al ejecutar summary(vivienda_sin_NA), se puede observar que quedaron 4814 registros después de eliminar los 3516 que contenían valores faltantes, es decír se eliminó el 42.2% de registros del dataset original.
Se volvieron a buscar los valores atípicos con el método de Z-score, debido a que se eliminó una gran cantidad de registros en la sección anterior.
## Filas con valores atípicos: 402
Debido a que hay una baja cantidad de outliers respecto al total de registros(8.3%), se decidió eliminarlos para que no interfieran con los resultados del análisis. El siguiente código fué usado para realizar esta tarea:
# Identifica registros con al menos un valor atípico en vivienda_z_scores
filas_con_outliers <- apply(vivienda_z_scores[,-1], 1, function(x) any(abs(x) > 3))
# elimina estos registros de vivienda_sin_NA
vivienda_sin_NA_sin_outliers <- vivienda_sin_NA[!filas_con_outliers, ]
Al ejecuttar summary(vivienda_sin_NA_sin_outliers), se puede observar que quedaron 4410 registros después de quitar outliers y faltantes, esto significa que el dataset queda con el 52.9% del total de registros originales.
Como se había notado que estas columnas tienen datos demasiado grandes para ser una latitud o longitud reales, se exploró manualmente los valores y se determinó que al parecer hubo un error en la toma de datos que hizo que se multipliquen por 1000 algunos valores de estas coordenadas, por tanto se creó una función que para cada caso en el que se supere el valor absoluto de 90 para latitud y 180 para longitud, se divide el valor original entre 1000 y se imputa este nuevo valor.
# corrige valores de la columna 'latitud'
vivienda_sin_NA_sin_outliers$latitud <- with(vivienda_sin_NA_sin_outliers, ifelse(abs(latitud) > 90, latitud / 1000, latitud))
# corrige valores de la columna 'longitud'
vivienda_sin_NA_sin_outliers$longitud <- with(vivienda_sin_NA_sin_outliers, ifelse(abs(longitud) > 180, longitud / 1000, longitud))
# Muestra los resultados para asegurarse de que las correcciónes se aplicaron correctamente
summary(vivienda_sin_NA_sin_outliers$latitud)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.333 3.378 3.408 3.414 3.450 3.498
summary(vivienda_sin_NA_sin_outliers$longitud)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -76.59 -76.54 -76.53 -76.53 -76.52 -76.46
Dado que los valores máximos, mínimos y promedio están dentro de valores reales para una latitud y longitud, se asume cautelosamente, que se han corregido satisfactoriamente. Si se desea un método mas conservador, se deberían eliminar, pero los valores eran tán parecidos en sus cifras significativas a los valores correctos multiplicados por exáctamente 1000, que se hace evidente un error en la digitación o procesamiento que pudo causar este cambio.
Se identificaron dos tipos de errores en la columna “barrio”, que aparece la zona como barrio y que hay errores de sintáxis.
-Existen 86 registros con barrios que figuran como la zona en lugar del nombre del barrio. Estos registros se eliminaron, ya que el barrio es un dato importante y no eliminarlos puede afectar el resto del análisis. Se usó el siguiente código:
# Filtrar registros que NO contienen la palabra "zona" en la columna 'barrio'
vivienda_sin_NA_sin_outliers_sin_zona <- vivienda_sin_NA_sin_outliers[!grepl("zona", vivienda_sin_NA_sin_outliers$barrio, ignore.case = TRUE), ]
Al ejecutar summary(vivienda_sin_NA_sin_outliers_sin_zona), Se puede apreciar que quedaron 4323 registros, que representan el 51.9% de los registros del dataset original.
Ahora se verifica cuantos barrios diferentes hay en el dataset:
# Contar cuántos valores diferentes de 'Barrio' hay
num_barrios_unicos <- length(unique(vivienda_sin_NA_sin_outliers_sin_zona$barrio))
# Imprimir el número de barrios únicos
print(num_barrios_unicos)
## [1] 260
Como se puede observar, existen 260 barrios diferentes, algunos de ellos pueden tener errores de sintáxis y corresponden al mismo barrio.
-Para corregir los posibles errores de sintáxis en “barrio”, se descargó de la página de la Alcaldía de Cali, una hoja de excel que contiene la lista de barrios existentes en 2015, se convirtió a csv con codificación UTF-8 y una sola columna llamada barrio_correcto, que contiene la lista de barrios.
# carga el dataset 'barrios_solo.csv' que solo contiene la columna barrio_correcto, extraída del dataset de la Alcaldía de Cali.
barrios_correctos <- read.csv('barrios_solo5.csv', fileEncoding = "UTF-8")
Se removieron espacios, corrigieron códigos ASCII y caractéres especiales tanto en el dataset vivienda_sin_NA_sin_outliers_sin_zona como en barrios_correctos, con el siguiente código:
para corregir errores de sintáxis se buscó para cada registro, el barrio en la base de datos de la alcaldía, con la mínima distancia entre cadenas calculada por la funcuión stringdist() y se imputó en lugar del barrio original, corrigiendo posibles errores en la escritura del barrio. El código está oculto por su extensión.
## [1] 512
Se puede ver que hay 512 registros de distancia superior a 0.05 que es una similitud casi exácta. Estos indican barrios incompletos o diferentes de los nombres de barrios de la Alcaldía de Cali en 2015. Se removerán estos registros con los siguientes comandos:
ids_a_remover <- barrios_a_revisar_o_quitar$id
library(dplyr)
vivienda_sin_NA_sin_outliers_sin_zona <- vivienda_sin_NA_sin_outliers_sin_zona %>% filter(!id %in% ids_a_remover)
# muestra cuantos registros quedaron en vivienda_sin_NA_sin_outliers_sin_zona
nrow(vivienda_sin_NA_sin_outliers_sin_zona)
## [1] 3811
Al remover los 512 registros con barrios que no están en la base de datos de la Alcalcdía de Cali, el dataset para análisis quedó con 3811 registros, eso es el 45.8% del total de registros del dataset original.
Después de este procesamiento, se verifica cuantos barrios diferentes hay en el dataset:
# Cuenta cuántos valores diferentes de 'Barrio' hay
num_barrios_unicos <- length(unique(vivienda_sin_NA_sin_outliers_sin_zona$barrio))
# Imprime el número de barrios únicos
print(num_barrios_unicos)
## [1] 146
Se puede ver que *pasamos de 260 barrios diferentes a 146 barrios después del procesamiento y de remover los valores diferentes a los de la lista de barrios descargada de la Alcaldía de Cali.
Se decidió eliminar esta columna debido a que no representa información relevante y puede interferir en la salida de algún comando que se ejecute para colúmnas numéricas, incrementando el trabajo de tener que separarlo del dataset en cada comando. Se conserva una copia del dataset original en caso de que se requiera en el futuro para corroborar la integridad de los datos. La columna se eliminó con el siguiente comando:
vivienda_final <- vivienda_sin_NA_sin_outliers_sin_zona[, -which(names(vivienda_sin_NA_sin_outliers_sin_zona) == "id")]
Al eliminar la columna, quedan 11 colúmnas en el dataset, eso es un 84.6% de las 13 columnas del dataset original.
En esta sección se adicionaron variables y se evaluó la necesidad de estandarización o normalización de variables numéricas y codificación de variables categóricas.
vivienda_final$precio_metro <- vivienda_final$preciom / vivienda_final$areaconst
# calcula el precio máximo y mínimo
precio_min <- min(vivienda_final$preciom, na.rm = TRUE)
precio_max <- max(vivienda_final$preciom, na.rm = TRUE)
# Calcula la pendiente (m)
pendiente <- (3.5 - 1.5) / (precio_max - precio_min)
# Calcula la intersección y (b)
interseccion_y <- 1.5 - pendiente * precio_min
# Calcula el porcentaje de comisión para cada propiedad
vivienda_final$porcentaje_comision <- pendiente * vivienda_final$preciom + interseccion_y
library(ggplot2)
# Agrega la nueva columna 'millones_comision' a vivienda_final
vivienda_final$millones_comision <- vivienda_final$preciom * (vivienda_final$porcentaje_comision / 100)
# Crear un gráfico de dispersión para visualizar la relación entre precio y comisión
ggplot(vivienda_final, aes(x = preciom, y = millones_comision)) +
geom_point(alpha = 0.6, color = "blue") +
theme_minimal() +
labs(title = "Relación entre Precio y Comisión",
x = "Precio de Venta (Millones)",
y = "Comisión (Millones)") +
theme(plot.title = element_text(hjust = 0.5))
Se puede ver la ligera curvatura producida por el incremento de la
comisión con el precio de venta, de 1.5% para $78M hasta 3.5% para
$1400M, representa la ganancia neta de la empresa B&C por una venta,
después de descontar pago al vendedor y gastos operacionales
aproximados.
hist(vivienda_final$millones_comision, main = "Comisión de B&C en Millones de Pesos", xlab = "Millones de Pesos")
Se puede observar que las comisiones de menos de 10 Millones
(Propiedades de 500 Millones) son mas frecuentes que las de mas de 10
millones, pero se evaluó el total de comisiones por rango de precios de
propiedad, para comprobar si esa alta frecuencia de ventas de bajo costo
se traduce en mayores o menores ganancias por comisión que los demás
segmentos.
Interesantemente, se observó conrtario a lo sugerido por el histograma
de comisiones, que la venta del segmento de viviendas mas baratas
aunque se venden mas, tienen menor ganancia que los
segmentos de viviendas de comisiones entre $150M y $900M.
Los 3 principales segmentos que reportan mayor ganancia neta por comisiones a B&C son:
Por tanto B&C debe enfocar sus esfuerzos y estrategias de marketing en vender en el rango de precios entre $150 y $600M, teniendo como opcionales las propiedades entre $600M a $900M.
Las variables “preciom”,“areaconst”, “latitud” y “longitud”. Se podrían estandarizar o normalizar, si se van a usar para un modelo de machine learning, pero como en este análisis eso no se va ahacer, se decide dejar estas columnas como están, de esta manera sus valores pueden ser mas representativos y fáciles de identificar para los ejecutivos de B&C.
Las demás variables numéricas, se podrían normalizar, pero porque tampoco se van a usar en modelos de ML, no hay necesidad de normalizarlas y así pueden ser mas fáciles de entender para los ejecutivos de B&C.
Se decidió no usar codificación de variables en esta oportunidad, por las mismas razones mencionadas en la sección anterior.
Las siguientes técnicas buscan resumir el dataset para facilitar su interpretación, visualización y el uso de patrones o regularidades encontrados en los datos, para dar una idea de la dinámica de mercado inmobiliario de Cali, que sirve para la toma de decisiones de negocios por parte de los ejecutivos de B&C.
Se empleó un análisis univariado (Sección 3.4.1) que describe los datos usando tablas y gráficos de frecuencia e indicadores de posición, centro y de forma para cada variable, para luego realizar un análisis multivariado (Sección 3.4.2) para analizar el precio de las viviendas en diferentes zonas, el tipo de viviendas más ofertadas, las características más relevantes de la oferta de vivienda en Cali, luego Información útil para B&C (Sección 3.4.3) como nicho de mercado y estrategias de marketing y finalmente, la documentación y síntesis de los resultado para visualización y presentación(Sección 3.4.4).
se examinaron las distribuciones de variables clave para comprender sus tendencias centrales, dispersión y forma.
Para visualizar la distribución de frecuencia de las variables mas importantes del negocio que son “areaconst y”preciom”, se usaron histogramas y BoxPlots. Los histogramas se generaron usando la función hist() y los diagramas de caja se crearon con boxplot(), que proporcionan información sobre su distribución y posibles valores atípicos.
# Histograma para 'preciom'
hist(vivienda_final$preciom, breaks = 30, main = "Distribución de Precios de Propiedad en Millones", xlab = "Precio en Millones de Pesos")
# Histograma para 'areaconst'
hist(vivienda_final$areaconst, breaks = 30, main = "Distribución del Área Construida", xlab = "Área Construida (m²)")
Se puede observar que la mayor parte de las propiedades tiene menos de
300 metros cuadrados y cuestan menos de $425 millones.
Ambas variables tienen asimetría positiva, indicando que hay muchas menos propiedades de mas de 300 metros cuadrados y de mas de $425 millones, sin embargo, son una cantidad significativa debido a la magnitud del costo de la vivienda que es proporcional a la ganancia de B&C por venderla.
Se realizaron box plots de estas mismas variables para tener una visión clara de su distribución.
# Diagrama de caja para 'preciom'
boxplot(vivienda_final$preciom, main = "Distribución de Precios de Propiedad en Millones", ylab = "Precio en Millones de Pesos")
# Diagrama de caja para 'areaconst'
boxplot(vivienda_final$areaconst, main = "Box Plot del Área Construida", ylab = "Área Construida (m²)")
Se muestra la mayor parte del área construída entre 80 y 200 metros
cuadrados, aunque se pueden ver varios puntos por encima del bigote
superior, que generalmente se consideran outliers, en este caso se
corresponden con la realidad y no con datos erroneos, ya que en efecto,
casas por encima de 400 metros cuadrados cuestan mucho mas que las demás
y son un porcentaje pequeño pero significativo de datos que no
se descartarán ya que pueden tener un peso importante en el
negocio de B&C, ya que vender una sola de estas casas, puede dar por
ejemplo 3 o 5 veces la ganancia de vender una casa pequeña.
Se generó una tabla con un análisis descriptivo para cada variable con promedio, mediana, medidas de dispersión como range, var y sd y medidas de posición como cuantil empleado
## piso estrato preciom areaconst parquea
## vars 1.000000e+00 2.00000000 3.000000 4.000000 5.000000e+00
## n 3.811000e+03 3811.00000000 3811.000000 3811.000000 3.811000e+03
## mean 3.864602e+00 4.84492259 422.070848 155.674044 1.689320e+00
## sd 2.539149e+00 0.91205822 261.657589 100.587567 8.430907e-01
## median 3.000000e+00 5.00000000 340.000000 118.000000 2.000000e+00
## trimmed 3.528698e+00 4.90554280 380.674975 139.054916 1.536569e+00
## mad 1.482600e+00 1.48260000 174.946800 66.717000 1.482600e+00
## min 1.000000e+00 3.00000000 78.000000 40.000000 1.000000e+00
## max 1.100000e+01 6.00000000 1400.000000 588.000000 5.000000e+00
## range 1.000000e+01 3.00000000 1322.000000 548.000000 4.000000e+00
## skew 1.066212e+00 -0.31829111 1.505936 1.484662 1.354042e+00
## kurtosis 3.462126e-01 -0.77537088 2.113058 1.920069 1.736038e+00
## se 4.113095e-02 0.01477417 4.238516 1.629389 1.365698e-02
## Q0.25 2.000000e+00 4.00000000 240.000000 83.000000 1.000000e+00
## Q0.75 5.000000e+00 6.00000000 530.000000 200.000000 2.000000e+00
## banios habitac precio_metro porcentaje_comision
## vars 6.00000000 7.000000e+00 8.000000e+00 9.000000e+00
## n 3811.00000000 3.811000e+03 3.811000e+03 3.811000e+03
## mean 3.09393860 3.399370e+00 2.917107e+00 2.101960e+00
## sd 1.19977797 1.030271e+00 1.010305e+00 3.740637e-01
## median 3.00000000 3.000000e+00 2.866667e+00 1.984632e+00
## trimmed 2.98097737 3.312889e+00 2.871245e+00 2.042781e+00
## mad 1.48260000 0.000000e+00 9.932215e-01 2.501026e-01
## min 0.00000000 0.000000e+00 6.250000e-01 1.610079e+00
## max 7.00000000 7.000000e+00 8.300654e+00 3.500000e+00
## range 7.00000000 7.000000e+00 7.675654e+00 1.889921e+00
## skew 0.66688290 9.870965e-01 5.648733e-01 1.505936e+00
## kurtosis -0.08204598 2.146216e+00 7.657961e-01 2.113058e+00
## se 0.01943486 1.668907e-02 1.636564e-02 6.059351e-03
## Q0.25 2.00000000 3.000000e+00 2.190744e+00 1.841673e+00
## Q0.75 4.00000000 4.000000e+00 3.529412e+00 2.256254e+00
## millones_comision rango_precio
## vars 10.0000000 1.100000e+01
## n 3811.0000000 3.811000e+03
## mean 9.8502687 3.346891e+00
## sd 8.6558397 1.801531e+00
## median 6.7477484 3.000000e+00
## trimmed 8.1063785 3.067563e+00
## mad 4.2476384 1.482600e+00
## min 1.2558613 1.000000e+00
## max 49.0000000 1.000000e+01
## range 47.7441387 9.000000e+00
## skew 2.1665428 1.452735e+00
## kurtosis 5.0221951 2.072629e+00
## se 0.1402135 2.918249e-02
## Q0.25 4.4200143 2.000000e+00
## Q0.75 11.9581487 4.000000e+00
Se pueden apreciar todas las medidas para cada variable numérica y de ellas podemos extraer el tipo de viviendas más ofertadas en Cali usando la media para valores contínuos y la mediana para discretos, se pudo determinar que las carácterísticas mas comunes son:
Los siguientes pasos buscan relaciones existentes entre las variables del dataset que puedan ser útiles para el negocio. Iniciando por un análisis de precios por zona, rentabilidad por zona y estrato.
Se agrupó las propiedades por zona y calcula la ganancia total (precio de venta multiplicado por el porcentaje de comisión) para cada zona. Identifica las zonas que generan mayores ganancias y considera enfocar los esfuerzos de marketing y adquisición de propiedades en esas zonas.
library(DT)
ganancias_por_zona <- vivienda_final %>%
group_by(zona) %>%
summarise(ganancia_total = sum(preciom * (porcentaje_comision / 100))) %>%
arrange(desc(ganancia_total))
# Crear y mostrar la tabla DT
tabla_interactiva <- datatable(ganancias_por_zona, options = list(pageLength = 10, autoWidth = FALSE)) %>%
formatRound('ganancia_total', digits = 0)
# Mostrar la tabla interactiva
tabla_interactiva
Se puede observar que se deben priorizar las zonas Sur y Oeste, opcionalmente la Zona Norte y evitar las zonas Oriente y centro.
library(dplyr)
# Filtrar los estratos del 1 al 6 y calcular el total de ganancias por estrato
ganancias_por_estrato <- vivienda_final %>%
filter(estrato %in% 3:6) %>%
group_by(estrato) %>%
summarise(total_ganancias = sum(millones_comision, na.rm = TRUE))
# Crear un gráfico de barras para visualizar el total de ganancias por estrato
ggplot(ganancias_por_estrato, aes(x = as.factor(estrato), y = total_ganancias)) +
geom_bar(stat = "identity", fill = "dodgerblue") +
theme_minimal() +
labs(title = "Total de Ganancias por Estrato",
x = "Estrato",
y = "Total de Ganancias (Millones de Comisión x Precio)") +
scale_x_discrete(name = "Estrato", labels = c("3", "4", "5", "6")) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Se Puede observar que se obtiene mayor ganncia neta potencial en
estratos 5 y 6, opcionalmente estrato 4.
En esta sección se toman los valores del análisis de las anteriores secciones y se plantea como se pueden usar en la toma de decisiones de B&C #### 3.4.3.1 Definición de nicho de mercado Para el nicho de mercado se pueden usar tanto los hallazgos en precio, estrato y zona que se encontraron relacionados con el incremento de potencial ganancia por comisiones. Estos datos de nicho son:
También como parte del nicho de mercado pueden servir las carácterísticas mas ofertadas en el mercado de Cali, donde debe competir la Empresa, buscando siempre vender viviendas de mayor costo para maximizar la comisión:
Las estrategias de marketing deben ir orientadas principalmente al nicho de mercado identificado, de propiedades de entr $150M y $600M, estrato 5 y 6 en le Sur y Oeste. Se debe limitar el marketing en otras zonas ya que hay menos oferta y probablemente también demanda, lo que hace mas ineficiente el trabajo inmobiliario.
Los posibles precios de venta son dificiles de estimar, ya que dependen de la demanda, que puede estar dada por la zona, el barrio, el estrato ylas características de la propiedad. Un futuro análisis donde se hagan estimaciones, servirá para estimar los posibles costos de venta basnandose en diferentes características, pero en este análisis ese dato no se estimó.
Los posibles servicios relacionados con este análisis pueden incluír mostrar gráficos con estimaciones del valor de un área específica proveniente de un modelo matemático, que le haga ver que está obteniendo un buen precio. Este modelo será entrenado con los datos que se preocesaron en este análisis.
Ya que los resultados de cada paso de la metodología de análisis (Sección 3) están documentados en este informe, en esta sección se creó un resumen ejecutivo con los resultados del análisis mas relevantes para B&C y orientado para ser leído por sus ejecutivos. Una copia de este resumen ejecutivo se adjunta para que se pueda realizar una presentación corta de los resultados a los ejecutivos, sin tener que pasar por el extenso análisis y procesamiento que produjo estos resultados.
Este resumen ejecutivo describe las necesidades de B&C cubiertas por este análisis(Sección 4.1.1), la información útil resultante del análisis que cubre estas necesidades(Sección 4.1.2), como cubre las necesidades de B&C esta información(Sección 4.1.3) y finalmente una conclusión sobre los resultados del análisis(Sección 4.1.4).
Se realizó un análisis descriptivo orientado a buscar los datos que puedan servir para incrementar las ganancias de B&C. El análisis proporcionó información sobre los siguientes temas:
Esto puede ser útil para la empresa B&C para tomar decisiones sobre su negocio, tales como:
Las siguientes secciones describen los hallazgos mas importantes:
La ganancia de la empresa viene de las comisiones ganadas por ventas.
Los 3 segmentos que producen mas ganancias a B&C son:
Por tanto B&C debe enfocar sus esfuerzos y estrategias de marketing en vender en el rango de precios entre $150 y $600M, teniendo como opcionales las propiedades entre $600M a $900M.
La ganancia está en Millones de pesos Colombianos.
Esta información puede ayudar a establecer el nicho de negocios de B&C. Se puede observar que se deben priorizar las zonas Sur y Oeste, opcionalmente la Zona Norte y evitar las zonas Oriente y centro.
Se Puede observar que se obtiene mayor ganncia neta potencial en
estratos 5 y 6. y esto también puede ayudar a
establecer el nicho de mercado y la esrtrategia de
marketing de B&C.
Este análisis presentó hallazgos que pueden orientar la toma de decisiones y la estrategia comercial de B&C con miras a buscar un mercado dinámico donde exista alta frecuencia de ventas y por tanto ganancias para la empresa por Comisiones.
Este análisis también realizó el procesamiento del dataset de viviendas en Cali para que se pueda seguir trabajando con el, usando modelos predictivos mas avanzados, que puedan brindar mas valor a B&C por medio de herramientas para comprender la mecánica del mercado, adelantarse a las tendencias y mejorar la toma de decisiones ejecutivas.
Las variables latitud y longitud no se usaron debido a que no se encontró una forma para usarlas directamente para los objetivos del proyecto, pero pueden ser útiles en el futuro cuando se usen algoritmos de machine learning, lo mismo sucede con la variable barrio, se eliminaron barrios que no están registrados en los datos abiertos de la Alcaldía de Cali de 2015 y se juntaron barrios escritos de diferentes maneras, pero no se codificaron ni se usaron en este análisis porque el objetivo de su procesamiento fué dejarlos listos para cuando se usen modelos de machine learning u otros con los que se puedan realizar por ejemplo, estimaciones del precio de venta de las propiedades basado en sus otras características como barrio, zona, pisos, parqueaderos o estrato.
Existe mas oferta de inmuebles baratos que caros, pero a la vez la ganancia de la venta de inmuebles caros deja mayores ganancias a la empresa, lo que hace pensar que se deben distribuír los esfuerzos por mantener este portafolio diversificado de oferta priorizando las viviendas deun rango medio de precios donde se maximiza la ganancia por comisiones. Los resultados se presentaron de una forma resumida, lo que facilita la toma de decisiones de los ejecutivos de B&C. Algunas variables fueron procesadas pero no usadas en este análisis, pero esto tiene el objetivo de que queden listas para su futuro procesamiento usando técnicas mas avanzadas de inferencia y aproximación usando machine learning.