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

1. Librerias

library(dplyr)
library(knitr)
library(readr)
library(caret)

2. Leer los datos

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 Mazatln- stas casas de tres habitaciones- estn dentro del residencial privado San Fernanda- mismo que cuenta con caseta de vigilancia-…
650000 1 3 1 4 NA 90 90 Prolongacin Jos Mara Pino Surez Centro Durango Casa un piso 3 recamaras 2 baos 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 baos 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 reas verdes casa en dos plantas diseo moderno acabados de primera- cuenta con 3 recamaras con closets- cocina equipada acero inoxidable-2 baos y medio- terraza- patio amplio jardn 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 diseo moderno 3 recamras 2 baos 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 bao boiler solar patio jardin cochera diseo moderno

3. Describir y explorar los datos

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

4. Limpiar datos

  • Quitar columnas que no se necesitan
  • Poner banio al nombre de la variable
  • Poner 0 los NA en los registros de estacionamientos 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

5. 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)
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
Datos de validación (primeros diez)
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

6. 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

7. Analizar el modelo

  • 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.

8. Realiza 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
  • Ver los datos en una tabla
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

9. Realizar una predicción con datos nuevos

  • estacionamientos = 1
  • recamaras = 4
  • banio = 2
  • construccion = 300
  • terreno = 215
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"

10. Interpretación

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.