#Presentado a: #Delia Ortega Lenis
#Daniel Alberto Rincón Loaiza #Universidad Javeriana de Cali
Realizamos inicialmente la instalación de las librerias necesarias.
if(!require(car)){
install.packages(car)
}
## Loading required package: car
## Loading required package: carData
library(car)
library(lmtest) # Para cargar el paquete 'lmtest'
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
if(!require(lmtest)){
install.packages(car)
}
library(lmtest)
if(!require(paqueteMETODOS)){
install.packages(paqueteMETODOS)
}
## Loading required package: paqueteMETODOS
## Loading required package: cubature
## Loading required package: GGally
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## Loading required package: MASS
## Loading required package: summarytools
## Loading required package: psych
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
## The following object is masked from 'package:car':
##
## logit
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ lubridate 1.9.2 ✔ tibble 3.2.1
## ✔ purrr 1.0.1 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%() masks ggplot2::%+%()
## ✖ psych::alpha() masks ggplot2::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::recode() masks car::recode()
## ✖ dplyr::select() masks MASS::select()
## ✖ purrr::some() masks car::some()
## ✖ tibble::view() masks summarytools::view()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(paqueteMETODOS)
if(!require(tidyverse)){
install.packages(tidyverse)
}
library(tidyverse)
# Instalaremos y cargaremos la librería devtools si aún no está instalada
if (!require(devtools)) {
install.packages("devtools")
}
## Loading required package: devtools
## Loading required package: usethis
library(ggplot2)
if(!require(dplyr)){
install.packages(dplyr)
}
library(dplyr)
if(!require(tidyr)){
install.packages(tidyr)
}
library(tidyr)
# Instalaremos y cargaremos la librería ggplot2 si aún no está instalada
if (!require(corrplot)) {
install.packages("corrplot")
}
## Loading required package: corrplot
## corrplot 0.92 loaded
library(corrplot)
library(paqueteMETODOS)
devtools::install_github("dgonxalex80/paqueteMETODOS")
Realice un análisis exploratorio de las variables precio de vivienda (millones de pesos COP) y área de la vivienda (metros cuadrados) - incluir gráficos e indicadores apropiados interpretados.
head(vivienda4)
## # A tibble: 6 × 5
## zona estrato preciom areaconst tipo
## <fct> <fct> <dbl> <dbl> <fct>
## 1 Zona Norte 4 220 52 Apartamento
## 2 Zona Norte 4 600 160 Casa
## 3 Zona Norte 4 320 108 Apartamento
## 4 Zona Sur 4 290 96 Apartamento
## 5 Zona Norte 4 220 82 Apartamento
## 6 Zona Norte 4 305 117 Casa
#Verificamos la cantidad de filas y columnas que tiene el dataset
str(vivienda4)
## spc_tbl_ [1,706 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ zona : Factor w/ 5 levels "Zona Centro",..: 2 2 2 5 2 2 2 2 2 2 ...
## $ estrato : Factor w/ 4 levels "3","4","5","6": 2 2 2 2 2 2 2 2 2 2 ...
## $ preciom : num [1:1706] 220 600 320 290 220 305 220 162 225 370 ...
## $ areaconst: num [1:1706] 52 160 108 96 82 117 75 60 84 117 ...
## $ tipo : Factor w/ 2 levels "Apartamento",..: 1 2 1 1 1 2 1 1 1 1 ...
# Grafico de densidad para el area de vivienda en azul
ggplot(vivienda4, aes(x = areaconst)) +
geom_density(fill = "#0072B2", color = "#0072B2") + # Color azul para la densidad
labs(x = "Area de la vivienda", y = "Densidad") +
theme_minimal() # Opcional: Aplicar un tema minimalista
conteo_apt <- table(vivienda4$tipo)
print(conteo_apt)
##
## Apartamento Casa
## 1363 343
De acuerdo a esto vamos a realizar el estudio unicamene de los apartemtos ya que es donde se encuentra la mayor cantidad de data con una area menor a 100 para enfocarnos unicamente en los apartamentos hasta ese tamañ..
# Grafico de densidad para el area de vivienda en azul
ggplot(vivienda4, aes(x = preciom)) +
geom_density(fill = "#0072B2", color = "#0072B2") +
labs(x = "Precio de la vivienda", y = "Densidad") +
theme_minimal()
data(vivienda4)
Apto <- filter(vivienda4, tipo == "Apartamento")
chuck(Apto)
## # A tibble: 1,363 × 5
## zona estrato preciom areaconst tipo
## <fct> <fct> <dbl> <dbl> <fct>
## 1 Zona Norte 4 220 52 Apartamento
## 2 Zona Norte 4 320 108 Apartamento
## 3 Zona Sur 4 290 96 Apartamento
## 4 Zona Norte 4 220 82 Apartamento
## 5 Zona Norte 4 220 75 Apartamento
## 6 Zona Norte 4 162 60 Apartamento
## 7 Zona Norte 4 225 84 Apartamento
## 8 Zona Norte 4 370 117 Apartamento
## 9 Zona Norte 4 155 60 Apartamento
## 10 Zona Norte 4 240 75 Apartamento
## # ℹ 1,353 more rows
2.Realice un análisis exploratorio bivariado de datos, enfocado en la relación entre la variable respuesta (precio) en función de la variable predictora (area construida) - incluir gráficos e indicadores apropiados interpretados.
ggplot(Apto, aes(x = areaconst)) +
geom_density(fill = "#0072B2", color = "#0072B2") +
labs(x = "Area de la vivienda", y = "Densidad") +
theme_minimal() +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())
# Análisis descriptivo de las variables precio y area construida
summary(Apto$preciom)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 78.0 153.5 185.0 202.4 240.0 645.0
summary(Apto$areaconst)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 40.00 60.00 70.00 75.48 84.00 200.00
Encontramos que el precio promedio de viviendas es de $185 millones COP y el área construida promedio es de 70.0 mts cuadrados.
Vamos a realizar un analisis del precio de la vivienda en función del area construida
ggplot(Apto, aes(x = areaconst, y = preciom)) +
geom_point(color = "#0072B2") + # Color personalizado
labs(x = "Area Construida (metros cuadrados)", y = "Precio de Vivienda (millones de pesos COP)")
La distribución de los datos es asimétrica hacia la derecha, lo que
significa que hay un mayor número de viviendas con precios bajos que con
precios altos.
# Histograma Precio Viviendas
ggplot(Apto, aes(x = preciom)) +
geom_histogram(bins = 30, fill = "#0072B2", color = "black") + # Relleno y borde con color personalizado
labs(x = "Precio de Vivienda (millones de pesos COP)", y = "Frecuencia") +
theme_minimal()
3. Estime el modelo de regresión lineal simple entre precio=f(area)+ε.
Interprete los coeficientes del modelo β0, β1 en caso de ser
correcto.
modelo_lineal = lm(preciom ~ areaconst, data=Apto)
summary(modelo_lineal)
##
## Call:
## lm(formula = preciom ~ areaconst, data = Apto)
##
## Residuals:
## Min 1Q Median 3Q Max
## -225.404 -23.902 -4.754 25.763 209.021
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 39.04679 4.09977 9.524 <2e-16 ***
## areaconst 2.16473 0.05204 41.595 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 43.34 on 1361 degrees of freedom
## Multiple R-squared: 0.5597, Adjusted R-squared: 0.5594
## F-statistic: 1730 on 1 and 1361 DF, p-value: < 2.2e-16
Al aplicar el modelo de regresión lineal, observamos que los coeficientes de intercepto y pendiente son 39.05 y 2.16, respectivamente. Esto indica que el área tiene un impacto significativo en la explicación del precio de los apartamentos. El valor del intercepto, β0, es de 39 millones, lo que representa el precio base sin tener en cuenta la superficie construida, es decir, el valor intrínseco del lugar donde se ubicará el apartamento. En cuanto a β1, que tiene un valor de 2.16, indica la pendiente de la relación. Esto significa que por cada metro cuadrado adicional en el apartamento, el precio aumenta en 2.16 millones. Por lo tanto, la ecuación de regresión toma la forma:
Precio = 39.05 + 2.16 × (área construida) + 43.34
4.Construir un intervalo de confianza (95%) para el coeficiente β1, interpretar y concluir si el coeficiente es igual a cero o no. Compare este resultado con una prueba de hipótesis t.
# Intervalo de confianza para el coeficiente de área construida
confint(modelo_lineal, parm = "areaconst", level = 0.95)
## 2.5 % 97.5 %
## areaconst 2.06264 2.266826
El intervalo de confianza indica que el coeficiente β1 está entre 2.06 y 2.26 millones de pesos. Esto significa que, con un 95% de confianza, el aumento en el precio esperado de una vivienda por cada metro cuadrado adicional de área construida está entre 2.06 y 2.26 millones de pesos COP.
Prueba de Hipotesis
La hipótesis nula (H0) plantea que el coeficiente β1 es igual a cero, lo que implica la ausencia de una relación entre el precio de la vivienda y el área construida. En contraste, la hipótesis alternativa (H1) sostiene que β1 tiene un valor distinto de cero.
# Prueba de hipótesis t para el coeficiente de área construida
summary(modelo_lineal)$coefficients
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 39.046787 4.09976963 9.524142 7.307017e-21
## areaconst 2.164733 0.05204291 41.595152 1.056327e-244
De acuerdo a nuestros resultados tenemos un valor p cercano a cero lo cual implica que la relación entre el precio de la vivienda y el área construida es significativa y no se debe al azar. Por lo tanto, se puede rechazar la hipótesis nula y concluir que el coeficiente β1 es diferente de cero, lo que significa que el área construida tiene un impacto estadísticamente significativo en el precio de la vivienda.
5.Calcule e interprete el indicador de bondad R2.
r2 = summary(modelo_lineal)$r.squared
print( paste("El valor del coeficiente de determinacion es (R2): ", r2) )
## [1] "El valor del coeficiente de determinacion es (R2): 0.559711740661315"
Un R² de 0.5597 sugiere que el modelo de regresión lineal es capaz de explicar una parte significativa de la variabilidad en los precios de vivienda, pero aún queda una cantidad considerable de variabilidad no explicada.
Apt_110 <- data.frame(areaconst= 110)
predict (modelo_lineal, Apt_110, interval = "confidence", level = 0.95)
## fit lwr upr
## 1 277.1674 272.9573 281.3775
Un apartamento en la misma zona con 110 metros cuadrados a un precio de 200 millones de pesos colombianos sería una oferta atractiva desde una perspectiva puramente basada en el precio si el valor medio estimado para una vivienda de 110 metros cuadrados es de 277.16 millones de pesos, según el análisis de regresión. Esto podría sugerir que el precio ofrecido es significativamente más bajo que el promedio estimado.
Supuesto de Linealidad
El supuesto de linealidad se apoya en la idea de que la relación entre la variable de respuesta y la variable predictora sigue un patrón lineal. Para evaluar este supuesto, se utiliza un gráfico que representa la dispersión de residuos estandarizados en relación a los valores predichos.
# Obtener los residuos del modelo
residuos <- residuals(modelo_lineal)
# Gráficos para validar supuestos
par(mfrow=c(2,2))
# Gráfico de dispersión entre residuos y predicciones
plot(modelo_lineal$fitted.values, residuos,
xlab = "Predicciones", ylab = "Residuos",
main = "Residuos vs. Predicciones", col = "#0072B2")
Al observar el gráfico, notamos que los residuos estandarizados
presentan una dispersión aparentemente aleatoria alrededor de la línea
central en cero. Este patrón nos lleva a concluir que el supuesto de
linealidad se cumple.
Supuesto de Homocedasticidad
Este supuesto establece que la varianza de los residuos se mantiene constante para todos los valores de la variable predictora. Para verificar esta premisa, podemos emplear un gráfico de residuos estandarizados en función de los valores predichos, lo que nos permite evaluar la homocedasticidad.
# Gráfico de residuos estandarizados vs. predicciones
plot(modelo_lineal$fitted.values, rstandard(modelo_lineal),
xlab = "Predicciones", ylab = "Residuos Estandarizados",
main = "Residuos Estandarizados vs. Predicciones")
abline(h = 0, col = "#0072B2")
La evaluación del gráfico nos permite determinar si la variabilidad de
los residuos se mantiene constante a lo largo de los valores ajustados.
En este caso, observamos un patrón en el que la dispersión se amplía a
medida que los valores ajustados aumentan, y notamos una mayor
concentración de puntos a la izquierda.
Este patrón no es horizontal ni uniforme, lo que sugiere que la variabilidad de los residuos no es constante. En lugar de cumplirse el supuesto de homocedasticidad, parece que existe heterocedasticidad en los datos. La heterocedasticidad indica que la variabilidad de los errores no es uniforme a lo largo de la variable predictora.
Es importante abordar la heterocedasticidad, ya que puede afectar la precisión de las estimaciones y la validez de las pruebas estadísticas en el modelo de regresión. Pueden requerirse transformaciones de variables o métodos específicos para abordar esta cuestión y garantizar que se cumplan los supuestos del modelo.
Supuesto de normalidad
El supuesto de normalidad en estadísticas se relaciona con la distribución de los residuos de un modelo o un conjunto de datos. Se espera que estos residuos, que son las diferencias entre los valores observados y los valores predichos, sigan una distribución normal, lo que implica que estén simétricamente distribuidos alrededor de la media.
# Gráfico de densidad de los residuos con color azul
plot(density(residuos), col = "#0072B2",
xlab = "Residuos", main = "Densidad de Residuos")
# Gráfico cuantil-cuantil de los residuos con color azul
qqnorm(residuos, main = "Q-Q Plot de Residuos", col = "#0072B2")
qqline(residuos, col = "red") # Agregamos una línea de referencia en rojo
Del grafico anterior se puede observar que los residuos se distribuyen
de forma cercana a la lineal. Por lo tanto, la observación de una
distribución de residuos que se asemeja a una disposición lineal sugiere
que el supuesto de normalidad en el modelo podría considerarse
válido.
Supuesto de Independencia
El supuesto de independencia se relaciona con la idea de que los residuos son independientes entre sí. Para evaluar este supuesto, podemos recurrir al gráfico de autocorrelación de los residuos. Este gráfico nos ayuda a determinar si existe alguna relación o patrón sistemático en la secuencia de residuos, lo que podría indicar la falta de independencia.
# Calcular los residuos estandarizados del modelo
rstudent <- rstudent(modelo_lineal)
# Calcular el rezago de los residuos estandarizados
rstudent_lag <- lag(rstudent)
ggplot(modelo_lineal, aes(x = rstudent_lag, y = rstudent)) +
geom_point(color = "#0072B2")
El gráfico de autocorrelación de los residuos no revela evidencia de
patrones sistemáticos o autocorrelación significativa entre los
residuos. Esto es indicativo de que los residuos son independientes
entre sí y cumple con el supuesto de independencia en el análisis. La
ausencia de autocorrelación es importante para garantizar que los
errores del modelo no estén relacionados en una secuencia ordenada, lo
que podría afectar la validez de las inferencias estadísticas. Por lo
tanto, la falta de evidencia de autocorrelación en los residuos respalda
la validez de este supuesto en el análisis.
# Realizar la transformación de Box-Cox
boxcox_result <- boxcox(lm(Apto$preciom ~ Apto$areaconst, data = Apto), lambda = -3:3)
# Modificar el color del gráfico en el resultado
plot(boxcox_result, col = "#0072B2")
bc<-boxcox(lm(Apto$preciom ~ Apto$areaconst), lambda = -1:1)
optimal_lambda <- bc$x[which.max(bc$y)]
# Graficar el resultado
plot(bc, main = paste("Box-Cox Transformation (Optimal Lambda =", round(optimal_lambda, 3), ")"))
lambda <- bc$x[which.max(bc$y)]
lambda
## [1] -0.1313131
El valor de lambda, que es -0.1313, indica que sería apropiado expresar la variable dependiente (precio) en una escala logarítmica. La razón principal es que el gráfico muestra que el valor 0 está dentro del intervalo de confianza del λ óptimo, y la estimación está muy cerca de 0. Por lo tanto, en esta situación, la elección más adecuada sería aplicar una transformación logarítmica a la variable de precio.
y1 = ((Apto$preciom ^ lambda) - 1 )/ lambda
modelo_Box=lm(y1 ~ areaconst, data=Apto)
summary(modelo_Box)
##
## Call:
## lm(formula = y1 ~ areaconst, data = Apto)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.48740 -0.06527 -0.00535 0.07957 0.32740
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.4459708 0.0097192 354.55 <2e-16 ***
## areaconst 0.0046628 0.0001234 37.79 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1027 on 1361 degrees of freedom
## Multiple R-squared: 0.5121, Adjusted R-squared: 0.5117
## F-statistic: 1428 on 1 and 1361 DF, p-value: < 2.2e-16
Se puede observar que, en el nuevo modelo, tanto el punto de intercepción como el coeficiente correspondiente al área de construcción mantienen su significancia, y la prueba de bondad es muy similar a la que teníamos en el modelo original.Esto demuestra que tanto el término de intercepción como el coeficiente para el área de construcción mantienen una alta significancia, lo que sugiere que siguen siendo importantes en la explicación de la variable dependiente (y1). El valor del coeficiente de determinación ajustado (Adjusted R-squared) es aproximadamente 0.5117, lo que indica que el modelo sigue siendo válido para describir la relación entre estas variables.
Prueba de Breusch-Pagan
La prueba de Breusch-Pagan es una prueba estadística utilizada para determinar si la varianza de los errores en un modelo de regresión es constante en relación con las variables independientes. En otras palabras, esta prueba evalúa si se cumple el supuesto de homocedasticidad, que establece que la varianza de los errores debe ser constante a lo largo de todas las combinaciones de valores de las variables predictoras.
lmtest::bptest(modelo_Box)
##
## studentized Breusch-Pagan test
##
## data: modelo_Box
## BP = 130.48, df = 1, p-value < 2.2e-16
El valor p extremadamente pequeño (p < 2.2e-16) sugiere fuerte evidencia en contra del supuesto de homocedasticidad, indicando la presencia de heterocedasticidad en los errores del modelo.
prueba de Durbin-Watson
El resultado de esta prueba proporcionará información sobre si los errores (residuos) del modelo muestran algún patrón de correlación serial, es decir, si los valores de los residuos están relacionados con los valores anteriores de los residuos. Esto puede ocurrir, por ejemplo, en series temporales o datos donde las observaciones están ordenadas en el tiempo.
lmtest::dwtest(modelo_Box)
##
## Durbin-Watson test
##
## data: modelo_Box
## DW = 1.3101, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
cat(“Informe para Inmobiliaria A&C”)
cat(“Resumen General:”) cat(“Durante el período de revisión en Cali, encontramos 1,363 apartamentos en estrato 4, principalmente en la zona Sur. Estos apartamentos tienen áreas construidas que varían de 40 a 200 metros cuadrados, con una mediana de 70 metros cuadrados.”) cat(“Los precios de estos apartamentos varían significativamente, desde 78 hasta 645 millones de pesos. Lo interesante es que hemos encontrado una fuerte correlación entre el área construida y el precio; a medida que el área aumenta, también lo hace el precio, y esta relación es estadísticamente significativa. Esto es un punto importante a considerar al fijar los precios.”) cat(“El 25% de los apartamentos cuesta menos de 153 millones, mientras que el 25% cuesta más de 240 millones.”)
cat(“Predicciones Utilizando Modelos Estadísticos:”) cat(“Si bien hemos intentado modelar la relación entre el área construida y el precio, debemos señalar que los modelos estadísticos que calculamos presentan resultados débiles y pueden estar sesgados. Incluso después de realizar ajustes (transformaciones) en los modelos, no logramos cumplir con todos los supuestos necesarios.”) cat(“Los modelos indican que, en promedio, por cada metro cuadrado adicional en un apartamento, el precio aumenta en 2.16 millones, con un rango de 2.06 a 2.26 millones. Si el área del apartamento es el valor promedio de 75.5 metros cuadrados, el precio promedio sería de 202 millones.”) cat(“Según las predicciones, un apartamento de aproximadamente 110 metros cuadrados podría tener un precio de alrededor de 440 millones, con un rango entre 429 y 452 millones de pesos. Encontrar un apartamento de 110 metros cuadrados por 200 millones sería una oferta excepcional.”)
cat(“Recomendación:”) cat(“Esperamos que esta información sea valiosa a la hora de establecer los precios de las viviendas que ustedes ofertan. Sin embargo, les recomendamos cautela al utilizar los resultados de los modelos estadísticos, ya que estos pueden ser un indicio pero no una verdad absoluta. Lo que sí está claro es que, en general, apartamentos más grandes tienden a tener precios más elevados.”) cat(“Gracias por confiar en nuestro análisis. Estamos disponibles para responder cualquier pregunta o aclaración que puedan necesitar. ¡Buena suerte en sus negocios!”)