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)
Data summary
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()
Data summary
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()
Data summary
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()
Data summary
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.

  1. Analisis de datos pro graficos.

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.