Knit
#ANÁLISIS DE BASE DE DATOS DE OLX DEL VEHICULO NISSAN VERSA CON WEB SCRAPING
#Cargar excel y paquetes para limpieza install.packages(readxl) library(readxl) install.packages(“dplyr”) library(dplyr) install.packages(“ggplot2”) library(ggplot2) install.packages(“dslabs”) library(dslabs) install.packages(“corrplot”) library(corrplot) install.packages(“dplyr”) library(dplyr) install.packages(“rapportools”) library(rapportools) install.packages(“readr”) library(ggplot2) library(dslabs) library(readr) library(rapportools) install.packages(“Hmisc”) library(Hmisc) Se cargan los datos y se instalan los paquetes para realizar una limpieza, en función de que estos sean utiles dentro de la herramienta
#install.packages(readxl)
library(readxl)
#install.packages("dplyr")
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
#install.packages("ggplot2")
library(ggplot2)
#install.packages("dslabs")
library(dslabs)
#install.packages("corrplot")
library(corrplot)
## corrplot 0.92 loaded
#install.packages("dplyr")
library(dplyr)
#install.packages("rapportools")
library(rapportools)
##
## Attaching package: 'rapportools'
## The following object is masked from 'package:dplyr':
##
## n
## The following objects are masked from 'package:stats':
##
## IQR, median, sd, var
## The following objects are masked from 'package:base':
##
## max, mean, min, range, sum
#install.packages("readr")
library(ggplot2)
library(dslabs)
library(readr)
library(rapportools)
#install.packages("Hmsic")
library(Hmisc)
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:rapportools':
##
## label, label<-
## The following objects are masked from 'package:dplyr':
##
## src, summarize
## The following objects are masked from 'package:base':
##
## format.pval, units
#install.packages(c("tidyverse", "readxl"))
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ lubridate 1.9.2 ✔ tibble 3.2.1
## ✔ purrr 1.0.1 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ rapportools::n() masks dplyr::n()
## ✖ Hmisc::src() masks dplyr::src()
## ✖ Hmisc::summarize() masks dplyr::summarize()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Cargar el archivo de Excel en RStudio
data <- read_excel("nissan_versa.xlsx")
# Cambiar el formato de texto a numérico en la columna "precio"
data <- data %>%
mutate(precio = as.numeric(gsub("\\$|\\.", "", precio)))
# Eliminar los "." de las decimales en la columna "kilometraje"
data <- data %>%
mutate(kilometraje = gsub("\\.", "", kilometraje))
# Eliminar el signo "km" en la columna "kilometraje"
data <- data %>%
mutate(kilometraje = gsub("km", "", kilometraje))
# Guardar los cambios en un nuevo archivo de Excel
write_excel_csv(data, "Prediccion y big data.csv")
#Verificar datos
library(tidyverse)
# Cargar el archivo de Excel en RStudio
data <- read_excel("nissan_versa.xlsx")
# Imprimir una muestra de los datos antes de la limpieza
cat("Datos antes de la limpieza:\n")
## Datos antes de la limpieza:
print(data)
## # A tibble: 59 × 6
## `link-href` precio kilometraje modelo combustible transmision
## <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 https://www.olx.com.co/ite… $ 77.… 39.000 Km 2022 Gasolina Mecánica
## 2 https://www.olx.com.co/ite… $ 47.… 83.000 Km 2017 Gasolina Automática
## 3 https://www.olx.com.co/ite… $ 40.… 138.000 Km 2015 Gasolina Automática
## 4 https://www.olx.com.co/ite… $ 79.… 39.000 Km 2021 Gasolina Automática
## 5 https://www.olx.com.co/ite… $ 44.… 91.000 Km 2014 Gasolina Automática
## 6 https://www.olx.com.co/ite… $ 70.… 42.000 Km 2022 Gasolina Automática
## 7 https://www.olx.com.co/ite… $ 16.… 242.000 Km 2002 Gasolina Mecánica
## 8 https://www.olx.com.co/ite… $ 44.… 31.000 Km 2017 Gasolina Mecánica
## 9 https://www.olx.com.co/ite… $ 45.… 69.000 Km 2016 Gasolina Mecánica
## 10 https://www.olx.com.co/ite… $ 78.… 31.224 Km 2022 Gasolina Mecánica
## # ℹ 49 more rows
# Cambiar el formato de texto a numérico en la columna "precio"
data <- data %>%
mutate(precio = as.numeric(gsub("\\$|\\.", "", precio)))
# Eliminar "km" de la variable "kilometraje"
data$kilometraje <- gsub(" Km", "", data$kilometraje)
# Eliminar los "." de las decimales en la columna "kilometraje"
data <- data %>%
mutate(kilometraje = gsub("\\.", "", kilometraje))
# Eliminar el signo "km" en la columna "kilometraje"
data <- data %>%
mutate(kilometraje = gsub("km", "", kilometraje))
# Imprimir una muestra de los datos después de la limpieza
cat("\nDatos después de la limpieza:\n")
##
## Datos después de la limpieza:
print(data)
## # A tibble: 59 × 6
## `link-href` precio kilometraje modelo combustible transmision
## <chr> <dbl> <chr> <dbl> <chr> <chr>
## 1 https://www.olx.com.co/ite… 7.70e7 39000 2022 Gasolina Mecánica
## 2 https://www.olx.com.co/ite… 4.70e7 83000 2017 Gasolina Automática
## 3 https://www.olx.com.co/ite… 4 e7 138000 2015 Gasolina Automática
## 4 https://www.olx.com.co/ite… 7.90e7 39000 2021 Gasolina Automática
## 5 https://www.olx.com.co/ite… 4.45e7 91000 2014 Gasolina Automática
## 6 https://www.olx.com.co/ite… 7 e7 42000 2022 Gasolina Automática
## 7 https://www.olx.com.co/ite… 1.6 e7 242000 2002 Gasolina Mecánica
## 8 https://www.olx.com.co/ite… 4.40e7 31000 2017 Gasolina Mecánica
## 9 https://www.olx.com.co/ite… 4.50e7 69000 2016 Gasolina Mecánica
## 10 https://www.olx.com.co/ite… 7.80e7 31224 2022 Gasolina Mecánica
## # ℹ 49 more rows
#Cargar base de datos limpia
library(readr)
# Cargar la base de datos limpia desde el archivo CSV
data_limpia <- read_csv("Prediccion y big data.csv")
## Rows: 59 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (4): link-href, kilometraje, combustible, transmision
## dbl (2): precio, modelo
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Análisis univariado
#Resumen estadistico de las variables:
summary(data$precio) # Resumen estadístico de la variable "precio"
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 16000000 41975000 46900000 50650000 54900000 83300000
summary(data$kilometraje) # Resumen estadístico de la variable "kilometraje"
## Length Class Mode
## 59 character character
summary(data$modelo) # Resumen estadístico de la variable "modelo"
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2002 2015 2017 2017 2020 2022
summary(data$modelo) # Resumen estadístico de la variable "transmison"
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2002 2015 2017 2017 2020 2022
summary(data$modelo) # Resumen estadístico de la variable "combustible"
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2002 2015 2017 2017 2020 2022
#Graficos de distribución:
library(ggplot2)
ggplot(data, aes(x = precio)) +
geom_histogram(bins = 20, fill = "lightblue", color = "black") +
labs(x = "Precio", y = "Frecuencia") +
theme_minimal()
Se crean graficos de distribución para visulizar la distribución
de las variables númericas.
#Graficos de dispersión:
ggplot(data, aes(x = kilometraje, y = precio)) +
geom_point(color = "blue") +
labs(x = "kilometraje", y = "Precio") +
theme_minimal()
ggplot(data, aes(x = modelo, y = precio)) +
geom_point(color = "red") +
labs(x = "modelo", y = "Precio") +
theme_minimal()
ggplot(data, aes(x = transmision, y = precio)) +
geom_point(color = "green") +
labs(x = "transmision", y = "Precio") +
theme_minimal()
ggplot(data, aes(x = combustible, y = precio)) +
geom_point(color = "orange") +
labs(x = "combustible", y = "Precio") +
theme_minimal()
Se crean graficos de dispersión para explorar la relación entre
el precio y otras variables númericas.
#Coeficiente de correlación: Kilometraje
Se hará analisis de la relación entre el precio y el kilometraje; y el precio y el modelo, pues en los graficos de dispersión se ve que son las variables en las que el precio presenta una mayor sensibilidad.
#Verificar datos
head(data$precio)
## [1] 77000000 47000000 40000000 79000000 44500000 70000000
head(data$kilometraje)
## [1] "39000" "83000" "138000" "39000" "91000" "42000"
sum(is.na(data$precio))
## [1] 0
sum(is.na(data$kilometraje))
## [1] 0
class(data$precio)
## [1] "numeric"
class(data$kilometraje)
## [1] "character"
# Eliminar comillas alrededor de los valores numéricos en la columna "kilometraje"
data$kilometraje <- gsub("\"", "", data$kilometraje)
# Convertir la columna "kilometraje" a tipo numérico
data$kilometraje <- as.numeric(data$kilometraje)
# Verificar el tipo de datos nuevamente
class(data$precio)
## [1] "numeric"
class(data$kilometraje)
## [1] "numeric"
# Calcular el coeficiente de correlación
cor(data$precio, data$kilometraje)
## [1] -0.7154792
En este caso, el coeficiente de correlación es de -0.7154792, lo que indica una correlación negativa.Lo que indica que hay una probabilidad de que a medida que la variable kilometraje aumente, la variable precio disminuya.
#Coeficiente de correlación: Modelo
#Verificar datos
head(data$precio)
## [1] 77000000 47000000 40000000 79000000 44500000 70000000
head(data$modelo)
## [1] 2022 2017 2015 2021 2014 2022
sum(is.na(data$precio))
## [1] 0
sum(is.na(data$modelo))
## [1] 0
class(data$precio)
## [1] "numeric"
class(data$modelo)
## [1] "numeric"
# Calcular el coeficiente de correlación
cor(data$precio, data$modelo)
## [1] 0.8717916
En este caso, el coeficiente de correlación dio un resultado positivo de 0.8717916, lo que indica una correlación fuerte positiva entre las dos variables. Lo que indica que existe una fuerte relación entre el modelo del vehiculo y su precio, es decir, entre más moderno sea el modelo, tendrá un mayor precio.
#MODELO DE REGRESIÓN MÚLTIPLE
##Modelo de regresión líneal múltiple para la variable modelo
# Definir las variables predictoras
predictoras <- c("precio", "modelo")
# Crear la base de datos nissan_versa
nissan_versa <- data.frame(
modelo = c(2020, 2021, 2022),
precio = c(25000, 27000, 29000)
)
# Crear el modelo de regresión lineal múltiple
mlp <- lm(precio ~ modelo, data = nissan_versa)
summary(mlp)
##
## Call:
## lm(formula = precio ~ modelo, data = nissan_versa)
##
## Residuals:
## 1 2 3
## -2.064e-10 4.129e-10 -2.064e-10
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.015e+06 7.226e-07 -5.556e+12 1.15e-13 ***
## modelo 2.000e+03 3.576e-10 5.593e+12 1.14e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.057e-10 on 1 degrees of freedom
## Multiple R-squared: 1, Adjusted R-squared: 1
## F-statistic: 3.129e+25 on 1 and 1 DF, p-value: 1.138e-13
# Predicción del error
nissan_versa$residuals <- residuals(mlp)
# Predicción de la variable dependiente:
nissan_versa$predicted <- predict(mlp)
En principio, parece que la variable “kilometraje no muestra una relación lineal con el precio, por ende, decido omitirla del analisis. Ahora entrando en el análisis, los residuos son muy pequeños, lo que muestra un muy buen ajuste con los datos. Los coeficientes representan la contribución esperada de cada variable en la predicción de”precio”. Ambos coeficientes son altamente significativos (p<0.001), lo que nos da a entender que la variable “modelo” tiene un alto efecto en “precio”. R-squared=1 lo que significa que el modelo tiene un efecto del 100% sobre el precio. Análisando F-statistic, es extremadamente grande y el p-valor es muy pequeño, lo que indica que el modelo es altamente significativo.
##Validar modelo por medio prueba informales: Grafico de dispersión
# Cargar los paquetes necesarios
library(ggplot2)
# Obtener los valores ajustados y los residuos del modelo
modelo <- lm(precio ~ modelo, data = nissan_versa) # Ajustar el modelo
ajustados <- predict(modelo) # Obtener los valores ajustados
residuos <- resid(modelo) # Obtener los residuos
# Gráfico de dispersión
ggplot(data = nissan_versa, aes(x = modelo, y = precio)) +
geom_point() +
geom_line(aes(y = ajustados), color = "red") +
labs(x = "Modelo", y = "Precio") +
ggtitle("Gráfico de dispersión con línea de regresión")
Se demuestra una relación lineal por medio de la grafica.
##Validar modelo por medio prueba formal Breush-Pagan:
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
bptest(mlp)
##
## studentized Breusch-Pagan test
##
## data: mlp
## BP = 8.7187e-25, df = 1, p-value = 1
La prueba de Breusch-Pagan sirve para probar la presencia de heterocedasticidad. CUando el valor del resultdado p es de un nivel menor de significancia (0.05). En este caso, el valor p es extremadamente pequeño (1e-25), lo que indica que hay evidencia sólida en contra de la hipótesis nula de no heteroscedasticidad. En otras palabras, el modelo comprueba que hay heterocedasticidad, lo que puede llegar a afectar la interpretación de los resultados del modelo de regresión.
#Corrección del modelo
#Error estandar robusto:
library(sandwich)
coeftest(mlp, vcov = vcovHC(mlp,type = "HC1"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.0150e+06 5.1099e-07 -7.8573e+12 8.102e-14 ***
## modelo 2.0000e+03 2.5284e-10 7.9102e+12 8.048e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
En el resultado que ha proporcionado la prueba de coeficientes, los valores estimados de los coeficientes son significativos con valores p muy pequeños (p < 0.001), lo que indica que hay una relación significativa entre las variables predictoras y la variable de respuesta en el modelo de regresión
#Validar el poder predictivo del modelo con validación cruzada (calcular MAE)
##Particion de los datos 80-20, 80%.
# Cargar los paquetes necesarios
library(caTools)
# Establecer una semilla para reproducibilidad
set.seed(123)
# Crear una partición 80-20
partition <- sample.split(data$precio, SplitRatio = 0.8)
# Dividir los datos en conjunto de entrenamiento y conjunto de prueba
train_data <- data[partition, ]
test_data <- data[!partition, ]
# Mostrar las primeras 5 filas del conjunto de datos de entrenamiento
head(train_data)
## # A tibble: 6 × 6
## `link-href` precio kilometraje modelo combustible transmision
## <chr> <dbl> <dbl> <dbl> <chr> <chr>
## 1 https://www.olx.com.co/item… 7.70e7 39000 2022 Gasolina Mecánica
## 2 https://www.olx.com.co/item… 4.70e7 83000 2017 Gasolina Automática
## 3 https://www.olx.com.co/item… 4 e7 138000 2015 Gasolina Automática
## 4 https://www.olx.com.co/item… 7 e7 42000 2022 Gasolina Automática
## 5 https://www.olx.com.co/item… 1.6 e7 242000 2002 Gasolina Mecánica
## 6 https://www.olx.com.co/item… 4.50e7 69000 2016 Gasolina Mecánica
# Mostrar las primeras 5 filas del conjunto de datos de prueba
head(test_data)
## # A tibble: 6 × 6
## `link-href` precio kilometraje modelo combustible transmision
## <chr> <dbl> <dbl> <dbl> <chr> <chr>
## 1 https://www.olx.com.co/item… 7.90e7 39000 2021 Gasolina Automática
## 2 https://www.olx.com.co/item… 4.45e7 91000 2014 Gasolina Automática
## 3 https://www.olx.com.co/item… 4.40e7 31000 2017 Gasolina Mecánica
## 4 https://www.olx.com.co/item… 4.30e7 132000 2017 Gasolina Mecánica
## 5 https://www.olx.com.co/item… 6 e7 37198 2020 Gasolina Mecánica
## 6 https://www.olx.com.co/item… 5.3 e7 61000 2018 Gasolina Automática
##Particion de los datos 80-20, 20%.
# Cargar los paquetes necesarios
library(caTools)
# Establecer una semilla para reproducibilidad
set.seed(123)
# Crear una partición 80-20
partition <- sample.split(data$precio, SplitRatio = 0.2)
# Dividir los datos en conjunto de entrenamiento y conjunto de prueba
train_data <- data[partition, ]
test_data <- data[!partition, ]
# Mostrar las primeras 5 filas del conjunto de datos de entrenamiento
head(train_data)
## # A tibble: 6 × 6
## `link-href` precio kilometraje modelo combustible transmision
## <chr> <dbl> <dbl> <dbl> <chr> <chr>
## 1 https://www.olx.com.co/item… 7 e7 42000 2022 Gasolina Automática
## 2 https://www.olx.com.co/item… 3.5 e7 74000 2016 Gasolina Automática
## 3 https://www.olx.com.co/item… 4.95e7 28000 2019 Gasolina Mecánica
## 4 https://www.olx.com.co/item… 4.19e7 121000 2016 Gasolina Mecánica
## 5 https://www.olx.com.co/item… 4.20e7 95000 2015 Gasolina Mecánica
## 6 https://www.olx.com.co/item… 4.67e7 75000 2017 Gasolina Mecánica
# Mostrar las primeras 5 filas del conjunto de datos de prueba
head(test_data)
## # A tibble: 6 × 6
## `link-href` precio kilometraje modelo combustible transmision
## <chr> <dbl> <dbl> <dbl> <chr> <chr>
## 1 https://www.olx.com.co/item… 7.70e7 39000 2022 Gasolina Mecánica
## 2 https://www.olx.com.co/item… 4.70e7 83000 2017 Gasolina Automática
## 3 https://www.olx.com.co/item… 4 e7 138000 2015 Gasolina Automática
## 4 https://www.olx.com.co/item… 7.90e7 39000 2021 Gasolina Automática
## 5 https://www.olx.com.co/item… 4.45e7 91000 2014 Gasolina Automática
## 6 https://www.olx.com.co/item… 1.6 e7 242000 2002 Gasolina Mecánica
#Calcular MAE
library(Metrics)
#Crear vector de valores
observados <- c(79000000, 44500000, 44000000, 43000000, 60000000, 53000000)
#Crear vector de valores
predichos <- c(77000000, 47000000, 40000000, 79000000, 44500000, 16000000)
#Calcular MAE
mae(predichos, observados)
## [1] 16166667
Entre menor sea el valor del MAE, mejor ajuste tiene con respecto a la variable, en este caso, la precisión del modelo en promedio difieren de los valores reales de la variable en aproximadamente 3.345 unidades. En este contexto, las predicciones con respecto al precio de la variable “modelo” están desviadas $16.166.667, lo que da un modelo totalmente desviado de los datos reales.
#Discusión de los resultados.
En general, este modelo permite entender el comportamineto de una variable, sin embargo es dificil predecirla, por lo menos en este caso en especifico. Ahora bien, hablando de este contexto especifico de automoviles, es complicado usar el modelo ya que a mi criterio, es un mercado muy intuitivo y que tiene un comportamiento bastante estandar, por ejemplo, a mayor kilometraje, menor precio o entre más moderno es el modelo, mayor será su precio, sin embargo, el aplicativo de este modelo puede llevarse a contextos mucho más complejos para su monetización, por ejemplo, mercados privados empresariales, en donde una compañía busque tomar una decisión de compra, o de adquisición de nuevos activos. Personalmente, en este ambito tan casual, es un poco complejo encontrarle un uso adecuado, pero en algún mercado más grande y complejo, indudablemente es una herramienta que tiene un potencial inmenso de ser monetizable, pues puede ayudar a tener mucha ventaja sobre posibles competidores.