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.
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.
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.
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)
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
| Apartamento | Casa |
|---|---|
| 5106 | 3221 |
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.
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
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.
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.
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)
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
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:
| Apartamento | Casa | |
|---|---|---|
| Zona Centro | 24 | 100 |
| Zona Norte | 1199 | 723 |
| Zona Oeste | 1035 | 169 |
| Zona Oriente | 62 | 289 |
| Zona Sur | 2786 | 1940 |
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.
| 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.
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)
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.
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
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
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.
| 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.
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:
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.
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
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.
De acuerdo al análisis por zona y tipo
Para B&C es importante segmentar bien este mercado, partiendo de las siguientes ideas:
En todos los casos y estrategias el networking es esencial, sobretodo en el mercado de lujo, por lo tanto se sugiere también:
Para la limpieza de datos se tomaron en cuenta las siguientes consideraciones:
En esta sección se mostrarán las memorias de los cálculos y procedimientos realizados sobre la base de datos de viviendas.
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:
| 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 |
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.
| 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.
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.
|
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 |
|
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:
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
Se repite el mismo proceso que se aplicó para apartamentos, encontrando estas distribuciones:
|
Piso
|
|||||||
|---|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 |
| 430 | 938 | 524 | 62 | 4 | 2 | 4 | 2 |
|
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
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
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
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)
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)
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)
boxplot(dfi$preciom~dfi$zona,
main="Distribucion precio por zona",
ylab="precio",
xlab="zona")