1.- conocimiento del problema. Se realizara una extraccion de datos (webscraping) sobre la pagina web de amazon, se hara una revision de los porductos computacionales que posee amazon en venta. se extraeran los modelos, las marcas asi como su precio y fecha de publicacion.
importacion de paquetes para la extraccion de datos.
library(rvest)
## Loading required package: xml2
library(robotstxt)
library(selectr)
library(xml2)
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.2 ✓ purrr 0.3.4
## ✓ tibble 3.0.4 ✓ dplyr 1.0.2
## ✓ tidyr 1.1.2 ✓ stringr 1.4.0
## ✓ readr 1.4.0 ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x readr::guess_encoding() masks rvest::guess_encoding()
## x dplyr::lag() masks stats::lag()
## x purrr::pluck() masks rvest::pluck()
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(dplyr)
library(skimr)
library(tidyr)
2.- Extraccion de datos. El webscraping se realizara por medio del paquete rvest.
# vecto de caracter que contiene el template de amazon a la cual estoy accediendo
url <- c("https://www.amazon.com/-/es/s?i=computers-intl-ship&bbn=16225007011&rh=n%3A16225007011%2Cn%3A13896617011%2Cn%3A565098&dc&language=es&qid=1607804959&rnid=2057412011&ref=sr_nr_p_n_feature_fourteen_browse-bin_2")
#asistencia del robots.txt para ver si esta disponible la extraccion de datos legalmente
paths_allowed(paths = url)
## Warning in get(name, envir = env, inherits = FALSE): input string '^()*(\s)*#'
## cannot be translated to UTF-8, is it valid in 'ANSI_X3.4-1968'?
## Warning in get(name, envir = env, inherits = FALSE): input string '^()*( )*([^
## \[\] ,;<>()@/?=\{\} \\])+( )*:' cannot be translated to UTF-8, is it valid in
## 'ANSI_X3.4-1968'?
## Warning in get(name, envir = env, inherits = FALSE): input string '^()*(\s)*$'
## cannot be translated to UTF-8, is it valid in 'ANSI_X3.4-1968'?
## Warning in get(name, envir = env, inherits = FALSE): input string '^()*(\s)*#'
## cannot be translated to UTF-8, is it valid in 'ANSI_X3.4-1968'?
## Warning in get(name, envir = env, inherits = FALSE): input string '^()*( )*([^
## \[\] ,;<>()@/?=\{\} \\])+( )*:' cannot be translated to UTF-8, is it valid in
## 'ANSI_X3.4-1968'?
## Warning in get(name, envir = env, inherits = FALSE): input string '^()*(\s)*$'
## cannot be translated to UTF-8, is it valid in 'ANSI_X3.4-1968'?
##
www.amazon.com
## [1] TRUE
Dado que el valor del robot.txt nos arrojo un TRUE, extrearemos los datos que queremos de la pagina objetivo.
#instancia que responde a la extraccion del code HTML de la pagina objetivo.
pagina_web <- read_html(url)
# vector de la clase css que situa el nombre del producto.
css_producto <- c(".s-line-clamp-2")
# se extrae en CODE HTML que contiene el nombre del producto
producto_html <- html_nodes(pagina_web, css_producto)
# Extreccion de nombre del producto
producto_texto <- html_text(producto_html)
# limpieza de cadenas de texto sobre los productos
producto_texto <- gsub("\n", "", producto_texto)
producto_texto <- gsub(" ", "", producto_texto)
nombre_col <- c("PC_producto",
"procesador",
"discoduro",
"RAM",
"artefactos",
"tarjetaswifi")
producto_texto <- read_delim(producto_texto,
",", col_names = F)
## Warning: 13 parsing failures.
## row col expected actual file
## 2 -- 6 columns 7 columns literal data
## 3 -- 6 columns 1 columns literal data
## 4 -- 6 columns 8 columns literal data
## 6 -- 6 columns 7 columns literal data
## 7 -- 6 columns 7 columns literal data
## ... ... ......... ......... ............
## See problems(...) for more details.
head(producto_texto)
colnames(producto_texto) <- nombre_col
head(producto_texto)
#obtenemos los precios
css_precio <- c(".a-price-whole")
precio_html <- html_nodes(pagina_web, css_precio)
precio_texto <- html_text(precio_html)
#limpieza de las cadenas de precio
precio_texto <- gsub(",", "", precio_texto)
precio_texto <- gsub(".", "", precio_texto)
#visualizacion de los precios
head(precio_texto)
## [1] "" "" "" "" "" ""
3.- Transformacion de variables
precio_real <- as.numeric(precio_texto)
# Dataframe con las variables extraidas
df <- data.frame("PC_producto" = producto_texto[1],
"procesador" = producto_texto[2],
"disco_duro" = producto_texto[3],
"RAM" = producto_texto[4],
"atefactos" = producto_texto[5],
"tarjetaswifi" = producto_texto[6],
"precio" = precio_real)
## Error in data.frame(PC_producto = producto_texto[1], procesador = producto_texto[2], : arguments imply differing number of rows: 16, 14
head(df)
##
## 1 function (x, df1, df2, ncp, log = FALSE)
## 2 {
## 3 if (missing(ncp))
## 4 .Call(C_df, x, df1, df2, log)
## 5 else .Call(C_dnf, x, df1, df2, ncp, log)
## 6 }
write.csv(df, file = "tabla de datos-WS-PC.csv")
## Error in as.data.frame.default(x[[i]], optional = TRUE): cannot coerce class '"function"' to a data.frame
luego de realizar dla extraccion de datos y arreglarlos, se importaran estos datos para realizar un analisis descriptivo.
4.- importacion de newdata.
library(readr)
tabla_de_datos_WS_PC <- read_delim("tabla de datos-WS-PC.csv",
";", escape_double = FALSE, na = "0",
trim_ws = TRUE)
##
## ── Column specification ────────────────────────────────────────────────────────
## cols(
## PC_producto = col_character(),
## procesador = col_character(),
## discoduro = col_character(),
## RAM = col_character(),
## caracteristicas = col_character(),
## tarjetaswifi_OS = col_character(),
## precio = col_double()
## )
head(tabla_de_datos_WS_PC)
5.- conocimiento de los datos. Los datos que se han importado, estan contenidos en una tabal de 16 x 7 los cuales contienen valores para las 5 variables cualitativas y 1 variable cuantitativa.
df <- tabla_de_datos_WS_PC
glimpse(df)
## Rows: 16
## Columns: 7
## $ PC_producto <chr> "CyberpowerPCGamerXtremeVRGamingPC", "iBUYPOWERGaming…
## $ procesador <chr> "Inteli5-10400F2.9GHz", "Inteli7-10700F2.9GHz", "", "…
## $ discoduro <chr> "GeForceGTX1660Super6GB", "1TBHDD y 240GBSSD", "", "5…
## $ RAM <chr> "8GBDDR4", "16GBDDR4RAM", "", "12GB2666MHzDDR4", "16G…
## $ caracteristicas <chr> "500GBNVMeSSD", "NVIDIAGTX1660Ti6GB", "", "8XDVD", "R…
## $ tarjetaswifi_OS <chr> "WiFiReady&Win10Home(GXiVR8060A10)", "Wi-Filisto", ""…
## $ precio <dbl> 791, 1275, 699, 529, 1229, 999, 829, 449, 579, 684, 9…
parece que el tipo de datos precio se guardo por valores double, se realizar un cambio del tipo de variable, corrigiendo este valor para evitar problema a futuro.
df <- df %>%
mutate(precio = as.integer(precio))
glimpse(df)
## Rows: 16
## Columns: 7
## $ PC_producto <chr> "CyberpowerPCGamerXtremeVRGamingPC", "iBUYPOWERGaming…
## $ procesador <chr> "Inteli5-10400F2.9GHz", "Inteli7-10700F2.9GHz", "", "…
## $ discoduro <chr> "GeForceGTX1660Super6GB", "1TBHDD y 240GBSSD", "", "5…
## $ RAM <chr> "8GBDDR4", "16GBDDR4RAM", "", "12GB2666MHzDDR4", "16G…
## $ caracteristicas <chr> "500GBNVMeSSD", "NVIDIAGTX1660Ti6GB", "", "8XDVD", "R…
## $ tarjetaswifi_OS <chr> "WiFiReady&Win10Home(GXiVR8060A10)", "Wi-Filisto", ""…
## $ precio <int> 791, 1275, 699, 529, 1229, 999, 829, 449, 579, 684, 9…
skim(df)
| Name | df |
| Number of rows | 16 |
| Number of columns | 7 |
| _______________________ | |
| Column type frequency: | |
| character | 6 |
| numeric | 1 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| PC_producto | 0 | 1 | 15 | 53 | 0 | 15 | 0 |
| procesador | 0 | 1 | 0 | 65 | 1 | 16 | 0 |
| discoduro | 0 | 1 | 0 | 23 | 1 | 14 | 0 |
| RAM | 0 | 1 | 0 | 15 | 1 | 11 | 0 |
| caracteristicas | 0 | 1 | 0 | 34 | 2 | 14 | 0 |
| tarjetaswifi_OS | 0 | 1 | 0 | 33 | 4 | 12 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| precio | 0 | 1 | 937.88 | 628.23 | 236 | 579.75 | 745 | 1056.5 | 2922 | ▇▆▁▁▁ |
Conclusiones: los precios que maneja amazon sobre la muestra extraida es de 938 USD por computador, con una desviacion de 628 USD. Asi mismo, el precio mas bajo por computador equivale a los 236 USD y el mas alto contiene un valor de 2922 USD. hasta el 50% de los datos, los precios llegan hasta 745 USD. Sobre el histograma podemos visualizar que coeficiente de asimetria es alto dado que su asimetria es positiva. Ergo, el valor mas frecuente es menor a la media y a la mediana.
Agruparemos los precio por computador.
df %>%
select(PC_producto, precio) %>%
dplyr::group_by(PC_producto) %>%
skim()
| Name | Piped data |
| Number of rows | 16 |
| Number of columns | 2 |
| _______________________ | |
| Column type frequency: | |
| numeric | 1 |
| ________________________ | |
| Group variables | PC_producto |
Variable type: numeric
| skim_variable | PC_producto | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|---|
| precio | AcerAspireC24-963-UA91AIODesktop | 0 | 1 | 579 | NA | 579 | 579 | 579 | 579 | 579 | ▁▁▇▁▁ |
| precio | AcerAspireTC-895-UA92Desktop | 0 | 1 | 529 | NA | 529 | 529 | 529 | 529 | 529 | ▁▁▇▁▁ |
| precio | AcerChromeboxCXI3-UA91MiniPC | 0 | 1 | 236 | NA | 236 | 236 | 236 | 236 | 236 | ▁▁▇▁▁ |
| precio | CyberpowerPCGamerSupremeLiquidCoolGamingPC | 0 | 1 | 1229 | NA | 1229 | 1229 | 1229 | 1229 | 1229 | ▁▁▇▁▁ |
| precio | CyberpowerPCGamerXtremeVRGamingPC | 0 | 1 | 791 | NA | 791 | 791 | 791 | 791 | 791 | ▁▁▇▁▁ |
| precio | DellInspironDesktop3880 | 0 | 1 | 649 | NA | 649 | 649 | 649 | 649 | 649 | ▁▁▇▁▁ |
| precio | HP22PCtodoenuno | 0 | 1 | 449 | NA | 449 | 449 | 449 | 449 | 449 | ▁▁▇▁▁ |
| precio | iBUYPOWERGamingPCDesktopElementMR9320 | 0 | 1 | 1275 | NA | 1275 | 1275 | 1275 | 1275 | 1275 | ▁▁▇▁▁ |
| precio | iBUYPOWERTrace-Computadoragamerdeescritorio | 0 | 1 | 699 | NA | 699 | 699 | 699 | 699 | 699 | ▁▁▇▁▁ |
| precio | LenovoIdeaCentreAIO3 | 0 | 1 | 632 | 73.54 | 580 | 606 | 632 | 658 | 684 | ▇▁▁▁▇ |
| precio | NuevosobremesaparajuegosAlienwareAuroraR10 | 0 | 1 | 1557 | NA | 1557 | 1557 | 1557 | 1557 | 1557 | ▁▁▇▁▁ |
| precio | OMEN30LGamingDesktopPC | 0 | 1 | 2922 | NA | 2922 | 2922 | 2922 | 2922 | 2922 | ▁▁▇▁▁ |
| precio | SkytechArchangelGamingComputerPCDesktop | 0 | 1 | 999 | NA | 999 | 999 | 999 | 999 | 999 | ▁▁▇▁▁ |
| precio | SkyTechBlazeII-Computadoradeescritorioparavideojuegos | 0 | 1 | 829 | NA | 829 | 829 | 829 | 829 | 829 | ▁▁▇▁▁ |
| precio | SkytechShivaGamingPCDesktop | 0 | 1 | 999 | NA | 999 | 999 | 999 | 999 | 999 | ▁▁▇▁▁ |
interpretacion. Nos damos cuenta que el computador mas barato es una miniPC marca Acer chromeboxCXI3 con un valor en USD de 236. el mas costoso una PC de escritorio para gaming (juegos) valorada en 2922 USD.
agrupemos los precios por procesador de computadora.
df %>%
select(procesador, precio) %>%
group_by(procesador) %>%
skim()
| Name | Piped data |
| Number of rows | 16 |
| Number of columns | 2 |
| _______________________ | |
| Column type frequency: | |
| numeric | 1 |
| ________________________ | |
| Group variables | procesador |
Variable type: numeric
| skim_variable | procesador | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|---|
| precio | 0 | 1 | 699 | NA | 699 | 699 | 699 | 699 | 699 | ▁▁▇▁▁ | |
| precio | “24”“All-in-OneOrdenadorTodo-en-UnoAMDRyzen54500UProcesadorMóvil” | 0 | 1 | 684 | NA | 684 | 684 | 684 | 684 | 684 | ▁▁▇▁▁ |
| precio | AMDRyzen34300UMobileProcessor | 0 | 1 | 580 | NA | 580 | 580 | 580 | 580 | 580 | ▁▁▇▁▁ |
| precio | AMDRyzen52600 | 0 | 1 | 999 | NA | 999 | 999 | 999 | 999 | 999 | ▁▁▇▁▁ |
| precio | AMDRyzen73700X y AMDRadeonRX5700XT | 0 | 1 | 1557 | NA | 1557 | 1557 | 1557 | 1557 | 1557 | ▁▁▇▁▁ |
| precio | AMDRyzen73800X3.9GHz | 0 | 1 | 1229 | NA | 1229 | 1229 | 1229 | 1229 | 1229 | ▁▁▇▁▁ |
| precio | IntelCeleron3867UProcessor1.8GHz | 0 | 1 | 236 | NA | 236 | 236 | 236 | 236 | 236 | ▁▁▇▁▁ |
| precio | IntelCorei3-1005G1 | 0 | 1 | 579 | NA | 579 | 579 | 579 | 579 | 579 | ▁▁▇▁▁ |
| precio | IntelCorei510thGen | 0 | 1 | 649 | NA | 649 | 649 | 649 | 649 | 649 | ▁▁▇▁▁ |
| precio | Inteli5-10400F2.9GHz | 0 | 1 | 791 | NA | 791 | 791 | 791 | 791 | 791 | ▁▁▇▁▁ |
| precio | Inteli7-10700F2.9GHz | 0 | 1 | 1275 | NA | 1275 | 1275 | 1275 | 1275 | 1275 | ▁▁▇▁▁ |
| precio | procesadorAMDAthlonGold3150U | 0 | 1 | 449 | NA | 449 | 449 | 449 | 449 | 449 | ▁▁▇▁▁ |
| precio | procesadorIntelCorei5-10400de6nucleos | 0 | 1 | 529 | NA | 529 | 529 | 529 | 529 | 529 | ▁▁▇▁▁ |
| precio | procesadorIntelCorei9-10850K | 0 | 1 | 2922 | NA | 2922 | 2922 | 2922 | 2922 | 2922 | ▁▁▇▁▁ |
| precio | Ryzen526006nucleos3.4GHz | 0 | 1 | 829 | NA | 829 | 829 | 829 | 829 | 829 | ▁▁▇▁▁ |
| precio | Ryzen536003.6GHz | 0 | 1 | 999 | NA | 999 | 999 | 999 | 999 | 999 | ▁▁▇▁▁ |
interpretacion. Los computadores mas caros contienen un procesador intel core i9; en contraste, el computador mas barato posee un procesador intel celeron de 1.8GHZ de frecuencia.
Agrupemos por memoria RAM.
df %>%
select(RAM, precio) %>%
group_by(RAM) %>%
skim()
| Name | Piped data |
| Number of rows | 16 |
| Number of columns | 2 |
| _______________________ | |
| Column type frequency: | |
| numeric | 1 |
| ________________________ | |
| Group variables | RAM |
Variable type: numeric
| skim_variable | RAM | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|---|
| precio | 0 | 1 | 699.00 | NA | 699 | 699.00 | 699.0 | 699.0 | 699 | ▁▁▇▁▁ | |
| precio | 12GB2666MHzDDR4 | 0 | 1 | 529.00 | NA | 529 | 529.00 | 529.0 | 529.0 | 529 | ▁▁▇▁▁ |
| precio | 12GBMemory | 0 | 1 | 649.00 | NA | 649 | 649.00 | 649.0 | 649.0 | 649 | ▁▁▇▁▁ |
| precio | 16GBDDR4 | 0 | 1 | 970.67 | 273.60 | 684 | 841.50 | 999.0 | 1114.0 | 1229 | ▇▁▇▁▇ |
| precio | 16GBDDR43000MHz | 0 | 1 | 999.00 | NA | 999 | 999.00 | 999.0 | 999.0 | 999 | ▁▁▇▁▁ |
| precio | 16GBDDR4RAM | 0 | 1 | 1275.00 | NA | 1275 | 1275.00 | 1275.0 | 1275.0 | 1275 | ▁▁▇▁▁ |
| precio | 32GBRAM | 0 | 1 | 2922.00 | NA | 2922 | 2922.00 | 2922.0 | 2922.0 | 2922 | ▁▁▇▁▁ |
| precio | 4GBDDR4-Memory | 0 | 1 | 236.00 | NA | 236 | 236.00 | 236.0 | 236.0 | 236 | ▁▁▇▁▁ |
| precio | 4GBdeRAM | 0 | 1 | 449.00 | NA | 449 | 449.00 | 449.0 | 449.0 | 449 | ▁▁▇▁▁ |
| precio | 8GBDDR4 | 0 | 1 | 694.75 | 133.98 | 579 | 579.75 | 685.5 | 800.5 | 829 | ▇▁▁▁▇ |
| precio | 8GBGDDR6 y 16GB | 0 | 1 | 1557.00 | NA | 1557 | 1557.00 | 1557.0 | 1557.0 | 1557 | ▁▁▇▁▁ |
interpretacion. el computador mas caro, viene con una memoria RAM de 32GB. el mas barato contiene una RAM de 4GBDDR4.
interpretacion grafica. solo encontamos un valor perdido sobre el grafico de boxplot. el rango intercuartilico se encuentra por debajo de los 2000 USD por lo que los precio de los computadores no exceden los 2000 USD.
ggplot(df) + geom_histogram(aes(precio), bins = 10, colour = 'black')
este acercamiento al histograma nos muestra que el valor promedio es menor al valor de la moda, aun asi el la asimetria es positiva.
7.- Analisis exploratorio de varibles (EDA).
df %>%
select_if(is.integer) %>%
gather() %>%
ggplot(aes(value)) + geom_density() +
facet_wrap(~key, scales = 'free') +
theme(axis.text = element_text(size = 6))
Con este Grafico visualizamos mejor la densidad de los datos, y su distribucion. podemos ver que no existe una distribucion normal.
Aplicaremos el test de normalidad de shapiro wilk para corroborar la normalidad de los datos. para esto, se contrastaran la hipotesis nula de ditribucion normal sobre los datos con un nivel de significancia del 5%.
shapiro.test(df$precio)
##
## Shapiro-Wilk normality test
##
## data: df$precio
## W = 0.77574, p-value = 0.00132
Conclusiones. Dado que el valor de probabilidad es inferior al valor de significancia, de 0,05. entonces, no existe evidencia suficiente para no rechazar la hipotesis nula, por lo que se tiene un 95% de confianza que para esta muestra los datos no se encuentran distribuidos normalmente.
8.- Analisis inferencial sobre los datos. En el siguiente analisis se realizara una inferencia sobre el promedio de la poblacion de los precio que se encuentran reunidos en el pagina de amazon sobre la ventas de computadores.
para un nivel de significancia de 5%, y una desviacion estandar de 628USD.
length(df$precio)
## [1] 16
#ratio de la desviacion y la raiz de n
ratio <- sd(df$precio)/sqrt(length(df$precio))
#calcular t-student dado qeu los datos no poseen distribucion normal.
valor_t <- qt(c(1-(0.05/2)), c(16-1))
Rempirica_95 <- c(ratio * valor_t)
lim_inf <- c(mean(df$precio) - Rempirica_95)
lim_sup <- c(mean(df$precio) + Rempirica_95)
inter_construction <- c(lim_inf, lim_sup)
print(inter_construction)
## [1] 603.1173 1272.6327
Conclusiones. Con un 95% de confianza inferimos que el valor del promedio para el precio de los computadores se encuentra entre los 603.1173 y 1272.6327 USD por computadora, dado los componentes que la misma proporciona.