Análise da base de dados de produtos.
# Carregar pacotes
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
library(corrplot)
## corrplot 0.92 loaded
library(gridExtra)
##
## Anexando pacote: 'gridExtra'
##
## O seguinte objeto é mascarado por 'package:dplyr':
##
## combine
library("FactoMineR")
# Carregar os dados
product_desc <- read.csv2("C:/Dev/projects/R/m11/sku_dataset.csv")
product_price <- read.csv("C:/Dev/projects/R/m11/sku_price.csv")
product_data <- left_join(product_desc, product_price, by = "cod_prod", multiple="first")
# Exibir as primeiras linhas dos dados
print(head(product_data))
## cod_prod nome_abrev
## 1 603078352615 Acne Solutions Cleansing Bar
## 2 131384024501 Pep Start Daily UV
## 3 85873708529 Deep Comfort Body Wash
## 4 579926605113 Lipikar Wash Gentle Foaming
## 5 397769055946 Anthelios AOX Daily Antioxidant
## 6 981647487600 Basil White Tea Body
## nome_completo
## 1 Acne Solutions Cleansing Bar for Face & Body
## 2 Pep Start Daily UV Protector Broad Spectrum SPF 50
## 3 Deep Comfort Body Wash
## 4 Lipikar Wash AP+ Gentle Foaming Moisturizing Wash
## 5 Anthelios AOX Daily Antioxidant Face Serum SPF 50
## 6 Basil & White Tea Body Wash
## descricao
## 1 Sabonete líquido Clinique Acne Solutions Cleansing Bar for Face & Body para Corpo
## 2 Protetor solar Clinique Pep Start Daily UV Protector Broad Spectrum SPF 50 para Corpo
## 3 Sabonete líquido Clinique Deep Comfort Body Wash para Corpo
## 4 Sabonete líquido La Roche-Posay Lipikar Wash AP+ Gentle Foaming Moisturizing Wash para Corpo
## 5 Protetor solar La Roche-Posay Anthelios AOX Daily Antioxidant Face Serum SPF 50 para Corpo
## 6 Sabonete líquido Nivea Basil & White Tea Body Wash para Corpo
## categoria sub_categoria marca conteudo_valor conteudo_medida
## 1 Corpo Sabonete líquido Clinique 156.0 ml
## 2 Corpo Protetor solar Clinique 30.0 ml
## 3 Corpo Sabonete líquido Clinique 204.0 ml
## 4 Corpo Sabonete líquido La Roche-Posay 405.0 ml
## 5 Corpo Protetor solar La Roche-Posay 30.0 ml
## 6 Corpo Sabonete líquido Nivea 600.0 ml
## data_inicio data_fim preco
## 1 2007-08-02 2009-08-07 25.99
## 2 2006-08-22 2007-08-15 96.99
## 3 2000-03-05 2002-01-16 25.99
## 4 2011-05-05 2011-12-08 21.99
## 5 2006-07-15 2010-02-12 89.99
## 6 2021-04-02 2021-07-17 23.99
# Verificar estrutura
str(product_data)
## 'data.frame': 563 obs. of 12 variables:
## $ cod_prod : num 6.03e+11 1.31e+11 8.59e+10 5.80e+11 3.98e+11 ...
## $ nome_abrev : chr "Acne Solutions Cleansing Bar" "Pep Start Daily UV" "Deep Comfort Body Wash" "Lipikar Wash Gentle Foaming" ...
## $ nome_completo : chr "Acne Solutions Cleansing Bar for Face & Body" "Pep Start Daily UV Protector Broad Spectrum SPF 50" "Deep Comfort Body Wash" "Lipikar Wash AP+ Gentle Foaming Moisturizing Wash" ...
## $ descricao : chr "Sabonete líquido Clinique Acne Solutions Cleansing Bar for Face & Body para Corpo" "Protetor solar Clinique Pep Start Daily UV Protector Broad Spectrum SPF 50 para Corpo" "Sabonete líquido Clinique Deep Comfort Body Wash para Corpo" "Sabonete líquido La Roche-Posay Lipikar Wash AP+ Gentle Foaming Moisturizing Wash para Corpo" ...
## $ categoria : chr "Corpo" "Corpo" "Corpo" "Corpo" ...
## $ sub_categoria : chr "Sabonete líquido" "Protetor solar" "Sabonete líquido" "Sabonete líquido" ...
## $ marca : chr "Clinique" "Clinique" "Clinique" "La Roche-Posay" ...
## $ conteudo_valor : chr "156.0" "30.0" "204.0" "405.0" ...
## $ conteudo_medida: chr "ml" "ml" "ml" "ml" ...
## $ data_inicio : chr "2007-08-02" "2006-08-22" "2000-03-05" "2011-05-05" ...
## $ data_fim : chr "2009-08-07" "2007-08-15" "2002-01-16" "2011-12-08" ...
## $ preco : num 26 97 26 22 90 ...
# Exibir quantidade de nulos
sum(is.na(product_data))
## [1] 0
# Resumo dos dados
summary(product_data)
## cod_prod nome_abrev nome_completo descricao
## Min. :6.587e+09 Length:563 Length:563 Length:563
## 1st Qu.:2.506e+11 Class :character Class :character Class :character
## Median :4.800e+11 Mode :character Mode :character Mode :character
## Mean :5.024e+11
## 3rd Qu.:7.696e+11
## Max. :9.970e+11
## categoria sub_categoria marca conteudo_valor
## Length:563 Length:563 Length:563 Length:563
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## conteudo_medida data_inicio data_fim preco
## Length:563 Length:563 Length:563 Min. : 9.99
## Class :character Class :character Class :character 1st Qu.: 31.49
## Mode :character Mode :character Mode :character Median : 50.99
## Mean : 86.79
## 3rd Qu.: 87.49
## Max. :497.99
cod_prod: código identificador do produto
nome_abrev: abreviação do nome do produto
nome_completo: nome completo do produto
descricao: descrição do produto
data_inicio: data inicial da vigência do preço do produto
data_fim: data final da vigência do preço do produto
preco: preço do produto
categoria: tipo de uso do produto
sub_categoria: tipo de produto
marca: nome da marca ao qual o produto pertence
conteudo_valor: peso do produto
conteudo_medida: formato de medição do produto (ml, oz, lbs)
# Histograma da variável 'categoria'
ggplot(product_data, aes(x = fct_infreq(categoria))) +
stat_count(width = 0.5, fill = "orange", color = "black") +
theme_minimal() +
labs(title = "Distribuição de categoria dos produtos", x = "Categoria", y = "Frequência")
# Histograma da variável 'sub_categoria'
ggplot(product_data, aes(y = fct_rev(fct_infreq(sub_categoria)))) +
stat_count(width = 1, fill = "gray", color = "black") +
theme_minimal() +
labs(title = "Distribuição de subcategoria dos produtos", x = "Frequência", y = "Subcategoria")
Para o conjunto de dados utilizado não se faz necessário a busca por outliers.
# Histograma para cada variável numérica
numeric_vars <- product_data %>% select(-categoria)
p <- lapply(names(numeric_vars), function(var) {
ggplot(product_data, aes_string(x = var)) +
stat_count(fill = "blue", color = "black") +
theme_minimal() +
labs(title = paste("Distribuição de", var), x = var, y = "Frequência")
})
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
grid.arrange(grobs = p, ncol = 3)
# Scatter plot entre 'marca' e 'categoria'
ggplot(product_data, aes(y = marca, x = categoria)) +
geom_point(alpha = 0.5) +
theme_minimal() +
labs(title = "Relação entre Marca e Categoria", x = "Categoria", y = "Marca")
# Scatter plot entre 'marca' e 'sub_categoria
ggplot(product_data, aes(x = factor(marca), y = sub_categoria, fill = factor(marca)), show.legend = FALSE) +
geom_boxplot() +
scale_x_discrete(guide = guide_axis(n.dodge=5)) +
labs(title = "Boxplot da Marca e Categoria", x="Marca", y = "Subcategoria")
# Matriz de correlação
cor_matrix <- cor(product_data %>% select_if(is.numeric))
corrplot(cor_matrix, method = "circle")
# Scatterplot matrix
ggpairs(product_data %>% select_if(is.numeric))
prcomp(cor_matrix, scale = FALSE)
## Standard deviations (1, .., p=2):
## [1] 1.030352e+00 1.570092e-16
##
## Rotation (n x k) = (2 x 2):
## PC1 PC2
## cod_prod -0.7071068 -0.7071068
## preco 0.7071068 -0.7071068
princomp(cor_matrix, cor = FALSE, scores = TRUE)
## Call:
## princomp(x = cor_matrix, cor = FALSE, scores = TRUE)
##
## Standard deviations:
## Comp.1 Comp.2
## 7.285690e-01 7.450581e-09
##
## 2 variables and 2 observations.
Usando apenas o preço e o código do produto não foi possível encontrar padrões tão grandes de correlação, ao realizar a conversão de marca, categoria e sub_categoria para número será possível encontrar correlações mais relevantes.
As lojas possuem mais produtos para uso nos olhos e pele;
Perfumes, sombra e batom são os produtos que mais tem no arsenal de produtos vendidos das lojas;
80% das marcas possuem pelo menos 3 categorias de produtos;
30% das marcas cobrem mais de 60% do número de subcategorias, a maioria das marcas cobrem abaixo de 15% de subcategorias;
Foi utilizado apenas os dados de produtos, o que limitou a possibilidade de análises cruzadas.
Alguns dos dados das bases estão em formato de texto, para análises comparativas entre variáveis é necessário um tratamento mais avançado dos dados.
Para realizar tratamentos e análises mais relevantes será necessário se aprofundar mais nas bibliotecas do R.
Nesta atividade, não foi efetuado o tratamento de dados em texto para númerico, ao realizar essa conversão será possível identificar novos padrões e relações que agregarão na análise dos dados.
Importar novas bases de dados para criar análises cruzadas que auxiliarão na identificação de novos entendimentos das relações entre os dados.
Realizar novas manipulações dos dados que resultarão em análises mais aprofundadas sobre os dados.