Introdução

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.

Declaração do Problema: Contextualizando a Necessidade de Análise de Dados

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.

Metodologia e Dados: Abordagem para a Solução

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.

Técnica Proposta

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.

Impacto e Benefícios

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.

Pacotes Requeridos

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

Preparação dos Dados

Importando DF´s

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.

library(lubridate)    # Simplifica o trabalho com datas e horas em R
## 
## 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.
View(data) # comando usado visando a visualização do dataset que foi nomeado como data , comando apenas para validação da importação.

Remoção das colunas e linhas vazias .

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 :

na_rows <- sum(rowSums(is.na(data)) == ncol(data))
sprintf("Empty rows: %d", na_rows)
## [1] "Empty rows: 464051"
na_cols <- sum(colSums(is.na(data)) == nrow(data))
sprintf("Empty columns: %d", na_cols)
## [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"

Valores de linhas e colunas dos dados após a limpeza

dim(clean_data)
## [1] 584524     21

Exibição das linhas e colunas removidas na limpeza

clean_data
## # 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>

Checkar e remover entradas duplicadas

sprintf("Entradas Duplicadas: %d", sum(duplicated(clean_data)))
## [1] "Entradas Duplicadas: 0"

Explore cada coluna e corrija quaisquer erros ou ambigüidades

class(clean_data$item_id)
## [1] "numeric"
# Numeros com valores unicos
length(unique(clean_data$item_id))
## [1] 584524

status

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.

class(clean_data$status)
## [1] "character"
# Numero de NA'S na coluna 
sum(is.na(clean_data$status))
## [1] 15
# Numero de valores unicos
length(unique(clean_data$status))
## [1] 17
# valores unicos
unique(clean_data$status)
##  [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"
# numero de linhas para cada status do pedido
count(clean_data, status)
## # 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.

class(clean_data$created_at)
## [1] "character"
class(clean_data$`Working Date`)
## [1] "character"
# Número de valores em 'created_at'
length(clean_data$created_at)
## [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.

# Número de valores em 'Working Date
length(clean_data$`Working Date`)
## [1] 584524
# Verificar se há datas ausentes
sum(is.na(clean_data$created_at))
## [1] 0
sum(is.na(clean_data$`Working Date`))
## [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”

# Removendo a coluna 'Working Date'
clean_data <- select(clean_data, -c(`Working Date`))
clean_data
## # 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 .

class(clean_data$sku)
## [1] "character"
# Numero de NA's na coluna
sum(is.na(clean_data$sku))
## [1] 20
class(clean_data$price)
## [1] "numeric"
# Numero de NA's na coluna
sum(is.na(clean_data$price))
## [1] 0
# Numero de 0 na coluna
filter(clean_data, clean_data$price == 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 .

class(clean_data$qty_ordered)
## [1] "numeric"
# Numero de NA's na coluna
sum(is.na(clean_data$qty_ordered))
## [1] 0
# Número de valores exclusivos na coluna
count(clean_data, qty_ordered)
## # 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.

class(clean_data$grand_total)
## [1] "numeric"
# Numero de NA's na coluna
sum(is.na(clean_data$grand_total))
## [1] 0
# Numero de 0 na coluna
filter(clean_data, clean_data$grand_total == 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.

class(clean_data$increment_id)
## [1] "numeric"
# Numero de NA's na coluna
sum(is.na(clean_data$increment_id))
## [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.

class(clean_data$category_name_1)
## [1] "character"
# Numero de NA's na coluna
sum(is.na(clean_data$category_name_1))
## [1] 164
# Número de pedidos para cada categoria exclusiva
count(clean_data, category_name_1)
## # 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.

class(clean_data$sales_commission_code)
## [1] "character"
# Numero de NA's na coluna
sum(is.na(clean_data$sales_commission_code))
## [1] 137175
# Valores exclusivos na coluna
count(clean_data, sales_commission_code)
## # 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.

class(clean_data$discount_amount)
## [1] "numeric"
# Numero de NA's na coluna
sum(is.na(clean_data$discount_amount))
## [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.

class(clean_data$payment_method)
## [1] "character"
# Numero de NA's na coluna
sum(is.na(clean_data$payment_method))
## [1] 0
# Número de métodos de pagamento exclusivos na coluna
count(clean_data, payment_method)
## # 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.

class(clean_data$`BI Status`)
## [1] "character"
# Número de NAs na coluna
sum(is.na(clean_data$`BI Status`))
## [1] 0
# Número de valores exclusivos na coluna
count(clean_data, `BI Status`)
## # 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.

class(clean_data$MV)
## [1] "character"
# Número de NAs na coluna
sum(is.na(clean_data$MV))
## [1] 0
# Numero de 0 na coluna
filter(clean_data, clean_data$MV == 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.

class(clean_data$Year)
## [1] "numeric"
# Número de NAs na coluna
sum(is.na(clean_data$Year))
## [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>
# Número de valores exclusivos na coluna
count(clean_data, Year)
## # 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.

class(clean_data$Month)
## [1] "numeric"
#  Número de NAs na coluna
sum(is.na(clean_data$Month))
## [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>
# Número de valores exclusivos na coluna
count(clean_data, Month)
## # 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.

class(clean_data$FY)
## [1] "character"
# Número de NAs na coluna
sum(is.na(clean_data$FY))
## [1] 0
# Número de valores exclusivos na coluna
count(clean_data, FY)
## # 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.

class(clean_data$`Customer ID`)
## [1] "numeric"
# Número de NAs na coluna
sum(is.na(clean_data$`Customer ID`))
## [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.

Análise Exploratória

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.

Contador de numero de pedidos de cada categoria e classsificados em ordem decrescnte

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.

categories <- count(clean_data, category_name)
arrange(categories, desc(n))
## # 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.

Método de pagamento versus frequência de status do pedido

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

Método de pagamento mais utilizado

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.

Categoria mais vendida para cada ano por número de 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.

categories_by_year <- clean_data %>% group_by(Year) %>%
  count(category_name)

categories_by_year
## # 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
max_orders_by_year %>% inner_join(categories_by_year,
                                  by=c("Year" = "Year",
                                       "max_orders" = "n"))
## # 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

Categoria mais vendida para cada mês e ano por número de pedidos

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

Categoria mais vendida para cada mês/ano por receita total

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.
categories_by_month_year
## # 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

Pedidos Concluídos por ano

Filtramos os pedidos com status “complete” e os agrupamos por ano, obtendo a contagem total de pedidos finalizados em cada período.

filter(clean_data, clean_data$status == 'complete') %>%
  group_by(Year) %>%
  count(status)
## # 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

Receita de pedidos concluídos por ano

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.

Categoria mais vendida para cada ano por receita total

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.
categories_by_year
## # 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.

COD 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")

Payaxis vs frequência de status do pedido

# 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")

Distribuição dos preços dos produtos

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()`).

Relação entre preço e quantidade vendida

ggplot(clean_data, aes(x = price, y = qty_ordered)) +
  geom_point(alpha = 0.5, color = "red") +
  labs(title = "Preço vs Quantidade Vendida", x = "Preço", y = "Quantidade")

Boxplot das vendas por categoria

ggplot(clean_data, aes(x = category_name, y = price)) +
  geom_boxplot(fill = "orange", alpha = 0.7) +
  coord_flip() +
  labs(title = "Distribuição de Preços por Categoria", x = "Categoria", y = "Preço")

Conclusão

Metodologia e Dados Utilizados

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.

Insights Interessantes

  • 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.

Implicações para Empresas e Varejistas

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.

Limitações da Análise

  • 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.

Melhorias Futuras

  • 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.