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. Las librerías

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)  # Para particionar datos
## Loading required package: lattice
## Loading required package: ggplot2

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. 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  
##                    
##                    
##                    
## 
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.f1.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<f3>n Jos<e9> Mar<ed>a Pino Su<e1>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<e1>n- <e9>stas casas de tres habitaciones- est<e1>n dentro del residencial privado"| __truncated__ "Casa un piso 3 recamaras 2 ba<f1>os boiler solar y de paso cochera patio cisterna todos los servicios ambiente "| __truncated__ "Casa un piso bonita 3 recamaras 2 ba<f1>os ambiente familiar boiler solar y de paso cochera todos los servicios" "Casa en venta nueva <e1>reas verdes casa en dos plantas dise<f1>o moderno acabados de primera- cuenta con 3 rec"| __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

4. 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
# Exportar los datos limpios
# write.csv(datos, "../datos/precio.casas.limpio.csv")

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))
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))
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

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

10. Interpretar el caso

Expresar ideas sobre el caso, individuales, innovadoras, constructivas, enriquecedoras, claras, consistentes, hiladas. de 80 a 100 palabras