Este trabajo desarrolla un análisis exploratorio de datos para una inmobiliaria de la ciudad de Cali, en el queremos observar como se relacionan los datos, qué distribución tienen, entender muy bien la representatividad de los mismos y con esto, el equipo directivo pueda tomar decisiones
El objetivo puntual es desarrollar un EDA con la información relevante de la base de datos de viviendas faltantes que provee la inmobiliaria B&C de la ciudad de Cali
Adicional, queremos que la empresa B&C pueda utilizar los insights generados en este informe para apalancar algunas de sus principales decisiones: Definir nichos, desarrollo de estrategias de mercadeo, establecer escalas de pricing, entregarles experiencias personalizadas a sus clientes y usuarios, entre otras
Queremos utilizar las librerias de R y Rstudio para abordar la visualización de los datos del dataset, cómo se distribuyen (con histogramas), si se correlacionan las variables o no, información estadística, etc.
#Cargamos los datos y paquetes adicionales necesarios
#install.packages("tidyverse")
#install.packages("corrplot")
#install.packages("leaflet")
#install.packages("mapview")
#install.packages("table1")
require(table1)
## Loading required package: table1
##
## Attaching package: 'table1'
## The following objects are masked from 'package:base':
##
## units, units<-
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(corrplot)
## corrplot 0.92 loaded
library(leaflet)
library(leaflet.extras)
#Importamos el dataset
setwd('C:/Users/sebastiane/Desktop/Info_PC_Prestamo/Info_SEV/Javeriana')
viviendas <- read.csv2('vivienda_faltantes.csv', sep = ";")
ubicacion <- read.csv2('geo.csv', sep = ";")
#Verificamos la cantidad de filas y columnas que tiene el dataset
str(viviendas)
## 'data.frame': 8327 obs. of 13 variables:
## $ id : int 8312 8311 8307 8296 8297 8298 8299 8300 8286 8287 ...
## $ zona : chr "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
## $ piso : int 4 1 NA 2 NA NA 2 NA NA 2 ...
## $ estrato : int 6 6 5 3 5 5 6 5 5 5 ...
## $ preciom : int 1300 480 1200 220 330 1350 305 480 275 285 ...
## $ areaconst: chr "318" "300" "800" "150" ...
## $ parquea : int 2 1 4 1 2 8 2 4 1 2 ...
## $ banios : int 4 4 7 2 4 10 3 4 2 4 ...
## $ habitac : int 2 4 5 4 3 10 3 4 3 3 ...
## $ tipo : chr "Apartamento" "Casa" "Casa" "Casa" ...
## $ barrio : chr "arboleda" "normandía" "miraflores" "el guabal" ...
## $ longitud : chr "-76576" "-76571" "-76568" "-76565" ...
## $ latitud : chr "3454" "3454" "3455" "3417" ...
head(viviendas)
## id zona piso estrato preciom areaconst parquea banios habitac
## 1 8312 Zona Oeste 4 6 1300 318 2 4 2
## 2 8311 Zona Oeste 1 6 480 300 1 4 4
## 3 8307 Zona Oeste NA 5 1200 800 4 7 5
## 4 8296 Zona Sur 2 3 220 150 1 2 4
## 5 8297 Zona Oeste NA 5 330 112 2 4 3
## 6 8298 Zona Sur NA 5 1350 390 8 10 10
## tipo barrio longitud latitud
## 1 Apartamento arboleda -76576 3454
## 2 Casa normandía -76571 3454
## 3 Casa miraflores -76568 3455
## 4 Casa el guabal -76565 3417
## 5 Casa bella suiza alta -76565 3408
## 6 Casa bella suiza alta -76565 3409
# Muestra un resumen estadístico de las variables numéricas en el dataset.
summary(viviendas)
## id zona piso estrato
## Min. : 1 Length:8327 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 :2638
## preciom areaconst parquea banios
## Min. : 58.0 Length:8327 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 Class :character 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Mode :character Median : 2.000 Median : 3.000
## Mean : 434.3 Mean : 1.836 Mean : 3.112
## 3rd Qu.: 540.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :10.000 Max. :10.000
## NA's :1603
## habitac tipo barrio longitud
## Min. : 0.000 Length:8327 Length:8327 Length:8327
## 1st Qu.: 3.000 Class :character Class :character Class :character
## Median : 3.000 Mode :character Mode :character Mode :character
## Mean : 3.605
## 3rd Qu.: 4.000
## Max. :10.000
##
## latitud
## Length:8327
## Class :character
## Mode :character
##
##
##
##
#Porcentaje de distribución de las zonas
Dist_Zonas = table(viviendas$zona)/length(viviendas$estrato)*100
Dist_Zonas
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 1.489132 23.081542 14.458989 4.215204 56.755134
#Gráfico de barras para la zona
ggplot(viviendas, aes(x = zona)) +
geom_bar()
#Histograma de cantidad de pisos de la vivienda
ggplot(viviendas, aes(x = piso)) +
geom_histogram(bins = 30)
## Warning: Removed 2638 rows containing non-finite values (`stat_bin()`).
#Histograma con la cantidad de baños y su distribución
ggplot(viviendas, aes(x = banios)) +
geom_histogram(bins = 30)
#Porcentaje de distribución de las zonas
Dist_Estrato = table(viviendas$estrato)/length(viviendas$estrato)*100
Dist_Estrato
##
## 3 4 5 6
## 17.44926 25.59145 33.03711 23.92218
#En qué estratos están distribuidas las viviendas
ggplot(viviendas, aes(x = estrato)) +
geom_histogram(bins = 30)
#Cómo se distribuyen los precios de las viviendas
ggplot(viviendas, aes(x = preciom)) +
geom_histogram(bins = 30)
Dist_Parqueaderos = table(viviendas$parquea)/length(viviendas$parquea)*100
Dist_Parqueaderos
##
## 1 2 3 4 5 6
## 37.90080461 29.75861655 6.25675513 4.63552300 0.81662063 0.81662063
## 7 8 9 10
## 0.21616428 0.20415516 0.04803651 0.09607302
#Cuántos parqueaderos tienen las viviendas
ggplot(viviendas, aes(x = parquea)) +
geom_histogram(bins = 30)
## Warning: Removed 1603 rows containing non-finite values (`stat_bin()`).
#Cuántas habitaciones tienen las viviendas
ggplot(viviendas, aes(x = habitac)) +
geom_histogram(bins = 30)
#Qué tipo de vivienda es
ggplot(viviendas, aes(x = tipo)) +
geom_bar()
# Gráfico de dispersión para analizar relaciones entre el precio y el área construida
ggplot(viviendas, aes(x = preciom, y = areaconst)) +
geom_point()
viviendas %>%
ggplot(aes(x = as.factor(1), y = preciom, fill = estrato)) +
geom_boxplot() +
scale_x_discrete(labels = "Precios") +
facet_wrap(~ estrato, scales = "free") +
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank())
# Creacion de mapas de calor para visualizar correlaciones entre las variables
# Calcula la matriz de correlación.
cor_matrix <- cor(viviendas[, c("estrato", "preciom", "parquea", "banios", "habitac")])
# Crea el mapa de calor.
corrplot(cor_matrix, method = "color")
# Cambiamos a valor numérico el campo de latitud y longitud para hacer un mapa
ubicacion$longitud <- as.numeric(ubicacion$longitud)
ubicacion$latitud <- as.numeric(ubicacion$latitud)
#Asignamos un color a la zona y al estrato para identificarlo más claro en el mapa.
color_estrato<- colorFactor(palette = "Set2", domain=ubicacion$estrato)
color_zona<- colorFactor(palette = "Set2", domain=ubicacion$zona)
# Creamos un mapa que nos segmente con colores los estratos
leaflet(data = ubicacion) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,radius=2,color=~color_estrato(estrato))
# Creamos un mapa que nos segmente con colores las zonas.
leaflet(data = ubicacion) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,radius=2,color=~color_zona(zona))
*Es importante que la empresa B&C haga una correcta captura y limpieza de los datos, actualmente hay mucha información incompleta, o con formatos diferentes e incluso mal escritos.
*Garantizar una buena calidad de los datos geográficos, ya que puede ser un insumo importante para la generación de informes geolocalizados, que pueden aportarles a ellos a entender muy bien el comportamiento por zonas o barrios, y también con esto crear modelos que puedan entregarle a los consumidores algunas herramientas o modelos que den un entendimiento claro y rápido de las casas de acuerdo a su ubicación.
*Para el campo pisos, vemos que el 31% de los datos no tiene ningún registro, se asume que es una casa de un solo piso.
*El 56% de las viviendas están en la zona sur.
*El 56% de las viviendas están entre los estratos 5 y 6, siendo el estrato 5 el que más participa con un 33%.
*El 19.2% de las viviendas no tienen parqueadero.
*El 61% son apartamentos y el 39% restante son casas.
*Hay 66 viviendas con “cero” habitaciones, asumimos entonces que son aparta-estudios.
*Desde mi experiencia, no se recomienda hacer imputación de los datos faltantes, aunque sabemos que existen técnicas para esto, es mejor analizar detalladamente cómo puede afectar los datos vacíos en el análisis exploratorio de los datos o en la modelación que se quiere realizar.
*Es muy interesante ver que existen precios máximos muy altos en cada estrato, se entienden precios muy altos en los estratos mayores (5 y 6), pero se observa en el estrato 3 viviendas con precios de metro cuadrado de hasta 1.600 y en el estrato 4 de 1.800, mientras que en el estrato 6 el más caro es de 1.950.
*La zona más costosa es la zona oeste pero se evidencia que tiene viviendas en todos los estratos, aunque la mayoría (El 64%) es de estrato 6.