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(knitr)
library(readr)
library(caret)
## Warning: package 'caret' was built under R version 4.0.3
## Loading required package: lattice
## Loading required package: ggplot2
library(ggplot2)
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
##
##
##
##
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__ ...
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
70 % datos de entrenamiento
30 % datos de validación
set.seed(2020)
entrena <- createDataPartition(y = datos$precio, p = 0.7, list = FALSE, times = 1)
datos.entrenamiento <- datos[entrena, ]
datos.validacion <- datos[-entrena, ]
kable(head(datos.entrenamiento, 10), caption = "(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 (row.names) {: 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
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 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"
El caso es muy importante y util en el sentido de que la compra-venta de casas es algo escencial y se mueve bastante.
Al ser datos reales de la ciudad de durango resulta demasiado util para alguna empresa que se dedique a las bienes raices para planificar, organizar y analizar los posibles costos de las casas por medio de las variables importantes.
Facilita el analizar distintas situaciones que ayudarian a encontrar mas rapido las ventas de casas, con una estadistica importante para sacar presupuestos.
Esto puede ser un crecimiento para las empresas duranguenses que trabajan con bienes raices para implementar nuevas tecnologias a su manera de vender y analizar presupuestos.
Facilita el trabajo de los empleados en cierto punto, con la capacidad de imprementarse en un software amigable para la empresa.