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
1. Las librerías
library(readr)
library(knitr)
library(dplyr)
library(caret) # Para particionar datos
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))
| 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))
## 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 |
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)
| 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
Para este caso los datos usados fueron obtenidos de varias publicaciones de casas en venta dentro de la ciudad de Durango, Durango México. Usamos la regresión línea múltiple para poder crear un modelo que sea capaz de predecir el valor o precio de una vivienda usando como variables independientes el número de estacionamientos, recamaras, baños, terreno construido y terreno sin construir. Para este caso tenemos un R-Squiared de 0.93% y un Adjusted R-Squared del 0.92% lo cual nos da a entender que la relación que existe entre el precio y las variables ya mencionadas es muy alto. Estadísticamente hablando y buscando los *** (tres asteriscos) el número de baños y el tamaño del terreno son fundamentales en el precio de una casa. La predicción que realizamos una casa que tiene 1 estacionamiento, 4 recamaras, 2 baños, construcción de 350 y terreno de 250 nos predice un valor de $2,905,874 que si analizamos estas características con alguna de las casas que está dentro de nuestro conjunto de datos el precio es similar, lo cual concluye que nuestro modelo de predicción es viable.