1. ECOPETROL

library(ggplot2)
library(gganimate)
library(lmtest)
library(dplyr)
library(readxl)
library(GGally)
library(caret)
library(tidyverse)
require(ggpubr)
require(CGPfunctions)
require (plotly)
library(magrittr)

datos <- read_excel("C:/Users/Andre/OneDrive/Escritorio/Ecopetrol.xlsx")
View(datos)
names(datos)
## [1] "Fecha"  "Accion" "Precio"
str(datos)
## tibble [18 × 3] (S3: tbl_df/tbl/data.frame)
##  $ Fecha : chr [1:18] "dic 14-15" "dic 15-15" "dic 16-15" "dic 18-15" ...
##  $ Accion: num [1:18] 1090 1170 1160 1230 1155 ...
##  $ Precio: num [1:18] 35.6 36.3 37.4 35 34.5 ...
attach(datos)
summary(datos)
##     Fecha               Accion         Precio     
##  Length:18          Min.   : 955   Min.   :30.44  
##  Class :character   1st Qu.:1066   1st Qu.:34.63  
##  Mode  :character   Median :1120   Median :36.05  
##                     Mean   :1108   Mean   :35.53  
##                     3rd Qu.:1164   3rd Qu.:36.98  
##                     Max.   :1230   Max.   :37.87
# Una fila, dos columnas
par(mfrow = c(2, 2))

# Los siguientes gráficos se combinarán
hist(Accion,
     main = "Numero de acciones Histograma")
# Box plot vertical
boxplot(Accion, col = "white")

# Puntos
stripchart(Accion,              # Datos
           method = "jitter", # Ruido aleatorio
           pch = 19,          # Símbolo pch
           col = 4,           # Color del símbolo
           vertical = TRUE,   # Modo vertical
           add = TRUE)        # Agregar encima

# Volvemos al estado original


# Los siguientes gráficos se combinarán
hist(Precio,
     main = "precio X accion Histograma")
# Box plot vertical
boxplot(Precio, col = "white")

# Puntos
stripchart(Precio,              # Datos
           method = "jitter", # Ruido aleatorio
           pch = 19,          # Símbolo pch
           col = 4,           # Color del símbolo
           vertical = TRUE,   # Modo vertical
           add = TRUE)        # Agregar encima

# Volvemos al estado original

par(mfrow = c(1, 1)) 

summary(datos)
##     Fecha               Accion         Precio     
##  Length:18          Min.   : 955   Min.   :30.44  
##  Class :character   1st Qu.:1066   1st Qu.:34.63  
##  Mode  :character   Median :1120   Median :36.05  
##                     Mean   :1108   Mean   :35.53  
##                     3rd Qu.:1164   3rd Qu.:36.98  
##                     Max.   :1230   Max.   :37.87

Analisis exploratorio

Para continuar con el análisis exploratorio, se observa la distribución de los datos disponibles para cada variable. Dando como resultado: el precio mínimo de la acción fue de 955 COP, el precio máximo de 1.230 COP y un valor promedio de 1.108 COP. Por su parte, el precio del petróleo tuvo un precio mínimo de 30,44 USD, un precio máximo de 37,87 USD y un precio promedio de 37,87 USD.

theme_set(theme_bw())


p <- ggplot(
  datos, 
  aes(x = Precio, y=Accion, size = Accion, color=factor(Accion))
  ) +
  geom_point(show.legend = FALSE, alpha = 0.7) +
  scale_color_viridis_d() +
  scale_size(range = c(2, 12)) +
  scale_y_binned() +
  labs(x = "Precio", y = "Accion")
p

correlacion=round(cor(Precio, Accion),5)

modelo1 <- lm(Accion~Precio)
summary(modelo1)
## 
## Call:
## lm(formula = Accion ~ Precio)
## 
## 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        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

Modelo

La ecuación de regresión es: Y = 177.768 + 26.192*X Donde: Y = precio de las acciones X = precio del petróleo

el coeficiente de determinación del modelo: 0.5004675

summary(modelo1)$coefficients[,4]
## (Intercept)      Precio 
## 0.456266912 0.001023938
z=qnorm(0.975)
li= round(26.19213-(z*6.542),2)
ls= round(26.19213+(z*6.542),2)
data.frame(li,ls)
li ls
13.37 39.01
round(summary(modelo1)$r.squared,4)
## [1] 0.5005

En primer lugar, se plantean las pruebas de hipótesis para los coeficientes b0 y b1:

Prueba 1 H0: b0 = 0 Ha: b0 ≠ 0

Prueba 2 H0: b1 = 0 Ha: b1 ≠ 0

Luego se recuperan los p-valor de cada coeficiente:

Con un nivel de significancia de 0.05, los resultados del cálculo del p-valor implican lo siguiente:

Para la prueba 1, el p-valor de B0 es 0.456266912. Por tanto, no se rechaza la hipótesis nula y, por lo tanto, se puede considerar que b0 es cero.

Para la prueba 2, el p-valor de b1 es 0.001023938. Por tanto, se rechaza la hipótesis nula, y se concluye que b1 es diferente de cero.

por tanto se podria pensar que existe una relación significativa entre las variables, siendo un modelos significativo

modelo1$coefficients
## (Intercept)      Precio 
##   177.76779    26.19213

Consideranto el b1, por cada dolar americano adicional este aumenta en 26,19 pesos.

Considerando el b0, si el precio del barril fuera cero, entonces seria de 177.76 pesos.

expp=modelo1$residuals
t.test(expp)
## 
##  One Sample t-test
## 
## data:  expp
## t = -4.2309e-16, df = 17, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -27.56364  27.56364
## sample estimates:
##     mean of x 
## -5.527407e-15

Supuesto 1. E (e) = 0

Supuesto 1. E (e) = 0

Como el valor de probabilidad de la prueba t es muy grande, se asume que el valor esperado de los residuos es cero.

lmtest::gqtest(modelo1)
## 
##  Goldfeld-Quandt test
## 
## data:  modelo1
## GQ = 0.17924, df1 = 7, df2 = 7, p-value = 0.9813
## alternative hypothesis: variance increases from segment 1 to 2

Supuesto 2. Var(e) = sigma2

El valor de probabilidad de la prueba Goldfeld-Quandt es grande y por tanto se asume que las varianzas son constantes.

shapiro.test(expp)
## 
##  Shapiro-Wilk normality test
## 
## data:  expp
## W = 0.89259, p-value = 0.04276

Supuesto 3. e ~ N(0, sigma2)

Considerando el valor de probabilidad de la prueba Shapiro-Wilk, se concluye los errores no siguen una distribución normal.

lmtest::dwtest(modelo1)
## 
##  Durbin-Watson test
## 
## data:  modelo1
## DW = 0.74504, p-value = 0.0004666
## alternative hypothesis: true autocorrelation is greater than 0

Supuesto 4. Cov(e_1)=0

Considerando el valor de probabilidad de la prueba Durbin Watson, se concluye que los errores están autocorrelacionados

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

### Validez del modelo

Debido a que no tienen una distribución normal debido a que nos muestra shaphiro test y nos muestras que las variables sean independientes como quisieramos como lo vemos en Cov(e), vemos que no es necesario que el modelo no sería valido para intentar intrepretar variables nuevas, por el momento se ajusta en un porcentaje del 50% que seria lanzar una moneda

2. SALARIO MÍNIMO

Enunciado

Se cuenta con los registros de la INFLACION y al SALARIO MINIMO LEGAL MENSUAL (SMLM) desde el año 1999 para Colombia.

La idea es establecer un modelo de regresión que ayude a determinar el comportamiento de estas dos variables tomando como variable dependiente SALARIO MINIMO LEGAL MENSUAL (SMLM) y como variable independiente INFLACION; obtenga un modelo de regresión lineal simple y resuelva los siguientes puntos.

Para iniciar, se realiza la lectura del dataframe, y se grafica el comportamiento entre la inflación y el salario con un diagrama de dispersión; aquí se logra apreciar que, a mayor inflación, habría un menor salario, sin embargo, esto no es coherente con la realidad, por lo cual se decide crear una nueva columna que calcula la tasa de variación del Salario para conocer el aumento que este tiene frente al periodo inmediatamente anterior, y así realizar los análisis en función de esta variación y no del salario mínimo.

Solución

salario <- read_excel("C:/Users/Andre/OneDrive/Escritorio/Datos_Salario.xlsx")
View(salario)
names(salario)
## [1] "Anio"      "Inflacion" "Salario"
str(salario)
## tibble [17 × 3] (S3: tbl_df/tbl/data.frame)
##  $ Anio     : num [1:17] 1999 2000 2001 2002 2003 ...
##  $ Inflacion: num [1:17] 9.23 8.75 7.65 6.99 6.49 5.5 4.85 4.48 5.69 7.67 ...
##  $ Salario  : num [1:17] 236460 260100 286000 309000 332000 ...
summary(salario)
##       Anio        Inflacion        Salario      
##  Min.   :1999   Min.   :1.940   Min.   :236460  
##  1st Qu.:2003   1st Qu.:3.660   1st Qu.:332000  
##  Median :2007   Median :5.500   Median :433700  
##  Mean   :2007   Mean   :5.354   Mean   :437079  
##  3rd Qu.:2011   3rd Qu.:6.990   3rd Qu.:535600  
##  Max.   :2015   Max.   :9.230   Max.   :644350
attach(salario)


plot(Inflacion,Salario)

salario=salario %>%
mutate(Variacion_Salario = (Salario-lag(Salario))/lag(Salario) * 100)
attach(salario)
View(salario)

Al analizar los datos, se observa que el valor de la inflación en cada año corresponde a la inflación acumulada en dicho año, sin embargo, esta no afecta el salario del año en curso, sino que se convierte en una variable decisiva para la determinación del salario del periodo siguiente, razón por la cual se decide desplazar una fila hacia abajo cada valor de la columna Inflacion, y eliminar la fila del 1999 ya que esta quedaría incompleta.

salario= salario %>%
mutate(Inflacion=lag(Inflacion)) %>%
na.omit()
attach(salario)
plot(Inflacion,Variacion_Salario)

A: Ecuación del modelo

Escriba la ecuación del modelo de regresión lineal simple

grafico=ggplot(salario,aes(y=Variacion_Salario,x=Inflacion)) + geom_point(colour = "purple", size = 2) + geom_smooth()
grafico

regresion=lm(Variacion_Salario~Inflacion)

La ecuación lineal que modela la tasa de variación anual el Salario Mínimo en Colombia en función de la inflación, está dada por: Y= 0.8103X + 2.2170, donde Y corresponde a la tasa de variación del Salario Mínimo, y X es el valor de la inflación.

B: Hipótesis de Linealidad

Plantee y valide las hipótesis correspondientes a la linealidad general del modelo propuesto en a.

  1. Significancia del Intercepto \(\beta_0\)

\(H_0: \beta_0 = 0\) = No existe relación entre las variables.

\(H_1: \beta_0 \neq 0\) = Existe relación entre las variables.

Se observa un valor-p del intercepto de 2.01e-05, el cual es aproximado a 0, siendo este mucho menor que el valor \(\alpha\) de 0.05, por lo cual se rechaza la hipótesis nula \(H_0\).

  1. Significancia de la Pendiente \(\beta_1\)

\(H_0: \beta_1 = 0\) = No existe relación entre las variables.

\(H_1: \beta_1 \neq 0\) = Existe relación entre las variables.

Se observa un valor-p de la pendiente de 2.77e-09, el cual también es aproximado a 0, igualmente menor al \(\alpha\) de 0.05, por lo cual se rechaza la hipótesis nula \(H_0\).

Dado la anterior, se cumple lo esperado frente a las hipótesis de linealidad general, por lo que es posible afirmar que existe una relación lineal entre las variables Inflación y Tasa de Variación del Salario Mínimo en Colombia.

C: Coeficiente de Correlación

Indique e interprete el coeficiente de correlación del modelo propuesto en a)

cor(Inflacion,Variacion_Salario)
## [1] 0.9620087

El coeficiente de correlación entre la variable Variación del Salario y la Inflación es de 0.9620087, esto indica que existe una correlación lineal fuerte y positiva entre las variables de interés, es decir, que a mayor Inflación, la tasa de variación del Salario frente al periodo anterior será mayor.

D. Intepretación de Coeficientes

Interprete cada uno de los coeficientes del modelo propuesto en a)

\(\beta_0 = 2.217\)

\(\beta_1 = 0.81030\)

Al intrepretar los coeficientes, es posible afirmar que, si para un año dado la inflación acumulada es de 0, la tasa de variación del Salario esperada sería de 2.217% (\(\beta_0\)); por otra parte, el análisis de \(\beta_1\) implica que por cada punto que aumente la inflación, la tasa de variación del Salario esperada aumentaría en 0.81030 unidades porcentuales.

E. Validación de Supuestos

Construya una gráfica de residuales y haga un análisis cualitativo de los supuestos del modelo propuesto en a).

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

Se genera el gráfico de los 4 supuestos del análisis de regresión lineal, y a continuación se analizan en profundidad:

E.1 El error es una variable aleatoria con media 0

mean(regresion$residuals)
## [1] -2.602085e-18

Al calcular el promedio de los residuos de la regresión, se observa que es un valor ínfimo que tiende a cero, por lo cual se confirma este supuesto.

E.2. El error es una variable aleatoria con varianza constante

require(lmtest)
bptest(regresion)    
## 
##  studentized Breusch-Pagan test
## 
## data:  regresion
## BP = 0.074196, df = 1, p-value = 0.7853

Test de Breusch-Pagan

\(H_0\): Los residuos son Homocedásticos.

\(H_1\): Los residuos no son Homocedásticos.

Este supuesto hace referencia a la Homocedasticidad; para verificarlo, se emplea la prueba de Breusch-Pagan; aquí, se obtiene un p-value de 0.7853, el cual es bastante mayor a un nivel de significa 0.05, por lo cual, se tendría que aceptar la hipótesis nula \(H_0\), es decir, los residuos serían Homocedásticos, por lo que la varianza entre estos sí sería constante, cumpliendo este supuesto.

E.3 Los errores son independientes entre sí

require(car)
dwt(regresion,alternative="two.sided")
##  lag Autocorrelation D-W Statistic p-value
##    1       -0.102184      2.106713   0.986
##  Alternative hypothesis: rho != 0

Test de Durbin-Watson

\(H_0: ρ= 0\) (No existe correlación).

\(H1: ρ≠ 0\) (Existe correlación).

Para validar este supuesto, se emplea la prueba de Durbin-Watson, para la cual, al obtener un p-valor de 0.98, es posible rechazar la hipótesis nula asumir que no existe correlación entre los errores; además, según la bibliografía consultada, si el valor del estadístico de Durbin-Watson se encuentra entre 1.5 y 2.5, la correlación es baja, por lo cual existiría independencia entre los residuos para este caso en el que el valor es de 2.10, además, se evidencia un coeficiente de autocorrelación de tan solo -0.102184, por lo cual, al ser tan baja la correlación, se puede concluir que los errores son independientes entre sí.

E.4 Los errores siguen una distribución normal

shapiro.test(regresion$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  regresion$residuals
## W = 0.92189, p-value = 0.1809

Test de Shapiro-Wilk

\(H_0\): La distribución es normal.

\(H_1:\) La distribución no es normal.

Finalmente, para validar el supuesto de la distribución normal de los errores, se emplea el test de Shapiro-Wilk, en el cual se busca rechazar la hipótesis nula de que la distribución es normal. Siendo así, y al haber obtenido un valor-p de 0.1809, y siendo este mayor que un alpha de 0.05, no se rechaza la hipótesis nula, y es posible concluir que los residuos siguen una distribución de probabilidad normal.

F. Conveniencia del Modelo

Comente sobre la conveniencia de usar el modelo propuesto en a) para predecir el SMLM para Colombia:

Teniendo en cuenta el análisis del modelo realizado, es posible afirmar que tiene un ajuste bastante elevado para explicar la tasa de variación que podría tener el salario mínimo en Colombia en el periodo siguiente, en función de la inflación acumulada del año en curso; sin embargo, es de considerar que a pesar de que la varaible inductora sea la inflación, se trata de una decisión tomada por mutuo acuerdo entre las Centrales Obreras, Gremios de empresarios, y el Ministerio de Trabajo, por lo cual existen otras variables e intereses que no son tomados en cuenta en el modelo; siendo así, es una aproximación acertada en un ambiente académico, pero no sería adecuado emplearla en la decisión real del incremento del salario mínimo.

3. VIVIENDAS

datos <- read_excel("C:/Users/Andre/OneDrive/Escritorio/Datos_Vivienda.xlsx")

datos_sub = datos %>% filter(Zona=="Zona Norte" & precio_millon < 500 & Area_contruida < 300)
head(datos_sub,3)
Zona piso Estrato precio_millon Area_contruida parqueaderos Banos Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud
Zona Norte 2 3 135 56 1 1 3 Apartamento torres de comfandi -76.46745 3.40763
Zona Norte NA 5 400 212 NA 2 4 Casa santa mónica residencial -76.47300 3.41800
Zona Norte NA 3 78 54 2 1 3 Apartamento chiminangos -76.47820 3.44898
tail(datos_sub,5)
Zona piso Estrato precio_millon Area_contruida parqueaderos Banos Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud
Zona Norte NA 5 280 145 NA 3 4 Apartamento acopi -76.55559 3.40764
Zona Norte 2 5 320 86 1 2 3 Apartamento la flora -76.56107 3.37993
Zona Norte NA 4 390 240 NA 3 4 Apartamento acopi -76.56213 3.40996
Zona Norte NA 5 170 62 NA 2 2 Apartamento Cali -76.56409 3.41032
Zona Norte 7 5 400 220 1 4 4 Apartamento granada -76.58732 3.46148
require(leaflet)
leaflet()%>% addCircleMarkers(lng=datos_sub$cordenada_longitud, lat = datos_sub$Cordenada_latitud,radius =0.3)%>% addTiles()

A.

los puntos que no se encuentra ubicados en la zona norte, se deben a que el registro de longitud y latitud marcan ubicaciones diferentes a la zona norte

names(datos_sub)
##  [1] "Zona"               "piso"               "Estrato"           
##  [4] "precio_millon"      "Area_contruida"     "parqueaderos"      
##  [7] "Banos"              "Habitaciones"       "Tipo"              
## [10] "Barrio"             "cordenada_longitud" "Cordenada_latitud"
borrar <- c("Zona","Tipo","piso","Barrio","Banos","cordenada_longitud","Habitaciones","Cordenada_latitud")
datos_sub2 <- datos[ , !(names(datos) %in% borrar)]

library(ggplot2)
library(gridExtra)

plot1 <- ggplot(data = datos_sub2,aes(y=precio_millon,x=Area_contruida)) + geom_point() + geom_smooth(formula = y ~ x, method = "lm")+theme_bw()
plot1

plot2 = ggplot(datos_sub2, aes(x=precio_millon, fill=Estrato )) + geom_bar( ) +scale_fill_hue(c = 40)+theme(legend.position="none")
plot2

plot3 = ggplot(data = datos_sub2,aes(x=parqueaderos,y=precio_millon,fill=parqueaderos))+geom_boxplot()+theme_bw()
plot3

### B. Análisis Exploratorio

lo que nos muestra el analisis exploratorio es que los apartamentos se encuentran en mayor proporción son menores iguales a 500 mts de area contruida y el precio por millon se encuentra en mayor distribucion y el precio de las propiedades aumenta conforme tienen mas parqueaderos

datos_sub2$parqueaderos<-as.numeric((datos_sub2$parqueaderos))
datos_sub2$Estrato<-as.character((datos_sub2$Estrato))
datos_sub3 = datos_sub2 %>% filter(parqueaderos!='NA')

modelo1<- lm(data=datos_sub3,precio_millon~Estrato+Area_contruida+parqueaderos)
summary(modelo1)
## 
## Call:
## lm(formula = precio_millon ~ Estrato + Area_contruida + parqueaderos, 
##     data = datos_sub3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1559.46   -72.25   -10.68    46.69  1103.46 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -18.37977    7.35353  -2.499   0.0125 *  
## Estrato4        67.62019    8.02840   8.423   <2e-16 ***
## Estrato5       125.35273    7.66019  16.364   <2e-16 ***
## Estrato6       377.91085    8.37848  45.105   <2e-16 ***
## Area_contruida   0.96006    0.01843  52.097   <2e-16 ***
## parqueaderos    78.77316    2.53331  31.095   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 176.1 on 6711 degrees of freedom
## Multiple R-squared:  0.7239, Adjusted R-squared:  0.7237 
## F-statistic:  3518 on 5 and 6711 DF,  p-value: < 2.2e-16

C. Coeficientes del modelo

modelo1$coefficients
##    (Intercept)       Estrato4       Estrato5       Estrato6 Area_contruida 
##     -18.379775      67.620189     125.352730     377.910854       0.960056 
##   parqueaderos 
##      78.773156

se pueden observar los coeficientes del modelo planteado, siendo tambien un R2 de 0.7239, podemos observar que solo tomo los estratos del 4 al 6 dado que no fue representativo para ella quizas a la cantidad de datos contenidos en esos estratos, una posible mejora seria sacar logaritmo

modelo2<- lm(data=datos_sub3,log(precio_millon)~Estrato+log(Area_contruida)+log(parqueaderos))
summary(modelo2)
## 
## Call:
## lm(formula = log(precio_millon) ~ Estrato + log(Area_contruida) + 
##     log(parqueaderos), data = datos_sub3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.44644 -0.16299 -0.00228  0.15718  1.13916 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         2.764816   0.030489   90.68   <2e-16 ***
## Estrato4            0.280121   0.011487   24.39   <2e-16 ***
## Estrato5            0.461200   0.011041   41.77   <2e-16 ***
## Estrato6            0.825617   0.012375   66.72   <2e-16 ***
## log(Area_contruida) 0.523982   0.006219   84.25   <2e-16 ***
## log(parqueaderos)   0.219430   0.008801   24.93   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2518 on 6711 degrees of freedom
## Multiple R-squared:  0.8395, Adjusted R-squared:  0.8394 
## F-statistic:  7021 on 5 and 6711 DF,  p-value: < 2.2e-16
nuevo <- data.frame(Area_contruida=c(100),
                    Estrato=c("4"),
                    parqueaderos=c(1))


predict(object=modelo1, newdata=nuevo)
##        1 
## 224.0192

D. Transformación

Podemos observar que al hacer la transformación de logaritmo el R2 mejoro con 0.8395, solo se debe tener en cuenta que los valores se debe ingresar con logaritmo y la resultante debera tenerse con exponencial

datos$Estrato<-as.character((datos$Estrato))

datos_sub4 = datos %>% filter(Zona=="Zona Norte" & Area_contruida > 100 & Estrato=="4" & parqueaderos > 0 & Tipo=="Apartamento")
datos_sub4$parqueaderos<-as.numeric((datos_sub4$parqueaderos))
datos_sub4 = datos_sub4 %>% filter(parqueaderos!='NA')

confint(modelo1)
##                      2.5 %      97.5 %
## (Intercept)    -32.7950305  -3.9645191
## Estrato4        51.8819835  83.3583937
## Estrato5       110.3363184 140.3691408
## Estrato6       361.4863662 394.3353418
## Area_contruida   0.9239307   0.9961813
## parqueaderos    73.8070730  83.7392394
mydata <- predict(modelo2, newdata = datos_sub4, interval = 'prediction', level = 0.95)
mydata.model <- exp(mydata)
mydata.plot <- cbind(datos_sub4,mydata.model)
mydata.plot
Zona piso Estrato precio_millon Area_contruida parqueaderos Banos Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud fit lwr upr
Zona Norte 4 4 380 123.00 1 3 3 Apartamento la flora -76.51437 3.48618 261.5004 159.5976 428.4679
Zona Norte NA 4 750 392.00 1 4 4 Apartamento la flora -76.51500 3.48900 479.9931 292.8593 786.7033
Zona Norte 11 4 510 121.00 2 4 4 Apartamento urbanización la flora -76.52100 3.49000 301.8539 184.2182 494.6079
Zona Norte NA 4 350 130.00 1 2 3 Apartamento la flora -76.52100 3.49000 269.1956 164.2933 441.0787
Zona Norte 1 4 290 108.00 1 2 3 Apartamento la flora -76.52115 3.48930 244.2739 149.0853 400.2390
Zona Norte 4 4 185 104.00 1 3 3 Apartamento san vicente -76.52300 3.46400 239.4908 146.1663 392.4013
Zona Norte NA 4 265 125.00 2 3 4 Apartamento la flora -76.52353 3.48157 307.0421 187.3850 503.1077
Zona Norte 2 4 380 126.00 2 3 4 Apartamento la flora -76.52432 3.48254 308.3267 188.1691 505.2123
Zona Norte 6 4 270 152.00 1 3 4 Apartamento versalles -76.52515 3.46334 292.1773 178.3158 478.7437
Zona Norte NA 4 340 121.00 2 3 3 Apartamento menga -76.52566 3.49078 301.8539 184.2182 494.6079
Zona Norte 3 4 300 287.00 1 3 4 Apartamento la campiña -76.52673 3.47907 407.6483 248.7493 668.0506
Zona Norte 2 4 240 103.00 1 2 3 Apartamento versalles -76.52700 3.46500 238.2814 145.4282 390.4196
Zona Norte 4 4 190 104.12 1 3 3 Apartamento san vicente -76.52707 3.46279 239.6356 146.2546 392.6385
Zona Norte 8 4 397 160.48 1 4 4 Apartamento la campiña -76.52741 3.48002 300.6080 183.4595 492.5619
Zona Norte 8 4 750 300.00 3 5 4 Apartamento chipichape -76.52782 3.47595 530.9596 324.0011 870.1148
Zona Norte 2 4 300 163.00 1 3 3 Apartamento san vicente -76.52785 3.46701 303.0723 184.9630 496.6010
Zona Norte 4 4 250 118.00 1 2 3 Apartamento versalles -76.52793 3.46699 255.8754 156.1651 419.2500
Zona Norte 7 4 250 106.00 1 2 3 Apartamento versalles -76.52812 3.46362 241.8931 147.6324 396.3377
Zona Norte 2 4 300 136.00 2 3 3 Apartamento el bosque -76.52872 3.48474 320.9155 195.8529 525.8374
Zona Norte NA 4 270 111.00 1 3 3 Apartamento versalles -76.52900 3.46300 247.8062 151.2409 406.0270
Zona Norte 2 4 300 136.00 2 2 3 Apartamento el bosque -76.52902 3.48509 320.9155 195.8529 525.8374
Zona Norte 7 4 300 126.00 2 4 4 Apartamento versalles -76.52953 3.45926 308.3267 188.1691 505.2123
Zona Norte 6 4 310 147.00 1 2 2 Apartamento santa monica -76.53098 3.46780 287.1012 175.2187 470.4240
Zona Norte NA 4 420 145.00 1 3 2 Apartamento centenario -76.53200 3.46500 285.0478 173.9658 467.0585
Zona Norte NA 4 280 173.00 2 3 3 Apartamento santa monica -76.53362 3.46337 364.0413 222.1731 596.4991
Zona Norte NA 4 600 242.00 1 4 3 Apartamento juanamb√∫ -76.53500 3.45800 372.8001 227.4969 610.9091
Zona Norte 7 4 315 125.00 1 3 4 Apartamento centenario -76.53593 3.45391 263.7198 160.9520 432.1050
Zona Norte 3 4 320 108.00 2 3 3 Apartamento acopi -76.53638 3.40770 284.4017 173.5653 466.0168
Zona Norte 10 4 245 103.00 1 2 2 Apartamento versalles -76.54973 3.42484 238.2814 145.4282 390.4196
Zona Norte NA 4 310 120.00 1 3 2 Apartamento san pedro -76.55400 3.42600 258.1388 157.5463 422.9590
ggplot(mydata.plot, aes(x=Area_contruida, y=precio_millon)) + 
  geom_point(color='#2980B9', size = 4) + 
  geom_smooth(method=lm, color='#2C3E50')

E. Modelo Identificado

Predecir el precio de un apartamento con 100 mt2, de estrato 4 y con parqueadero el precio por 450 millones segun la prediccion se enceuntra muy por encima por tanto no deberia considerar la oferta dado que nos da de 234 millones con el mejorado y con normal es de 224 millones por las condiciones sugeridas

F. 5 ofertas potenciales a discutir

datos_plot = mydata.plot %>% filter(upr<=400)

require(leaflet)
leaflet()%>% addCircleMarkers(lng=datos_plot$cordenada_longitud, lat = datos_plot$Cordenada_latitud,popup="Posible Compra")%>% addTiles()

4. ÁRBOLES

Enunciado

Con base en los datos de arboles 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.

Solución

A: Exploración de los datos

arboles<-read_excel("C:/Users/Andre/OneDrive/Escritorio/datos_arboles.xlsx",
    col_types = c("text", "text", "numeric", 
        "numeric", "numeric"))

head(arboles)
finca mg peso diametro altura
FINCA_1 GENOTIPO_1 13.73 4.7 5.0
FINCA_1 GENOTIPO_1 14.58 5.3 5.6
FINCA_1 GENOTIPO_1 15.88 4.8 5.8
FINCA_1 GENOTIPO_1 8.99 3.2 4.3
FINCA_1 GENOTIPO_1 6.99 2.2 3.3
FINCA_1 GENOTIPO_2 19.34 6.3 7.9
names(arboles)
## [1] "finca"    "mg"       "peso"     "diametro" "altura"
attach(arboles)

par(mfrow=c(1,3))

hist(peso,freq = FALSE,main="Histograma del peso",ylab="Frecuencia",xlab="Peso")
lines(density(peso), lwd = 2, col = 'red')
hist(diametro,freq = FALSE,main="Histograma del diametro",ylab="Frecuencia",xlab="Diametro")
lines(density(diametro), lwd = 2, col = 'red')
hist(altura,freq = FALSE,main="Histograma de la altura",ylab="Frecuencia",xlab="Altura")
lines(density(altura), lwd = 2, col = 'red')

ggpairs(arboles, lower = list(continuous = "smooth"),
        diag = list(continuous = "barDiag"), axisLabels = "none")

Visualmente, se observa que las 3 variables numéricas (peso, diámetro y altura), tienen un comportamiento normal, además, es posible observar que sí existe una correlación entre el peso y las otras dos variables numpericas disponibles = diámetro (0.908123) y altura (0.8582009); adicionalmente, se observa que hay una fuerte correlación entre las variables diámetro y altura (0.9355360), siendo incluso mayor que la correlación que existe entre la variable independiente peso y sus posibles predictoras, por lo cual, se decide calcular el determinante de la matriz de coeficientes de correlación, y se encuentra que este es bastante cercano a 0 (0.02179987); por este motivo, se podría pensar que existe multicolinealidad entre las variables diámetro y altura, pero a pesar de ello se decide trabajar con la totalidad de las variables disponibles.

B: Planteamiento del Modelo

modelo <- lm(data=arboles, peso~.)
summary(modelo)
## 
## Call:
## lm(formula = peso ~ ., data = arboles)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.1009 -1.8569 -0.5094  1.5578 12.8691 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -13.95177    1.68295  -8.290 1.59e-12 ***
## fincaFINCA_2  -0.03095    0.99140  -0.031 0.975166    
## fincaFINCA_3   3.51938    0.83466   4.217 6.23e-05 ***
## mgGENOTIPO_2  -4.50270    1.23667  -3.641 0.000468 ***
## diametro       2.57058    0.76282   3.370 0.001138 ** 
## altura         2.98566    0.76616   3.897 0.000195 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.983 on 84 degrees of freedom
## Multiple R-squared:  0.8738, Adjusted R-squared:  0.8662 
## F-statistic: 116.3 on 5 and 84 DF,  p-value: < 2.2e-16

Al analizar el resumen de las variables, se logra apreciar un valor de \(R^2\) bastante cercano a 1, de 0.8662, por lo cual se concluye que existe una fuerte relación entre la totalidad de variables disponibles, y que además, estas explican el 86,62% de los valores del peso, sin embargo, se puede apreciar que las observaciones de FINCA_1, FINCA_2 y GENOTIPO_1 no son significativas para el modelo; por lo anterior, la ecuación que lo representa está dada por:

\(Peso = 3.51938*FINCA3 - 4.50270*GENOTIPO2 + 2.57058*DIAMETRO + 2.98566*ALTURA\)

C: Entrenamiento y Validación Cruzada

set.seed(123)
random_sample <- createDataPartition(peso,
                                p = 0.8, list = FALSE)
training_dataset  <- arboles[random_sample, ]
testing_dataset <- arboles[-random_sample, ]
model <- lm(peso ~., data = training_dataset, na.action=na.exclude)
summary(model)
## 
## Call:
## lm(formula = peso ~ ., data = training_dataset, na.action = na.exclude)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.0563 -1.7826 -0.3383  1.5405 10.7840 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -13.3772     1.6827  -7.950 2.70e-11 ***
## fincaFINCA_2  -0.2855     0.9620  -0.297 0.767518    
## fincaFINCA_3   3.7552     0.8200   4.579 2.05e-05 ***
## mgGENOTIPO_2  -4.9857     1.2318  -4.047 0.000135 ***
## diametro       2.0143     0.7280   2.767 0.007286 ** 
## altura         3.3636     0.7318   4.596 1.92e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.608 on 68 degrees of freedom
## Multiple R-squared:  0.8901, Adjusted R-squared:  0.882 
## F-statistic: 110.1 on 5 and 68 DF,  p-value: < 2.2e-16
predictions <- predict(model, testing_dataset)

data.frame( R2 = R2(predictions, testing_dataset $ peso),
            RMSE = RMSE(predictions, testing_dataset $ peso),
            MAE = MAE(predictions, testing_dataset $ peso))
R2 RMSE MAE
0.8504781 4.359821 2.775827

Se realiza una partición de los datos, con el fin de tomar el 80% de estos como datos de entrada para el entrenamiento del modelo, y el 20% restante como datos para validación cruzada; luego, se calcula el \(R^2\), el \(RMSE\) (Error Cuadrático Medio) y el \(MAE\) (Error Absoluto Medio), los cuales, para la primer instancia de prueba Esto porque los valores pueden variar en próximas ejecuciones del código al tratarse de una muestra, fueron:

\(R^2 = 0.8504781\)

\(RMSE = 4.359821\)

\(MAE = 2.775827\)

Teniendo en cuenta estos resultados, es posible concluir que el modelo planteado posee un alto nivel de ajuste, y puede ser de utilidad al predecir el peso de los árboles en función de sus variables de interés.