## -- 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()
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.
Para la actividad del análisis exploratorio de datos, se utilizara el IDE de R-Studio, y los chunks de R y Python
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
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))
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
El comando de R hist representa el histograma de la variable x
hist(df_R2$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)
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)
El comando de R qqnorm representa el gráfico de cuantiles para la normalidad de la variable x
qqnorm(df_R2$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)
library(ggplot2)
precio_vs_area <- data.frame(df_R2$Precio_m,df_R2$Area_contruida)
head(precio_vs_area)
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'
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")
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.
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)
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()