Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz para apartamento de estrato 4 con área construida menor a 200 m2 (vivienda4.RDS) la inmobiliaria A&C requiere el apoyo de un cientifico de datos en la construcción de un modelo que lo oriente sobre los precios de inmuebles.
Con este propósito el equipo de asesores a diseñado los siguientes pasos para obtener un modelo y así poder a futuro determinar los precios de los inmuebles a negociar.
La población indicada por el dataset está compuesta de 343 casas y 1363 apartamentos, los precios de casas y apartamentos se encuentran en un rango de 207.4 y 309 millones de pesos; el área construida se encuentra entre 40 y 200 metros cuadrados.
Los 1363 apartamentos se encuentran segmentados de la siguiente manera: 7 en la Zona Centro, 237 en la Zona Norte, 52 en la Zona Oeste, 2 en la Zona Oriente, y 1065 en la Zona Sur.
Los precios de apartamenos de todas las zonas se encuentran en un rango entre 207.4 y 305.2 millones de pesos; su área se encuentra entre 40 m2 y 200 m2.
El alcance del presente análisis se encuentra enfocado en los inmuebles del tipo apartamento especificamente de la zona sur, ya que contienen la mayor cantidad de datos disponibles en el dataset.
La población de 1065 apartamentos de la Zona Sur tiene rango de precios entre 207.4 y 305. 2 millones de pesos, la media de la zona Sur se encuentra en 235.6 millones de pesos.
Con el fin de realizar estimaciónes del precio en base a la cantidad de metros cuadrados construidos se analizaron 4 modelos de regresión verificando la bondad del ajustemediante la comprobación del coeficiente de bondad R2 y el cumplimiento de los supuestos de normalidad, linealidad, homocedasticidad, no autorrelación de errores, con el fin de mejorar el ajuste se eliminaron los datos atípicos.
Como resultado del modelo se determinó la ecuación: Precio_Apto = 201.86 +0.47x + ε en donde x representa la cantidad de metros cuadrados construidos, esta ecuación representa un 53.62% del valor basado en los datos disponibles, es importante tener en cuenta que existen otras varibles que pueden incidir en el valor del inmueble tanto positivamente como negativamente como son: estado actual del inmueble, implicaciones legales del inmueble, localización vertical del inmueble, existencia o no de parquederos, entre otras.
Descarga de base de datos.
#install.packages('devtools')
#devtools::install_github('dgonxalex80/paqueteMETODOS')
library(paqueteMETODOS)
data(vivienda4)
Verificamos las descriptivas, verificamos que no tengamos datos faltantes:
library(summarytools)
descr(vivienda4)
Descriptive Statistics
vivienda4
N: 1706
areaconst preciom
----------------- ----------- ---------
Mean 87.63 243.70
Std.Dev 36.35 19.56
Min 40.00 207.41
Q1 60.00 230.73
Median 75.00 238.77
Q3 98.00 251.51
Max 200.00 309.70
MAD 22.24 14.19
IQR 38.00 20.77
CV 0.41 0.08
Skewness 1.53 1.26
SE.Skewness 0.06 0.06
Kurtosis 1.68 1.25
N.Valid 1706.00 1706.00
Pct.Valid 100.00 100.00
Revisamos los tipos de inmuebles y en las zonas en las cuales se encuentran ubicados los inmuebles:
summary(vivienda4)
zona estrato preciom areaconst
Zona Centro : 8 3: 0 Min. :207.4 Min. : 40.00
Zona Norte : 288 4:1706 1st Qu.:230.7 1st Qu.: 60.00
Zona Oeste : 60 5: 0 Median :238.8 Median : 75.00
Zona Oriente: 6 6: 0 Mean :243.7 Mean : 87.63
Zona Sur :1344 3rd Qu.:251.5 3rd Qu.: 98.00
Max. :309.7 Max. :200.00
tipo
Apartamento:1363
Casa : 343
Filtramos la base de datos para seleccionar los tipo apartamento:
apartamentos <- subset(data, data$tipo =="Apartamento")
summary(apartamentos)
zona estrato preciom areaconst
Zona Centro : 7 3: 0 Min. :207.4 Min. : 40.00
Zona Norte : 237 4:1363 1st Qu.:228.8 1st Qu.: 60.00
Zona Oeste : 52 5: 0 Median :236.1 Median : 70.00
Zona Oriente: 2 6: 0 Mean :237.7 Mean : 75.48
Zona Sur :1065 3rd Qu.:243.6 3rd Qu.: 84.00
Max. :305.2 Max. :200.00
tipo
Apartamento:1363
Casa : 0
Apto_Norte <-subset(apartamentos, apartamentos$zona =="Zona Norte")
Apto_Sur <-subset(apartamentos, apartamentos$zona =="Zona Sur")
Apto_Oriente <-subset(apartamentos, apartamentos$zona =="Zona Oriente")
Apto_Oeste <-subset(apartamentos, apartamentos$zona =="Zona Oeste")
Apto_Centro <-subset(apartamentos, apartamentos$zona =="Zona Centro")
Revisamos las diferentes zonas de apartamentos para detectar Outliers (Valores atípicos)
Revisamos los apartementos de la Zona Centro:
summary(Apto_Centro)
zona estrato preciom areaconst tipo
Zona Centro :7 3:0 Min. :236.2 Min. : 62.0 Apartamento:7
Zona Norte :0 4:7 1st Qu.:241.3 1st Qu.: 84.0 Casa :0
Zona Oeste :0 5:0 Median :257.3 Median :120.0
Zona Oriente:0 6:0 Mean :256.4 Mean :107.7
Zona Sur :0 3rd Qu.:269.7 3rd Qu.:124.5
Max. :279.0 Max. :155.0
Revisamos los apartementos de la Zona Norte:
summary(Apto_Norte)
zona estrato preciom areaconst tipo
Zona Centro : 0 3: 0 Min. :216.2 Min. : 51.00 Apartamento:237
Zona Norte :237 4:237 1st Qu.:230.4 1st Qu.: 61.00 Casa : 0
Zona Oeste : 0 5: 0 Median :236.7 Median : 73.00
Zona Oriente: 0 6: 0 Mean :239.1 Mean : 78.67
Zona Sur : 0 3rd Qu.:243.7 3rd Qu.: 83.00
Max. :302.4 Max. :200.00
Revisamos los apartementos de la Zona Oeste:
summary(Apto_Oeste)
zona estrato preciom areaconst tipo
Zona Centro : 0 3: 0 Min. :215.4 Min. : 48.00 Apartamento:52
Zona Norte : 0 4:52 1st Qu.:227.7 1st Qu.: 58.25 Casa : 0
Zona Oeste :52 5: 0 Median :238.3 Median : 63.00
Zona Oriente: 0 6: 0 Mean :238.9 Mean : 74.87
Zona Sur : 0 3rd Qu.:246.6 3rd Qu.: 82.00
Max. :275.2 Max. :144.00
Revisamos los apartementos de la Zona Oriente:
summary(Apto_Oriente)
zona estrato preciom areaconst tipo
Zona Centro :0 3:0 Min. :236.8 Min. :84.0 Apartamento:2
Zona Norte :0 4:2 1st Qu.:238.6 1st Qu.:85.5 Casa :0
Zona Oeste :0 5:0 Median :240.4 Median :87.0
Zona Oriente:2 6:0 Mean :240.4 Mean :87.0
Zona Sur :0 3rd Qu.:242.2 3rd Qu.:88.5
Max. :244.0 Max. :90.0
Revisamos los apartementos de la Zona Sur:
summary(Apto_Sur)
zona estrato preciom areaconst
Zona Centro : 0 3: 0 Min. :207.4 Min. : 40.00
Zona Norte : 0 4:1065 1st Qu.:228.6 1st Qu.: 60.00
Zona Oeste : 0 5: 0 Median :235.8 Median : 70.00
Zona Oriente: 0 6: 0 Mean :237.2 Mean : 74.57
Zona Sur :1065 3rd Qu.:243.3 3rd Qu.: 83.00
Max. :305.2 Max. :200.00
tipo
Apartamento:1065
Casa : 0
Graficamos los costos segmentando por Zonas:
boxplot(apartamentos$preciom~apartamentos$zona,
main = "Precio de los apartamentos por zonas",
ylab = "Precio (MMCOP)",
xlab = "",
las = 2,
col=c("grey","green", "#f4d35e","blue", "violet"))
axis(side = 2, at = seq(0, 2000, by = 10), labels = FALSE, cex.axis = 2)
Revisamos los metrajes de los apartamentos por zona:
par(mfrow=c(1,2))
par(mar = c(4, 4, 12, 2))
hist(Apto_Centro$areaconst,
main = "Histograma Zona Centro", # Título del gráfico
xlab = "m2 construido", # Etiqueta del eje X
ylab = "Frecuencia", # Etiqueta del eje Y
col = "green", # Color de las barras
border = "black") # Color del borde de las barras
hist(Apto_Norte$areaconst,
main = "Histograma Zona Norte", # Título del gráfico
xlab = "m2 construido", # Etiqueta del eje X
ylab = "Frecuencia", # Etiqueta del eje Y
col = "yellow", # Color de las barras
border = "black") # Color del borde de las barras
par(mfrow=c(1,3))
par(mar = c(4, 4, 12, 2))
hist(Apto_Oeste$areaconst,
main = "Histograma Zona Oeste", # Título del gráfico
xlab = "m2 construido", # Etiqueta del eje X
ylab = "Frecuencia", # Etiqueta del eje Y
col = "violet", # Color de las barras
border = "black") # Color del borde de las barras
hist(Apto_Oriente$areaconst,
main = "Histograma Zona Oriente", # Título del gráfico
xlab = "m2 construido", # Etiqueta del eje X
ylab = "Frecuencia", # Etiqueta del eje Y
col = "red", # Color de las barras
border = "black") # Color del borde de las barras
hist(Apto_Sur$areaconst,
main = "Histograma Zona Sur", # Título del gráfico
xlab = "m2 construido", # Etiqueta del eje X
ylab = "Frecuencia", # Etiqueta del eje Y
col = "blue", # Color de las barras
border = "black") # Color del borde de las barras
Para el presente análisis nos centraremos en los inmuebles tipo Apartamento de la Zona Sur la cual contiene una mayor cantidad de datos disponibles 1065 unidades.
Verificamos la normalidad de la Zona Sur:
plot(density(Apto_Sur$preciom))
Determinamos Outliers de la Zona Sur, se observa los datos atípicos que se encuentran fuera del intervalo:
boxplot(Apto_Sur$preciom,
horizontal = TRUE,
main = "Distribución Precio/m2 - Zona Sur",
col = "blue",
las = 1,
xlab = "Precio del inmueble (MMCOP)",
ylab = "Zona")
Buscamos outliers mediante la función boxplot.stats, se identifican 32 valores atípicos los cuales se encuentran entre 267.0240 (min) y 305.1900(max):
boxplot.stats(Apto_Sur$preciom)
$stats
[1] 207.4063 228.6035 235.7811 243.2961 264.9877
$n
[1] 1065
$conf
[1] 235.0698 236.4925
$out
[1] 278.5580 267.2948 266.7912 272.1928 284.4535 272.2040 305.1900 272.5211
[9] 270.9289 281.7389 269.2610 300.4450 294.0925 298.7191 283.3601 273.4190
[17] 275.0311 267.0240 272.2105 281.4747 298.5620 297.1333 273.0654 286.2517
[25] 269.1626 276.9321 300.5529 285.0401 267.0178 267.4686 272.4343
Filtramos los valores que no son Outliers:
AptosSur_Sin_Out<- subset(Apto_Sur,Apto_Sur$preciom <267.0240)
Verificamos nuevamente los Outliers de la Zona Sur, se observan que persisten todavía valores atípicos:
boxplot(AptosSur_Sin_Out$preciom,
horizontal = TRUE,
main = "Distribución Precio/m2 - Zona Sur",
col = "blue",
las = 1,
xlab = "Precio del inmueble (MMCOP)",
ylab = "Zona")
Buscamos nuevamente outliers mediante la función boxplot.stats, buscando su eliminación mediante un proceso iterativo, se identifican que todavía persisten 10 valores atípicos:
boxplot.stats(AptosSur_Sin_Out$preciom)
$stats
[1] 207.7435 228.3047 235.4000 242.2297 262.7313
$n
[1] 1037
$conf
[1] 234.7168 236.0833
$out
[1] 264.4863 266.7912 263.3649 263.5436 264.8171 267.0240 264.0082 264.9877
[9] 267.0178 207.4063
Nuevamente filtramos los valores que no son Outliers:
AptosSur_Sin_Out2<- subset(AptosSur_Sin_Out,AptosSur_Sin_Out$preciom >207.7435 & AptosSur_Sin_Out$preciom <263.3649)
Repetimos Outliers de la Zona Sur, se identifica que todavía tenemos un valor outlier:
boxplot(AptosSur_Sin_Out2$preciom,
horizontal = TRUE,
main = "Distribución Precio/m2 - Zona Sur",
col = "blue",
las = 1,
xlab = "Precio del inmueble (MMCOP)",
ylab = "Zona")
Buscamos nuevamente outliers mediante la función boxplot.stats, mediante un proceso iterativo
boxplot.stats(AptosSur_Sin_Out2$preciom)
$stats
[1] 207.7435 228.1527 235.3254 241.9838 262.6127
$n
[1] 1027
$conf
[1] 234.6435 236.0073
$out
[1] 262.7313
Filtramos los valores que no son Outliers, se identifica que ya no existen valores outliers:
AptosSur_Sin_Out3<- subset(AptosSur_Sin_Out2,AptosSur_Sin_Out2$preciom <262.7312)
Repetimos Outliers de la Zona Sur:
boxplot(AptosSur_Sin_Out3$preciom,
horizontal = TRUE,
main = "Distribución Precio/m2 - Zona Sur",
col = "blue",
las = 1,
xlab = "Precio del inmueble (MMCOP)",
ylab = "Zona")
Buscamos nuevamente outliers mediante la función boxplot.stats, se
verifica que se han eliminado todos los valores atípicos:
boxplot.stats(AptosSur_Sin_Out3$preciom)
$stats
[1] 207.7435 228.1502 235.3057 241.9573 262.6127
$n
[1] 1026
$conf
[1] 234.6246 235.9868
$out
numeric(0)
Revisamos como queda la Zona Sur Sin Outliers:
summary(AptosSur_Sin_Out3)
zona estrato preciom areaconst
Zona Centro : 0 3: 0 Min. :207.7 Min. : 40.00
Zona Norte : 0 4:1026 1st Qu.:228.2 1st Qu.: 60.00
Zona Oeste : 0 5: 0 Median :235.3 Median : 70.00
Zona Oriente: 0 6: 0 Mean :235.7 Mean : 71.98
Zona Sur :1026 3rd Qu.:242.0 3rd Qu.: 81.00
Max. :262.6 Max. :143.00
tipo
Apartamento:1026
Casa : 0
data_Ajust <- AptosSur_Sin_Out3
Verificamos las descriptivas a los datos de la Zona Sur sin Outliers:
descr(data_Ajust)
Descriptive Statistics
data_Ajust
N: 1026
areaconst preciom
----------------- ----------- ---------
Mean 71.98 235.74
Std.Dev 16.08 10.33
Min 40.00 207.74
Q1 60.00 228.15
Median 70.00 235.31
Q3 81.00 241.96
Max 143.00 262.61
MAD 14.83 10.12
IQR 21.00 13.80
CV 0.22 0.04
Skewness 0.94 0.27
SE.Skewness 0.08 0.08
Kurtosis 0.78 -0.24
N.Valid 1026.00 1026.00
Pct.Valid 100.00 100.00
Verificamos la normalidad de la Zona Sur sin Outliers:
plot(density(data_Ajust$preciom))
Verificamos la tendencia mediante un gráfico, se observa que existe una relación positiva lineal:
ggplot(data_Ajust, aes(x = areaconst, y = preciom)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(x = "Area Construida (m2)", y = "Precio de Vivienda MMCOP")
Revisavos la covarianza, se observa que es positiva por lo tanto las dos
variables se mueven en la misma dirección.
cov(data_Ajust$areaconst, data_Ajust$preciom)
[1] 121.6386
Revisamos la correlación, para esto determinamos el coeficiente de correlación de Pearson, el valor obtenido de 0,73 indica una relación positiva debíl ya que sencuentra en el intervalo mayor de 0,3 pero menor de 0,8, de igual manera el coeficiente de correlación de Spearman tambien indica una relación posiva debil.
cor(data_Ajust$areaconst, data_Ajust$preciom, method = 'pearson')
[1] 0.7322761
cor(data_Ajust$areaconst, data_Ajust$preciom, method = 'spearman')
[1] 0.7071745
attach(data_Ajust)
El modelo de regresión lineal simple tiene la siguiente ecuación: Y = β0 + β1X + ε
Modelo1 <- lm(formula =preciom ~ areaconst, data = data_Ajust)
summary(Modelo1)
Call:
lm(formula = preciom ~ areaconst, data = data_Ajust)
Residuals:
Min 1Q Median 3Q Max
-24.5063 -5.0073 0.0442 4.5234 21.7780
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 201.85506 1.00886 200.08 <2e-16 ***
areaconst 0.47069 0.01368 34.41 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 7.04 on 1024 degrees of freedom
Multiple R-squared: 0.5362, Adjusted R-squared: 0.5358
F-statistic: 1184 on 1 and 1024 DF, p-value: < 2.2e-16
Determinamos la ecuación:
Modelo1$coefficients
(Intercept) areaconst
201.8550597 0.4706852
Se observa que la ecuación del modelo planteado es : 201.86 +0.47x + ε debido que el coeficiente β0 = 201.86 indica que el valor mínimo del área construida para la venta en la Zona sur es de 201.86 MMCOP, por otra parte el valor de β1 = 0.47 indica que por cada incremento del metro cuadrado de área construida se tendrá 0.47 incrementando el valor del precio, por otro lado podemos estimer un 53.62% del valor del precio del inmueble en base al modelo planteado.
Procedemos a establecer los intervalos de confianza y a realizar las pruebas de hipótesis:
confint(Modelo1, level=0.95)
2.5 % 97.5 %
(Intercept) 199.8753848 203.8347346
areaconst 0.4438429 0.4975274
Con un nivel de confianza del 95% y un 5% de error α, podemos determinar que el coeficiente β1 para el caso del área construida (x) podría incrementar un valor entre los 0,48 y los 0,51 Millones por cada metro cuadrado construido.
Verificamos Normalidad asumiendo alfa (α) >0.05
Verificamos Normalidad mediante Shaphiro test, bajo las siguientes hipótesis:
Ho: errores tiene una distribución normal Ha: errores no tienen una distribución normal
U <- Modelo1$residuals
shapiro.test(U)
Shapiro-Wilk normality test
data: U
W = 0.99894, p-value = 0.825
Se confirma la normalidad al ser p>0.05, por lo tanto se confirma la hipótesis nula.
Verificamos la Homocedasticidad mediante Breusch-Pagan Test
Verificamos Homocedasticidad, bajo las siguientes hipótesis:
Ho: Los errores tienen una varianza constante. Ha: Los errores no tienen una varianza constante.
library(lmtest)
bptest(Modelo1)
studentized Breusch-Pagan test
data: Modelo1
BP = 0.44973, df = 1, p-value = 0.5025
Se confirma que los errores tienen una varianza cosntante al ser p>0.05, se confirma la hipótesis nula.
Verificamos la No autocorrección de errores mediante Durbin-Watson Test:
Ho: Los errores son independientes entre si. Ha: Los errores No son independientes entre si.
dwtest(Modelo1)
Durbin-Watson test
data: Modelo1
DW = 2.0185, p-value = 0.6128
alternative hypothesis: true autocorrelation is greater than 0
Se confirma que los errores son independientes entre si, se confirma la hipótesis nula.
R2 = summary(Modelo1)$r.squared
print( paste("Coeficiente de determinación (R2) es de: ", R2) )
[1] "Coeficiente de determinación (R2) es de: 0.536228227390305"
El Coeficiente de Determinación también conocido como R2, es una medida de ajuste que indica si finalmente las estimaciones (predicciones) que se logran con la recta de regresión reflejan la realidad.
El coeficeinte R2 del modelo lineal es del 0.54 lo cual evidencia un buen ajuste a los datos, nos permite determinar que el área construida de una apartamento de la Zona Sur corresponde al 71.62 % de la variabilidad de los precios por millón de dichas viviendas.
En base a la propuesta de 220 millones de pesos por un apartamento de 110 m2, se proce a realizar la estimación y comparación.
(predict(Modelo1, list(areaconst=110), interval = "confidence", level = 0.95))
fit lwr upr
1 253.6304 252.5225 254.7384
Según el modelo planteado se estima que el valor del apartamento de 110 m2 se encuentre entre 254.2 y 255.58 millones de pesos, por lo tanto la oferta de 220 millones en primera istancia podría ser una buena oferta para el comprador, sin embargo habría que analizar otras variables que se encuentran fuera del alcance del modelo, como son: estado actual del inmueble, problemas legales asociados al inmueble, problemas estructurales, entre otros, por lo tanto se tendría que investigar las razones del vendedor y cual es su motivación para realizar la venta.
Con anterioridad se verificó el cumplimiento de normalidad, mediante del gráfico Q-Q Residuals se confirma que muchos de los dato se ajustan de manera lineal, la linealidad tambien se puede observar en el gráfico Residuals vs Fitted, la homocedasticidad tambien se puede observar en el gráfico Scale-Location, por otro lado en el modelo presentado se eliminaron los datos atípicos para proporcionar un mejor ajuste al modelo, en consecuencia el modelo cumple los supuestos:
par(mfrow=c(2,2))
plot(Modelo1)
Mediante Boxcox determinamos el mejor ajuste para el modelo:
library(MASS)
boxcox(lm(preciom ~ areaconst, data = apartamentos))
Según la gráfica anterior el modelo que más se ajusta es el lineal al ser lambda cercano a = 1.
Transformación logaritmo a Lineal
Modelo2 <-lm(log(preciom) ~ areaconst, data = data_Ajust)
Verificamos Normalidad asumiendo alfa (α) >0.05
Verificamos Normalidad mediante Shaphiro test, bajo las siguientes hipótesis:
Ho: errores tiene una distribución normal Ha: errores no tienen una distribución normal
U <- Modelo2$residuals
shapiro.test(U)
Shapiro-Wilk normality test
data: U
W = 0.9989, p-value = 0.802
Se confirma la normalidad al ser p>0.05, por lo tanto se confirma la hipótesis nula.
Verificamos la Homocedasticidad mediante Breusch-Pagan Test
Verificamos Homocedasticidad, bajo las siguientes hipótesis:
Ho: Los errores tienen una varianza constante. Ha: Los errores no tienen una varianza constante.
library(lmtest)
bptest(Modelo2)
studentized Breusch-Pagan test
data: Modelo2
BP = 3.3945, df = 1, p-value = 0.06541
Se rechaza ya que los errores No tienen una varianza constante al ser p<0.05, se rechaza la hipótesis nula.
Verificamos la No autocorrelación de errores mediante Durbin-Watson Test:
Ho: Los errores son independientes entre si. Ha: Los errores No son independientes entre si.
dwtest(Modelo2)
Durbin-Watson test
data: Modelo2
DW = 2.019, p-value = 0.6157
alternative hypothesis: true autocorrelation is greater than 0
Se confirma que los errores son independientes entre si, se confirma la hipótesis nula.
par(mfrow=c(2,2))
plot(Modelo2, col="blue", main="Modelo 2 Log- Lin")
Transformación lineal a Logaritmo
Modelo3 <-lm((preciom) ~ log(areaconst), data = data_Ajust)
Verificamos Normalidad asumiendo alfa (α) >0.05
Verificamos Normalidad mediante Shaphiro test, bajo las siguientes hipótesis:
Ho: errores tiene una distribución normal Ha: errores no tienen una distribución normal
U <- Modelo3$residuals
shapiro.test(U)
Shapiro-Wilk normality test
data: U
W = 0.99868, p-value = 0.6517
No se cumple la normalidad al ser p<0.05, por lo tanto se rechaza la hipótesis nula.
Verificamos la Homocedasticidad mediante Breusch-Pagan Test
Verificamos Homocedasticidad, bajo las siguientes hipótesis:
Ho: Los errores tienen una varianza constante. Ha: Los errores no tienen una varianza constante.
library(lmtest)
bptest(Modelo3)
studentized Breusch-Pagan test
data: Modelo3
BP = 2.8638, df = 1, p-value = 0.09059
No se cumple que los errores No tienen una varianza constante al ser p<0.05, se rechaza la hipótesis nula.
Verificamos la No autocorrelación de errores mediante Durbin-Watson Test:
Ho: Los errores son independientes entre si. Ha: Los errores No son independientes entre si.
dwtest(Modelo3)
Durbin-Watson test
data: Modelo3
DW = 1.9851, p-value = 0.4017
alternative hypothesis: true autocorrelation is greater than 0
Se confirma que los errores son independientes entre si, se confirma la hipótesis nula.
par(mfrow=c(2,2))
plot(Modelo3, col="darkviolet", main="Modelo 3 Lin- Log")
Transformación logaritmo a Logaritmo
Modelo4 <-lm(log(preciom) ~ log(areaconst), data = data_Ajust)
Verificamos Normalidad asumiendo alfa (α) >0.05
Verificamos Normalidad mediante Shaphiro test, bajo las siguientes hipótesis:
Ho: errores tiene una distribución normal Ha: errores no tienen una distribución normal
U <- Modelo4$residuals
shapiro.test(U)
Shapiro-Wilk normality test
data: U
W = 0.99888, p-value = 0.7868
Se cumple la normalidad al ser p>0.05, por lo tanto se acepta la hipótesis nula.
Verificamos la Homocedasticidad mediante Breusch-Pagan Test
Verificamos Homocedasticidad, bajo las siguientes hipótesis:
Ho: Los errores tienen una varianza constante. Ha: Los errores no tienen una varianza constante.
library(lmtest)
bptest(Modelo4)
studentized Breusch-Pagan test
data: Modelo4
BP = 8.9847, df = 1, p-value = 0.002723
Se cumple que los errores No tienen una varianza constante al ser p>0.05, se acepta la hipótesis nula.
Verificamos la No autocorrelación de errores mediante Durbin-Watson Test:
Ho: Los errores son independientes entre si. Ha: Los errores No son independientes entre si.
dwtest(Modelo4)
Durbin-Watson test
data: Modelo4
DW = 1.9869, p-value = 0.4127
alternative hypothesis: true autocorrelation is greater than 0
Se confirma que los errores son independientes entre si, se confirma la hipótesis nula.
par(mfrow=c(2,2))
plot(Modelo4, col="green", main="Modelo 4 Log- Log")
Realizamos graficos comparativos entre el modelo lineal inicial y el modelo transformado Log-Log.
par(mfrow=c(2,2))
plot(Modelo1, col="black", main="Modelo inicial Y")
par(mfrow=c(2,2))
plot(Modelo4, col="green", main="Modelo 4 Log- Log")
el modelo inicial (modelo lineal) resulta dar un mejor ajuste con respecto a los modelos trnasformados , se compara contra el modelo transformado log-Log ya que los modelos transformadosLin-Log y Log-Lin no cumplen algunos de los supuestos como son: normalidad, homocedasticidad y no autocorrelación.
library(stargazer)
stargazer(Modelo1, Modelo2, Modelo3, Modelo4, type="text", df=FALSE)
=======================================================================
Dependent variable:
---------------------------------------------------
preciom log(preciom) (preciom) log(preciom)
(1) (2) (3) (4)
-----------------------------------------------------------------------
areaconst 0.471*** 0.002***
(0.014) (0.0001)
log(areaconst) 35.463*** 0.149***
(1.042) (0.004)
Constant 201.855*** 5.320*** 84.903*** 4.828***
(1.009) (0.004) (4.439) (0.019)
-----------------------------------------------------------------------
Observations 1,026 1,026 1,026 1,026
R2 0.536 0.529 0.531 0.525
Adjusted R2 0.536 0.528 0.530 0.525
Residual Std. Error 7.040 0.030 7.083 0.030
F Statistic 1,183.983*** 1,148.515*** 1,157.351*** 1,133.245***
=======================================================================
Note: *p<0.1; **p<0.05; ***p<0.01
De acuerdo con el coeficiente de bondad R2 el modelo que mejor se ajusta es el modelo inicial lineal al tener un coeficiente de bondad mayor que el restante de los modelos planteados, además cumple con los supuestos de Normalidad, Homocedasticidad No autocorrelación, tal como se indicó mediante la función Boxplot().