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.