1. Introducción

La empresa B&C (Bines y Casas) es una agencia de bienes raíces establecida en la ciudad de Cali, Colombia, hace 10 años, que cuenta con 8 agentes de bienes raíces. En este informe, se presenta un análisis descriptivo de datos recopilados por la empresa sobre el mercado inmobiliario en Cali. El objetivo es identificar tendencias y patrones en los datos que puedan ser útiles para la toma de decisiones empresariales.

2. Objetivos

El objetivo principal del informe es proporcionar información detallada sobre el mercado de bienes raíces en Cali, incluyendo el precio de las viviendas en diferentes zonas, los tipos de viviendas más ofertadas y las características más relevantes de la oferta de vivienda.

3. Métodos

El análisis estadístico se llevará a cabo mediante técnicas de estadística descriptiva, aprovechando datos recopilados, mediante web scrapping, de una plataforma online de oferta de bienes raíces. El proceso comprenderá la organización y limpieza de la base de datos para garantizar su calidad, seguido de análisis exploratorios para identificar patrones y calcular estadísticas descriptivas. Además, se emplearán herramientas gráficas para una presentación visual de los resultados y se evaluará la relación entre variables con el objetivo de comprender mejor, cómo ciertas características de las propiedades influyen en sus precios de venta.

Los hallazgos serán expuestos en la sección 4 a través de gráficos, tablas y resúmenes, con referencias directas a algunos anexos para ofrecer un desglose completo del proceso de cálculo realizado.

4. Resultados

4.1 Caracterización de la oferta del mercado inmobiliario

A continuación se muestra la caracterización de las variables del estudio para las viviendas basadas en su tipo, estrato, zonas, número de habitaciones y área; también se mostrarán las opciones disponibles y su proporción, lo que permitirá un primer acercamiento a los datos y una comprensión inicial del mercado inmobiliario con base en la información recopilada.

A continuación se presenta una serie de pestañas con el detalle de cada variable (dar click sobre cada una)

Tipos de vivienda

El mercado inmobiliario tiene una mayor participación para el tipo “Apartamento” lo que puede brindar información acerca de como segmentar el mercado para la asignación de agentes inmobiliario para cada tipo de vivienda. Así como también ir perfilando el tipo de cliente adecuado para cada caso.

Este porcentaje corresponde a las siguientes cantidades de Casas y Apartamentos Anexo 6.2.1

Oferta por tipo
Apartamento Casa
5106 3221

Estratos

La oferta inmobiliario en Cali a través de medios online tiene una mayor volumen en los estratos medios-altos, lo que indicaría una mayor participación de mercado para viviendas de valor medio o alto. Puede indicar también que estas plataformas online son usadas principalmente para dar liquidez al mercado en estos estratos, siendo para los estratos 1 y 2 un medio poco atractivo o que no genera confianza. En caso de que la inmobiliaria B&C desee particiar en el mercado de los estratos 1 y 2 tendrá que usar una estrategia más directa, ya que los medios online, según esta información, no son un buen canal en estos sectores de la sociedad.

Zonas

Más de la mitad del mercado inmobiliario se ofrece en el sur de Cali, lo que puede ser consistente con la distribución de estratos, ya que esta zona tiene predominancia de los estratos 4, 5 y 6

Número de habitaciones

Este indicador permite identificar el tipo de cliente al cual se debe orientar cualquier estrategia de marketing, ya que el mercado inmobiliario se mueve más para las propiedades que están entre 3 y 4 habitaciones, lo que significa que el target puede ser familias con uno o dos hijos.

Área

A continuación se presentan los valores numéricos para estos estadísticos con el fin de tener una referencia más clara de esta variable. Anexo 6.2.2

Min. 1st Qu. Median Mean 3rd Qu. Max.
30 80 123 175 229 1745
## [1] "Moda: 60"
## [1] "Desviación std: 142.949848460672"

Se realizó esta revisión del área para determinar su simetría en el conjunto de datos, ya que puede ser una variable que nos permita ampliar el entendimiento del comportamiento del precio.

4.2 Análisis bivariable

En esta sección se revisarán dos de las variables en relación con la zona, para ampliar la caracterización del mercado inmobiliario, según los datos recopilados.

A continuación se presenta una serie de pestañas con el detalle de cada variable (dar click sobre cada una)

Estratos por zona

Con el fin de identificar posibles nichos de mercado para la inmobiliaria B&C se mostrará cómo está la distribución de estratos por zona en la ciudad.

Se puede evidenciar que las zonas con mayor oferta para un público con alto poder adquisitivo estaría en la Zona Oeste, la Zona Sur y por último la Zona Norte. Así mismo la Zona Centro y la Zona Oriente son zonas indicadas para los estratos medio y medio-bajo. Anexo 6.2.3

Tipo de vivienda por zona

Se puede observar que en las zonas Sur, Oeste y Norte la oferta de vivienda se da principalmente en Apartamentos, lo que contrasta con que estas zonas cuentan con la mayor proporción de los estratos 4,5 y 6, lo que brinda información para la segmentación para definir el nicho de mercado. Cabe notar que en la Zona Sur dada su alta expansión la oferta está un poco más equilibrada entre Casas y Apartamentos.

Que corresponde a esta tabulación:

Tipo de vivienda más ofertado por zona
Apartamento Casa
Zona Centro 24 100
Zona Norte 1199 723
Zona Oeste 1035 169
Zona Oriente 62 289
Zona Sur 2786 1940

4.3 Valor de mercado

Sabemos que el precio total de mercado es aproximadamente $3.62 billones de pesos con base en los 8327 registros del estudio. La siguiente tabla muestra la segmentación del mercado por estrato y tipo de vivienda, con relación al valor de mercado.

Valor de mercado por tipo y estrato (valor en millones de pesos)
Estrato 3 4 5 6
Total viviendas 1453 2131 2751 1992
Precio medio por estrato $ 160 $ 235 $ 350 $ 700
Valor de mercado por estrato $ 305,600 $ 586,417 $ 1,128,590 $ 1,595,419
Total Apartamentos 639 1404 1767 1296
Precio medio Apartamentos $ 120 $ 190 $ 300 $ 610
Valor de mercado Aptos $ 134,397 $ 386,358 $ 724,907 $ 1,037,983
Total Casas 814 727 984 696
Precio medio Casas $ 250 $ 360 $ 480 $ 890
Valor de mercado Casas $ 171,203 $ 200,059 $ 403,683 $ 557,436

Esta información es muy útil para B&C ya que le permite identificar aquellas relaciones entre estrato y tipo de vivienda con un valor de mercado más alto, que tenga mayor probabilidad de tener liquidez, también dependiendo de la estrategia a emplear, permite identificar nichos de mercado con menor competencia.

De esta tabla podemos extraer algunas relaciones que permitirán a la inmobiliaria B&C tomar decisiones estratégicas para su participación en el mercado.

  • Al no contar con un dato que nos indique la fecha de publicación de los anuncios en la plataforma, no se puede determinar el nivel de rotación y/o liquidez para cada estrato, sin embargo, considerando el volumen de propiedades ofertadas en cada uno y considerando que el tiempo promedio activo del anuncio es el mismo para todos los estratos, se puede decir que el mercado más atractivo es el de Apartamentos en estrato 6, ya que cuenta con el valor de mercado más alto y mayor liquidez en proporción con su valor. Estratégicamente se podría decir que definir una estrategia de marketing orientada a inversionistas con alto poder adquisitivo sería lo adecuado para participar en este segmento de mercado.

4.4 Análisis de precios

Se iniciará con un análisis general del precio de las viviendas para comprender su distribución e identificar algunas características:

Min. 1st Qu. Median Mean 3rd Qu. Max.
58 220 330 434.3 540 1999
## [1] "Moda: 350"
## [1] "Desviación std: 329.033477914646"

Lo que estos datos nos indican es una alta dispersión de los datos y además, sesgados a la derecha, es decir, hay valores muy altos (a la derecha) que están lejos de la media o la mediana, esto también lo evidencia el rango ( 58M a 1999M ).

En términos de mercado esto podría indicar que la mayoría de las viviendas tienen precios moderados o bajos, sin embargo, hay viviendas con precios tan altos que afectan la distribución pero que indican la presencia en el mercado de bienes de lujo o con características excepcionales. Para identificar este tipo de relaciones se realizará un estudio que relacione otras variables con el precio, para hacer una mejor segmentación del mercado.


A continuación se presenta una serie de pestañas con el detalle de cada variable (dar click sobre cada una)

Precio por estrato

Este indicador es muy general y solo presenta una vista del precio medio por estrato, están descontadas las relaciones entre zona, tipo de vivienda y otras características de los inmuebles. En este punto no es un indicador muy confiable de precio, ni tampoco ofrece mayor información para construir una estrategia de marketing, pero lo que si nos da es la intuición del nivel de precios en la ciudad de Cali por estrato.

Por ejemplo, muestra como el precio medio de la vivienda en estrato 6 es el doble que el precio medio de la vivienda en estrato 5, lo cual, permite hacer un análisis preliminar de los precios y es otro insumo para el perfilamiento de los clientes en cada estrato.

Precio por zona

La Zona Oeste de Cali tiene una correlación directa con el estrato 6, ya que se puede ver como duplica prácticamente el precio medio con respecto a las otras zonas. Anexo 6.2.4

Variación de precio por zona y tipo

Con respecto a la variabilidad del precio por zona y tipo se presentará un diagrama por cada relación donde será fácil identificar características del mercado que serán de ayuda para la definición de estrategias de marketinig para la inmobilidaria B&C

Precio por zona y tipo

En esta tabla se muestra la mediana de los precios (en adelante referenciada como precio medio) por zona y tipo, esta información es útil para la segmentación de los clientes por capacidad de pago y da una idea de cómo orientar las estrategias de marketing.

Precio por tipo y zona
Zona-tipo Precio medio (M)
Zona Centro-Apartamento 152.5
Zona Centro-Casa 310.0
Zona Norte-Apartamento 250.0
Zona Norte-Casa 390.0
Zona Oeste-Apartamento 570.0
Zona Oeste-Casa 680.0
Zona Oriente-Apartamento 115.0
Zona Oriente-Casa 235.0
Zona Sur-Apartamento 245.0
Zona Sur-Casa 480.0

De esta tabla surgen preguntas como el por qué las variaciones tan amplias en algunas zonas entre Apartamentos y Casas, qué tanto está influyendo el área en el precio de la vivienda por zona, para esto se revisará la relación entre zona, tipo de vivienda y área.

Esta gráfica de dispersión muestra la gran concentración de viviendas entre los 55m² y 300m² para todas las zonas y tipos de vivienda.

Indica también en qué zonas, áreas y tipos de vivienda se tiene la oferta más “exclusiva” de la ciudad, por ejemplo, Casas de la zona sur son las más grandes y costosas, así como apartamentos de la zona oeste son los más costosos de la ciudad, con áreas por debajo de los 500m².

Ahora se quiere identificar cuál es la tendencia de precio por área y por zona, con este análisis se busca determinar cuáles son las zonas de la ciudad con más valoración por metro cuadrado.

De esta gráfica se puede inferir que la Zona Oriente tiene un “techo” por así decirlo en el precio medio de la vivienda, y que a pesar de tener grandes variaciones en área el precio no varía mucho, por lo tanto es una zona donde la mejor oportunidad se dará para viviendas con áreas grandes.

Las Zonas Norte y Centro tienen un comportamiento similar en cuanto a la variación de precio en función del área, con la diferencia que en la Zona Norte se cuenta con una oferta de mayor área y precio medio.

Las Zonas sur y Oeste son las de mayor “valorización” por área, esto hace que la propiedad de áreas grandes tengan un incremento muy alto en el precio y muestra el porqué de los datos atípicos.

El sur de la ciudad es la zona de mayor expansión en Cali y por ende se pueden encontrar ofertas de vivienda con mayores áreas. Tradicionalmente la Zona Oeste, es una zona donde predominan los apartamentos de lujo y la oferta de casas es reducida en proporción con otras zonas de la ciudad.


4.4 Propuestas para plan de Marketing y Comercial

En esta sección se presentarán algunas conclusiones del análisis exploratorio de datos y sugerencias para que la inmobiliaria B&C pueda establecer su nicho de mercado y desarrollar sus estrategias de marketing.

De acuerdo con el valor de mercado, hay tres grandes grupos:

  • para estrato 3 representado por las zonas centro y oriente en su mayoría, el valor de mercado está alrededor de los $305mil millones
  • para estratos 4 y 5 las zonas más atractivas son las zonas sur y norte, cuyo valor de mercado está alrededor de $1.7 billones
  • para estrato 6 la mayor concentración está en la zona oeste con una participación importante en la zona sur, cuyo valor de mercado está alrededor de los $1.6 billones.

De esta información se podrían sugerir 3 estrategias de distribución de los agentes, considerando el número de agentes inmobiliarios con los que cuenta B&C.

  • 2 agentes inmobiliarios muy especializados en inmuebles de lujo o exclusivos que estén enfocados en atender la Zona Oeste de la ciudad y los sectores más exclusivos del sur de la ciudad.
  • 5 agentes inmobiliarios atendiendo el amplio mercado de los estratos 4 y 5 cubriendo principalmente las zonas Sur y Norte.
  • 1 agente inmobiliario cubriendo las ofertas de estrato 4 para las zonas Centro y Oriente, y aquellas propiedades del estrato 3 en dichas zonas y que tengan una orientación comercial.

El objetivo de esta segmentación es llegar a clientes con nivel adquisitivo medio-alto a alto, que brinde mayor liquidez y menor tiempo de negociación para los inmuebles.

De acuerdo con el tipo de vivienda por zona

  • Las zonas Sur, Norte y Oeste tienen una mayor oferta de Apartamentos que de Casas, representando cerca del 70% de la oferta total de dichas zonas, este alto volumen de inmuebles, con precios competitivos permite definir estrategias comerciales y de marketing para llegar a los clientes interesados en este tipo de vivienda con una mayor probabilidad de éxito.

Estrategias como: * Resaltar las características de los apartamentos que los hacen convenientes: * externas como: ubicación, cercanía a servicios, clínicas, centros comerciales, colegios y transporte púbilico * internas como amenidades entre las cuales se tienen piscinas, gimnasio, áreas sociales además de la seguridad y estacionamiento. * Enfocar la oferta como inversión, dada la cantidad de proyectos inmobiliarios, especialmente al sur de la ciudad es un mercado muy atractivo para inversionistas, dada la rentabilidad que pueden lograr en dichas zonas. * Utilización de medios digitales como marketing segmentado usando plataformas como Google Ads, redes sociales, portales online, creación de Tours virtuales como apoyo al proceso de venta.

  • En cuanto a las casas, se sabe que es alrededor de un 30% de la oferta, y concentrándo el esfuerzo en las zonas Norte, Sur y Oeste tenemos las siguientes estrategias.

    • Enfocar el marketing en estilo de vida, enfatizando la calidad de vida que ofrece vivir en una casa, espacio libre, privacidad, libertad para personalizarla o ampliarla orientado a familias y en menor medida personas que buscan mayor espacio y privacidad en sus hogares.
    • A diferencia de la venta de apartamentos, en las casas lo más importante es ofrecer la experiencia al cliente, por lo tanto se recomienda eventos de puertas abiertas, que permita a los potenciales compradores visitar las casas y experimentarlas de primera mano.

De acuerdo al análisis por zona y tipo

  • la oferta de vivienda está principalmente concentrada en Apartamentos, en su mayoría de 3 habitaciones y al menos un parqueadero, en estratos 4, 5 y 6.

Para B&C es importante segmentar bien este mercado, partiendo de las siguientes ideas:

  • Apartamentos de 3 habitaciones en estrato 4 y 5 con 1 parqueadero
    • Orientado a familias pequeñas o parejas que buscan un apartamento espacioso y bien ubicado.
    • Inversionistas que buscan darle una orientación comercial, bien sea para alquier de corto plazo, a través de herramientas como Airbnb, especialmente en las zonas gastronómicas o culturales de la ciudad (zona oeste)
  • Apartamentos de 3 o 4 habitaciones con 2 parqueaderos en estrato 6
    • Orientado a familias más grandes o parejas que buscan un estilo de vida lujoso y exclusivo

En todos los casos y estrategias el networking es esencial, sobretodo en el mercado de lujo, por lo tanto se sugiere también:

  • Colaboraciones Estratégicas, a través de asociaciones con otros profesionales del sector inmobiliario, como diseñadores de interiores, arquitectos o agentes de bienes raíces, para ofrecer servicios complementarios y mejorar la experiencia del cliente.
  • Eventos de puertas abiertas para mostrar las características premium de los apartamentos, como sus acabados y amenidades.

5. Discusión

5.1 Limpieza de datos

Para la limpieza de datos se tomaron en cuenta las siguientes consideraciones:

  • Revisar registros nulos, aquellos registros donde la mayoría de sus variables eran NA, se encontraron 3. Anexo 6.1.1
  • Para la imputación de la variable piso, se dividió el análisis por tipo de vivienda, tanto para Apartamento como para Casa se revisó primero la distribución de esta variable para identificar el piso más común y se hizo una segunda comprobación revisando por estrato cuál era el piso más común.
  • Para la imputación de la variable parqueadero, se analizó el valor común por tipo de vivienda y estrato y se encuentra que no es posible definir un único valor, entonces las reglas de imputación quedan así:
    • Para cualquier tipo de vivienda de estrato 3 y 4 se define 1 como el valor a imputar.
    • Para apartamentos de estrato 5 se imputa con el valor 1.
    • Para casas de estrato 5 se imputa con el valor 2.
    • Para cualquier propiedad de estrato 6 se imputa con el valor 2. Anexo 6.1.3
  • En el análisis exploratorio se encuentra que tanto longitud como latitud tenían errores, algunos valores estaban multiplicados por 1000, sin embargo, no se hace modificación de datos ya que no es una variable que se vaya a incluir en el estudio. Anexo 6.1.5
    • En un estudio realizado sobre la ubicación de los inmuebles se encuentran muchos inmuebles que comparten la misma ubicación (lat, long) a pesar de estar en diferentes barrios, esto indica que son publicaciones hechas posiblemente por inmobiliarias y la ubicación corresponde a sus oficinas. Esta validación permitió concluir que no es una variable muy confiable para hacer estudio de mapas de calor o cualquier otro diagrama basado en ubicación. Considero que faltaría información extra para contrastar como por ejemplo si el anuncio es particular o fue creado por una inmobiliaria.
  • También se realizó revisión de barrios encontrando muchos problemas de tipografía, caracteres especiales y nombres similares, nuevamente no se realiza imputación de datos ya que no es una variable que se vaya a utilizar en el estudio.

5.2 Supuestos

  • Para establecer el valor de mercado se hizo la suposición que toda la oferta de bienes raices está activa al momento del análisis, además se consideró que no hay registros con datos actualizados para la misma propiedad, esto se comprobó al verificar datos repetidos.
  • En los cálculos de precio por metro cuadrado se asumió que no hay errores en este valor, ya que no se cuenta con un dato para contrastar dicha información, esto se hizo a pesar de encontrar registros con áreas bajas 64 m² en inmuebles de hasta 3 habitaciones, que puede no ser muy realista, pero se asumió como cierto.

6. Anexos

En esta sección se mostrarán las memorias de los cálculos y procedimientos realizados sobre la base de datos de viviendas.

6.1 Limpieza de datos

Para realizar el análisis exploratorio de los datos, se debe contar con un dataframe depurado; lo primero es ver la calidad de los datos del dataframe original.

El dataframe cuenta con 8330 registros y 13 variables, en la primer revisión de los datos se encuentra la cantidad de datos NA por cada variable:

Registros faltantes por atributo
colSums2(is.na(vivienda_faltantes))
id 3
zona 3
piso 2641
estrato 3
preciom 2
areaconst 3
parquea 1606
banios 3
habitac 3
tipo 3
barrio 3
longitud 3
latitud 3

6.1.1 Eliminación de registros duplicados y/o nulos

Evaluando los registros cuyo Id es NA, se encuentra que para casi todos las variables el valor es NA, se procede a eliminar estos tres registros. Este paso es fundamental para mejorar la calidad de los datos y evitar sesgos.

Registros faltantes campo id
id zona piso estrato preciom areaconst parquea banios habitac tipo barrio longitud latitud
NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA 330 NA NA NA NA NA NA NA NA

Ahora el dataframe de viviendas tiene 8327 registros. El siguiente paso es identificar campos vacíos o nulos en las demás variables, sabemos que las variables piso y parqueadero son los que tienen datos faltantes. En este caso no podemos eliminar dichos registros ya que representan un número importante de registros del dataset.

6.1.2 Imputación piso - Apartamentos

Primero se normaliza el nombre de los valores para la variable tipo

df <- df %>%
  mutate(tipo = ifelse(tipo %in% c("Apartamento", "APARTAMENTO", "apto"), "Apartamento",
                       ifelse(tipo %in% c("casa", "Casa", "CASA"), "Casa", tipo)))

Se evalúa la cantidad de viviendas tipo Apartamento por cada piso, excluyendo los valores NA.

Distribución por pisos
Piso
1 2 3 4 5 6 7 8 9 10 11 12
431 512 573 545 564 243 203 211 146 128 84 83
Distribución por pisos y por estrato
Estrato
Piso
1 2 3 4 5 6 7 8 9 10 11 12
3 68 76 82 79 121 2 2 7 0 2 2 0
4 130 146 150 160 174 55 63 71 44 37 14 12
5 141 169 212 191 153 103 85 80 53 58 39 45
6 92 121 129 115 116 83 53 53 49 31 29 26

Se encuentra que el piso más frecuente entre los Aparamentos es el 3. También se evalúa la distribución de pisos según el estrato, en este caso si se ve una variación:

  • para estratos 3 y 4 el piso más común es el 5 y
  • para estratos 5 y 6 es el 3.

Se decide hacer la imputación siguiendo estas reglas.

df$piso <- ifelse(is.na(df$piso) & df$tipo == "Apartamento" & df$estrato < 5, 5, df$piso)
df$piso <- ifelse(is.na(df$piso) & df$tipo == "Apartamento" & df$estrato > 4, 3, df$piso)
colSums(is.na(df))
##        id      zona      piso   estrato   preciom areaconst   parquea    banios 
##         0         0      1255         0         0         0      1603         0 
##   habitac      tipo    barrio  longitud   latitud 
##         0         0         0         0         0

6.1.3 Imputación piso - Casas

Se repite el mismo proceso que se aplicó para apartamentos, encontrando estas distribuciones:

Distribución por pisos
Piso
1 2 3 4 5 6 7 10
430 938 524 62 4 2 4 2
Distribución por pisos y por estrato
Estrato
Piso
1 2 3 4 5 6 7 10
3 141 154 123 17 1 0 0 1
4 81 201 156 18 2 1 1 1
5 135 332 141 18 1 1 2 0
6 73 251 104 9 0 0 1 0

Aquí encontramos que 2 es el piso con más número de viviendas tipo Casa y será el valor para hacer la imputación. Posteriormente se valida la siguiente variable a ser imputada, en este caso será parquea (parqueadero).

df$piso <- ifelse(is.na(df$piso) & df$tipo == "Casa", 2, df$piso)
colSums(is.na(df))
##        id      zona      piso   estrato   preciom areaconst   parquea    banios 
##         0         0         0         0         0         0      1603         0 
##   habitac      tipo    barrio  longitud   latitud 
##         0         0         0         0         0

6.1.4 Imputación parqueaderos

En el dataframe hay alrededor de 1603 registros con datos faltantes para la variable parqueadero, se procede con el mismo método que con el número de piso.

##    
##        1    2    3    4    5    6    7    8    9   10
##   3  557   93   19   10    1    3    0    0    0    1
##   4 1238  318   50   23    4    4    2    0    1    2
##   5 1207 1030  136  100   27   13    5    3    1    1
##   6  154 1037  316  253   36   48   11   14    2    4
##                
##                   1   2   3   4   5   6   7   8   9  10
##   3 Apartamento 280  14   2   0   0   0   0   0   0   0
##   3 Casa        277  79  17  10   1   3   0   0   0   1
##   4 Apartamento 921 120   3   2   0   0   0   0   0   1
##   4 Casa        317 198  47  21   4   4   2   0   1   1
##   5 Apartamento 972 640  30  16   0   0   1   0   0   1
##   5 Casa        235 390 106  84  27  13   4   3   1   0
##   6 Apartamento 126 812 218  72   4   2   0   0   0   0
##   6 Casa         28 225  98 181  32  46  11  14   2   4

para imputar los valores de parqueadero se van a diferenciar por estrato y tipo quedando así: - para casas y apartamentos de estratos 3 y 4 se imputará con el valor 1 - para apartamentos de estrato 5 se imputará con el valor 1 - para casas y apartamentos de estrato 6 el valor será 2

df$parquea <- ifelse(is.na(df$parquea) & df$estrato < 5, 1, df$parquea)
df$parquea <- ifelse(is.na(df$parquea) & df$estrato > 5, 2, df$parquea)
df$parquea <- ifelse(is.na(df$parquea) & df$estrato == 5 & df$tipo == "Apartamento", 1, df$parquea)
df$parquea <- ifelse(is.na(df$parquea) & df$estrato == 5 & df$tipo == "Casa", 2, df$parquea)
colSums(is.na(df))
##        id      zona      piso   estrato   preciom areaconst   parquea    banios 
##         0         0         0         0         0         0         0         0 
##   habitac      tipo    barrio  longitud   latitud 
##         0         0         0         0         0

6.1.5 Imputación Longitud y Latitud

Se va a corregir el formato de la longitud

Se verifica primero si el campo tiene valores NA

num_na <- sum(is.na(df$longitud))
num_na
## [1] 0

se saca un dataframe sin estos valores NA

## [1] 8327
## # A tibble: 0 × 13
## # ℹ 13 variables: id <dbl>, zona <chr>, piso <dbl>, estrato <dbl>,
## #   preciom <dbl>, areaconst <dbl>, parquea <dbl>, banios <dbl>, habitac <dbl>,
## #   tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
## [1] 8327
## # A tibble: 8,327 × 13
##       id zona        piso estrato preciom areaconst parquea banios habitac tipo 
##    <dbl> <chr>      <dbl>   <dbl>   <dbl>     <dbl>   <dbl>  <dbl>   <dbl> <chr>
##  1  8312 Zona Oeste     4       6    1300       318       2      4       2 Apar…
##  2  8311 Zona Oeste     1       6     480       300       1      4       4 Casa 
##  3  8307 Zona Oeste     2       5    1200       800       4      7       5 Casa 
##  4  8296 Zona Sur       2       3     220       150       1      2       4 Casa 
##  5  8297 Zona Oeste     2       5     330       112       2      4       3 Casa 
##  6  8298 Zona Sur       2       5    1350       390       8     10      10 Casa 
##  7  8299 Zona Sur       2       6     305       125       2      3       3 Apar…
##  8  8300 Zona Oeste     3       5     480       280       4      4       4 Apar…
##  9  8286 Zona Sur       3       5     275        74       1      2       3 Apar…
## 10  8287 Zona Sur       2       5     285       120       2      4       3 Apar…
## # ℹ 8,317 more rows
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>

Ahora se mutan los valores de longitud, ya que están mal en algunos casos

dfdepLong <- dfSinLongNA
dfdepLong
## # A tibble: 8,327 × 13
##       id zona        piso estrato preciom areaconst parquea banios habitac tipo 
##    <dbl> <chr>      <dbl>   <dbl>   <dbl>     <dbl>   <dbl>  <dbl>   <dbl> <chr>
##  1  8312 Zona Oeste     4       6    1300       318       2      4       2 Apar…
##  2  8311 Zona Oeste     1       6     480       300       1      4       4 Casa 
##  3  8307 Zona Oeste     2       5    1200       800       4      7       5 Casa 
##  4  8296 Zona Sur       2       3     220       150       1      2       4 Casa 
##  5  8297 Zona Oeste     2       5     330       112       2      4       3 Casa 
##  6  8298 Zona Sur       2       5    1350       390       8     10      10 Casa 
##  7  8299 Zona Sur       2       6     305       125       2      3       3 Apar…
##  8  8300 Zona Oeste     3       5     480       280       4      4       4 Apar…
##  9  8286 Zona Sur       3       5     275        74       1      2       3 Apar…
## 10  8287 Zona Sur       2       5     285       120       2      4       3 Apar…
## # ℹ 8,317 more rows
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
dfdepLong$longitud <- lapply(dfdepLong$longitud, function(x) ifelse(x <= -80 & !is.na(x), x / 1000, x))
dfdepLong
## # A tibble: 8,327 × 13
##       id zona        piso estrato preciom areaconst parquea banios habitac tipo 
##    <dbl> <chr>      <dbl>   <dbl>   <dbl>     <dbl>   <dbl>  <dbl>   <dbl> <chr>
##  1  8312 Zona Oeste     4       6    1300       318       2      4       2 Apar…
##  2  8311 Zona Oeste     1       6     480       300       1      4       4 Casa 
##  3  8307 Zona Oeste     2       5    1200       800       4      7       5 Casa 
##  4  8296 Zona Sur       2       3     220       150       1      2       4 Casa 
##  5  8297 Zona Oeste     2       5     330       112       2      4       3 Casa 
##  6  8298 Zona Sur       2       5    1350       390       8     10      10 Casa 
##  7  8299 Zona Sur       2       6     305       125       2      3       3 Apar…
##  8  8300 Zona Oeste     3       5     480       280       4      4       4 Apar…
##  9  8286 Zona Sur       3       5     275        74       1      2       3 Apar…
## 10  8287 Zona Sur       2       5     285       120       2      4       3 Apar…
## # ℹ 8,317 more rows
## # ℹ 3 more variables: barrio <chr>, longitud <list>, latitud <dbl>

se valida la mutación

max(dfdepLong$longitud)
## [1] -76.463
min(dfdepLong$longitud)
## [1] -76.58915

Ahora se revisa la columna latitud

dfdepLat <- dfdepLong
head(dfdepLat$latitud, 100)
##   [1] 3454.00000 3454.00000 3455.00000 3417.00000 3408.00000 3409.00000
##   [7] 3408.00000 3408.00000 3409.00000    3.41000    3.41000 3421.00000
##  [13] 3418.00000 3458.00000 3418.00000 3423.00000 3423.00000    3.45139
##  [19] 3455.00000 3453.00000 3461.00000 3455.00000 3455.00000 3452.00000
##  [25] 3375.00000 3386.00000 3417.00000 3419.00000 3419.00000 3419.00000
##  [31] 3388.00000 3458.00000 3412.00000 3447.00000 3395.00000 3408.00000
##  [37] 3408.00000 3408.00000 3447.00000 3447.00000 3389.00000 3397.00000
##  [43] 3397.00000 3411.00000 3456.00000 3459.00000 3459.00000 3459.00000
##  [49] 3459.00000 3421.00000 3394.00000 3405.00000 3417.00000    3.41000
##  [55] 3409.00000 3447.00000 3449.00000    3.41832 3451.00000 3451.00000
##  [61] 3451.00000 3451.00000 3451.00000 3451.00000 3451.00000 3451.00000
##  [67] 3451.00000 3405.00000    3.40000 3458.00000 3451.00000 3447.00000
##  [73] 3395.00000 3404.00000    3.38805    3.39000 3413.00000 3417.00000
##  [79] 3426.00000 3413.00000    3.41000 3408.00000 3449.00000 3447.00000
##  [85] 3448.00000 3448.00000 3417.00000 3448.00000 3403.00000 3429.00000
##  [91] 3445.00000    3.41000 3401.00000 3442.00000 3411.00000 3447.00000
##  [97]    3.45000 3452.00000 3445.00000 3446.00000

Aquí se tiene el mismo error de precision, hay que llevar la latitud al rango de 3.4 entonces para cualquier valor por encima de 4 se hará la conversión

Primero se evalua si existen valores NA

num_na <- sum(is.na(dfdepLat$latitud))
num_na
## [1] 0

se valida el rango de latitud

max(dfdepLat$latitud)
## [1] 3497
min(dfdepLat$latitud)
## [1] 3.33308
latitudes_filtradas <- dfdepLat$latitud[dfdepLat$latitud > 4 & dfdepLat$latitud < 10]
latitudes_filtradas
## numeric(0)

Ahora se hace la mutación de los datos para la latitud

dfdepLat$latitud <- lapply(dfdepLat$latitud, function(x) ifelse(x > 4 & !is.na(x), x/1000, x))
dfdepLat
## # A tibble: 8,327 × 13
##       id zona        piso estrato preciom areaconst parquea banios habitac tipo 
##    <dbl> <chr>      <dbl>   <dbl>   <dbl>     <dbl>   <dbl>  <dbl>   <dbl> <chr>
##  1  8312 Zona Oeste     4       6    1300       318       2      4       2 Apar…
##  2  8311 Zona Oeste     1       6     480       300       1      4       4 Casa 
##  3  8307 Zona Oeste     2       5    1200       800       4      7       5 Casa 
##  4  8296 Zona Sur       2       3     220       150       1      2       4 Casa 
##  5  8297 Zona Oeste     2       5     330       112       2      4       3 Casa 
##  6  8298 Zona Sur       2       5    1350       390       8     10      10 Casa 
##  7  8299 Zona Sur       2       6     305       125       2      3       3 Apar…
##  8  8300 Zona Oeste     3       5     480       280       4      4       4 Apar…
##  9  8286 Zona Sur       3       5     275        74       1      2       3 Apar…
## 10  8287 Zona Sur       2       5     285       120       2      4       3 Apar…
## # ℹ 8,317 more rows
## # ℹ 3 more variables: barrio <chr>, longitud <list>, latitud <list>

se verifica la latitud

dfdepLat
## # A tibble: 8,327 × 13
##       id zona        piso estrato preciom areaconst parquea banios habitac tipo 
##    <dbl> <chr>      <dbl>   <dbl>   <dbl>     <dbl>   <dbl>  <dbl>   <dbl> <chr>
##  1  8312 Zona Oeste     4       6    1300       318       2      4       2 Apar…
##  2  8311 Zona Oeste     1       6     480       300       1      4       4 Casa 
##  3  8307 Zona Oeste     2       5    1200       800       4      7       5 Casa 
##  4  8296 Zona Sur       2       3     220       150       1      2       4 Casa 
##  5  8297 Zona Oeste     2       5     330       112       2      4       3 Casa 
##  6  8298 Zona Sur       2       5    1350       390       8     10      10 Casa 
##  7  8299 Zona Sur       2       6     305       125       2      3       3 Apar…
##  8  8300 Zona Oeste     3       5     480       280       4      4       4 Apar…
##  9  8286 Zona Sur       3       5     275        74       1      2       3 Apar…
## 10  8287 Zona Sur       2       5     285       120       2      4       3 Apar…
## # ℹ 8,317 more rows
## # ℹ 3 more variables: barrio <chr>, longitud <list>, latitud <list>

se convierte la columna latitud y longitud de vector a valor individual

dfdepLat$latitud <- unlist(dfdepLat$latitud)
dfdepLat$longitud <- unlist(dfdepLat$longitud)
head(dfdepLat$longitud, 100)
##   [1] -76.576 -76.571 -76.568 -76.565 -76.565 -76.565 -76.565 -76.565 -76.564
##  [10] -76.564 -76.564 -76.563 -76.563 -76.563 -76.562 -76.562 -76.562 -76.562
##  [19] -76.561 -76.561 -76.561 -76.561 -76.561 -76.559 -76.559 -76.559 -76.559
##  [28] -76.559 -76.559 -76.559 -76.559 -76.559 -76.558 -76.558 -76.557 -76.557
##  [37] -76.557 -76.557 -76.557 -76.557 -76.557 -76.557 -76.557 -76.557 -76.557
##  [46] -76.557 -76.557 -76.557 -76.557 -76.556 -76.556 -76.556 -76.556 -76.556
##  [55] -76.556 -76.556 -76.556 -76.556 -76.556 -76.556 -76.556 -76.556 -76.556
##  [64] -76.556 -76.556 -76.556 -76.556 -76.556 -76.556 -76.556 -76.556 -76.555
##  [73] -76.555 -76.555 -76.555 -76.555 -76.555 -76.555 -76.555 -76.555 -76.555
##  [82] -76.555 -76.555 -76.555 -76.555 -76.555 -76.555 -76.555 -76.555 -76.555
##  [91] -76.555 -76.555 -76.554 -76.554 -76.554 -76.554 -76.554 -76.554 -76.554
## [100] -76.554
head(dfdepLat$latitud, 100)
##   [1] 3.45400 3.45400 3.45500 3.41700 3.40800 3.40900 3.40800 3.40800 3.40900
##  [10] 3.41000 3.41000 3.42100 3.41800 3.45800 3.41800 3.42300 3.42300 3.45139
##  [19] 3.45500 3.45300 3.46100 3.45500 3.45500 3.45200 3.37500 3.38600 3.41700
##  [28] 3.41900 3.41900 3.41900 3.38800 3.45800 3.41200 3.44700 3.39500 3.40800
##  [37] 3.40800 3.40800 3.44700 3.44700 3.38900 3.39700 3.39700 3.41100 3.45600
##  [46] 3.45900 3.45900 3.45900 3.45900 3.42100 3.39400 3.40500 3.41700 3.41000
##  [55] 3.40900 3.44700 3.44900 3.41832 3.45100 3.45100 3.45100 3.45100 3.45100
##  [64] 3.45100 3.45100 3.45100 3.45100 3.40500 3.40000 3.45800 3.45100 3.44700
##  [73] 3.39500 3.40400 3.38805 3.39000 3.41300 3.41700 3.42600 3.41300 3.41000
##  [82] 3.40800 3.44900 3.44700 3.44800 3.44800 3.41700 3.44800 3.40300 3.42900
##  [91] 3.44500 3.41000 3.40100 3.44200 3.41100 3.44700 3.45000 3.45200 3.44500
## [100] 3.44600

6.2 RMarkdown de gráficas

6.2.1 Porcentaje tipo de vivienda

tipo_porcentaje <- prop.table(table(dfi$tipo)) *100
dfi_porcentajeTipo <- data.frame(tipo = names(tipo_porcentaje), porcentaje = as.numeric(tipo_porcentaje))
ggplot(dfi_porcentajeTipo, aes(x = tipo, y= porcentaje, fill = tipo)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(round(porcentaje, 2), "%")), vjust = -0.5) + 
  labs(title = "Porcentaje de Tipo de Vivienda",
       x = "Tipo de Vivienda",
       y = "Porcentaje") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 0, hjust = 1)) +
  scale_fill_brewer(palette = "Set3") +
  ylim(0,100)

6.2.2 Gráfica área

plot1area <- ggplot(dfi, aes(y = areaconst)) +
  geom_boxplot(fill = "skyblue", color = "black") +
  labs(title = "Boxplot de Áreas de Viviendas",
       y = "Área Construida") +
  theme_minimal()

plot2area <- ggplot(dfi, aes(x = areaconst)) +
  geom_histogram(binwidth = 50, fill = "skyblue", color = "black") +
  labs(title = "Distribución de Áreas de Viviendas",
       x = "Área Construida",
       y = "Frecuencia")

plot3area <- ggplot(dfi, aes(x = areaconst)) +
  geom_histogram(binwidth = 50, fill = "skyblue", color = "black") +
  labs(title = "Distribución de Áreas de Viviendas",
       x = "Área Construida",
       y = "Frecuencia") +
  coord_cartesian(xlim = c(0, 500))

wrap_plots(plot1area, plot2area, plot3area, ncol = 2)  

6.2.3 Porcentaje de estrato por zona

porcentaje_estrato <- dfi %>%
  group_by(zona, estrato) %>%
  summarise(num_propiedades = dplyr::n()) %>%
  group_by(zona) %>%
  mutate(porcentaje = num_propiedades / sum(num_propiedades) * 100)

plot_ly(porcentaje_estrato, x = ~zona, y = ~porcentaje, type = "bar", 
        color = ~factor(estrato), text = ~paste0(round(porcentaje, 1), "%"),
        hoverinfo = "text") %>%
  layout(title = "Porcentaje de Estratos por Zona",
         xaxis = list(title = "Zona"),
         yaxis = list(title = "Porcentaje", tickmode = "linear", tick0 = 0, dtick = 10),
         barmode = "stack") %>%
  config(displayModeBar = TRUE) 

6.2.4 Precio por zona

boxplot(dfi$preciom~dfi$zona,
        main="Distribucion precio por zona",
        ylab="precio",
        xlab="zona")