library(readxl)
Datos_Vivienda <- read_excel("Datos_Vivienda.xlsx")Par_2
En el siguiente documento desarrollado en Quarto se va a utilizar el lenguaje de programación R para resolver los puntos planteados.
Punto 1
En el primer punto disponemos de una base de datos de un conjunto de viviendas en la cual tenemos la información de zona, piso, estrato, precio por millón, área contruída, parqueaderos, Baños, Habitaciones, Tipo (casa o apartamento), barrio, coordenadas (longitud y latitud) de la ciudad de Cali.
Para empezar a trabajar con la base de datos, primero tenemos que importarla.
Esta es la ubicación de las viviendas que tenemos en nuestra base de datos.
Loading required package: leaflet
Warning in validateCoords(lng, lat, funcName): Data contains 3 rows with either
missing or invalid lat/lon values and will be ignored
Ítem 1
En el ítem 1 nos pide filtrar por barrio las variables precio por millón y el área construida. En este caso, el barrio de interés es el ingenio
datos_filtrados <- subset(Datos_Vivienda, Barrio == "el ingenio")
library(dplyr)
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
datos_filtrados <- select(datos_filtrados, precio_millon, Area_contruida,cordenada_longitud,Cordenada_latitud)Esta es la ubicación de las viviendas que tenemos flitradas y nos piden en el item 1
require(leaflet)
leaflet() %>% addTiles() %>% addCircleMarkers(lng = datos_filtrados$cordenada_longitud,lat = datos_filtrados$Cordenada_latitud,radius = 0.2,clusterOptions =)Ítem 2
En este item nos piden realizar una regresión lineal simple.
En este caso, “precio_millon” es la variable de respuesta y “Area_contruida” es la variable predictor.
# Ajustamos el modelo lineal
modelo_lm <- lm(precio_millon ~ Area_contruida, data = datos_filtrados)
# Creamos el gráfico
plot(datos_filtrados$Area_contruida, datos_filtrados$precio_millon,
xlab = "Área construida (m²)", ylab = "Precio (millones de pesos)",
main = "Relación entre precio y área construida")
abline(modelo_lm, col = "red")Del resumen a continuación podemos ver que el p valor es mucho menor a 0.05, de lo cual podemos inferir que es bastante significativo este valor. Otra cosa que podemos observar es que el Multiple R-squared es 0.7738, lo cual nos indica que el modelo explica el 77.38% de la variabilidad en el precio por millón.
summary(modelo_lm)
Call:
lm(formula = precio_millon ~ Area_contruida, data = datos_filtrados)
Residuals:
Min 1Q Median 3Q Max
-282.09 -61.15 -8.32 45.89 477.33
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 195.71496 11.63854 16.82 <2e-16 ***
Area_contruida 1.21159 0.04632 26.16 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 105.2 on 200 degrees of freedom
Multiple R-squared: 0.7738, Adjusted R-squared: 0.7727
F-statistic: 684.2 on 1 and 200 DF, p-value: < 2.2e-16
Ítem 3
En el tercer item nos piden involucrar ahora la variable de tipo vivienda y realizar de nuevo un análisis usando Regresión Categórica.
datos_filtrados <- subset(Datos_Vivienda, Barrio == "el ingenio")
library(dplyr)
datos_filtrados_tipo <- select(datos_filtrados, precio_millon, Tipo, Area_contruida)
show(datos_filtrados_tipo)# A tibble: 202 × 3
precio_millon Tipo Area_contruida
<dbl> <chr> <dbl>
1 1450 Casa 1200
2 290 Apartamento 100
3 360 Apartamento 99
4 550 Apartamento 197
5 410 Apartamento 136
6 390 Apartamento 198
7 300 Apartamento 147
8 250 Apartamento 97
9 370 Apartamento 104
10 1200 Casa 616
# ℹ 192 more rows
library(fastDummies)
datos_filtrados_tipo_dummy <- dummy_cols(datos_filtrados_tipo,
select_columns = "Tipo")
show(datos_filtrados_tipo_dummy)# A tibble: 202 × 5
precio_millon Tipo Area_contruida Tipo_Apartamento Tipo_Casa
<dbl> <chr> <dbl> <int> <int>
1 1450 Casa 1200 0 1
2 290 Apartamento 100 1 0
3 360 Apartamento 99 1 0
4 550 Apartamento 197 1 0
5 410 Apartamento 136 1 0
6 390 Apartamento 198 1 0
7 300 Apartamento 147 1 0
8 250 Apartamento 97 1 0
9 370 Apartamento 104 1 0
10 1200 Casa 616 0 1
# ℹ 192 more rows
modelo_vivienda_RC<- lm(precio_millon~Area_contruida+Tipo_Casa, data=datos_filtrados_tipo_dummy)
summary(modelo_vivienda_RC)
Call:
lm(formula = precio_millon ~ Area_contruida + Tipo_Casa, data = datos_filtrados_tipo_dummy)
Residuals:
Min 1Q Median 3Q Max
-277.45 -48.20 -9.33 53.92 491.45
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 196.11964 10.91567 17.967 < 2e-16 ***
Area_contruida 1.02197 0.05616 18.196 < 2e-16 ***
Tipo_Casa 99.24986 18.63125 5.327 2.69e-07 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 98.68 on 199 degrees of freedom
Multiple R-squared: 0.802, Adjusted R-squared: 0.8
F-statistic: 403.1 on 2 and 199 DF, p-value: < 2.2e-16
La sección “Residual standard error” muestra el error estándar de los residuos. Mientras que “Multiple R-squared” indica la cantidad de variabilidad en la variable respuesta que es explicada por el modelo (80.2%). El valor de “Adjusted R-squared” es similar al anterior, pero tiene en cuenta el número de variables incluidas en el modelo. Finalmente, “F-statistic” y “p-value” indican la significancia estadística general del modelo y su capacidad para explicar la variabilidad en la variable respuesta, respectivamente. En este caso, tanto el valor de F como el p-value son muy bajos, lo que indica que el modelo es altamente significativo.
Ítem 4
El análisis de varianza (ANOVA) muestra que la inclusión de la variable ficticia Tipo en el modelo de regresión mejora su ajuste en comparación con el modelo que usa solo el área incorporada. La suma residual de cuadrados (RSS) muestra que el modelo de variable ficticia es útil para explicar los cambios en los precios de la vivienda en el área de El Ingenio. Los resultados F bajos y los valores p significativos indican que esta mejora no es aleatoria. Por lo tanto, la variable ficticia Tipo_Casa es importante para explicar la volatilidad de los precios de la vivienda en el área de El Ingenio.
anova(modelo_lm,modelo_vivienda_RC)Analysis of Variance Table
Model 1: precio_millon ~ Area_contruida
Model 2: precio_millon ~ Area_contruida + Tipo_Casa
Res.Df RSS Df Sum of Sq F Pr(>F)
1 200 2214303
2 199 1937949 1 276354 28.378 2.687e-07 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
par(mfrow=c(2,2))
plot(modelo_lm)El resultado de la prueba de Shapiro-Wilk sugiere que la distribución de los residuos no sigue una distribución normal. El valor de p es muy bajo (p = 5.66e-07), lo que indica que hay suficiente evidencia para rechazar la hipótesis nula de que los residuos siguen una distribución normal.
residuos <- resid(modelo_lm)
shapiro.test(residuos)
Shapiro-Wilk normality test
data: residuos
W = 0.94495, p-value = 5.66e-07
Punto 2
En el siguiente punto tenemos una base de datos de la masa y la edad de una persona, vamos a desarrollar los items en el lenguaje de programacion R
A continuación vamos a cargar la base datos para empezar a analizar la informacion
DatosME <- read.table("DatosME.txt", header = FALSE )
show(DatosME) V1 V2
1 106 43
2 106 41
3 97 47
4 113 46
5 96 45
6 119 41
7 92 47
8 112 41
9 92 48
10 102 48
11 107 42
12 107 47
13 102 43
14 115 44
15 101 42
16 87 55
17 91 57
18 97 56
19 82 59
20 78 57
21 95 54
22 98 53
23 94 52
24 96 53
25 100 54
26 84 60
27 70 59
28 104 51
29 76 59
30 93 57
31 73 68
32 73 63
33 76 60
34 80 63
35 84 63
36 71 64
37 64 66
38 88 65
39 79 60
40 88 65
41 73 65
42 74 69
43 76 61
44 87 70
45 70 68
46 69 78
47 54 78
48 62 78
49 78 72
50 65 70
51 64 73
52 74 76
53 87 78
54 63 78
55 82 71
56 80 75
57 52 77
58 56 76
59 70 72
60 74 76
masa <- DatosME[, 1]
edad <- DatosME[, 2]Ítem 1
##Idea 2
#Normalizacion de la variable edad
edad_barra <- mean(edad)
#Deficion de la nueva varible normalizada
xi <- edad - edad_barra
#Elaboración del modelo cuadratico
modelo_cuadratico <- lm(masa ~ xi + I(xi^2))
modelo_linel <- lm(masa ~ edad )
#Elaboración de las gráficas
library(ggplot2)
ggplot(data = data.frame(x = xi, y = masa), aes(x, y)) +
geom_point() +
geom_smooth(method = "lm", formula = y ~ x + I(x^2), se = FALSE)Ítem 2
Los betas son los siguientes:
- β0 (intersección): 82.935749
- β1 (pendiente): -1.183958
- β11 (coeficiente de la variable independiente al cuadrado): 0.014840
El intercepto (β0) es de 82.94, lo que sugiere que la masa promedio a la edad cero es de 82.94 kg. El coeficiente de la variable independiente (β1) es -1.18, lo que indica que a medida que la edad aumenta en una unidad, la masa disminuye en 1.18 kg. El coeficiente del término cuadrático (β11) no es significativo (p=0.0811), lo que sugiere que la relación entre la masa y la edad puede no ser completamente cuadrática.
#Resumen del modelo
summary(modelo_cuadratico)
Call:
lm(formula = masa ~ xi + I(xi^2))
Residuals:
Min 1Q Median 3Q Max
-15.086 -6.154 -1.088 6.220 20.578
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 82.935749 1.543146 53.745 <2e-16 ***
xi -1.183958 0.088633 -13.358 <2e-16 ***
I(xi^2) 0.014840 0.008357 1.776 0.0811 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 8.026 on 57 degrees of freedom
Multiple R-squared: 0.7632, Adjusted R-squared: 0.7549
F-statistic: 91.84 on 2 and 57 DF, p-value: < 2.2e-16
Ítem 3
Para verificar si el término cuadrático debe eliminarse del modelo, puede realizar una prueba de hipótesis. La hipótesis nula asume que el coeficiente del término cuadrático (β11) es cero, lo que indica que la relación entre tamaño y edad es igual. El valor p asociado al coeficiente de β11 es 0.0811, lo que indica que no hay suficiente evidencia para rechazar la hipótesis nula. Sin embargo, si el término cuadrático tiene una definición clara o precisa, la eliminación del término cuadrático puede justificarse por razones prácticas más que cuantitativas.
Ítem 4
# Scatterplot de la variable "Masa" vs. su forma cuadrática "Masa^2" (antes de la transformación)
plot(DatosME$V1, DatosME$V1^2, col="blue", main="Scatterplot de Masa vs. Masa^2 (antes de la transformación)")# Scatterplot de la variable "xi" vs. su forma cuadrática "xi^2" (después de la transformación)
xi <- DatosME$V1 - mean(DatosME$V1)
plot(xi, xi^2, col="red", main="Scatterplot de xi vs. xi^2 (después de la transformación)")Sí, se justifica la transformación de la variable en el punto inicial (centrar la variable) para eliminar la multicolinealidad entre la variable y su forma cuadrática, debido a que la correlación entre ambas variables antes de la transformación es muy alta, lo que indica multicolinealidad.
En el scatterplot de la variable “Masa” versus su forma cuadrática “Masa^2” (antes de la transformación), se puede observar que los puntos están muy cercanos a una línea recta, lo que indica una fuerte correlación lineal positiva entre ambas variables.
En cambio, después de la transformación en el punto inicial, en el scatterplot de la variable “xi” versus su forma cuadrática “xi^2”, se puede observar que la correlación entre ambas variables es mucho más débil, lo que sugiere que la multicolinealidad se ha reducido significativamente.
Por lo tanto, la transformación de la variable en el punto inicial es una forma efectiva de eliminar la multicolinealidad entre la variable y su forma cuadrática.
par(mfrow=c(2,2))
plot(modelo_linel)residuos_2 <- resid(modelo_cuadratico)
shapiro.test(residuos_2)
Shapiro-Wilk normality test
data: residuos_2
W = 0.97666, p-value = 0.3039
residuos_3 <- resid(modelo_linel)
shapiro.test(residuos_3)
Shapiro-Wilk normality test
data: residuos_3
W = 0.97958, p-value = 0.4112
El resultado de la prueba de Shapiro-Wilk sugiere que la distribución de los residuos puede seguir una distribución normal. El valor de p es relativamente alto tanto para el modelo cuadrático, como para un modelo lineal con estos datos, lo que indica que no hay suficiente evidencia para rechazar la hipótesis nula de que los residuos siguen una distribución normal.