Objetivo
Determinar la ecuación de regresión lineal mútiple y predecir valores de los datos de precios de casas de Durango, México.
Descripción
Se muestra cómo utilizar la función de regresión lineal múltiple y con ello se determinan las ecuaciones de regesión lineal múltiple para el conjuno de datos de precios de casas de Durango, México.
Proceso
Librerías
Leer los datos
Describir y explorar los datos
Limpiar datos
Conjunto de entrenamiento y conjunto de validación 70%, 30%
Determinar el modelo
Analizar el modelo
Realiza predicciones con conjunto de datos de validación
Realizar predicciones con datos nuevos
Interpretar el caso
Librerias
library(readr)
library(knitr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(caret)
## Warning: package 'caret' was built under R version 4.0.3
## Loading required package: lattice
## Loading required package: ggplot2
Leer los datos
datos <- read.csv('C:/Users/Blue/Documents/casas.csv', encoding = "UTF-8")
kable(head(datos))
| 1780000 |
2 |
3 |
2 |
5 |
2020 |
169 |
126 |
Privada San Fernanda |
San Fernando- Durango |
Durango |
Ubicadas en la salida Mazatl<U+FFFD>n- <U+FFFD>stas casas de tres habitaciones- est<U+FFFD>n dentro del residencial privado San Fernanda- mismo que cuenta con caseta de vigilancia-… |
| 650000 |
1 |
3 |
1 |
4 |
NA |
90 |
90 |
Prolongaci<U+FFFD>n Jos<U+FFFD> Mar<U+FFFD>a Pino Su<U+FFFD>rez |
Centro |
Durango |
Casa un piso 3 recamaras 2 ba<U+FFFD>os boiler solar y de paso cochera patio cisterna todos los servicios ambiente familiar….todo cerca- mucho transporte.- buenos servicios. |
| 590000 |
2 |
2 |
2 |
4 |
NA |
63 |
90 |
Centro |
Centro |
Durango |
Casa un piso bonita 3 recamaras 2 ba<U+FFFD>os ambiente familiar boiler solar y de paso cochera todos los servicios |
| 1300000 |
2 |
3 |
2 |
5 |
NA |
130 |
120 |
Centro |
Centro |
Durango |
Casa en venta nueva <U+FFFD>reas verdes casa en dos plantas dise<U+FFFD>o moderno acabados de primera- cuenta con 3 recamaras con closets- cocina equipada acero inoxidable-2 ba<U+FFFD>os y medio- terraza- patio amplio jard<U+FFFD>n <U+FFFD>rea de servicio hidro gas estacionario cisterna cristales tintex de primera cochera dos autos bonita zona ambiente familiar aplican todos los creditos |
| 1000000 |
2 |
2 |
1 |
3 |
NA |
110 |
160 |
Centro |
Centro |
Durango |
Bonita casa en dos pisos dise<U+FFFD>o moderno 3 recamras 2 ba<U+FFFD>os y medio cochera todos los servicios ambiente familiar se aceptan todos los creditos |
| 465000 |
2 |
3 |
1 |
4 |
NA |
53 |
89 |
Centro |
Centro |
Durango |
Bonita casa con 2 recamras un ba<U+FFFD>o boiler solar patio jardin cochera dise<U+FFFD>o moderno |
Explorar los datos
summary(datos)
## precio estacionamientos recamaras ba.U.FFFD.os
## Min. : 462000 Min. :0.000 Min. :1.000 Min. :1.000
## 1st Qu.: 655000 1st Qu.:0.000 1st Qu.:2.000 1st Qu.:1.000
## Median :1000000 Median :1.000 Median :3.000 Median :2.000
## Mean :1514383 Mean :1.125 Mean :2.824 Mean :1.706
## 3rd Qu.:1938500 3rd Qu.:2.000 3rd Qu.:3.000 3rd Qu.:2.000
## Max. :8200000 Max. :3.000 Max. :5.000 Max. :4.000
## NA's :3
## habitaciones agnio.construccion construccion terreno
## Min. :2.000 Min. :1995 Min. : 47.00 Min. : 47.0
## 1st Qu.:4.000 1st Qu.:2020 1st Qu.: 75.75 1st Qu.: 90.0
## Median :4.500 Median :2020 Median :131.00 Median :126.0
## Mean :4.569 Mean :2017 Mean :151.12 Mean :148.7
## 3rd Qu.:5.000 3rd Qu.:2020 3rd Qu.:169.75 3rd Qu.:166.0
## Max. :8.000 Max. :2020 Max. :606.00 Max. :512.0
## NA's :26 NA's :1
## calle.domicilio colonia.fraccionamiento ciudad
## Length:51 Length:51 Length:51
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
## descripcion
## Length:51
## Class :character
## Mode :character
##
##
##
##
str(datos)
## 'data.frame': 51 obs. of 12 variables:
## $ precio : int 1780000 650000 590000 1300000 1000000 465000 780000 464520 660000 580000 ...
## $ estacionamientos : int 2 1 2 2 2 2 2 0 0 NA ...
## $ recamaras : int 3 3 2 3 2 3 1 2 3 3 ...
## $ ba.U.FFFD.os : num 2 1 2 2 1 1 1 1 1 1 ...
## $ habitaciones : num 5 4 4 5 3 4 2 3 4 4 ...
## $ agnio.construccion : int 2020 NA NA NA NA NA 2020 2020 2020 2020 ...
## $ construccion : num 169 90 63 130 110 53 84 47 73 65 ...
## $ terreno : num 126 90 90 120 160 89 90 98 112 103 ...
## $ calle.domicilio : chr "Privada San Fernanda" "Prolongaci<U+FFFD>n Jos<U+FFFD> Mar<U+FFFD>a Pino Su<U+FFFD>rez" "Centro" "Centro" ...
## $ colonia.fraccionamiento: chr "San Fernando- Durango" "Centro" "Centro" "Centro" ...
## $ ciudad : chr "Durango" "Durango" "Durango" "Durango" ...
## $ descripcion : chr "Ubicadas en la salida Mazatl<U+FFFD>n- <U+FFFD>stas casas de tres habitaciones- est<U+FFFD>n dentro del residen"| __truncated__ "Casa un piso 3 recamaras 2 ba<U+FFFD>os boiler solar y de paso cochera patio cisterna todos los servicios ambie"| __truncated__ "Casa un piso bonita 3 recamaras 2 ba<U+FFFD>os ambiente familiar boiler solar y de paso cochera todos los servicios" "Casa en venta nueva <U+FFFD>reas verdes casa en dos plantas dise<U+FFFD>o moderno acabados de primera- cuenta c"| __truncated__ ...
Sólo interesan los datos: * Como variable dependiente: * precio. * Como variables independientes; * estacioamiento, Cuántos estacionamientos * recamaras, Cuántas recámaras * banios, Cuántos baños * construccion. Cantidad de metros contruidos * terreno: Cantidad de metros
Limpiar datos
Quitar columnas que no se necesitan
Poner banio al nombre de la variable
Poner 0 los NA en todas las variables porque no tiene estacionamiento
datos <- datos[,c(1,2,3,4,7,8)]
names(datos)[4] <- c("banio")
datos <- mutate(datos, estacionamientos = ifelse(is.na(estacionamientos) ,0,estacionamientos ))
head(datos)
## precio estacionamientos recamaras banio construccion terreno
## 1 1780000 2 3 2 169 126
## 2 650000 1 3 1 90 90
## 3 590000 2 2 2 63 90
## 4 1300000 2 3 2 130 120
## 5 1000000 2 2 1 110 160
## 6 465000 2 3 1 53 89
Conjunto de entrenamiento y conjunto de validación 70%, 30%
set.seed(2020)
entrena <- createDataPartition(y = datos$precio, p = 0.7, list = FALSE, times = 1)
# Datos entrenamiento
datos.entrenamiento <- datos[entrena, ] # [renglones, columna]
# Datos validación
datos.validacion <- datos[-entrena, ]
kable(head(datos.entrenamiento, 10), caption = "Datos de entrenamiento (primeros diez)", row.names = 1:nrow(datos.entrenamiento))
## Warning in if (is.na(row.names)) row.names = has_rownames(x): la condición tiene
## longitud > 1 y sólo el primer elemento será usado
## Warning in if (row.names) {: la condición tiene longitud > 1 y sólo el primer
## elemento será usado
Datos de entrenamiento (primeros diez)
| 2 |
650000 |
1 |
3 |
1 |
90 |
90 |
| 3 |
590000 |
2 |
2 |
2 |
63 |
90 |
| 4 |
1300000 |
2 |
3 |
2 |
130 |
120 |
| 5 |
1000000 |
2 |
2 |
1 |
110 |
160 |
| 7 |
780000 |
2 |
1 |
1 |
84 |
90 |
| 8 |
464520 |
0 |
2 |
1 |
47 |
98 |
| 10 |
580000 |
0 |
3 |
1 |
65 |
103 |
| 11 |
1550000 |
2 |
3 |
2 |
155 |
126 |
| 12 |
640000 |
0 |
2 |
1 |
NA |
90 |
| 14 |
480000 |
0 |
2 |
1 |
53 |
90 |
kable(head(datos.validacion, 10), caption = "Datos de validación (primeros diez)", row.names = 1:nrow(datos.entrenamiento))
## Warning in if (is.na(row.names)) row.names = has_rownames(x): la condición tiene
## longitud > 1 y sólo el primer elemento será usado
## Warning in if (row.names) {: la condición tiene longitud > 1 y sólo el primer
## elemento será usado
Datos de validación (primeros diez)
| 1 |
1780000 |
2 |
3 |
2.0 |
169.00 |
126 |
| 6 |
465000 |
2 |
3 |
1.0 |
53.00 |
89 |
| 9 |
660000 |
0 |
3 |
1.0 |
73.00 |
112 |
| 13 |
2350000 |
2 |
3 |
2.5 |
194.56 |
203 |
| 16 |
1000000 |
2 |
3 |
2.0 |
110.00 |
120 |
| 23 |
660000 |
0 |
3 |
1.0 |
73.00 |
112 |
| 25 |
1750000 |
1 |
3 |
2.0 |
154.00 |
130 |
| 32 |
2100000 |
0 |
4 |
2.0 |
151.00 |
151 |
| 34 |
640000 |
1 |
2 |
1.0 |
60.00 |
90 |
| 35 |
462000 |
1 |
2 |
1.0 |
47.00 |
90 |
Determinar el modelo
modelo <- lm(formula = precio ~ ., datos.entrenamiento)
summary(modelo)
##
## Call:
## lm(formula = precio ~ ., data = datos.entrenamiento)
##
## Residuals:
## Min 1Q Median 3Q Max
## -943487 -164375 38426 201582 1255070
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -980740 287915 -3.406 0.001840 **
## estacionamientos -75542 85311 -0.885 0.382714
## recamaras -73962 110674 -0.668 0.508896
## banio 599112 145930 4.105 0.000272 ***
## construccion 1786 1663 1.074 0.291058
## terreno 9738 1719 5.666 3.18e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 417700 on 31 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.9332, Adjusted R-squared: 0.9225
## F-statistic: 86.68 on 5 and 31 DF, p-value: < 2.2e-16
Realizar predicciones con conjunto de datos de validación
prediccion <- predict(object = modelo, newdata = datos.validacion)
prediccion
## 1 6 9 13 16 23 25 32
## 1373425.4 206790.9 617581.9 2468495.1 1209608.0 617581.9 1461127.3 1661854.7
## 34 35 45 49 51
## 378536.5 355315.7 1085880.3 916617.4 2928514.4
predicciones <- data.frame(datos.validacion, prediccion)
kable(predicciones)
| 1 |
1780000 |
2 |
3 |
2.0 |
169.00 |
126 |
1373425.4 |
| 6 |
465000 |
2 |
3 |
1.0 |
53.00 |
89 |
206790.9 |
| 9 |
660000 |
0 |
3 |
1.0 |
73.00 |
112 |
617581.9 |
| 13 |
2350000 |
2 |
3 |
2.5 |
194.56 |
203 |
2468495.1 |
| 16 |
1000000 |
2 |
3 |
2.0 |
110.00 |
120 |
1209608.0 |
| 23 |
660000 |
0 |
3 |
1.0 |
73.00 |
112 |
617581.9 |
| 25 |
1750000 |
1 |
3 |
2.0 |
154.00 |
130 |
1461127.3 |
| 32 |
2100000 |
0 |
4 |
2.0 |
151.00 |
151 |
1661854.7 |
| 34 |
640000 |
1 |
2 |
1.0 |
60.00 |
90 |
378536.5 |
| 35 |
462000 |
1 |
2 |
1.0 |
47.00 |
90 |
355315.7 |
| 45 |
960000 |
1 |
3 |
2.0 |
162.00 |
90 |
1085880.3 |
| 49 |
1200000 |
1 |
3 |
1.5 |
115.00 |
112 |
916617.4 |
| 51 |
3450000 |
2 |
3 |
2.0 |
200.00 |
280 |
2928514.4 |
Realizar predicciones con datos nuevos
estacionamientos
banio
recamaras
construccion
terreno
estacionamientos <- 2
recamaras <- 3
banio <- 2
construccion <- 250
terreno = 201
nuevos.datos <- data.frame(estacionamientos=estacionamientos,recamaras=recamaras, banio=banio, construccion=construccion,terreno=terreno)
prediccion <- predict(object = modelo,
newdata = nuevos.datos)
paste("El valor del precio predicho es: ", round(prediccion, 2))
## [1] "El valor del precio predicho es: 2248490.41"
Interpretacion
De acuerdo al caso sobre costo de casas de durango podemos sacar las variables que usaremos, que son la variable dependiente e independientes. Donde el precio es nuestra variable dependiente y las independientes son estacionamientos, baño, recamaras, construccion y terreno todo esto influye en el costo de una casa.
En cuanto al valor de Multiple R-squared tenemos un valor de 0.9332 y Adjusted R-squared con 0.9225 aproximadamente un 90% lo cual nos indica que se puede hacer una buena prediccion.
En el caso se tiene un ejemplo de prediccion con los siguientes datos: estacionamientos:2, recamaras:3,baños:2, contruccion: 250 y terreno:201, al hacer la prediccion nos da un total de 2248490.41.
Como conclusion final nos damos cuenta de que el modelo de regresion lineal multiple es muy bueno ya que sus predicciones al considerar varias variables los resultados son muy acertados.