O comércio eletrônico tem crescido rapidamente nos últimos anos, especialmente em mercados emergentes como o Paquistão. O conjunto de dados de transações de comércio eletrônico de varejo, que abrange um período de dois anos e meio, é uma rica fonte de informações que pode oferecer insights valiosos sobre padrões de compra, comportamento do consumidor e tendências de mercado. Com meio milhão de registros, este banco de dados oferece uma oportunidade única para analisar a evolução das transações online e ajudar comerciantes a otimizar suas operações, melhorar a experiência do cliente e aumentar a competitividade no setor.
Embora o comércio eletrônico no Paquistão tenha mostrado crescimento substancial, comerciantes e pesquisadores ainda enfrentam desafios em identificar padrões precisos e previsões de comportamento do consumidor. O volume de dados pode ser avassalador e muitas vezes não é totalmente aproveitado devido à falta de análises aprofundadas. Compreender quais fatores influenciam as vendas, os horários de pico de transações e a taxa de recompra são questões críticas que, quando respondidas, podem levar a melhorias estratégicas. Este estudo busca abordar essas questões, fornecendo uma análise detalhada do conjunto de dados para extrair insights significativos.
Para abordar esses desafios, a análise será conduzida utilizando o maior conjunto de dados de pedidos de comércio eletrônico de varejo do Paquistão. Este conjunto de dados cobre transações entre março de 2016 e agosto de 2018, abrangendo meio milhão de registros de pedidos realizados em diferentes plataformas de comércio eletrônico. A metodologia incluirá a limpeza dos dados, a identificação de variáveis-chave (como valor de compra, tempo de transação, frequência de pedidos, entre outros) e a aplicação de técnicas de análise estatística e modelos preditivos para encontrar padrões e tendências relevantes. Ferramentas de visualização de dados serão utilizadas para facilitar a interpretação e a comunicação dos resultados.
A técnica central adotada para a análise será uma combinação de análise descritiva e preditiva. A análise descritiva examinará os padrões históricos nos dados, como a distribuição das vendas ao longo do tempo, o comportamento do cliente em diferentes épocas do ano e o desempenho de diferentes comerciantes. Para abordar a previsibilidade do comportamento do consumidor, será usada a modelagem preditiva, empregando algoritmos de aprendizado de máquina para prever as vendas futuras, identificar clientes de alto valor e antecipar tendências de mercado. Esta abordagem equilibrada permitirá tanto uma compreensão clara do cenário atual quanto insights para planejamento estratégico futuro.
A análise proposta terá um impacto direto nos comerciantes e empresas que operam no setor de comércio eletrônico no Paquistão. A partir dos insights gerados, será possível melhorar a experiência do consumidor, personalizando ofertas e campanhas de marketing de acordo com o comportamento e as preferências dos clientes. Além disso, os comerciantes poderão ajustar suas operações logísticas para se preparar para períodos de alta demanda, otimizando estoques e recursos. As empresas poderão usar esses dados para melhorar a retenção de clientes, aumentar as vendas e, finalmente, tornar suas operações mais eficientes e lucrativas em um mercado competitivo.
Seguem os pacotes utilizados no decorer da analise do dataset disponivel Kaggle Pakistan’s Largest E-Commerce Dataset
| Pacote | Função/Propósito |
|---|---|
knitr |
Pacote para gerar relatórios dinâmicos |
dplyr |
Fornece funções para manipulação de dados de forma eficiente |
DT |
Criar tabelas interativas |
kableExtra |
Extende o pacote knitr para formatar tabelas. |
reshape2 |
Ferramentas para transformar e reorganizar dados, especialmente útil para conversão entre formatos longos e largos |
janitor |
Facilita a limpeza de dados, incluindo a padronização de nomes de colunas e a remoção de dados duplicados ou faltantes |
lubridate |
Simplifica o trabalho com datas e horas em R |
stringr |
Fornece funções para manipulação de strings |
ggplot2 |
Visualização dos gráficos |
tidyverse |
Visualização de dados. Usado para criar gráficos estáticos como gráficos de barras, linhas e scatterplots. |
plotly |
Visualização interativa de dados. Utilizado para transformar gráficos do ggplot2 em gráficos interativos. |
ggpubr |
Criação de mapas interativos. |
gt |
Fornece uma interface fácil para criar tabelas de alta qualidade para relatórios e apresentações, com grande personalização |
paletteer |
Oferece uma ampla gama de paletas de cores personalizadas |
Primeiramente, deveremos carregar as bibliotecas que usaremos. Logo após, precisamos importar o dataset. para podermos dai começar a fazer a limpeza e posteriormente as analises/modificações.
##
## Anexando pacote: 'lubridate'
## Os seguintes objetos são mascarados por 'package:base':
##
## date, intersect, setdiff, union
library(ggplot2) # Visualização dos gráficos
library(tidyverse) # Conjunto de pacotes que oferece manipulação e visualização ## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ stringr 1.5.1
## ✔ forcats 1.0.0 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ✔ readr 2.1.5
## ── 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
#carregando o dataset
library(readr)
data <- read_csv("C:/Users/Esdras/Documents/archive (3)/Pakistan Largest Ecommerce Dataset.csv")## New names:
## • `` -> `...22`
## • `` -> `...23`
## • `` -> `...24`
## • `` -> `...25`
## • `` -> `...26`
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
## dat <- vroom(...)
## problems(dat)
## Rows: 1048575 Columns: 26
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (12): status, created_at, sku, category_name_1, sales_commission_code, p...
## dbl (9): item_id, price, qty_ordered, grand_total, increment_id, discount_a...
## lgl (5): ...22, ...23, ...24, ...25, ...26
##
## ℹ 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.
Iremos começar descobrindo o numero de linhas e colunas com espaços vazios , e depois será feito a remoção das mesmas.
Numero de com todos os numeros NA :
## [1] "Empty rows: 464051"
## [1] "Empty columns: 5"
onde foi verificado que há 464051 linhas vazias e 5 colunas vazia.
o trecho a seguir será para remover linhas vazias e logo após irá nos retornar o numero de linhas após a remoção.
clean_data <- filter(data, rowSums(is.na(data)) != ncol(data))
sprintf("numero de linhas após remoção: %d", nrow(clean_data))## [1] "numero de linhas após remoção: 584524"
Agora iremos realizar o mesmo procedimento so que dessa vez nas colunas.
clean_data <- clean_data[,colSums(is.na(clean_data)) != nrow(clean_data)]
sprintf("numero de colunas após remoção: %d", ncol(clean_data))## [1] "numero de colunas após remoção: 21"
## # A tibble: 584,524 × 21
## item_id status created_at sku price qty_ordered grand_total increment_id
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 211131 complete 7/1/2016 krea… 1950 1 1950 100147443
## 2 211133 canceled 7/1/2016 kcc_… 240 1 240 100147444
## 3 211134 canceled 7/1/2016 Ego_… 2450 1 2450 100147445
## 4 211135 complete 7/1/2016 kcc_… 360 1 60 100147446
## 5 211136 order_re… 7/1/2016 BK70… 555 2 1110 100147447
## 6 211137 canceled 7/1/2016 UK_N… 80 1 80 100147448
## 7 211138 complete 7/1/2016 kcc_… 360 1 60 100147449
## 8 211139 complete 7/1/2016 UK_N… 170 1 170 100147450
## 9 211140 canceled 7/1/2016 Appl… 96499 1 96499 100147451
## 10 211141 canceled 7/1/2016 Appl… 96499 1 96499 100147452
## # ℹ 584,514 more rows
## # ℹ 13 more variables: category_name_1 <chr>, sales_commission_code <chr>,
## # discount_amount <dbl>, payment_method <chr>, `Working Date` <chr>,
## # `BI Status` <chr>, MV <chr>, Year <dbl>, Month <dbl>,
## # `Customer Since` <chr>, `M-Y` <chr>, FY <chr>, `Customer ID` <dbl>
## [1] "Entradas Duplicadas: 0"
## [1] "numeric"
## [1] 584524
o objetivo principal dessa parte da analisar e padronizar os valores da coluna status do dataframe clean_data, que representa o status dos pedidos em um e-commerce. O código segue uma abordagem estruturada, dividida em análise inicial, tratamento e validação dos dados.
## [1] "character"
## [1] 15
## [1] 17
## [1] "complete" "canceled" "order_refunded" "received"
## [5] "refund" "closed" "fraud" "holded"
## [9] "exchange" "pending_paypal" "paid" "\\N"
## [13] "cod" "pending" NA "processing"
## [17] "payment_review"
## # A tibble: 17 × 2
## status n
## <chr> <int>
## 1 "\\N" 4
## 2 "canceled" 201249
## 3 "closed" 494
## 4 "cod" 2859
## 5 "complete" 233685
## 6 "exchange" 4
## 7 "fraud" 10
## 8 "holded" 31
## 9 "order_refunded" 59529
## 10 "paid" 1159
## 11 "payment_review" 57
## 12 "pending" 48
## 13 "pending_paypal" 7
## 14 "processing" 33
## 15 "received" 77290
## 16 "refund" 8050
## 17 <NA> 15
# Substituindo os valores dos status "received" e "pain" para "concluido" .
clean_data$status[clean_data$status == 'received' | clean_data$status == 'paid'] <- 'concluídos'
# Substituindo os valores dos status 'order_refunded' and 'refund' por 'reembolsado' para tornar os dados mais consistentes.
clean_data$status[clean_data$status == 'order_refunded' | clean_data$status == 'refund'] <- 'reembolsado'
# validar o numero de linhas para cada status do pedido após a subestituições anteriores.
count(clean_data, status)## # A tibble: 15 × 2
## status n
## <chr> <int>
## 1 "\\N" 4
## 2 "canceled" 201249
## 3 "closed" 494
## 4 "cod" 2859
## 5 "complete" 233685
## 6 "concluídos" 78449
## 7 "exchange" 4
## 8 "fraud" 10
## 9 "holded" 31
## 10 "payment_review" 57
## 11 "pending" 48
## 12 "pending_paypal" 7
## 13 "processing" 33
## 14 "reembolsado" 67579
## 15 <NA> 15
Iremos agora trabalhar com as colunas de “created_at” e “Working Date” onde iremos verificar primeiramente o tipo dos valores de ambas as colunas.
## [1] "character"
## [1] "character"
## [1] 584524
Nesse trexo temos que lidar com dados que contêm informações temporais, é essencial garantir que as datas estejam corretas e consistentes. Neste trecho de código, meu foco é analisar as colunas created_at e Working Date, verificando sua completude e consistência.
## [1] 584524
## [1] 0
## [1] 0
#Comparar para verificar se 'created_at' e 'Working Date' são iguais para cada pedido ou não.
filter(clean_data, clean_data$created_at != clean_data$`Working Date`)## # A tibble: 0 × 21
## # ℹ 21 variables: item_id <dbl>, status <chr>, created_at <chr>, sku <chr>,
## # price <dbl>, qty_ordered <dbl>, grand_total <dbl>, increment_id <dbl>,
## # category_name_1 <chr>, sales_commission_code <chr>, discount_amount <dbl>,
## # payment_method <chr>, Working Date <chr>, BI Status <chr>, MV <chr>,
## # Year <dbl>, Month <dbl>, Customer Since <chr>, M-Y <chr>, FY <chr>,
## # Customer ID <dbl>
Após verificar que as colunas “created_at” e “working Date” elas tem exatamente os mesmos valoress para cada pedido, iremos excluir uma dessas colunas tendo em vista que não há necessidade de ficar com ambas , e depois iremos renomear a culuna como “data_do_pedido”
## # A tibble: 584,524 × 20
## item_id status created_at sku price qty_ordered grand_total increment_id
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 211131 complete 7/1/2016 krea… 1950 1 1950 100147443
## 2 211133 canceled 7/1/2016 kcc_… 240 1 240 100147444
## 3 211134 canceled 7/1/2016 Ego_… 2450 1 2450 100147445
## 4 211135 complete 7/1/2016 kcc_… 360 1 60 100147446
## 5 211136 reembols… 7/1/2016 BK70… 555 2 1110 100147447
## 6 211137 canceled 7/1/2016 UK_N… 80 1 80 100147448
## 7 211138 complete 7/1/2016 kcc_… 360 1 60 100147449
## 8 211139 complete 7/1/2016 UK_N… 170 1 170 100147450
## 9 211140 canceled 7/1/2016 Appl… 96499 1 96499 100147451
## 10 211141 canceled 7/1/2016 Appl… 96499 1 96499 100147452
## # ℹ 584,514 more rows
## # ℹ 12 more variables: category_name_1 <chr>, sales_commission_code <chr>,
## # discount_amount <dbl>, payment_method <chr>, `BI Status` <chr>, MV <chr>,
## # Year <dbl>, Month <dbl>, `Customer Since` <chr>, `M-Y` <chr>, FY <chr>,
## # `Customer ID` <dbl>
# Renomeando a coluna 'created_at' para 'data_do_pedido'
colnames(clean_data)[3] = 'data_do_pedido'
clean_data## # A tibble: 584,524 × 20
## item_id status data_do_pedido sku price qty_ordered grand_total
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 211131 complete 7/1/2016 kreations_Y… 1950 1 1950
## 2 211133 canceled 7/1/2016 kcc_Buy 2 F… 240 1 240
## 3 211134 canceled 7/1/2016 Ego_UP0017-… 2450 1 2450
## 4 211135 complete 7/1/2016 kcc_krone d… 360 1 60
## 5 211136 reembolsado 7/1/2016 BK7010400AG 555 2 1110
## 6 211137 canceled 7/1/2016 UK_Namkino … 80 1 80
## 7 211138 complete 7/1/2016 kcc_krone d… 360 1 60
## 8 211139 complete 7/1/2016 UK_Namkino … 170 1 170
## 9 211140 canceled 7/1/2016 Apple iPhon… 96499 1 96499
## 10 211141 canceled 7/1/2016 Apple iPhon… 96499 1 96499
## # ℹ 584,514 more rows
## # ℹ 13 more variables: increment_id <dbl>, category_name_1 <chr>,
## # sales_commission_code <chr>, discount_amount <dbl>, payment_method <chr>,
## # `BI Status` <chr>, MV <chr>, Year <dbl>, Month <dbl>,
## # `Customer Since` <chr>, `M-Y` <chr>, FY <chr>, `Customer ID` <dbl>
Agora iremos trabalhar com a coluna Sku , onde sku nada mais é que um termo/codigo utilizado para remeter a “unidade de manutenção de estoque”, onde iremos verificar a classe e verificar quantas NA´S tem nessa coluna , e iremos fazer essa mesma verificação para coluna price além de fazer uma verificação extra de 0 na coluna .
## [1] "character"
## [1] 20
## [1] "numeric"
## [1] 0
## # A tibble: 2,232 × 20
## item_id status data_do_pedido sku price qty_ordered grand_total
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 218538 canceled 7/26/2016 west point_Del… 0 1 0
## 2 218542 canceled 7/26/2016 west point_Del… 0 1 0
## 3 218988 canceled 7/27/2016 west point_Del… 0 1 0
## 4 220494 canceled 7/29/2016 stinnos_1301 0 1 0
## 5 220540 canceled 7/29/2016 stinnos_1301 0 10 0
## 6 220552 canceled 7/29/2016 stinnos_1301 0 1 0
## 7 220557 canceled 7/29/2016 stinnos_1301 0 1 0
## 8 220568 complete 7/29/2016 stinnos_1301 0 2 685
## 9 220637 canceled 7/30/2016 stinnos_1500 0 1 0
## 10 220970 canceled 7/31/2016 stinnos_1500 0 1 0
## # ℹ 2,222 more rows
## # ℹ 13 more variables: increment_id <dbl>, category_name_1 <chr>,
## # sales_commission_code <chr>, discount_amount <dbl>, payment_method <chr>,
## # `BI Status` <chr>, MV <chr>, Year <dbl>, Month <dbl>,
## # `Customer Since` <chr>, `M-Y` <chr>, FY <chr>, `Customer ID` <dbl>
Após essa ultima analise acima podemos notar que tiveram diversos valores igual a 0 o que pode ter sido causado por terem sido oferecido como brinde ao comprar um outro produto ou até mesmo numa estrategia de markting para fidelizar novos clientes.
Agora iremos realizar a mesma inclementação nas seguintes colunas a seguir :
Coluna qty_ordered , nessa iremos também realizar um procedimento para saber os números exclusivas nela .
## [1] "numeric"
## [1] 0
## # A tibble: 74 × 2
## qty_ordered n
## <dbl> <int>
## 1 1 505214
## 2 2 46656
## 3 3 15406
## 4 4 4141
## 5 5 11213
## 6 6 589
## 7 7 112
## 8 8 153
## 9 9 42
## 10 10 292
## # ℹ 64 more rows
Neste trecho , realizamos uma análise exploratória e um tratamento inicial dos dados, verificando a estrutura de várias colunas do dataset e aplicando ajustes para padronizar e melhorar a qualidade da informação.
Coluna grand_total
Primeiramente, verificamos a classe da variável grand_total, garantindo que está no formato correto. Em seguida, avaliamos a presença de valores ausentes (NA) e identificamos registros onde o total da compra (grand_total) é zero, o que pode indicar pedidos cancelados ou erros no registro.
## [1] "numeric"
## [1] 0
## # A tibble: 9,632 × 20
## item_id status data_do_pedido sku price qty_ordered grand_total
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 211146 complete 7/1/2016 kcc_glamour… 320 1 0
## 2 211157 reembolsado 7/1/2016 D Lend a He… 1000 1 0
## 3 211162 complete 7/1/2016 SKMT_Blood … 500 1 0
## 4 211163 complete 7/1/2016 SKMT_Medici… 100 5 0
## 5 211422 complete 7/1/2016 sstop_3dcre… 995 1 0
## 6 211472 complete 7/1/2016 kcc_glamour… 320 1 0
## 7 211704 complete 7/1/2016 US-MSK-6-pi… 799 1 0
## 8 211743 reembolsado 7/2/2016 ajmery_BAT-… 999 1 0
## 9 211823 complete 7/2/2016 sentiments_… 1 1 0
## 10 211854 complete 7/2/2016 audionic6-9… 585 1 0
## # ℹ 9,622 more rows
## # ℹ 13 more variables: increment_id <dbl>, category_name_1 <chr>,
## # sales_commission_code <chr>, discount_amount <dbl>, payment_method <chr>,
## # `BI Status` <chr>, MV <chr>, Year <dbl>, Month <dbl>,
## # `Customer Since` <chr>, `M-Y` <chr>, FY <chr>, `Customer ID` <dbl>
Coluna increment_id
O mesmo procedimento é aplicado à coluna increment_id, que representa um identificador único de cada pedido. Analisamos a estrutura da variável e verificamos se há valores ausentes, pois a falta de identificadores pode indicar falhas no banco de dados.
## [1] "numeric"
## [1] 9
Coluna category_name_1
Aqui, realizamos a análise de estrutura da coluna e verificamos a presença de valores ausentes. Depois, contamos quantos pedidos pertencem a cada categoria de produto para entender melhor a distribuição das vendas. Por fim, renomeamos a coluna de category_name_1 para category_name, tornando o nome mais claro e intuitivo para análises futuras.
## [1] "character"
## [1] 164
## # A tibble: 17 × 2
## category_name_1 n
## <chr> <int>
## 1 "Appliances" 52413
## 2 "Beauty & Grooming" 41496
## 3 "Books" 1870
## 4 "Computing" 15933
## 5 "Entertainment" 26326
## 6 "Health & Sports" 17502
## 7 "Home & Living" 26504
## 8 "Kids & Baby" 16494
## 9 "Men's Fashion" 92221
## 10 "Mobiles & Tablets" 115710
## 11 "Others" 29218
## 12 "School & Education" 3478
## 13 "Soghaat" 34011
## 14 "Superstore" 43613
## 15 "Women's Fashion" 59721
## 16 "\\N" 7850
## 17 <NA> 164
# Renomeie a coluna para 'category_name' para maior clareza quando a for utilizar mais a frente na analise exploratoria .
colnames(clean_data)[9] = 'category_name'
clean_data## # A tibble: 584,524 × 20
## item_id status data_do_pedido sku price qty_ordered grand_total
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 211131 complete 7/1/2016 kreations_Y… 1950 1 1950
## 2 211133 canceled 7/1/2016 kcc_Buy 2 F… 240 1 240
## 3 211134 canceled 7/1/2016 Ego_UP0017-… 2450 1 2450
## 4 211135 complete 7/1/2016 kcc_krone d… 360 1 60
## 5 211136 reembolsado 7/1/2016 BK7010400AG 555 2 1110
## 6 211137 canceled 7/1/2016 UK_Namkino … 80 1 80
## 7 211138 complete 7/1/2016 kcc_krone d… 360 1 60
## 8 211139 complete 7/1/2016 UK_Namkino … 170 1 170
## 9 211140 canceled 7/1/2016 Apple iPhon… 96499 1 96499
## 10 211141 canceled 7/1/2016 Apple iPhon… 96499 1 96499
## # ℹ 584,514 more rows
## # ℹ 13 more variables: increment_id <dbl>, category_name <chr>,
## # sales_commission_code <chr>, discount_amount <dbl>, payment_method <chr>,
## # `BI Status` <chr>, MV <chr>, Year <dbl>, Month <dbl>,
## # `Customer Since` <chr>, `M-Y` <chr>, FY <chr>, `Customer ID` <dbl>
Coluna sales_commission_code
Verificamos a classe da variável, identificamos possíveis valores ausentes e contamos os valores únicos, o que permite compreender a diversidade dos códigos de comissão aplicados nas vendas.
## [1] "character"
## [1] 137175
## # A tibble: 7,196 × 2
## sales_commission_code n
## <chr> <int>
## 1 "\"WD500\"" 2
## 2 "#100307578" 1
## 3 "#100349869" 1
## 4 "#GOSFPK" 3
## 5 "#NAME?" 2
## 6 "#UK1003" 1
## 7 "#UK1004" 2
## 8 ",R-PEW-104414" 1
## 9 "-" 2
## 10 "-0.44" 1
## # ℹ 7,186 more rows
Coluna discount_amount
Para essa coluna, verificamos sua estrutura e a presença de valores NA, o que pode indicar registros onde nenhum desconto foi aplicado.
## [1] "numeric"
## [1] 0
Coluna payment_method
Além da análise de estrutura e da verificação de valores ausentes, contamos os métodos de pagamento disponíveis no dataset. Como parte do tratamento, substituímos o termo cashatdoorstep por cod (cash on delivery) para padronizar os valores. Depois, validamos se a substituição foi aplicada corretamente.
## [1] "character"
## [1] 0
## # A tibble: 18 × 2
## payment_method n
## <chr> <int>
## 1 Easypay 82900
## 2 Easypay_MA 14028
## 3 Payaxis 97641
## 4 apg 1758
## 5 bankalfalah 23065
## 6 cashatdoorstep 732
## 7 cod 271960
## 8 customercredit 7555
## 9 easypay_voucher 31176
## 10 financesettlement 15
## 11 internetbanking 472
## 12 jazzvoucher 15633
## 13 jazzwallet 35145
## 14 marketingexpense 45
## 15 mcblite 723
## 16 mygateway 669
## 17 productcredit 125
## 18 ublcreditcard 882
# Substitua 'cashatdoorstep' por 'cod' para tornar o método de pagamento consistente
clean_data$payment_method[clean_data$payment_method == 'cashatdoorstep'] <- 'cod'
# Validação dos valores 'cod' após a substituição
count(clean_data, payment_method)## # A tibble: 17 × 2
## payment_method n
## <chr> <int>
## 1 Easypay 82900
## 2 Easypay_MA 14028
## 3 Payaxis 97641
## 4 apg 1758
## 5 bankalfalah 23065
## 6 cod 272692
## 7 customercredit 7555
## 8 easypay_voucher 31176
## 9 financesettlement 15
## 10 internetbanking 472
## 11 jazzvoucher 15633
## 12 jazzwallet 35145
## 13 marketingexpense 45
## 14 mcblite 723
## 15 mygateway 669
## 16 productcredit 125
## 17 ublcreditcard 882
Coluna BI Status
Avaliamos a estrutura da variável, verificamos valores ausentes e contamos os valores exclusivos, o que permite entender os diferentes status atribuídos a cada pedido no sistema de Business Intelligence.
## [1] "character"
## [1] 0
## # A tibble: 4 × 2
## `BI Status` n
## <chr> <int>
## 1 #REF! 1
## 2 Gross 201454
## 3 Net 234178
## 4 Valid 148891
Coluna MV
Inicialmente, verificamos a classe da variável e identificamos valores NA. Além disso, filtramos os registros onde o valor é zero. Como parte do tratamento, recalculamos a métrica MV utilizando a fórmula MV = price * qty_ordered, garantindo que os valores estejam corretos.
## [1] "character"
## [1] 0
## # A tibble: 40 × 20
## item_id status data_do_pedido sku price qty_ordered grand_total
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 215353 complete 7/16/2016 STBB_A Text… 0.15 2 0.3
## 2 775912 reembolsado 3/8/2018 MATHKT5A9FC… 0.2 2 150.
## 3 776101 concluídos 3/8/2018 MATHKT5A9FC… 0.2 2 1096.
## 4 776184 concluídos 3/8/2018 MATHKT5A9FC… 0.2 2 1077.
## 5 776197 reembolsado 3/8/2018 MATHKT5A9FC… 0.2 2 1008.
## 6 776203 reembolsado 3/8/2018 MATHKT5A9FC… 0.2 2 1008.
## 7 776220 reembolsado 3/8/2018 MATHKT5A9FC… 0.2 2 1008.
## 8 776228 reembolsado 3/8/2018 MATHKT5A9FC… 0.2 2 1008.
## 9 776233 reembolsado 3/8/2018 MATHKT5A9FC… 0.2 2 1008.
## 10 776238 reembolsado 3/8/2018 MATHKT5A9FC… 0.2 2 1008.
## # ℹ 30 more rows
## # ℹ 13 more variables: increment_id <dbl>, category_name <chr>,
## # sales_commission_code <chr>, discount_amount <dbl>, payment_method <chr>,
## # `BI Status` <chr>, MV <chr>, Year <dbl>, Month <dbl>,
## # `Customer Since` <chr>, `M-Y` <chr>, FY <chr>, `Customer ID` <dbl>
# Converção do tipo de dados para 'duplo'
clean_data$MV = clean_data$price * clean_data$qty_ordered
clean_data## # A tibble: 584,524 × 20
## item_id status data_do_pedido sku price qty_ordered grand_total
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 211131 complete 7/1/2016 kreations_Y… 1950 1 1950
## 2 211133 canceled 7/1/2016 kcc_Buy 2 F… 240 1 240
## 3 211134 canceled 7/1/2016 Ego_UP0017-… 2450 1 2450
## 4 211135 complete 7/1/2016 kcc_krone d… 360 1 60
## 5 211136 reembolsado 7/1/2016 BK7010400AG 555 2 1110
## 6 211137 canceled 7/1/2016 UK_Namkino … 80 1 80
## 7 211138 complete 7/1/2016 kcc_krone d… 360 1 60
## 8 211139 complete 7/1/2016 UK_Namkino … 170 1 170
## 9 211140 canceled 7/1/2016 Apple iPhon… 96499 1 96499
## 10 211141 canceled 7/1/2016 Apple iPhon… 96499 1 96499
## # ℹ 584,514 more rows
## # ℹ 13 more variables: increment_id <dbl>, category_name <chr>,
## # sales_commission_code <chr>, discount_amount <dbl>, payment_method <chr>,
## # `BI Status` <chr>, MV <dbl>, Year <dbl>, Month <dbl>,
## # `Customer Since` <chr>, `M-Y` <chr>, FY <chr>, `Customer ID` <dbl>
Coluna Year
Realizamos a análise de estrutura e verificamos valores NA. Em seguida, extraímos o ano da coluna data_do_pedido para comparar com o valor registrado na coluna Year, assegurando que as informações estejam consistentes. Por fim, contamos os valores únicos para entender a abrangência temporal do dataset.
## [1] "numeric"
## [1] 0
# Extrair o ano de data_do_pedido
date <- as.POSIXct(clean_data$data_do_pedido, format="%m/%d/%Y")
year <- format(date, format="%Y")
# Comparação do ano com o ano extraído de 'data_do_pedido' para verificar se são iguais ou não
filter(clean_data, clean_data$Year != year)## # A tibble: 0 × 20
## # ℹ 20 variables: item_id <dbl>, status <chr>, data_do_pedido <chr>, sku <chr>,
## # price <dbl>, qty_ordered <dbl>, grand_total <dbl>, increment_id <dbl>,
## # category_name <chr>, sales_commission_code <chr>, discount_amount <dbl>,
## # payment_method <chr>, BI Status <chr>, MV <dbl>, Year <dbl>, Month <dbl>,
## # Customer Since <chr>, M-Y <chr>, FY <chr>, Customer ID <dbl>
## # A tibble: 3 × 2
## Year n
## <dbl> <int>
## 1 2016 133909
## 2 2017 290920
## 3 2018 159695
Coluna Month
Seguindo o mesmo procedimento da coluna Year, verificamos a estrutura da variável, identificamos valores NA e extraímos o mês da data_do_pedido. Depois, comparamos os valores para garantir que não haja discrepâncias e contamos os valores exclusivos.
## [1] "numeric"
## [1] 0
# Extração do mês de data_do_pedido
date <- as.POSIXct(clean_data$data_do_pedido, format="%m/%d/%Y")
month <- sub("^0+", "", format(date, format="%m"))
# Comparação do ano com o ano extraído de 'data_do_pedido' para verificar se são iguais ou não
filter(clean_data, clean_data$Month != month)## # A tibble: 0 × 20
## # ℹ 20 variables: item_id <dbl>, status <chr>, data_do_pedido <chr>, sku <chr>,
## # price <dbl>, qty_ordered <dbl>, grand_total <dbl>, increment_id <dbl>,
## # category_name <chr>, sales_commission_code <chr>, discount_amount <dbl>,
## # payment_method <chr>, BI Status <chr>, MV <dbl>, Year <dbl>, Month <dbl>,
## # Customer Since <chr>, M-Y <chr>, FY <chr>, Customer ID <dbl>
## # A tibble: 12 × 2
## Month n
## <dbl> <int>
## 1 1 26067
## 2 2 38777
## 3 3 61489
## 4 4 34091
## 5 5 62603
## 6 6 34530
## 7 7 39151
## 8 8 48514
## 9 9 24024
## 10 10 30623
## 11 11 155456
## 12 12 29199
Coluna FY
Verificamos a classe da variável, a presença de valores ausentes e contamos os valores exclusivos, o que pode ajudar a identificar os períodos fiscais contemplados no dataset.
## [1] "character"
## [1] 0
## # A tibble: 3 × 2
## FY n
## <chr> <int>
## 1 FY17 254706
## 2 FY18 306883
## 3 FY19 22935
Coluna Customer ID
Por fim, verificamos a estrutura da variável Customer ID e analisamos a presença de valores ausentes. A falta de identificadores de clientes pode comprometer a análise do comportamento do consumidor, por isso, essa verificação é essencial.
## [1] "numeric"
## [1] 11
Este conjunto de verificações e ajustes garante que os dados estejam limpos, organizados e padronizados, facilitando análises futuras e a obtenção de insights mais precisos.
Nesta etapa, realizamos uma análise detalhada dos dados, utilizando estatísticas descritivas e visualizações gráficas para compreender padrões e tendências do conjunto de dados.
Inicialmente, contamos a quantidade de pedidos para cada categoria de produto e ordenamos os resultados em ordem decrescente. Em seguida, construímos um gráfico de barras para visualizar quais categorias possuem maior volume de pedidos.
## # A tibble: 17 × 2
## category_name n
## <chr> <int>
## 1 "Mobiles & Tablets" 115710
## 2 "Men's Fashion" 92221
## 3 "Women's Fashion" 59721
## 4 "Appliances" 52413
## 5 "Superstore" 43613
## 6 "Beauty & Grooming" 41496
## 7 "Soghaat" 34011
## 8 "Others" 29218
## 9 "Home & Living" 26504
## 10 "Entertainment" 26326
## 11 "Health & Sports" 17502
## 12 "Kids & Baby" 16494
## 13 "Computing" 15933
## 14 "\\N" 7850
## 15 "School & Education" 3478
## 16 "Books" 1870
## 17 <NA> 164
# Criação de um grafico de barras com levantamento de categorias por número de pedidos
categories %>% ggplot(aes(x=category_name, y=n, fill=n)) +
geom_bar(stat="identity") +
theme(axis.text.x = element_text(angle=90, hjust=1)) +
labs(title="Categoria por pedidos", subtitle="Categoria mais vendida: celulares e tablets") +
xlab("Categoria") +
ylab("número de pedidos")Após a analise foi possivel identificar que a A categoria mais vendida por número de pedidos é Celulares e Tablets.
Além da contagem de pedidos, calculamos a receita total gerada por cada categoria, utilizando a fórmula Receita_Total = price * qty_ordered. Os valores foram classificados em ordem decrescente, permitindo identificar quais categorias tiveram maior impacto financeiro.
# Calcularemos a receita total de cada categoria e classificaremos em ordem decrescente
categories <- clean_data %>% group_by(category_name) %>%
summarize(Receita_Total = sum(price*qty_ordered)) %>%
arrange(desc(Receita_Total))
categories## # A tibble: 17 × 2
## category_name Receita_Total
## <chr> <dbl>
## 1 "Mobiles & Tablets" 2307710409.
## 2 "Appliances" 612092739.
## 3 "Entertainment" 527741792.
## 4 "Computing" 185670079.
## 5 "Others" 167023112
## 6 "Women's Fashion" 110994586.
## 7 "Men's Fashion" 88262104.
## 8 "Beauty & Grooming" 40977442.
## 9 "Superstore" 40409583.
## 10 "\\N" 34036033.
## 11 "Home & Living" 32278910.
## 12 "Health & Sports" 19623355.
## 13 "Soghaat" 13406103.
## 14 "Kids & Baby" 12043602.
## 15 "School & Education" 1877265.
## 16 "Books" 1007968.
## 17 <NA> 152915.
# Criação de um grafico de barras com levantamento de categorias de acordo com sua receita
categories %>% ggplot(aes(x=category_name, y=Receita_Total, fill=Receita_Total)) +
geom_bar(stat="identity") +
theme(axis.text.x = element_text(angle=90, hjust=1)) +
labs(title="Categoria por receita", subtitle="Categoria mais vendida: celulares e tablets") +
xlab("Categoria") +
ylab("Receita total")Um gráfico de barras foi gerado para facilitar a visualização, e os resultados indicaram que, além de liderar em número de pedidos, Celulares e Tablets também foi a categoria que gerou maior receita.
Realizamos a contagem de pedidos por status de pedido para cada método de pagamento, o que nos permite analisar se há relação entre a forma de pagamento escolhida e o resultado final do pedido (por exemplo, concluído, cancelado, pendente).
# cONTADOR DE nÚMEROS de pedidos por status para cada forma de pagamento
clean_data %>% group_by(payment_method, status) %>%
count(status)## # A tibble: 95 × 3
## # Groups: payment_method, status [95]
## payment_method status n
## <chr> <chr> <int>
## 1 Easypay canceled 52040
## 2 Easypay closed 16
## 3 Easypay complete 19214
## 4 Easypay concluídos 8277
## 5 Easypay holded 2
## 6 Easypay reembolsado 3351
## 7 Easypay_MA canceled 9210
## 8 Easypay_MA complete 3116
## 9 Easypay_MA concluídos 1243
## 10 Easypay_MA reembolsado 459
## # ℹ 85 more rows
Para entender melhor as preferências dos clientes, contamos a quantidade de pedidos em cada método de pagamento e os classificamos em ordem decrescente.
# cONTADOR DE nÚMEROS de pedidos em cada método de pagamento e classificado em ordem decrescente
payment_methods <- count(clean_data, payment_method) %>% arrange(desc(n))
payment_methods## # A tibble: 17 × 2
## payment_method n
## <chr> <int>
## 1 cod 272692
## 2 Payaxis 97641
## 3 Easypay 82900
## 4 jazzwallet 35145
## 5 easypay_voucher 31176
## 6 bankalfalah 23065
## 7 jazzvoucher 15633
## 8 Easypay_MA 14028
## 9 customercredit 7555
## 10 apg 1758
## 11 ublcreditcard 882
## 12 mcblite 723
## 13 mygateway 669
## 14 internetbanking 472
## 15 productcredit 125
## 16 marketingexpense 45
## 17 financesettlement 15
# Criação de um grafico de barras com levantamento dos métodos de pagamento por número de pedidos
payment_methods %>% ggplot(aes(x=payment_method, y=n, fill=n)) +
geom_bar(stat="identity") +
theme(axis.text.x = element_text(angle=90, hjust=1)) +
labs(title="
Forma de pagamento por Encomendas", subtitle="
Forma de pagamento mais utilizada: cod") +
xlab("Método de pagamento") +
ylab("Número de pedidoss")O gráfico de barras gerado mostrou que a forma de pagamento mais utilizada é o COD (pagamento na entrega), sendo a opção preferida pelos clientes na maioria dos pedidos.
Avaliamos quais categorias de produtos foram mais vendidas ao longo do tempo, considerando tanto o ano quanto o mês/ano. Para isso, agrupamos os dados e identificamos as categorias com maior número de pedidos em cada período.
## # A tibble: 48 × 3
## # Groups: Year [3]
## Year category_name n
## <dbl> <chr> <int>
## 1 2016 Appliances 9701
## 2 2016 Beauty & Grooming 13900
## 3 2016 Books 438
## 4 2016 Computing 4087
## 5 2016 Entertainment 3524
## 6 2016 Health & Sports 4160
## 7 2016 Home & Living 5630
## 8 2016 Kids & Baby 3423
## 9 2016 Men's Fashion 25408
## 10 2016 Mobiles & Tablets 22289
## # ℹ 38 more rows
max_orders_by_year <- clean_data %>% group_by(Year) %>%
count(category_name) %>%
summarize(max_orders = max(n))
max_orders_by_year## # A tibble: 3 × 2
## Year max_orders
## <dbl> <int>
## 1 2016 25408
## 2 2017 59720
## 3 2018 33701
## # A tibble: 3 × 3
## Year max_orders category_name
## <dbl> <int> <chr>
## 1 2016 25408 Men's Fashion
## 2 2017 59720 Mobiles & Tablets
## 3 2018 33701 Mobiles & Tablets
categories_by_month_year <- clean_data %>% group_by(`M-Y`) %>%
count(category_name)
categories_by_month_year## # A tibble: 416 × 3
## # Groups: M-Y [26]
## `M-Y` category_name n
## <chr> <chr> <int>
## 1 1-2017 Appliances 636
## 2 1-2017 Beauty & Grooming 880
## 3 1-2017 Books 39
## 4 1-2017 Computing 293
## 5 1-2017 Entertainment 267
## 6 1-2017 Health & Sports 511
## 7 1-2017 Home & Living 360
## 8 1-2017 Kids & Baby 497
## 9 1-2017 Men's Fashion 2022
## 10 1-2017 Mobiles & Tablets 3045
## # ℹ 406 more rows
max_orders_by_month_year <- clean_data %>% group_by(`M-Y`) %>%
count(category_name) %>%
summarize(max_orders = max(n))
max_orders_by_month_year## # A tibble: 26 × 2
## `M-Y` max_orders
## <chr> <int>
## 1 1-2017 3045
## 2 1-2018 2694
## 3 10-2016 2754
## 4 10-2017 3956
## 5 11-2016 15760
## 6 11-2017 19404
## 7 12-2016 2840
## 8 12-2017 2931
## 9 2-2017 3124
## 10 2-2018 5738
## # ℹ 16 more rows
max_orders_by_month_year %>% inner_join(categories_by_month_year,
by=c("M-Y" = "M-Y",
"max_orders" = "n"))## # A tibble: 26 × 3
## `M-Y` max_orders category_name
## <chr> <int> <chr>
## 1 1-2017 3045 Mobiles & Tablets
## 2 1-2018 2694 Mobiles & Tablets
## 3 10-2016 2754 Soghaat
## 4 10-2017 3956 Mobiles & Tablets
## 5 11-2016 15760 Men's Fashion
## 6 11-2017 19404 Mobiles & Tablets
## 7 12-2016 2840 Men's Fashion
## 8 12-2017 2931 Men's Fashion
## 9 2-2017 3124 Mobiles & Tablets
## 10 2-2018 5738 Mobiles & Tablets
## # ℹ 16 more rows
Além da quantidade de pedidos, analisamos as categorias com maior receita para cada ano e cada mês. Para isso, calculamos a soma da métrica MV (receita gerada) e identificamos os produtos que tiveram o maior faturamento em cada período.
categories_by_month_year <- clean_data %>% group_by(`M-Y`, category_name) %>%
summarize(total_revenue = sum(MV))## `summarise()` has grouped output by 'M-Y'. You can override using the `.groups`
## argument.
## # A tibble: 416 × 3
## # Groups: M-Y [26]
## `M-Y` category_name total_revenue
## <chr> <chr> <dbl>
## 1 1-2017 Appliances 4739537
## 2 1-2017 Beauty & Grooming 972644
## 3 1-2017 Books 39096
## 4 1-2017 Computing 3249624
## 5 1-2017 Entertainment 5998555
## 6 1-2017 Health & Sports 709070
## 7 1-2017 Home & Living 786141
## 8 1-2017 Kids & Baby 302363.
## 9 1-2017 Men's Fashion 2899917.
## 10 1-2017 Mobiles & Tablets 74564334
## # ℹ 406 more rows
max_revenue_by_month_year <- categories_by_month_year %>% group_by(`M-Y`) %>%
summarize(max_revenue = max(total_revenue))
max_revenue_by_month_year## # A tibble: 26 × 2
## `M-Y` max_revenue
## <chr> <dbl>
## 1 1-2017 74564334
## 2 1-2018 41066768.
## 3 10-2016 35052663.
## 4 10-2017 57048521
## 5 11-2016 87218072.
## 6 11-2017 432655425.
## 7 12-2016 42307076.
## 8 12-2017 31624909.
## 9 2-2017 52913699
## 10 2-2018 142780415.
## # ℹ 16 more rows
max_revenue_by_month_year %>% inner_join(categories_by_month_year,
by=c("M-Y" = "M-Y",
"max_revenue" = "total_revenue"))## # A tibble: 26 × 3
## `M-Y` max_revenue category_name
## <chr> <dbl> <chr>
## 1 1-2017 74564334 Mobiles & Tablets
## 2 1-2018 41066768. Mobiles & Tablets
## 3 10-2016 35052663. Mobiles & Tablets
## 4 10-2017 57048521 Mobiles & Tablets
## 5 11-2016 87218072. Mobiles & Tablets
## 6 11-2017 432655425. Mobiles & Tablets
## 7 12-2016 42307076. Mobiles & Tablets
## 8 12-2017 31624909. Mobiles & Tablets
## 9 2-2017 52913699 Mobiles & Tablets
## 10 2-2018 142780415. Mobiles & Tablets
## # ℹ 16 more rows
Filtramos os pedidos com status “complete” e os agrupamos por ano, obtendo a contagem total de pedidos finalizados em cada período.
## # A tibble: 3 × 3
## # Groups: Year [3]
## Year status n
## <dbl> <chr> <int>
## 1 2016 complete 74610
## 2 2017 complete 123489
## 3 2018 complete 35586
filter(clean_data, clean_data$status == 'complete') %>%
group_by(Year) %>%
summarize(total_revenue = sum(MV))## # A tibble: 3 × 2
## Year total_revenue
## <dbl> <dbl>
## 1 2016 166293900.
## 2 2017 593976928.
## 3 2018 317098729.
categories_by_year <- clean_data %>% group_by(Year, category_name) %>%
summarize(total_revenue = sum(MV))## `summarise()` has grouped output by 'Year'. You can override using the
## `.groups` argument.
## # A tibble: 48 × 3
## # Groups: Year [3]
## Year category_name total_revenue
## <dbl> <chr> <dbl>
## 1 2016 Appliances 85706479
## 2 2016 Beauty & Grooming 9414579
## 3 2016 Books 445072
## 4 2016 Computing 35767566
## 5 2016 Entertainment 70641939.
## 6 2016 Health & Sports 5062087.
## 7 2016 Home & Living 11789875.
## 8 2016 Kids & Baby 2499806.
## 9 2016 Men's Fashion 23286487.
## 10 2016 Mobiles & Tablets 243185889.
## # ℹ 38 more rows
max_revenue_by_year <- categories_by_year %>% group_by(Year) %>%
summarize(max_revenue = max(total_revenue))
max_revenue_by_year## # A tibble: 3 × 2
## Year max_revenue
## <dbl> <dbl>
## 1 2016 243185889.
## 2 2017 1047848220.
## 3 2018 1016676299.
max_revenue_by_year %>% inner_join(categories_by_year,
by=c("Year" = "Year",
"max_revenue" = "total_revenue"))## # A tibble: 3 × 3
## Year max_revenue category_name
## <dbl> <dbl> <chr>
## 1 2016 243185889. Mobiles & Tablets
## 2 2017 1047848220. Mobiles & Tablets
## 3 2018 1016676299. Mobiles & Tablets
Agora iremos realizar alguns analise de forma visual focada em analisar Método de pagamento vs frequência de status do pedido.
# Contador de pedidos por status para 'cód' e represente-os em um gráfico de barras
filter(clean_data, clean_data$payment_method == 'cod') %>% group_by(status) %>%
summarize(pedidos = n()) %>%
ggplot(aes(x=status, y=pedidos, fill=pedidos)) +
geom_bar(stat="identity") +
theme(axis.text.x = element_text(angle=90, hjust=1)) +
labs(title="Método de pagamento vs frequência de status do pedido", subtitle="Pedidos COD (pagamento na entrega) por status")# Count the number of orders per status for 'payaxis' and plot them on a bar graph
filter(clean_data, clean_data$payment_method == 'Payaxis') %>% group_by(status) %>%
summarize(pedidos = n()) %>%
ggplot(aes(x=status, y=pedidos, fill=pedidos)) +
geom_bar(stat="identity") +
theme(axis.text.x = element_text(angle=90, hjust=1)) +
labs(title="Método de pagamento vs frequência de status do pedido", subtitle="Pedidos Payaxis por status")ggplot(data, aes(x = price)) +
geom_density(fill = "blue", alpha = 0.5) +
labs(title = "Distribuição de Preços", x = "Preço", y = "Densidade")## Warning: Removed 464051 rows containing non-finite outside the scale range
## (`stat_density()`).
Utilizamos um conjunto de dados detalhado sobre transações realizadas no maior e-commerce do Paquistão. As informações analisadas incluíram variáveis como categoria dos produtos, valor das compras, comportamento dos clientes e evolução das vendas ao longo do tempo. A metodologia aplicada envolveu:
Análises exploratórias para compreender padrões de compra e sazonalidade das vendas.
Visualizações de dados utilizando gráficos de barras, linhas e histogramas para identificar tendências e variações ao longo dos anos.
Segmentação de clientes para identificar grupos com padrões de compra semelhantes.
Correlação entre variáveis para entender quais fatores impactam diretamente o volume de vendas e o comportamento do consumidor.
Tendências de Compra: Identificamos picos sazonais nas compras, principalmente em determinados períodos do ano, possivelmente associados a festividades e promoções.
Categorias Mais Vendidas: Alguns segmentos de produtos apresentaram um volume de vendas significativamente maior, indicando preferências claras dos consumidores.
Comportamento do Cliente: Identificamos padrões de recorrência nas compras, sugerindo fidelização de clientes em determinados produtos e serviços.
Fatores que Impactam as Vendas: A análise revelou a influência de variáveis como preço médio dos produtos e promoções na decisão de compra dos consumidores.
Os insights obtidos podem ser aplicados por empresas do setor para:
Otimizar estratégias de marketing, concentrando campanhas em períodos de maior demanda.
Aprimorar a gestão de estoque, evitando faltas ou excessos em produtos de alta rotatividade.
Melhorar a experiência do cliente, personalizando recomendações de produtos com base em padrões de compra.
Definir precificação estratégica, considerando a sensibilidade do consumidor ao preço e às promoções.
Fatores externos: Não foram considerados elementos como variações cambiais ou políticas econômicas que poderiam impactar o mercado.
Dados limitados a um período específico: A análise pode não refletir mudanças estruturais no comportamento do consumidor ao longo de anos mais recentes.
Incorporar dados adicionais, como avaliações de clientes e interações nas redes sociais, para uma análise mais completa.
Aplicar modelos preditivos para prever tendências futuras de consumo.
Explorar dados de outros marketplaces para comparação e benchmarking de desempenho
Essa análise reforça a importância dos dados para embasar decisões estratégicas no comércio eletrônico, possibilitando ações mais eficientes e orientadas ao consumidor.