ANÁLISIS EXPLORATORIO DE DATOS PARA LA EMPRESA B&C

Caso: Análisis del mercado inmobiliario en la Ciudad de Cali.

Introducción

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

Objetivo

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

Métodos

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.

Resultados

#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 = ";")
  • Exploramos la estructura de la base de datos viviendas_faltantes
#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
  • Realizamos un resumen estadístico
# 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  
##                    
##                    
##                    
## 
  • Visualizamos los datos
#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))

Conclusiones

*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.