## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.2     v dplyr   1.0.7
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   2.0.0     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

Análisis Exploratorio de Datos

1. ¿Qués es el EDA?

EDA es la sigla en inglés para Exploratory Data Analysis y consiste en una de las primeras tareas que tiene que desempeñar el Científico de Datos. Es cuando revisamos por primera vez los datos que nos llegan, por ejemplo un archivo CSV que nos entregan y deberemos intentar comprender “¿de qué se trata?”, vislumbrar posibles patrones y reconociendo distribuciones estadísticas que puedan ser útiles en el futuro.

2. Análisis Exploratorio de Datos (EDA) en R

Para la actividad del análisis exploratorio de datos, se utilizara el IDE de R-Studio, y los chunks de R y Python

2.1. Carga de datos en el chunk de R

El primer paso es cargar la base de datos con la que se va a trabajar. Para esto utilizaremos la librería (readxl)

library(readxl)
olx_viviendas_cali <- read_excel("olx_viviendas_cali.xlsx", 
    sheet = "datos")

Antes de aplicar cualquier técnica de análisis de datos, es preciso realizar un análisis previo de la información de la que se dispone. Es necesario examinar las variables individuales y las relaciones entre ellas.

df_R <- data.frame(olx_viviendas_cali)
names(df_R)
##  [1] "ID"                 "URL"                "ciudad"            
##  [4] "Zona"               "Barrio"             "Cordenada_latitud" 
##  [7] "cordenada_longitud" "Tipo"               "piso"              
## [10] "Estrato"            "Area_contruida"     "parqueaderos"      
## [13] "Baños"              "Habitaciones"       "Precio"

Seleccionamos columnas específicas, y construimos una nueva data-frame sin las variables “ID” y “URL”

df_R2 <- df_R[ , c(-1,-2)]
names(df_R2)
##  [1] "ciudad"             "Zona"               "Barrio"            
##  [4] "Cordenada_latitud"  "cordenada_longitud" "Tipo"              
##  [7] "piso"               "Estrato"            "Area_contruida"    
## [10] "parqueaderos"       "Baños"              "Habitaciones"      
## [13] "Precio"
attach(df_R2)
class(df_R2)
## [1] "data.frame"
head(df_R2)

Podemos observas que las variables “ID” y “URL”, ya no están en para el objeto de estudio

2.2. Resumen estadístico (summary)

Para ver las variables de la base de datos y sus propiedades

En R, podemos ver los resúmenes utilizando el comando summary en los datos.

summary(df_R2)
##     ciudad              Zona              Barrio          Cordenada_latitud
##  Length:5919        Length:5919        Length:5919        Min.   :3.400    
##  Class :character   Class :character   Class :character   1st Qu.:3.425    
##  Mode  :character   Mode  :character   Mode  :character   Median :3.449    
##                                                           Mean   :3.447    
##                                                           3rd Qu.:3.467    
##                                                           Max.   :3.576    
##                                                                            
##  cordenada_longitud     Tipo                piso           Estrato     
##  Min.   :-76.60     Length:5919        Min.   : 1.000   Min.   :1.000  
##  1st Qu.:-76.54     Class :character   1st Qu.: 2.000   1st Qu.:3.000  
##  Median :-76.53     Mode  :character   Median : 3.000   Median :4.000  
##  Mean   :-76.53                        Mean   : 3.764   Mean   :4.341  
##  3rd Qu.:-76.51                        3rd Qu.: 5.000   3rd Qu.:5.000  
##  Max.   :-76.21                        Max.   :15.000   Max.   :6.000  
##                                        NA's   :2204     NA's   :21     
##  Area_contruida    parqueaderos        Baños         Habitaciones   
##  Min.   :  30.0   Min.   : 1.000   Min.   : 0.000   Min.   : 0.000  
##  1st Qu.:  84.0   1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 3.000  
##  Median : 137.0   Median : 2.000   Median : 3.000   Median : 3.000  
##  Mean   : 187.6   Mean   : 1.833   Mean   : 3.092   Mean   : 3.871  
##  3rd Qu.: 240.0   3rd Qu.: 2.000   3rd Qu.: 4.000   3rd Qu.: 4.000  
##  Max.   :2000.0   Max.   :10.000   Max.   :10.000   Max.   :20.000  
##                   NA's   :1524                                      
##      Precio         
##  Min.   :3.000e+07  
##  1st Qu.:1.950e+08  
##  Median :3.300e+08  
##  Mean   :4.425e+08  
##  3rd Qu.:5.300e+08  
##  Max.   :4.500e+09  
## 

En el resumen podemos ver rápidamente en la variable Precio los valores en notación científica, para ello procedemos a normalizar los datos, dividiendo la variable Precio/10.000.000

df_R2 <- df_R2 %>% 
  mutate(Precio_m = (Precio/10000000))
head(df_R2$Precio_m)
## [1] 18.0 14.0 39.5 11.5 13.0 21.8
str(df_R2)
## 'data.frame':    5919 obs. of  14 variables:
##  $ ciudad            : chr  "Cali" "Cali" "Cali" "Cali" ...
##  $ Zona              : chr  "Zona Sur" "Zona Norte" "Zona Oeste" "Zona Norte" ...
##  $ Barrio            : chr  "la buitrera" "villagorogona" "cristales" "poblado campestre candelaria" ...
##  $ Cordenada_latitud : num  3.48 3.4 3.4 3.41 3.41 ...
##  $ cordenada_longitud: num  -76.2 -76.4 -76.5 -76.5 -76.5 ...
##  $ Tipo              : chr  "Casa" "Casa" "Apartamento" "Casa" ...
##  $ piso              : num  2 NA 2 NA 1 NA 1 1 NA 3 ...
##  $ Estrato           : num  2 2 6 3 3 4 6 4 4 6 ...
##  $ Area_contruida    : num  240 140 103 82 72 75 85 84 128 84 ...
##  $ parqueaderos      : num  NA 1 2 1 1 1 2 2 1 2 ...
##  $ Baños             : num  3 3 2 3 2 2 2 2 3 2 ...
##  $ Habitaciones      : num  6 4 3 3 4 3 3 2 3 2 ...
##  $ Precio            : num  1.80e+08 1.40e+08 3.95e+08 1.15e+08 1.30e+08 2.18e+08 3.10e+08 3.15e+08 3.30e+08 3.35e+08 ...
##  $ Precio_m          : num  18 14 39.5 11.5 13 21.8 31 31.5 33 33.5 ...

Otra forma de normalizar los datos con notación cientifica es calcular la variables con el logaritmo base 10.

library(dplyr)
df_R3 <- mutate(df_R2, Precio_log = ifelse(Precio!=0, log(Precio), NA))

2.3. Tablas de Frecuencias

Es conveniente iniciar el análisis exploratorio de datos con la construcción de las tablas de frecuencia, para poder así intuir la distribución de probabilidad de los datos, su normalidad, su simetría y otras propiedades interesantes en el análisis de datos.

Tabla de frecuencia de la variables Precio_m

Frecuencias

frecuencias <- as.data.frame(table(clases=factor(cut(df_R2$Precio_m, breaks = 14))))

Frecuencias Variable Precio_log

frecuencias_log <- as.data.frame(table(clases=factor(cut(df_R3$Precio_log, breaks = 14))))

Tabla de Frecuencias

tabla_frecuencias=transform(frecuencias,FRECAC=cumsum(Freq),FRECREL=Freq/5919,RELACUM=cumsum(Freq/5919))

tabla_frecuencias

Al observar la tabla de frecuencia podemos decir que el 83.7% de los precios de casas y apartamento se encuentran en el rango de 25 y 67 millones de pesos, con un total de 4957 propiedades ofrecidas de las 5919

Tabla de Frecuencias Variable Precio_log

Otra método para normalizar variables es trabajar con el logartimo con base 10.

tabla_frecuencias_log=transform(frecuencias,FRECAC=cumsum(Freq),FRECREL=Freq/5919,RELACUM=cumsum(Freq/5919))

tabla_frecuencias_log

2.4. Histograma de la variable Precio_m

El comando de R hist representa el histograma de la variable x

hist(df_R2$Precio_m)

2.5. Boxplot de la variable Precio_m

El comando de R boxplot representa los gráficos de caja y bigotes de la(s) variable(s) x, y, z …

boxplot(df_R2$Precio_m)

2.6. Diagrama de disperción de la variable Precio_m y Area_contruida

El comando de R plot representa la gráfica de dispersión bivariante entre las columnas de data frame de la variable x

plot(df_R2$Precio_m, df_R2$Area_contruida)

2.8. Gráfico de normalidad de la variable Precio_m

El comando de R qqnorm representa el gráfico de cuantiles para la normalidad de la variable x

qqnorm(df_R2$Precio_m)

2.9. Gráfico de dispersión de la variable Precio_m

boxplot(df_R2$Precio_m ~ df_R2$Area_contruida)

frec_estrato <- table(df_R2$Estrato)
frec_estrato
## 
##    1    2    3    4    5    6 
##   39  304 1406 1215 1725 1209
barplot(frec_estrato)

2.10. Gráficas con la librería ggplots

library(ggplot2)

2.10.1. Creamos un data frame de las variables que queremos relacionar

precio_vs_area <- data.frame(df_R2$Precio_m,df_R2$Area_contruida)
head(precio_vs_area)

2.10.2. Gráfica de Puntos

ggplot(data = precio_vs_area,
       mapping = aes(x= df_R2$Precio_m,
                     y= df_R2$Area_contruida))+
  geom_point()+
  labs(title = "Precio vs Área Construida")

Agregando una línea de regresion a los puntos

ggplot(data = precio_vs_area,
       mapping = aes(x= df_R2$Precio_m,
                     y= df_R2$Area_contruida)) +
  geom_point() +
  geom_smooth(method = "lm") +
  labs(title = "Precio vs Área Construida")
## `geom_smooth()` using formula 'y ~ x'

2.10.3. Gráfica de líneas

ggplot(data = precio_vs_area,
       mapping = aes(x= df_R2$Precio_m,
                     y= df_R2$Area_contruida))+
  geom_line() +
  labs(title = "Precio vs Área Construida")

2.10.4. Gráfica de barras

Escogeremos datos realizando un filtro

df_precio_bajo <- df_R2 %>% 
  filter(df_R2$Precio < 250000000)
head(df_precio_bajo)

Creamos una gráfica de barras por Tipo

ggplot(data = df_precio_bajo,
       mapping = aes(x = factor(df_precio_bajo$Tipo))) +
  geom_bar()
## Warning: Use of `df_precio_bajo$Tipo` is discouraged. Use `Tipo` instead.

Gráfica de barras con la variable Estrato

ggplot(data = df_precio_bajo,
       mapping = aes(x = factor(df_precio_bajo$Estrato))) +
  geom_bar()
## Warning: Use of `df_precio_bajo$Estrato` is discouraged. Use `Estrato` instead.

ggplot(data = df_precio_bajo,
       mapping = aes(x = factor(df_precio_bajo$Estrato))) +
  geom_bar() +
  coord_flip()
## Warning: Use of `df_precio_bajo$Estrato` is discouraged. Use `Estrato` instead.

2.10.5. Tablas de frecuencias, otras librerías

library(arsenal)
df_R2 %>%
  #filter(Precio_m >100) %>% 
  select(Estrato) %>% 
  table() %>% 
  freqlist() %>% 
  summary()
## 
## 
## |.  | Freq| Cumulative Freq| Percent| Cumulative Percent|
## |:--|----:|---------------:|-------:|------------------:|
## |1  |   39|              39|    0.66|               0.66|
## |2  |  304|             343|    5.15|               5.82|
## |3  | 1406|            1749|   23.84|              29.65|
## |4  | 1215|            2964|   20.60|              50.25|
## |5  | 1725|            4689|   29.25|              79.50|
## |6  | 1209|            5898|   20.50|             100.00|
library(plotly)
plot_ly(df_R2, x = ~df_R2$Area_contruida, y = ~df_R2$Precio_m)
plot_ly(df_R2, x = ~df_R2$Area_contruida, y = ~df_R2$Precio_m, color = ~df_R2$Tipo)
plot_ly(data = df_R2, x = ~df_R2$Estrato, y = ~df_R2$Area_contruida, color = ~df_R2$Tipo, type = "box")
plot_ly(data = df_R2, x = ~df_R2$Estrato, y = ~df_R2$Area_contruida, color = ~df_R2$Tipo, type = "bar")
plot_ly(df_R2, x = ~df_R2$Estrato, color = ~df_R2$Tipo, colors =  "Accent")
library(corrplot)
library(GGally)
library(Hmisc)
library(PerformanceAnalytics)
df_R_num <- df_R[ , c(-1,-2,-3,-4,-5,-6,-7,-8)]
names(df_R_num)
## [1] "piso"           "Estrato"        "Area_contruida" "parqueaderos"  
## [5] "Baños"          "Habitaciones"   "Precio"
chart.Correlation(df_R_num, histogram = F, pch = 19)

3. Análisis Exploratorio de Datos (EDA) en Python

3.1. Carga de datos en el chunk de Python

library(reticulate)
import pandas as pd
df_py = pd.read_excel("D:/01-Pontificia Universidad Javeriana/01_02_Metodos_y_simulacion_estadistica/Unidad_1_Analisis_Exploratorio_de_Datos/Analisis_Exploratorio_de_Datos/olx_viviendas_cali.xlsx", sheet_name = "datos")
df_py2 = df_py.iloc[ : , 2:17]
df_py2.info()
## <class 'pandas.core.frame.DataFrame'>
## RangeIndex: 5919 entries, 0 to 5918
## Data columns (total 13 columns):
##  #   Column              Non-Null Count  Dtype  
## ---  ------              --------------  -----  
##  0   ciudad              5919 non-null   object 
##  1   Zona                5572 non-null   object 
##  2   Barrio              5919 non-null   object 
##  3   Cordenada_latitud   5919 non-null   float64
##  4   cordenada_longitud  5919 non-null   float64
##  5   Tipo                5919 non-null   object 
##  6   piso                3715 non-null   float64
##  7   Estrato             5898 non-null   float64
##  8   Area_contruida      5919 non-null   float64
##  9   parqueaderos        4395 non-null   float64
##  10  Baños               5919 non-null   int64  
##  11  Habitaciones        5919 non-null   int64  
##  12  Precio              5919 non-null   int64  
## dtypes: float64(6), int64(3), object(4)
## memory usage: 601.3+ KB

Verifiquemos si hay correlación entre los datos

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="ticks", color_codes=True)
#%matplotlib inline
plt.figure(figsize=(12, 10))
sns.heatmap(df_py2.corr(),annot=True)
## <AxesSubplot:>
plt.show()