Determinar la ecuación de regresión lineal mútiple y predecir valores de los datos de precios de casas de Durango, México.
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
library(dplyr)
library(knitr)
library(readr)
library(caret)
datos <- read.csv("https://raw.githubusercontent.com/rpizarrog/FundamentosMachineLearning/master/datos/datos%20precios%20de%20casas.csv", encoding = "UTF-8")
kable(head(datos))
precio | estacionamientos | recamaras | ba.f1.os | habitaciones | agnio.construccion | construccion | terreno | calle.domicilio | colonia.fraccionamiento | ciudad | descripcion |
---|---|---|---|---|---|---|---|---|---|---|---|
1780000 | 2 | 3 | 2 | 5 | 2020 | 169 | 126 | Privada San Fernanda | San Fernando- Durango | Durango | Ubicadas en la salida Mazatl |
650000 | 1 | 3 | 1 | 4 | NA | 90 | 90 | Prolongaci |
Centro | Durango | Casa un piso 3 recamaras 2 ba |
590000 | 2 | 2 | 2 | 4 | NA | 63 | 90 | Centro | Centro | Durango | Casa un piso bonita 3 recamaras 2 ba |
1300000 | 2 | 3 | 2 | 5 | NA | 130 | 120 | Centro | Centro | Durango | Casa en venta nueva |
1000000 | 2 | 2 | 1 | 3 | NA | 110 | 160 | Centro | Centro | Durango | Bonita casa en dos pisos dise |
465000 | 2 | 3 | 1 | 4 | NA | 53 | 89 | Centro | Centro | Durango | Bonita casa con 2 recamras un ba |
summary(datos)
## precio estacionamientos recamaras ba.f1.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
##
##
##
##
Para este caso sólo importan los siguientes atributos: Variable dependiente: ´precio Variables independientes: estacionamientos, recamaras, banios, construcción y terreno
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
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
precio | estacionamientos | recamaras | banio | construccion | terreno | |
---|---|---|---|---|---|---|
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 (is.na(row.names)) row.names = has_rownames(x): la condición tiene
## longitud > 1 y sólo el primer elemento será usado
precio | estacionamientos | recamaras | banio | construccion | terreno | |
---|---|---|---|---|---|---|
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 |
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
El valor Multiple R-squared es de un 93% y el valor de Adjusted R-squared es de un 92% esto representa que tanta relación hay entre las variables independientes la variable dependiente
Los ** para el Intercet y los *** para banio y terreno representan que hay alguna importancia estadistica para el precio de una casa.
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)
precio | estacionamientos | recamaras | banio | construccion | terreno | prediccion | |
---|---|---|---|---|---|---|---|
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 |
estacionamientos <- 1
recamaras <- 4
banio <- 2
construccion <- 300
terreno <- 215
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: 2475718.49"
En este caso se trata con un conjunto de datos que es acerca de los precios de casas en la ciudad de Durango, se uso el modelo de regresión lineal múltiple para el análisis y se decidió usar como variable dependiente el precio y como variables independientes estacionamientos, recamaras, banio, construcción y terreno. Para este análisis obtenemos que el R-squared vale 0.9332 (93%) y el Adjusted R-squared vale 0.9225 (92%) lo que quiere decir en el modelo que la relación entre la variable dependiente y las variables independientes es muy alta, sin embargo al momento de revisar los coeficientes del modelo solamente el Intercept, el banio y el terreno tienen un significado estadístico representativo, mientras que las demás variables independientes no presentan ningún significado estadístico relevante para el modelo, lo que quiere decir que el modelo no es adecuado para el caso, y como vemos en las predicciones estas no son correctas siempre ofrece un precio más alto o menor al precio original, por lo tanto se necesita refinar aún más el modelo o bien buscar que el conjunto de datos original no sea tan homogéneo entre registros.