ANALISIS PRECIO DE CASAS EN CALIFORNIA

En el siguiente ejercicio se analizará el precio de las casas ubicadas en el estado de California de Estados Unidos. Se realizará el análisis adecuado para la construcción de un modelo de regresión lineal simple. A continuación se importaran las librerias adecuadas y se procederá a realizar un análisis exploratorio de datos.

#LIBRERIAS

library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.5.3
## Cargando paquete requerido: xts
## Warning: package 'xts' was built under R version 4.5.3
## Cargando paquete requerido: zoo
## Warning: package 'zoo' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Adjuntando el paquete: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.5.3
## corrplot 0.95 loaded
library(ggplot2)
library(summarytools)
## Warning: package 'summarytools' was built under R version 4.5.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
## 
## ######################### Warning from 'xts' package ##########################
## #                                                                             #
## # The dplyr lag() function breaks how base R's lag() function is supposed to  #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
## # source() into this session won't work correctly.                            #
## #                                                                             #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
## # dplyr from breaking base R's lag() function.                                #
## #                                                                             #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## ###############################################################################
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:xts':
## 
##     first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.5.3
library(nortest)

#ANALISIS EXPLORATORIO DE DATOS (EDA)

data<-read.csv("housing.csv")
dim(data)
## [1] 20640    10
colnames(data)
##  [1] "longitude"          "latitude"           "housing_median_age"
##  [4] "total_rooms"        "total_bedrooms"     "population"        
##  [7] "households"         "median_income"      "median_house_value"
## [10] "ocean_proximity"
summary(data)
##    longitude         latitude     housing_median_age  total_rooms   
##  Min.   :-124.3   Min.   :32.54   Min.   : 1.00      Min.   :    2  
##  1st Qu.:-121.8   1st Qu.:33.93   1st Qu.:18.00      1st Qu.: 1448  
##  Median :-118.5   Median :34.26   Median :29.00      Median : 2127  
##  Mean   :-119.6   Mean   :35.63   Mean   :28.64      Mean   : 2636  
##  3rd Qu.:-118.0   3rd Qu.:37.71   3rd Qu.:37.00      3rd Qu.: 3148  
##  Max.   :-114.3   Max.   :41.95   Max.   :52.00      Max.   :39320  
##                                                                     
##  total_bedrooms     population      households     median_income    
##  Min.   :   1.0   Min.   :    3   Min.   :   1.0   Min.   : 0.4999  
##  1st Qu.: 296.0   1st Qu.:  787   1st Qu.: 280.0   1st Qu.: 2.5634  
##  Median : 435.0   Median : 1166   Median : 409.0   Median : 3.5348  
##  Mean   : 537.9   Mean   : 1425   Mean   : 499.5   Mean   : 3.8707  
##  3rd Qu.: 647.0   3rd Qu.: 1725   3rd Qu.: 605.0   3rd Qu.: 4.7432  
##  Max.   :6445.0   Max.   :35682   Max.   :6082.0   Max.   :15.0001  
##  NA's   :207                                                        
##  median_house_value ocean_proximity   
##  Min.   : 14999     Length:20640      
##  1st Qu.:119600     Class :character  
##  Median :179700     Mode  :character  
##  Mean   :206856                       
##  3rd Qu.:264725                       
##  Max.   :500001                       
## 
str(data)
## 'data.frame':    20640 obs. of  10 variables:
##  $ longitude         : num  -122 -122 -122 -122 -122 ...
##  $ latitude          : num  37.9 37.9 37.9 37.9 37.9 ...
##  $ housing_median_age: num  41 21 52 52 52 52 52 52 42 52 ...
##  $ total_rooms       : num  880 7099 1467 1274 1627 ...
##  $ total_bedrooms    : num  129 1106 190 235 280 ...
##  $ population        : num  322 2401 496 558 565 ...
##  $ households        : num  126 1138 177 219 259 ...
##  $ median_income     : num  8.33 8.3 7.26 5.64 3.85 ...
##  $ median_house_value: num  452600 358500 352100 341300 342200 ...
##  $ ocean_proximity   : chr  "NEAR BAY" "NEAR BAY" "NEAR BAY" "NEAR BAY" ...

Nuestra base de datos cuenta con 20640 registros de casas ubicadas en california y 10 variables. Tenemos casas que rondan desde solo un año de estas ser construidas siendo estas las más nuevas hasta 52 años de ser construida siendo estas las más viejas.

mean(data$median_house_value)
## [1] 206855.8
hist(data$median_house_value)

boxplot(data$median_house_value, horizontal = T, xlab = "Boxplot Valor Promedio de Casas") 
abline(v= mean(data$median_house_value),
       lty=2,
       lwd=2,
       col= 'red')

En promedio el valor de las casas de nuestro data set tiene un valor $206.855 dolares. Al graficar el histograma vemos que estos datos presentan un cesgo a la derecha. Esto nos da indicio que la media es mayor a la mediana de los datos. Para ello graficamos nuestra variable en un boxplot para representarlo mejor graficamente.

Quisieramos comprobar si esta variable tiene comportamiento normal. Para ello realizaremos una prueba de normalidad definiendo las siguientes hipótesis:

H0: La variable precio promedio de casas se ajusta a una distribución normal. H1: La variable precio promedio de casas NO se ajusta a una distribución normal.

Debido a la cantidad de datos la prueba a utilizar para evaluar normalidad será la prueba Kolmogrov Smirnoff.

ks.test(data$median_house_value, "pnorm", mean(data$median_house_value),
        sd(data$median_house_value))
## Warning in ks.test.default(data$median_house_value, "pnorm",
## mean(data$median_house_value), : ties should not be present for the one-sample
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  data$median_house_value
## D = 0.10299, p-value < 2.2e-16
## alternative hypothesis: two-sided

Con un nivel de significancia de 0.05 y un p-value 0.00001 se rechaza la hipotesis nula por lo que decimos que esta variable no se ajusta a una distribución normal.

Para entender mejor como se comportan nuestras variables utilizaremos la libreria summary tools y tener un resumen estadístico de cada una de nuestras variables

view(dfSummary(data))
## Switching method to 'browser'
## Output file written: C:\Users\c_her\AppData\Local\Temp\RtmpGsrcrm\file29005f8c3f0a.html

Al detallar nuestro resumen comprobamos que la variable precio promedio de la casa tiene una media mayor a su mediana corroborando una asimetría.

A continuación queremos estudiar las variables valor promedio de casa, ingreso promedio, antiguedad de casa, cuartos promedios y ocupantes promedio

datam <- data[, c("median_house_value",
                        "median_income",
                        "housing_median_age",
                        "total_rooms",
                        "households")]

Verificamos que no existan datos faltantes en nuestras variables.

colSums(is.na(datam))
## median_house_value      median_income housing_median_age        total_rooms 
##                  0                  0                  0                  0 
##         households 
##                  0

#COVARIANZA Y CORRELACIÓN

Queremos analizar la variable valor promedio de casa y definirla como nuestra variable predictora. Por otro lado definimos como nuestras varibales explicativas ingreso promedio, antiguedad de casa, cuartos promedios y ocupantes promedio.

Para el analisis queremos ver como se comportan cada una de las explicativas con nuestra variable predictora. Para ello estudiaremos las covarianzas y las correlaciones entre ellas.

chart.Correlation(datam)

cov(datam$median_income,datam$median_house_value)
## [1] 150847.5
cov(datam$housing_median_age,datam$median_house_value)
## [1] 153398.8
cov(datam$total_rooms,datam$median_house_value)
## [1] 33772890
cov(datam$households,datam$median_house_value)
## [1] 2904924
cor(datam$median_income,datam$median_house_value)
## [1] 0.6880752
cor(datam$housing_median_age,datam$median_house_value)
## [1] 0.1056234
cor(datam$total_rooms,datam$median_house_value)
## [1] 0.1341531
cor(datam$households,datam$median_house_value)
## [1] 0.06584265
#COEFICIENTE DE CORRELACIÓN
cor(datam$median_income,datam$median_house_value)^2
## [1] 0.4734475
cor(datam$housing_median_age,datam$median_house_value)^2
## [1] 0.01115631
cor(datam$total_rooms,datam$median_house_value)^2
## [1] 0.01799706
cor(datam$households,datam$median_house_value)^2
## [1] 0.004335255
plot(datam$median_income,datam$median_house_value)

plot(datam$housing_median_age, datam$median_house_value)

plot(datam$total_rooms, datam$median_house_value)

plot(datam$households, datam$median_house_value)

Entre todas nuestras variables explicativas vemos que la mejorrelacion tiene con la predictora es ingreso promedio ya que tiene un coeficiente de correlacion positivo moderado (0.69). Sin embargo, debemos corroborar que dicha correlación es significativa.

H0: No existe una relación lineal entre las variables ingreso promedio y valor promedio por casa.

H1: Existe una relación lineal entre las variables ingreso promedio y valor promedio por casa.

cor.test(datam$median_income,datam$median_house_value)
## 
##  Pearson's product-moment correlation
## 
## data:  datam$median_income and datam$median_house_value
## t = 136.22, df = 20638, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6808236 0.6951920
## sample estimates:
##       cor 
## 0.6880752

Con un nivel de significancia de 0.05 y un p-value de 0.00001 se rechaza la hipotesis nula por lo que decimos que existe una relacion linean entre la variable explicativa y nuestra variable predictora. Esto nos indica que ambas variables son aptas y significativas para la construccion de un modelo de regresión lineal.

MODELO RLS

modelo1<-lm(median_house_value~median_income,
            data=datam)
summary(modelo1)
## 
## Call:
## lm(formula = median_house_value ~ median_income, data = datam)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -540697  -55950  -16979   36978  434023 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    45085.6     1322.9   34.08   <2e-16 ***
## median_income  41793.8      306.8  136.22   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 83740 on 20638 degrees of freedom
## Multiple R-squared:  0.4734, Adjusted R-squared:  0.4734 
## F-statistic: 1.856e+04 on 1 and 20638 DF,  p-value: < 2.2e-16
boxplot(modelo1$residuals, horizontal =  T)

hist(modelo1$residuals)

#NORMALIDAD RESIDUOS H0: Los residuos se ajustan a una distribución normal. H1: Los residuos no se ajustan a una distribución normal.

ks.test(modelo1$residuals, "pnorm", mean(modelo1$residuals),
        sd(modelo1$residuals))
## Warning in ks.test.default(modelo1$residuals, "pnorm", mean(modelo1$residuals),
## : ties should not be present for the one-sample Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  modelo1$residuals
## D = 0.099068, p-value < 2.2e-16
## alternative hypothesis: two-sided

Con un nivel de significancia de 0.05 y un p-value de 0.0001 se rechaza la hipotesis nula por los que los residuos no se ajustan a una distribucion normal. Esto nos da un indicio sobre la calidad del modelo ya que no cumple con dicho supuesto.

plot(modelo1)

#EXPLICACION DE GRAFICAS

RESIDUALS VS FITTED (Linealidad) se deberian ver residuos aleatorios alrededor del cero; la linea roja deberia ser completamente horizontal. Dado que no cumple ninguna de estas características vemos que no hay una relación lineal

QQPLOT (Normalidad) Los residuos en la prueba de normalidad y en el qqplot muestran que los daots no siguen una distribución normal. En el gráfico vemos que existen desviaciones y colas desviadas.

SCALE LOCATION CHART (Homocedasticidad) Este gráfico nos habla de la varianza en los residuos la cual esperamos que sea constante. Sin embargo vemos que esta aumenta y disminuye presentando un comportamiento no horizontal lo que hace que se haga un patrón distinto al deseado. Visualmente esto nos da evidsencia de que existe hetereocedasticidad. Para corroborarlo presentamos una prueba de homocedasticidad.

H0: La varianza de los datos de los errores es constante a lo largo de las observaciones H1:La varianza de los datos de los errores NO es constante a lo largo de las observaciones

bptest(modelo1)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo1
## BP = 138.86, df = 1, p-value < 2.2e-16

Con un nivel de significancia de 0.05 y un p-value de 0.00001 se rechaza la hipotesis nula lo cual confirma que los errores del modelo no tienen una varianza constante a lo largo de las observaciones. }

CONCLUSIONES

El poder explicativo de nuestro modelo es moderado (47%), la relacion entre nuestras variables es positiva, sin embargo en nuestro gráfico de residuals vs fitted vemos que dicha relación no es perfectamente lineal.

RECOMENDACIONES

Escribir la ecuación ygoroo = beta0 + beta1X +error Supuesto de linealidad supuesto de normalidad supuesto de independencia

\[ \widehat{Y} = 45085.6 + 41793.8X \]

EJEMPLOS DE COMO REPRESENTAR EXPRESIONES MATEMATICAS \[ p < 2.2 \times 10^{-16} \]

\[ \hat{\beta}_1= \frac{\sum_{i=1}^{n}(X_i-\bar{X})(Y_i-\bar{Y})} {\sum_{i=1}^{n}(X_i-\bar{X})^2} \]

\[ \hat{\beta}_0= \bar{Y}-\hat{\beta}_1\bar{X} \]