ACTIVIDAD: MODELO DE REGRESION LINEAL SIMPLE Y MULTIPLE

1.- PRECIO BARRIL WTI Y VALOR ACCION ECOPETROL

Analizar el comportamiento de los precios de las Acciones de Ecopetrol según la variación del precio del barril de petróleo WTI producido en Colombia.

A continuación se realiza la exploración y análisis univariado sobre los datos dispuestos.

# Librerias necesarias
library(readxl)
library(psych)
require(ggplot2)
require(plotly)
require(CGPfunctions)


# Cargue de los datos
acciones_ecopetrol <- read_excel("ecopetrol.xlsx")
attach(acciones_ecopetrol)

1.1.- Exploración de los datos y análisis Univariado

Un primera exploración gráfica (Histograma y curva normal) a las variables “precio_petroleo_WTI_US” (independiente) y “precio_accion_ecopetrol_COP” (dependiente) muestra que ambas variables se alejan un poco de la Distribución Normal. Esto lo confirma la aplicación de un gráfico QQ de normalidad sobre ambas variables.
Posteriormente se aplica un test de normalidad de Shapiro-Wilks para verificar si las muestras de cada variable provienen de una Distribución Normal(hipótesis Nula \(H0\)) con un nivel de confianza establecido en un \(α=0.05\) (5%).

  • Para el caso de la variable “precio_petroleo_WTI_US” se obtiene un \(p-value = 0.03224\) que es ligeramente menor a \(0.05\). Podemos establecer que la hipótesis nula NO es rechazada y la variable \(X\) presenta una Distribución Normal.

  • Para la variable “precio_accion_ecopetrol_COP” el test de Shapiro-Wilks muestra un \(p-valor=0.3518\) que ya es bastante elevado y supera notablemente el umbral \(0.05\). La hipótesis nula NO es rechazada y la variable \(Y\) presenta una distribución normal.

# Exploración de los datos
describe(acciones_ecopetrol)
vars n mean sd median trimmed mad min max range skew kurtosis se
fecha 1 18 NaN NA NA NaN NA Inf -Inf -Inf NA NA NA
precio_accion_ecopetrol_COP 2 18 1108.38889 78.423540 1120.000 1110.3750 70.42350 955.00 1230.00 275.00 -0.5163108 -0.8021738 18.4846057
precio_petroleo_WTI_US 3 18 35.53056 2.118183 36.055 35.7025 1.77912 30.44 37.87 7.43 -1.0058958 -0.0024506 0.4992605
# Histograma variable -> precio_petroleo_WTI_US
hist(precio_petroleo_WTI_US, probability=TRUE, breaks=9, col="#336699", ylab="Densidad", xlab="WTI", main="Histograma Precio WTI", )
x = seq(min(precio_petroleo_WTI_US), max(precio_petroleo_WTI_US), length = 40)
f = dnorm(x, mean = mean(precio_petroleo_WTI_US), sd = sd(precio_petroleo_WTI_US))
lines(x,f, col="black", lwd=3)
l_media = mean(precio_petroleo_WTI_US)
abline(v=l_media, col="red", lwd=3)

# Test de Normalidad sobre la variable precio_petroleo_WTI_US
qqnorm(precio_petroleo_WTI_US, main = "Gráfico QQ de Normalidad - precio_petroleo_WTI_US", col = "darkred")
qqline(precio_petroleo_WTI_US)

shapiro.test(precio_petroleo_WTI_US)
## 
##  Shapiro-Wilk normality test
## 
## data:  precio_petroleo_WTI_US
## W = 0.88542, p-value = 0.03224
# Histograma variable -> Precio_accion_ecopetrol_COP
hist(precio_accion_ecopetrol_COP, probability=TRUE, breaks=5, col="#336699", ylab="Densidad", xlab="Precio_accion", main="Histograma Precio accion Ecopetrol")
x = seq(min(precio_accion_ecopetrol_COP), max(precio_accion_ecopetrol_COP), length = 40)
f = dnorm(x, mean = mean(precio_accion_ecopetrol_COP), sd = sd(precio_accion_ecopetrol_COP))
lines(x,f, col="black", lwd=3)
l_media = mean(precio_accion_ecopetrol_COP)
abline(v=l_media, col="red", lwd=3)

qqnorm(precio_accion_ecopetrol_COP, main = "precio_accion_ecopetrol_COP", col = "blue")
qqline(precio_accion_ecopetrol_COP)

shapiro.test(precio_accion_ecopetrol_COP)
## 
##  Shapiro-Wilk normality test
## 
## data:  precio_accion_ecopetrol_COP
## W = 0.94498, p-value = 0.3518

1.2.- Analisis Bivariado

Se aplica un gráfico de dispersión que muestra de manera visual y aproximada un posible correlación positiva entre las variables.
Posteriormente se aplica la función de correlación y se encuentra el Coeficiente de Correlación \(R = 0.707\). Que indica que las variables tienen una correlación en un rango que puede considerarse Alto.

# EXPLORACION Y ANALISIS BIVARIADO

g1=ggplot(data=acciones_ecopetrol,aes(y=precio_accion_ecopetrol_COP, x=precio_petroleo_WTI_US))+geom_point()+geom_smooth()
ggplotly(g1)
# CORRELACION DE LAS VARIABLES

cor(precio_petroleo_WTI_US,precio_accion_ecopetrol_COP)
## [1] 0.7074373

A continuación se aplica un test de significancia a la correlación obtenida para verificar si posee un p-valor significativo. En este caso el resultado del p-valor indica el nivel de dependencia o correlación de las variables, podemos entonces establecer el valor \(\alpha=0.05\) y como Hipótesis Nula \(H0 = \text{Las variables no tienen correlacion alguna}\).
El resultado obtenido es un \(p-valor=0.001024\) lo cual indica que se rechaza la hipótesis Nula (\(H0\)) y las variables SI estás correlacionadas.

cor.test(x = precio_petroleo_WTI_US,
         y = (precio_accion_ecopetrol_COP), 
         alternative = "two.sided",
         conf.level  = 0.95,
         method      = "pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  precio_petroleo_WTI_US and (precio_accion_ecopetrol_COP)
## t = 4.0037, df = 16, p-value = 0.001024
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3592064 0.8827512
## sample estimates:
##       cor 
## 0.7074373

1.3.- Modelo de Regresión Lineal

A continuación se aplica un Modelo de Regresión Lineal a las variables “precio_petroleo_WTI_US” (independiente o predictora) y “precio_accion_ecopetrol_COP” (dependiente o respuesta).
Aunque en el paso anterior se verificó la significancia de la correlación, en el modelo de regresión planteado, se obtiene un Coeficiente de Determinación bajo igual a \(R^2=0.4692\). Lo que implica que en el modelo de regresión obtenido explica el 47% de la variablidad de la variable dependiente \(Y\) (“precio_accion_ecopetrol_COP”).

modelo=lm(precio_accion_ecopetrol_COP~precio_petroleo_WTI_US,data=acciones_ecopetrol)
summary(modelo)
## 
## Call:
## lm(formula = precio_accion_ecopetrol_COP ~ precio_petroleo_WTI_US, 
##     data = acciones_ecopetrol)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -59.90 -40.74 -15.94  33.40 136.82 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)   
## (Intercept)             177.768    232.828   0.764  0.45627   
## precio_petroleo_WTI_US   26.192      6.542   4.004  0.00102 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 57.13 on 16 degrees of freedom
## Multiple R-squared:  0.5005, Adjusted R-squared:  0.4692 
## F-statistic: 16.03 on 1 and 16 DF,  p-value: 0.001024
par(mfrow=c(2,2))
plot(modelo)

1.4.- Transformaciones sobre el Modelo

A continuación se aplican distintas transformaciones sobre el modelo para mejorar la bondad del ajuste y por consiguiente el nivel de predictibilidad.

# 1.- AJUSTE EXPONENCIAL
modelog1=lm(log(precio_accion_ecopetrol_COP)~precio_petroleo_WTI_US,data=acciones_ecopetrol)
summary(modelog1)
## 
## Call:
## lm(formula = log(precio_accion_ecopetrol_COP) ~ precio_petroleo_WTI_US, 
##     data = acciones_ecopetrol)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.05440 -0.03599 -0.01496  0.02970  0.12101 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            6.122915   0.208590  29.354 2.42e-15 ***
## precio_petroleo_WTI_US 0.024917   0.005861   4.251 0.000609 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.05119 on 16 degrees of freedom
## Multiple R-squared:  0.5304, Adjusted R-squared:  0.5011 
## F-statistic: 18.07 on 1 and 16 DF,  p-value: 0.0006095
par(mfrow=c(2,2))
plot(modelog1)

# 1.- AJUSTE LOGARITMICO
modelog2=lm(precio_accion_ecopetrol_COP~log(precio_petroleo_WTI_US),
            data=acciones_ecopetrol)
summary(modelog2)
## 
## Call:
## lm(formula = precio_accion_ecopetrol_COP ~ log(precio_petroleo_WTI_US), 
##     data = acciones_ecopetrol)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -61.16 -40.91 -14.21  32.96 134.99 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  -2135.3      790.5  -2.701 0.015730 *  
## log(precio_petroleo_WTI_US)    908.9      221.5   4.104 0.000829 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 56.42 on 16 degrees of freedom
## Multiple R-squared:  0.5128, Adjusted R-squared:  0.4824 
## F-statistic: 16.84 on 1 and 16 DF,  p-value: 0.0008295
par(mfrow=c(2,2))
plot(modelog2)

# 3.- AJUSTE DOBLEMENTE LOGARITMICO
modelog3=lm(log(precio_accion_ecopetrol_COP)~log(precio_petroleo_WTI_US),
            data=acciones_ecopetrol)
summary(modelog3)
## 
## Call:
## lm(formula = log(precio_accion_ecopetrol_COP) ~ log(precio_petroleo_WTI_US), 
##     data = acciones_ecopetrol)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.05435 -0.03615 -0.01306  0.02928  0.11927 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                   3.9229     0.7072   5.547 4.42e-05 ***
## log(precio_petroleo_WTI_US)   0.8646     0.1981   4.364 0.000482 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.05048 on 16 degrees of freedom
## Multiple R-squared:  0.5434, Adjusted R-squared:  0.5149 
## F-statistic: 19.04 on 1 and 16 DF,  p-value: 0.0004824
par(mfrow=c(2,2))
plot(modelog3)

# 4.- AJUSTE HIPERBOLICO
modelog4=lm(precio_accion_ecopetrol_COP~(1/precio_petroleo_WTI_US),
            data=acciones_ecopetrol)
summary(modelog4)
## 
## Call:
## lm(formula = precio_accion_ecopetrol_COP ~ (1/precio_petroleo_WTI_US), 
##     data = acciones_ecopetrol)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -153.39  -42.14   11.61   55.36  121.61 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1108.39      18.48   59.96   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 78.42 on 17 degrees of freedom
par(mfrow=c(2,2))
plot(modelog4)

A la pregunta Proponga un modelo de regresión lineal simple que permita predecir el valor de las Acciones de Ecopetrol con base en el Precio del barril de petróleo en Colombia. Indique la ecuación de regresión y el valor del R2

Se observa que el mejor ajuste se obtiene con un ajuste Inverso descrito por la siguiente expresión: \(Y=1/(α+βX)\)
Con este ajuste se obtiene un Coefeciente de Determinación \(R^2=0.5317\)

# 5.- AJUSTE INVERSO
modelog5=lm((1/precio_accion_ecopetrol_COP)~precio_petroleo_WTI_US,
            data=acciones_ecopetrol)
summary(modelog5)
## 
## Call:
## lm(formula = (1/precio_accion_ecopetrol_COP) ~ precio_petroleo_WTI_US, 
##     data = acciones_ecopetrol)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -1.075e-04 -2.640e-05  1.289e-05  3.181e-05  4.980e-05 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             1.751e-03  1.877e-04   9.329 7.16e-08 ***
## precio_petroleo_WTI_US -2.376e-05  5.274e-06  -4.506 0.000359 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.606e-05 on 16 degrees of freedom
## Multiple R-squared:  0.5592, Adjusted R-squared:  0.5317 
## F-statistic:  20.3 on 1 and 16 DF,  p-value: 0.0003593
par(mfrow=c(2,2))
plot(modelog5)

A partir de esta transformacion con un ajuste Inverso, podemos establecer la siguiente ecuacion de regresion:
\(Y=1/((1.751E-03) + (-2.376E-05X)\)

A continuación una predicción con el modelo estimado: Para un valor de \(X=35\) se obtiene un valor de \(Y=1087.66\) (precio de la acción de ecopetrol)

Yp1=1/(1.751e-03 + (-2.376e-05*35))
Yp1
## [1] 1087.666

A la pregunta __Pruebe la significancia del modelo propuesto en “a)” plantee las hipótesis respectivas y use el concepto de Valor _p para tomar la decisión sobre las hipótesis. Use α = 0.05__

Prueba de hipotesis t. Se establecen las siguientes hipotesis:
- Hipotesis Nula H0: El coeficente \(β1 = 0\). Esto implicaria que la pendiente de la recta es 0, es decir que no hay relación entre la variable predictora \(X\) y la variable respuesta \(Y\).
- Hipotesis altenativa H1: El coeficiente \(β1 ≠ 0\). Esto implicaría que existe realmente una pendiente para la recta del modelo, es decir que si existe relacion entre las variables.
Resultado: Se encuentra un \(P-valor = 0.0003593\), que es mucho mas pequeño que el valor convencional de \(α = 0.05\). Lo cual implica que la hipotesis nula H0 puede ser rechazada, considerandose valida la Hipótesis Alternativa \(H1\).

3.- MRLM (Modelo de Regresión Lineal Múltiple) - PRECIOS DE VIVIENDAS.

3.1.- Filtros y consultas a la base de datos

Realice un filtro a la base de datos e incluya solo las ofertas de apartamentos, de la zona norte de la ciudad con precios inferiores a los 500 millones de pesos y áreas menores a 300 mt2. Presente los primeros 3 registros de la base y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de la base, discutir si todos los puntos se ubican en la zona norte o se presentan valores en otras zonas, por que?).

# Cargue de los datos
datos_vivienda <- read_excel("Datos_Vivienda.xlsx")
attach(datos_vivienda)

pos_2=which(datos_vivienda$zona=="Zona Norte" & datos_vivienda$precio_millon<500 & datos_vivienda$area_construida<300 & datos_vivienda$tipo=="Apartamento")
datos_sub2=datos_vivienda[pos_2,]
head(datos_sub2)
zona piso estrato precio_millon area_construida parqueaderos banos habitaciones tipo barrio coordenada_longitud coordenada_latitud
Zona Norte NA 6 450 118 NA 3 3 Apartamento acopi -76.52910 3.34525
Zona Norte NA 6 400 110 NA 3 3 Apartamento acopi -76.52843 3.35073
Zona Norte NA 6 310 93 NA 3 3 Apartamento acopi -76.52701 3.36394
Zona Norte NA 4 270 86 NA 2 2 Apartamento Cali -76.52274 3.36400
Zona Norte NA 5 265 94 NA 2 3 Apartamento acopi -76.52386 3.36403
Zona Norte 1 6 450 106 NA 4 3 Apartamento ciudad jardin -76.53729 3.36487
summary(datos_sub2)
##      zona               piso              estrato      precio_millon  
##  Length:1077        Length:1077        Min.   :3.000   Min.   : 65.0  
##  Class :character   Class :character   1st Qu.:3.000   1st Qu.:132.0  
##  Mode  :character   Mode  :character   Median :4.000   Median :220.0  
##                                        Mean   :4.195   Mean   :233.8  
##                                        3rd Qu.:5.000   3rd Qu.:320.0  
##                                        Max.   :6.000   Max.   :495.0  
##  area_construida  parqueaderos           banos        habitaciones  
##  Min.   : 35.00   Length:1077        Min.   :0.000   Min.   :0.000  
##  1st Qu.: 60.00   Class :character   1st Qu.:2.000   1st Qu.:3.000  
##  Median : 76.00   Mode  :character   Median :2.000   Median :3.000  
##  Mean   : 85.94                      Mean   :2.138   Mean   :2.851  
##  3rd Qu.:100.00                      3rd Qu.:2.000   3rd Qu.:3.000  
##  Max.   :287.00                      Max.   :5.000   Max.   :5.000  
##      tipo              barrio          coordenada_longitud coordenada_latitud
##  Length:1077        Length:1077        Min.   :-76.59      Min.   :3.345     
##  Class :character   Class :character   1st Qu.:-76.53      1st Qu.:3.462     
##  Mode  :character   Mode  :character   Median :-76.52      Median :3.476     
##                                        Mean   :-76.52      Mean   :3.467     
##                                        3rd Qu.:-76.50      3rd Qu.:3.488     
##                                        Max.   :-76.47      Max.   :3.498
require(leaflet)
leaflet() %>% addCircleMarkers(lng=datos_sub2$coordenada_longitud, lat=datos_sub2$coordenada_latitud, radius=0.3) %>% addTiles()  

De acuerdo con las condiciones del requerimiento, se obtienen 1077 registros. Sin embargo, algunos apartamentos a pesar de estar etiquetdos como Zona Norte, las coordenadas ingresadas no corresponden a esta zona de la ciudad. Posiblemente se trate de un caso donde es necesario una actividad inicial de limpieza de datos.
Para este ejercicio se continuará con el total de registros encontrados (1077).

3.2. Análisis exploratorio - Correlación entre variables

Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio del apartamento) en función del área construida, estrato y si tiene parqueadero. Use gráficos interactivos con plotly e interprete los resultados.

graf1=ggplot(data=datos_sub2,aes(y=precio_millon, x=area_construida))+geom_point()+geom_smooth()
ggplotly(graf1)
graf2=ggplot(data=datos_sub2,aes(x=estrato, fill=precio_millon))+geom_bar()
ggplotly(graf2)
g21 = ggplot(data=datos_sub2,aes(x=estrato,y=precio_millon,fill=estrato))+geom_boxplot()+theme_bw()
ggplotly(g21)
graf3=ggplot(data=datos_sub2,aes(x=parqueaderos, fill=precio_millon))+geom_bar()
ggplotly(graf3)
g31 = ggplot(data=datos_sub2,aes(x=parqueaderos,y=precio_millon,fill=parqueaderos))+geom_boxplot()+theme_bw()
ggplotly(g31)

1.- Para ilustrar la relacion entre el gráfico que relaciona el Precio de la vivienda con el Area construida, se construyó un gráfico de dispersion. Este recurso muestra una relación lineal directa entre las dos variables.
2.- Para ilustrar la relación entre el Precio de la vivienda y la variable categórica Estrato, se construyeron dos recursos: Un gráfico de barras que indica cuantos apartamentos se ubican en cada estrato. Se encontró que que el estrato 5 tiene la mayor cantidad de apartamentos (451).
El segundo recurso corresponde a un gráfico de cajas y bigotes que muestra la ubicacion de cada elemento “caja/bigotes” frente al eje Y (Precio) y al eje X (estrato); y brinda distintos indicadores estadisticos de la variable Precio. En este gráfico se puede observar que el estrato 5 es el que posee los apartamentos con precios mas elevados, con una media=315 millones.
3.- Para ilustrar la relación entre el Precio de la vivienda y la variable Parqueaderos, se construyeron dos recursos: Un gráfico de barras que indica cuantos apartamentos poseen un determinado número de parqueaderos (incluidos los que poseen el dato NA). Se observa que la mayoría de apartamentos poseen 1 parqueadero (559).
El segundo recurso corresponde a un gráfico de cajas y bigotes que muestra la ubicacion de cada elemento “caja/bigotes” frente al eje Y (Precio) y al eje X (parqueaderos); y brinda distintos indicadores estadisticos de la variable Precio. Por otro lado, en este grafico podemos observar que los apartamentos con 3 parqueaderos son en promedio los mas costosos, con una media=395 millones.

3.3. Estimación de Modelo de Regresión Lineal Múltiple

Estime un modelo de regresión lineal múltiple con las variables del punto anterior e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

En primer lugar, es necesario tener en cuenta que la variable “Parqueaderos” es de tipo caracter e incluye datos “NA” que se infiere no se sabe a que equivale, en este trabajo tampoco se ha asumido que es equivalente a 0. Así pues, es necesario por un lado filtrar aquellos inmuebles que tienen parqueadero=NA. por otro lado, es necesario convertir la variable a tipo númerico.

pos_3=which(datos_vivienda$zona=="Zona Norte" & datos_vivienda$precio_millon<500 & datos_vivienda$area_construida<300 & datos_vivienda$tipo=="Apartamento" & parqueaderos!="NA")
datos_sub3=datos_vivienda[pos_3,]
datos_sub31 <- transform(datos_sub3,parqueaderos = as.numeric(parqueaderos))
head(datos_sub31)
zona piso estrato precio_millon area_construida parqueaderos banos habitaciones tipo barrio coordenada_longitud coordenada_latitud
Zona Norte 1 5 240 87 1 3 3 Apartamento acopi -76.51700 3.36971
Zona Norte 6 5 170 56 1 1 2 Apartamento acopi -76.51735 3.37251
Zona Norte 9 5 435 113 2 3 3 Apartamento la flora -76.54583 3.37370
Zona Norte 2 5 320 86 1 2 3 Apartamento la flora -76.56107 3.37993
Zona Norte 1 5 310 137 2 3 4 Apartamento acopi -76.53105 3.38296
Zona Norte 3 5 285 82 1 2 3 Apartamento la flora -76.54702 3.38611
summary(datos_sub31)
##      zona               piso              estrato      precio_millon  
##  Length:755         Length:755         Min.   :3.000   Min.   : 70.0  
##  Class :character   Class :character   1st Qu.:4.000   1st Qu.:160.0  
##  Mode  :character   Mode  :character   Median :5.000   Median :260.0  
##                                        Mean   :4.419   Mean   :260.4  
##                                        3rd Qu.:5.000   3rd Qu.:340.0  
##                                        Max.   :6.000   Max.   :495.0  
##  area_construida   parqueaderos       banos        habitaciones  
##  Min.   : 42.00   Min.   :1.000   Min.   :0.000   Min.   :0.000  
##  1st Qu.: 67.00   1st Qu.:1.000   1st Qu.:2.000   1st Qu.:3.000  
##  Median : 85.00   Median :1.000   Median :2.000   Median :3.000  
##  Mean   : 91.25   Mean   :1.268   Mean   :2.285   Mean   :2.877  
##  3rd Qu.:107.00   3rd Qu.:2.000   3rd Qu.:3.000   3rd Qu.:3.000  
##  Max.   :287.00   Max.   :4.000   Max.   :5.000   Max.   :5.000  
##      tipo              barrio          coordenada_longitud coordenada_latitud
##  Length:755         Length:755         Min.   :-76.59      Min.   :3.370     
##  Class :character   Class :character   1st Qu.:-76.53      1st Qu.:3.464     
##  Mode  :character   Mode  :character   Median :-76.52      Median :3.479     
##                                        Mean   :-76.52      Mean   :3.472     
##                                        3rd Qu.:-76.51      3rd Qu.:3.489     
##                                        Max.   :-76.47      Max.   :3.498

Posterior a estas operaciones de preparación y limpieza de datos, se construyó el siguiente gráfico matricial de correlacciones entre las variables. Este grafico da una excelente idea del tipo y fuerza de la correlacion entre las distintas variables estudiadas.

library(GGally)
ggpairs(datos_sub31, columns=c("precio_millon", "area_construida", "estrato", "parqueaderos"), columnLabels = c("precio_millon", "area_construida", "estrato", "parqueaderos"), lower = list(continuous = "smooth"),
        diag = list(continuous = "barDiag"), axisLabels = "none")

Despues de los pasos anteriores, se procede a plantear un Modelo de Regresión Lineal Multiple con las variables bajo estudio.
Con el modelo estimado se obtiene un Coeficiente de Determinacion alto \(R²=0.708\) que explica el 70% de la variabilidad de la variable Precio de la Vivienda \(Y\) .
Por otro lado, estableciendo la Hipótesis Nula como \(H0= Las variables no estàn correlacionadas\), el \(p-valor= < 2.2e-16\) obtenido tiene significancia estadistica, permite rechazar la hipotesis Nula y confirma que el modelo obtenido no obedece al azar.

modelorlm <- lm(data=datos_sub31, precio_millon ~ area_construida + estrato + parqueaderos  )
summary(modelorlm)
## 
## Call:
## lm(formula = precio_millon ~ area_construida + estrato + parqueaderos, 
##     data = datos_sub31)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -184.798  -37.957    0.529   31.854  231.856 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     -172.21312   10.87566 -15.835  < 2e-16 ***
## area_construida    0.76566    0.08161   9.382  < 2e-16 ***
## estrato           69.77587    2.89836  24.074  < 2e-16 ***
## parqueaderos      42.94832    5.24414   8.190 1.12e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 56.62 on 751 degrees of freedom
## Multiple R-squared:  0.7096, Adjusted R-squared:  0.7084 
## F-statistic: 611.6 on 3 and 751 DF,  p-value: < 2.2e-16

3.4. Validacion de supuestos del modelo

Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas solo realizar sugerencias de que se podría hacer).
A continuación se presenta el gráfico de Residuos del modelo. De este gráfico podemos evaluar los primeros dos supuestos.

1.- Homocedasticidad de los residuos: El resultado del grafico de “Residuos vs Valores ajustados” permite observar que la distribución tiende a ser aleatoria y de varianza constante, que es lo que se espera.

2.- Distribucion normal de los residuos: El resultado del gráfico Q-Q de normalidad permite observar que la distribcion practicamente se ajusta a la normal, que es lo que se espera y da fuerza la modelo de regresión obtenido. Del grafico.

3.- Linealidad: Este supuesto del modelo, prevee que existe una relación lineal entre la variable dependiente o respuesta y las independientes o predictoras. Este supuesto queda cumplido mediante el grafico tipo matriz construido anteriomente en el que se observa que existe una correlacion alta entre cada predictor y la variable respuesta.

4.- No colinealidad: Este supuesto del modelo prevee que no existe colinealidad entre los predictores, es decir que deben ser independientes. Puesto que se entiende que colinealidad entre predictores presenta un coeficiente de correlacion cercano a 1, del grafico tipo matriz construido anteriormente podemos establecer que no existe colinealidad entre los predictores.

5.- Parsimonia: Este supuesto del modelo prevee que el mejor modelo explica con alto nivel de precision la varibalidad observada en la variable respuesta empleando el menor numero posible de predictores. En este caso tenemos un dataframe con 12 posibles variables predictoras, y se ha logrado un coeficiente de dterminacion \(R^=0.70\) empleando solo tres predictores; Podemos decir que cumple con el supuesto.

par(mfrow=c(2,2))
plot(modelorlm)

3.5. Prediccion # 1 del modelo

Con el modelo identificado predecir el precio de un apartamento con 100 mt2, de estrato 4 y con parqueadero. ¿Si este apartamento lo están ofreciendo en 450 millones cual seria su opinión con base en el resultado del modelo considera que es una buena oferta?

DE acuerdo con la expresion general del Modelo de Regresion Lineal Multiple tenemos: Yi=(β0+β1X1i+β2X2i+⋯+βnXni)+ei.
Ahora bien, de acuerdo con el modelo obtenido podemos plantear la siguiente expresión: Yi= -172.21312 + 0.76566X1 + 69.77587X2 + 42.94832X3.
Para un apartamento con las caracteristicas propuestas tenemos un precio estimado de 226.4 millones.

Y=-172.21312 + (0.76566*100) + (69.77587*4) + (42.94832*1)
Y
## [1] 226.4047

3.6. Prediccion # 2 del modelo

Con las predicciones del modelo sugiera potenciales ofertas para una persona interesada en un apartamento en la zona norte con mas de 100 mt2 de área, de estrato 4, que tenga parqueadero y tenga en cuenta que la persona tiene un crédito preaprobado de máximo 400 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.

#OFERTA 1
Y1=-172.21312 + (0.76566*200) + (69.77587*4) + (42.94832*1)
Y1
## [1] 302.9707
#OFERTA 2
Y2=-172.21312 + (0.76566*250) + (69.77587*4) + (42.94832*1)
Y2
## [1] 341.2537
#OFERTA 3 - Area=250 , Con 2 parqueaderos
Y3=-172.21312 + (0.76566*250) + (69.77587*4) + (42.94832*2)
Y3
## [1] 384.202
#OFERTA 4 - Area=270 Con 2 parqueaderos
Y4=-172.21312 + (0.76566*270) + (69.77587*4) + (42.94832*2)
Y4
## [1] 399.5152
#OFERTA 5 - Area=300 Con 1 parqueaderos
Y5=-172.21312 + (0.76566*300) + (69.77587*4) + (42.94832*1)
Y5
## [1] 379.5367
# Creamos un dataframe con las propuestas

df <- data.frame(
  "precio" = c(302.97,341.25,384.20,399.51,379.53), 
  "area" = c(200, 250, 250, 270,300), 
  "estrato" = c(4, 4, 4, 4, 4),
  "parqueaderos" = c(1, 1, 2, 2, 1),
  "lat" = c(3.479,3.482,3.493,3.495,3.48),
  "long"= c(-76.518,-76.519,-76.545,-76.541,-76.531)
)


require(leaflet)
leaflet() %>% addCircleMarkers(lng=df$long, lat=df$lat, radius=0.3) %>% addTiles() 

4.- MRLM (Modelo de Regresión Lineal Múltiple) - PESO DE ARBOLES.

Con base en los datos de árboles proponga un modelo de regresión lineal múltiple que permita predecir el peso del árbol en función de las covariables que considere importantes y seleccionándolas de acuerdo con un proceso adecuado. Tenga en cuenta realizar una evaluación de la significancia de los parámetros, interpretación y proponga un método de evaluación por medio de validación cruzada. Presente métricas apropiadas como el RMSE y MAE.

# Cargue de los datos
datos_arboles <- read_excel("data_arboles-o.xlsx")
attach(datos_arboles)

head(datos_arboles)
finca mg peso diametro altura
FINCA_1 1 13.73 4.7 5.0
FINCA_1 1 14.58 5.3 5.6
FINCA_1 1 15.88 4.8 5.8
FINCA_1 1 8.99 3.2 4.3
FINCA_1 1 6.99 2.2 3.3
FINCA_1 2 19.34 6.3 7.9
summary(datos_arboles)
##     finca                 mg           peso          diametro    
##  Length:90          Min.   :1.0   Min.   : 5.98   Min.   :2.200  
##  Class :character   1st Qu.:1.0   1st Qu.:13.64   1st Qu.:4.525  
##  Mode  :character   Median :1.5   Median :17.48   Median :5.400  
##                     Mean   :1.5   Mean   :18.77   Mean   :5.446  
##                     3rd Qu.:2.0   3rd Qu.:22.80   3rd Qu.:6.500  
##                     Max.   :2.0   Max.   :47.87   Max.   :8.800  
##      altura      
##  Min.   : 3.300  
##  1st Qu.: 5.225  
##  Median : 6.450  
##  Mean   : 6.634  
##  3rd Qu.: 7.875  
##  Max.   :11.300

4.1. Análisis exploratorio - Correlación entre variables

A continuacion se construye se construye el siguiente gráfico matricial de correlacciones entre las variables.
De acuerdo con los resultados obtenido, se eligen las variables predictoras “diametro” y “altura” por tener alto Coeficiente de Correlacion con la variable respuesta “peso”. El grafico de dispersión de estas dos variables predictoras frente a la varible respuesta, muestra una correlacion lineal positiva en ambos casos.

library(GGally)
ggpairs(datos_arboles, columns=c("peso", "mg", "diametro", "altura"), columnLabels = c("PESO", "MG","DIAMETRO", "ALTURA"), lower = list(continuous = "smooth"),
        diag = list(continuous = "barDiag"), axisLabels = "none")

4.2. Estimación de Modelo de Regresión Lineal Múltiple

A continuación se plantea un Modelo de Regresión Lineal Múltiple con las variables predictoras elegidas para estimar el peso de un árbol.
Con el modelo estimado se obtiene un Coeficiente de Determinación elevado \(R^2=0.8213\) que explica aprox. el 82% de la variabilidad de la variable “peso”.

Por otro lado, se establecen las siguientes hipotesis:

  • Hipótesis Nula \(H0 = \text{El coeficente } β1=0\). Esto implicaría que la pendiente de la recta es 0, es decir que no hay relación entre la variable predictora X y la variable respuesta Y.
  • Hipótesis altenativa \(H1 = \text{El coeficiente } β1≠0\). Esto implicaría que existe realmente una pendiente para la recta del modelo, es decir que si existe relación entre las variables.
    Resultado: Se encuentra un \(p−valor< 2.2e-16\), que es mucho mas pequeño que el valor α=0.05 . Lo cual implica que la hipotesis nula \(H0\) puede ser rechazada, considerándose válida la Hipótesis Alternativa \(H1\).
modelorlm_a <- lm(data=datos_arboles, peso ~ diametro + altura)
summary(modelorlm_a)
## 
## Call:
## lm(formula = peso ~ diametro + altura, data = datos_arboles)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.3083 -2.5121  0.1608  2.0088 11.7446 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -9.1205     1.4305  -6.376 8.44e-09 ***
## diametro      4.7395     0.7128   6.649 2.49e-09 ***
## altura        0.3132     0.5751   0.544    0.587    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.449 on 87 degrees of freedom
## Multiple R-squared:  0.8253, Adjusted R-squared:  0.8213 
## F-statistic: 205.5 on 2 and 87 DF,  p-value: < 2.2e-16

A continuación se presenta el grafico y analisis de residuos del modelo:

1.- Homocedasticidad de los residuos: El resultado del grafico de “Residuos vs Valores ajustados” permite observar que la distribución tiende a ser aleatoria y de varianza constante, que es lo que se espera.

2.- Distribucion normal de los residuos: El resultado del gráfico Q-Q de normalidad permite observar que la distribucion practicamente se ajusta a la normal, que es lo que se espera y da fuerza la modelo de regresión obtenido.
3.- Linealidad: Este supuesto del modelo, prevee que existe una relación lineal entre la variable dependiente o respuesta y las independientes o predictoras. Este supuesto queda cumplido mediante el grafico tipo matriz construido anteriomente en el que se observa que existe una correlacion muy alta entre cada predictor y la variable respuesta.

4.- No colinealidad: Este supuesto del modelo prevee que no existe colinealidad entre los predictores, es decir que deben ser independientes. Puesto que se entiende que colinealidad entre predictores presenta un coeficiente de correlacion cercano a 1, del grafico tipo matriz construido anteriormente podemos decir que aunque la colinealidad entre los predictores no es perfecta (igual a 1), si existe una colinealidad bastante alta.

5.- Parsimonia: Este supuesto del modelo prevee que el mejor modelo explica con alto nivel de precision la variabilidad observada en la variable respuesta empleando el menor numero posible de predictores. En este caso tenemos un dataframe con 4 posibles variables predictoras, y se ha logrado un coeficiente de determinacion \(R^2=0.8213\) empleando dos predictores; En el marco de este ejercicio, podemos decir que cumple con este supuesto.

par(mfrow=c(2,2))
plot(modelorlm_a)

4.3.- Validación Cruzada

Proponga un método de evaluación por medio de validación cruzada. Presente métricas apropiadas como el RMSE y MAE.
El proposito de los metodos de validación cruzada es medir el desempeño del modelo predictivo sobre nuevos conjuntos de datos. Esto lo realizamos mediante la division del conjunto de datos original, en dos conjuntos:
+ El conjunto de entrenamiento del modelo.
+ El conjunto de prueba, usado para medir el dsempeño del modelo mediante la estimacion del error.
Los pasos generales que seguiremos son los siguientes:
+ Reservamos una muestra del conjunto de datos. Este es el cojunto de prueba. + Construimos o Entrenamos el modelo con el resto de datos.
+ Probamos el desempeño de modelo sobre el conjunto de prueba y se calcula la prediccion de los errores. Si el modelo funciona bien (con metricas como RMSE y MAE) sobre el conjunto de prueba, podemos decir entonces que el modelo es valido.

library(caret)

entrenamiento.muestras <- datos_arboles %>%
  createDataPartition(p = 0.8, list = FALSE)
entrenamiento.datos  <- datos_arboles[entrenamiento.muestras, ]
prueba.datos <- datos_arboles[-entrenamiento.muestras, ]

predicciones <- modelorlm_a %>% predict(prueba.datos)

data.frame( R2 = R2(predicciones, prueba.datos$peso),
            RMSE = RMSE(predicciones, prueba.datos$peso),
            MAE = MAE(predicciones, prueba.datos$peso))
R2 RMSE MAE
0.8226329 3.428771 2.773912

A partir de los resultados obtenidos podemos establecer que el Coeficiente de Determinación es muy alto ($R^2=0.8226) y coherente el obtenido antes de la validacion cruzada.

  • El Error Cuadratico Medio (RMSE) es bajo, lo que permite tambien aportar validez al modelo.
  • El Error Absoluto Medio (MAE) es bajo, lo que tambien permite aportar validez al modelo obtenido.