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
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
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
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
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
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
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
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.
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)
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.
Plantee y valide las hipótesis correspondientes a la linealidad general del modelo propuesto en a.
\(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\).
\(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.
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.
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.
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:
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.
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.
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í.
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.
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.
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()
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
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
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')
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
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()
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.
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.
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\)
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.