Como primer paso se cargan los paquetes
library(dplyr)
library(tidyr)
library(readr)
library(corrr)
library(GGally)
#Cargo los datos
ar_properties <- read_csv("D:/OneDrive/Ciencia de Datos/06 Enfoque estadĆstico/TP01/TP01/ar_properties.csv")
#Veo su estructura
glimpse(ar_properties)
## Observations: 388,891
## Variables: 24
## $ id <chr> "S0we3z3V2JpHUJreqQ2t/w==", "kMxcmAS8NvrynGBVb...
## $ ad_type <chr> "Propiedad", "Propiedad", "Propiedad", "Propie...
## $ start_date <date> 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-1...
## $ end_date <date> 2019-06-14, 2019-04-16, 9999-12-31, 9999-12-3...
## $ created_on <date> 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-1...
## $ lat <dbl> -34.94331, -34.63181, NA, -34.65471, -34.65495...
## $ lon <dbl> -54.92966, -58.42060, NA, -58.79089, -58.78712...
## $ l1 <chr> "Uruguay", "Argentina", "Argentina", "Argentin...
## $ l2 <chr> "Maldonado", "Capital Federal", "Bs.As. G.B.A....
## $ l3 <chr> "Punta del Este", "Boedo", NA, "Moreno", "More...
## $ l4 <chr> NA, NA, NA, "Moreno", "Moreno", NA, "Ituzaingó...
## $ l5 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ l6 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ rooms <dbl> 2, NA, 2, 2, 2, 4, NA, 6, NA, NA, NA, NA, NA, ...
## $ bedrooms <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ bathrooms <dbl> 1, NA, 1, 2, 3, 1, 3, 3, NA, NA, NA, NA, NA, N...
## $ surface_total <dbl> 45, NA, 200, 460, 660, NA, 70, NA, 1300, 405, ...
## $ surface_covered <dbl> 40, NA, NA, 100, 148, 89, 122, NA, NA, NA, NA,...
## $ price <dbl> 13000, 0, NA, NA, NA, NA, NA, NA, 0, NA, 0, NA...
## $ currency <chr> "UYU", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
## $ price_period <chr> "Mensual", "Mensual", NA, "Mensual", "Mensual"...
## $ title <chr> "Departamento - Roosevelt", "PH - Boedo", "Itu...
## $ property_type <chr> "Departamento", "PH", "Casa", "Casa", "Casa", ...
## $ operation_type <chr> "Alquiler", "Venta", "Alquiler", "Venta", "Ven...
summary(ar_properties)
## id ad_type start_date
## Length:388891 Length:388891 Min. :2018-12-29
## Class :character Class :character 1st Qu.:2019-02-15
## Mode :character Mode :character Median :2019-03-31
## Mean :2019-03-31
## 3rd Qu.:2019-05-12
## Max. :2019-06-26
##
## end_date created_on lat
## Min. :2018-12-30 Min. :2018-12-29 Min. :-54.98
## 1st Qu.:2019-05-15 1st Qu.:2019-02-15 1st Qu.:-34.67
## Median :2019-06-27 Median :2019-03-31 Median :-34.60
## Mean :4426-06-16 Mean :2019-03-31 Mean :-34.48
## 3rd Qu.:9999-12-31 3rd Qu.:2019-05-12 3rd Qu.:-34.43
## Max. :9999-12-31 Max. :2019-06-26 Max. : 44.67
## NA's :50597
## lon l1 l2
## Min. :-105.27 Length:388891 Length:388891
## 1st Qu.: -58.80 Class :character Class :character
## Median : -58.48 Mode :character Mode :character
## Mean : -59.37
## 3rd Qu.: -58.40
## Max. : -41.90
## NA's :50597
## l3 l4 l5 l6
## Length:388891 Length:388891 Length:388891 Mode:logical
## Class :character Class :character Class :character NA's:388891
## Mode :character Mode :character Mode :character
##
##
##
##
## rooms bedrooms bathrooms surface_total
## Min. : 1.0 Min. : -2.00 Min. : 1.00 Min. : -3.0
## 1st Qu.: 2.0 1st Qu.: 1.00 1st Qu.: 1.00 1st Qu.: 50.0
## Median : 3.0 Median : 2.00 Median : 1.00 Median : 91.0
## Mean : 2.9 Mean : 2.16 Mean : 1.67 Mean : 458.3
## 3rd Qu.: 4.0 3rd Qu.: 3.00 3rd Qu.: 2.00 3rd Qu.: 266.0
## Max. :40.0 Max. :390.00 Max. :20.00 Max. :200000.0
## NA's :144668 NA's :230747 NA's :94136 NA's :74063
## surface_covered price currency
## Min. : -139 Min. :0.000e+00 Length:388891
## 1st Qu.: 43 1st Qu.:2.000e+04 Class :character
## Median : 70 Median :9.400e+04 Mode :character
## Mean : 235 Mean :2.690e+05
## 3rd Qu.: 142 3rd Qu.:2.250e+05
## Max. :4000000 Max. :2.147e+09
## NA's :97854 NA's :21222
## price_period title property_type
## Length:388891 Length:388891 Length:388891
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
## operation_type
## Length:388891
## Class :character
## Mode :character
##
##
##
##
df = ar_properties %>%
filter(l1 == 'Argentina' & l2 == 'Capital Federal' &
currency == 'USD' & property_type %in% c('Departamento', 'PH', 'Casa') &
operation_type == 'Venta') %>%
select(id, l3, rooms, bedrooms, bathrooms, surface_total, surface_covered, price, property_type)
dim(df) #se confirma las dimensiones indicadas en el TP
## [1] 61905 9
#transformo a factores
charcol = c('id', 'l3', "property_type")
df[charcol] <- lapply(df[charcol] , factor)
#valores unicos para cada variable
unicos = sapply(df, function(x) length(unique(x)))
#cantidad de NA para cada variable
nas = sapply(df, function(x) sum(is.na(x)))
rbind(unicos, nas)
## id l3 rooms bedrooms bathrooms surface_total surface_covered
## unicos 61905 58 24 25 15 671 573
## nas 0 355 5314 25298 3196 3671 2975
## price property_type
## unicos 4095 3
## nas 0 0
En la tabla anterior se puede ver como todas las propiedades cuentan con un precio y tienen asignada un tipo de propiedad. Las demĆ”s varaibles tienen datos faltantes. La variable con mayor proporción de datos faltantes es ābedroomsā seguida por āroomsā.
df %>%
select(-c(id,l3,property_type)) %>%
cor(.,use="pairwise.complete.obs")
## rooms bedrooms bathrooms surface_total
## rooms 1.00000000 0.92382161 0.62574631 0.08169819
## bedrooms 0.92382161 1.00000000 0.62667805 0.07892981
## bathrooms 0.62574631 0.62667805 1.00000000 0.08607046
## surface_total 0.08169819 0.07892981 0.08607046 1.00000000
## surface_covered 0.09199855 0.08435479 0.09633800 0.69441844
## price 0.30418750 0.34137037 0.42063819 0.07664240
## surface_covered price
## rooms 0.09199855 0.30418750
## bedrooms 0.08435479 0.34137037
## bathrooms 0.09633800 0.42063819
## surface_total 0.69441844 0.07664240
## surface_covered 1.00000000 0.09236313
## price 0.09236313 1.00000000
#se produce una visualizacion de la matriz de correlacion
df %>%
select(-c(id,l3,property_type)) %>%
correlate(use = 'complete.obs')%>%
network_plot(min_cor = 0.4)
##
## Correlation method: 'pearson'
## Missing treated using: 'complete.obs'
La matriz de correlación y el grĆ”fico anterior muestran como las variables āroomsā y ābedroomsā son las que presentan una mayor correlación entre sĆ. Le siguen la āsurface_totalā y āsurface_coveredā. Al analizar la correlación con la variable precio se observa que las variables mĆ”s correlacionadas son āroomsā, ābedroomsā y ābathroomsā todas relacionadas con la cantidad de habitaciones de una propiedad. Resalta el hecho de que la correlación con del precio con la superficie es muy baja y es sabido que este valor influye de manera importante en el precio de una propiedad.
a y b) eliminacion de variable room y de datos faltantes
df = df %>%
select(-bedrooms) %>%
na.omit()
head(df)
## # A tibble: 6 x 8
## id l3 rooms bathrooms surface_total surface_covered price
## <fct> <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Hdjp~ Boedo 6 2 178 240 500000
## 2 Afdc~ Vele~ 3 2 95 69 199900
## 3 ESzy~ NuƱez 1 1 44 38 147000
## 4 r22O~ Alma~ 1 1 40 37 92294
## 5 atZQ~ Alma~ 1 1 49 44 115000
## 6 R7Is~ Alma~ 1 1 40 37 77000
## # ... with 1 more variable: property_type <fct>
dim(df) #se confirma las dimensiones del dataset del tp
## [1] 51210 8
summary(df$price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6000 119000 170000 251577 270000 6000000
ggplot(df, aes(price))+
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
La estadĆstica descriptiva indica que el menor de la variable precio es de 6 000 USD lo cuĆ”l puede considerarse como un error, a su vez muestra un valor mĆ”ximo de 6 000 000 USD que podrĆa considerarse atĆpico (habrĆa que evaluar otras variables). Puesto que el valor de la mediana es inferior a la media, la distribución tiene una asimetrĆa derecha. Al ver el histograma se puede ver como existen valores altos con muy poca frecuencia. Esto puede indicar que los valores altos son un grupo de propiedades con caracterĆsticas propias o corresponden a valores atĆpicos.
casa = summary((df %>% filter(property_type == 'Casa'))$price)
ph = summary((df %>% filter(property_type == 'PH'))$price)
depto = summary((df %>% filter(property_type == 'Departamento'))$price)
t(rbind(casa, ph, depto))
## casa ph depto
## Min. 20000.0 32000.0 6000.0
## 1st Qu. 235000.0 137000.0 115000.0
## Median 335000.0 190000.0 164000.0
## Mean 434188.8 218747.4 246855.7
## 3rd Qu. 490000.0 270000.0 260000.0
## Max. 5000000.0 1500000.0 6000000.0
ggplot(df, aes(property_type, price, colour = property_type))+
geom_boxplot()
La estadĆstica descriptiva y los boxplots muestran que las departamentos son la propiedades que tienen un mayor rango, sin embargo el primer y tercer cuartil se encuentran cerca lo que implica que la mayorĆa de los datos estĆ”n concentrados cerca de su mediana en relación con las propiedades tipo āCasaā. Los precios de las casas son superiores respecto a las otras propiedades y presentan una gran dispersión en la parte alta al igual que las propiedades tipo departamento. Las propiedades tipo āPHā son las que tienen un menor rango y tiene un compartamiento similar a los departamentos (exceptuando los valores del cuarto cuartil). La estadĆstica descriptica permite identificar que los valores mĆnimos y mĆ”ximos se encuentran en las propiedades tipo departamento.
ggpairs(df[c(-1,-2)], title = "Matriz de correlaciones",mapping = aes(colour= property_type))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Al analizar el correlograma se puede ver que a nivel general se mantienen los resultados de las matriz de correlación. Luego de remover las variable ābedroomsā y los faltantes, la variable que mejor explica el precio es la cantidad de baƱos seguida por la cantidad de cuartos. Al ver los grĆ”ficos de dispersión de la variable precio se pueden ver valores atĆpicos y formas diferentes a la āpelota de rugbyā que hacen que las estimaciones de correlación no sean las mejores.
ggplot(df, aes(price, rank(price), colour = property_type))+
geom_point(shape = 1)
Se observa que a partir de $1 000 000 existen muy pocas propiedades. La escala del grafico no permite observar las observaciones inferiores por ende se realiza un grafico de los menores valores
ggplot(df, aes(price, rank(price), colour = property_type))+
geom_point(shape = 1)+
coord_cartesian(ylim=c(-0,500), xlim=c(0,70000))
Se asume que propiedades con valores menores a los $40 000 son irreales en el mercado. Se oberva que solo alrededor de 150 observaciones tienen estas propiedades.
Se realiza el corte univariado de outliers. Seria adecuado eventualmente realizar un analisis multivariado de outliers
df_outlier = df %>%
filter(price>40000 & price<1000000)
cat('porcentaje de outliers',(-nrow(df_outlier)+nrow(df))/nrow(df)*100,'%')
## porcentaje de outliers 2.442882 %
Se repiten los pasos del punto 4 con los nuevos datos
summary(df_outlier$price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 41000 118000 168000 218043 264000 999999
ggplot(df_outlier, aes(price))+
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Como se redujeron una mayor cantidad de datos altos, los valores de la estadistica descriptiva son menores. Se puede observar que el histograma mantiene su asimetria pero al recortar los valores atipicos, la cola se reduce y los bins tienen una altura perceptible.
#Obtener estadisticas descriptivas para la variable precio (cuartiles, promedio,
#minimo y maximo) por cada tipo de propiedad.
casa_outlier = summary((df_outlier %>% filter(property_type == 'Casa'))$price)
ph_outlier = summary((df_outlier %>% filter(property_type == 'PH'))$price)
depto_outlier = summary((df_outlier %>% filter(property_type == 'Departamento'))$price)
print('estadisticas del precio por tipo de vivienda')
## [1] "estadisticas del precio por tipo de vivienda"
t(rbind(casa_outlier, ph_outlier, depto_outlier))
## casa_outlier ph_outlier depto_outlier
## Min. 55000.0 42000.0 41000.0
## 1st Qu. 230000.0 137000.0 115000.0
## Median 325000.0 190000.0 160000.0
## Mean 367608.1 218324.8 211283.5
## 3rd Qu. 460000.0 270000.0 250000.0
## Max. 990000.0 970000.0 999999.0
Se observa modificaciones en los tres tipos de variables, sin embargo la vivienda tipo PH mantiene el primer, segundo y tercer cuartil indicando que no se ve tan afectada por el recorte de datos atipicos.
#Realizar un grafico de boxplot de la variable precio por tipo de propiedad
ggplot(df_outlier, aes(property_type, price, colour = property_type))+
geom_boxplot()
Lo mismo se refleja en los boxplots.
Realizo una resta de las matrices de correlacion para ver el cambio producto de la salida de outliers
cor_df = df %>%
select(-c(id,l3,property_type)) %>%
cor(.,use="pairwise.complete.obs")
cor_df_out = df_outlier %>%
select(-c(id,l3,property_type)) %>%
cor(.,use="pairwise.complete.obs")
cor_df-cor_df_out
## rooms bathrooms surface_total surface_covered
## rooms 0.00000000 0.01867417 0.0101232529 0.0131332581
## bathrooms 0.01867417 0.00000000 0.0113302909 0.0154591326
## surface_total 0.01012325 0.01133029 0.0000000000 0.0008096315
## surface_covered 0.01313326 0.01545913 0.0008096315 0.0000000000
## price -0.10765779 -0.05679452 0.0070259598 0.0119548617
## price
## rooms -0.10765779
## bathrooms -0.05679452
## surface_total 0.00702596
## surface_covered 0.01195486
## price 0.00000000
Al comparar las matrices de correlación se observa una variación importante en la correlación que es la relativa a precio-rooms (disminuye 0,108)
Es interesante notar que la correlacion entre rooms-precio y bathrooms-precio disminuye al eliminar outliers y todas las demas aumentan.
#Realizar un modelo lineal simple para explicar el precio en función de las habitaciones (rooms)
m_hab = lm(price~rooms, df_outlier)
ggplot(df_outlier, aes(rooms, price))+
geom_point(position = 'jitter', shape = 1, alpha = 0.2) +
geom_smooth(method = 'lm')
summary(m_hab)
##
## Call:
## lm(formula = price ~ rooms, data = df_outlier)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1661735 -66862 -18906 29498 824229
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 26040.5 1253.9 20.77 <2e-16 ***
## rooms 69865.4 410.4 170.25 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 122500 on 49957 degrees of freedom
## Multiple R-squared: 0.3672, Adjusted R-squared: 0.3672
## F-statistic: 2.899e+04 on 1 and 49957 DF, p-value: < 2.2e-16
El modelo linel ajustado es de la siguiente forma: Precio = 26040 + 69865xcuartos. Esto implica que cada cuarto adicional aumenta el monto del inmueble en 69865 USD. El p valor de los coeficientes indica que se puede rechazar la hipotesis nula de que no hay asociacion lineal entre el precio y cuartos.
#y otro modelo que explique el precio en función de la superficie total (surface_total)
m_surf = lm(price~surface_total, df_outlier)
ggplot(df_outlier, aes(surface_total, price))+
geom_point(position = 'jitter', shape = 1, alpha = 0.2)+
geom_smooth(method = 'lm')
summary(m_surf)
##
## Call:
## lm(formula = price ~ surface_total, data = df_outlier)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1349581 -99543 -49757 45826 780254
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.170e+05 6.928e+02 313.23 <2e-16 ***
## surface_total 1.069e+01 8.357e-01 12.79 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 153800 on 49957 degrees of freedom
## Multiple R-squared: 0.003265, Adjusted R-squared: 0.003245
## F-statistic: 163.6 on 1 and 49957 DF, p-value: < 2.2e-16
El modelo linel ajustado es de la siguiente forma: Precio = 217000 + 10,69xsuperficie total. Esto implica que cada unidad de superficie adicional aumenta el monto del inmueble en 10,69 USD. El p valor de los coeficientes indica que se puede rechazar la hipotesis nula de que no hay asociacion lineal entre el precio y la superficie.
Los modelos utlizados al analizarlos graficamente no tienen una clara relacion lineal (es probable que al ajustar de mejor manera por outliers el modelo mejore). Se deberia analizar mas en detalle los valores atipicos y explorar otros modelos para explicar de mejor manera el comportamiento de la variable precio. En todo caso, si tuviera que elegir eligiria el modelo que predice el precio en funcion de los cuartos ya que tiene un mejor R2, menor error estandar de los residuos y graficamente parece tener una relacion mas clara.