Soluções - Avaliação 1

Introdução à Ciência de Dados 2025
Bacharelado em Administração

Autor

Prof. Dr. Washington S. da Silva

Data de Publicação

14 de maio de 2025

Questão 1 (7 pontos)

Tópico: Metodologia CRISP-DM: Fase 1 e Tipos de Análises

Considerando que Lindsey, da equipe de marketing da Junglivet, precisa entender melhor o comportamento de compra dos clientes na loja online, responda:

a) Com base na necessidade apresentada por Lindsey e no dicionário de dados do arquivo onlineshop.csv, formule um objetivo de negócio específico, mensurável e relevante que poderia ser respondido com esses dados.

Boas Respostas

Boas respostas poderiam incluir objetivos como:

  • Determinar o perfil demográfico dos clientes com maior valor de compra
  • Identificar quais fatores influenciam a conversão de anúncios em vendas
  • Analisar a relação entre métodos de pagamento e devoluções
  • Avaliar a eficácia dos anúncios em vídeo comparados a outros formatos

b) Com base na necessidade apresentada por Lindsey de “entender melhor os padrões de compra para otimizar campanhas de marketing e melhorar a experiência do cliente”, qual tipo de análise você recomendaria como primeiro passo: descritiva, diagnóstica, preditiva ou prescritiva? Justifique sua escolha considerando os dados disponíveis no arquivo onlineshop.csv e o estágio atual do projeto.

Resposta de Referência

Uma análise descritiva seria mais apropriada como etapa inicial, pois Lindsey precisa primeiro identificar padrões fundamentais no comportamento de compra antes de explorar causas ou fazer previsões.

Esta abordagem permitirá mapear perfis demográficos dos clientes, padrões de compra, eficácia dos anúncios em vídeo e comportamentos de devolução, criando uma base sólida para análises mais sofisticadas posteriormente. Os dados do arquivo onlineshop.csv contêm as variáveis necessárias para esta caracterização inicial dos clientes.

Questão 2 (8 pontos)

Tópico: Importação e Exploração Inicial dos Dados

a) Escreva o código R para importar o arquivo onlineshop.csv utilizando o pacote here para definir o caminho relativo e o pacote readr para a importação. Armazene o resultado da importação em um objeto chamado dados_lojaonline.

Solução
# Importa o arquivo de dados

## 1.1 Define o caminho relativo do arquivo em seu projeto RStudio
caminho <- here::here("dados/brutos/onlineshop.csv")

## 1.2 Importa o arquivo com a funçào read_csv
dados_lojaonline <- readr::read_csv(caminho)

b) Use a função apropriada do pacote dplyr que exibe a dimensão e a estrutura (tipos das variáveis) do objeto dados_lojaonline que recebeu os dados importados.

Solução
dplyr::glimpse(dados_lojaonline)
Rows: 463
Columns: 12
$ DATE           <date> 2023-10-02, 2023-10-02, 2023-10-02, 2023-10-02, 2023-1…
$ USER_ID        <chr> "cardiB", "natalie_hershlag", "babe_ruth", "homlesspist…
$ AGE            <dbl> 27, 42, 48, 60, 93, 36, 56, 35, 24, 36, 37, 27, 56, 28,…
$ GENDER         <chr> "female", "female", "male", "male", "male", "male", "ma…
$ TYPE           <dbl> NA, NA, 1, 1, 1, 1, NA, 1, 1, 1, 1, NA, NA, 1, 1, 1, 1,…
$ CREDIT_SCORE   <dbl> 3, 4, 2, 5, 5, 4, 5, 5, 5, 4, 4, 4, 3, 4, 5, 4, 1, 3, 4…
$ LIFETIME       <dbl> 8, 10, 12, 9, 12, 5, 12, 11, 5, 5, 11, 2, 8, 4, 8, 5, 0…
$ PAYMENT_METHOD <chr> "bank transfer", "BNPL", "BNPL", "paypal", "credit card…
$ TURNOVER       <dbl> 44, 34, 34, 500, 43, 47, 286, 48, 625, 40, 42, 31, 32, …
$ SENDBACK       <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,…
$ VIDEO_AD       <lgl> FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRU…
$ CONVERTED      <dbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0…

c) Com base na saída do item b acima, responda:

c.1) Quantas observações estão contidas no objeto dados_lojaonline?

Solução
  • 463 observações (ou linhas) estão contidas no objeto dados_lojaonline.

c.2) Explique especificamente o que cada linha (observação) na data frame dados_lojaonline representa. Para sua resposta ser completa, identifique tanto a entidade principal quanto qualquer dimensão temporal que caracterize cada observação.

Solução de Referência
  • Cada linha (observação) na data frame dados_lojaonline representa uma visita ou transação individual de um cliente na loja online da Junglivet Whisky Company.

  • Especificamente, cada linha/observação registra uma interação única de um cliente com a plataforma em uma data específica, incluindo informações sobre a compra realizada (valor, método de pagamento), características do cliente (idade, gênero, classificação) e seu comportamento (resposta ao anúncio, eventual devolução).

  • Uma mesma pessoa (USER_ID) pode aparecer em múltiplas linhas se realizou múltiplas visitas ou transações em diferentes datas.

Questão 3 (8 pontos)

Tópico: Limpeza e Preparação dos Dados

a) Complete o código a seguir para criar um pipeline que irá limpar e preparar os dados para análises posteriores e exibir a nova data frame limpa.

A data frame limpa será chamada dados_lojaonline_limpos e irá conter nomes mais simples em português para as variáveis e converter as variáveis renomeadas para tipos/classes adequados para análise:

Solução
dados_lojaonline_limpos <- dados_lojaonline %>% 
    # Renomeia as colunas para nomes mais simples em português
   rename(
      data = DATE,
      id_cliente = USER_ID,
      idade = AGE,
      sexo = GENDER,
      tipo = TYPE,
      score_de_credito = CREDIT_SCORE,
      tempo_da_conta = LIFETIME,
      metodo_pagamento = PAYMENT_METHOD,
      faturamento = TURNOVER,
      devolucao = SENDBACK,
      tipo_de_anuncio = VIDEO_AD,
      convertido = CONVERTED
   ) %>% 
    # Converte cada variável para o tipo/classe adequado
   mutate(
      data = as.Date(data),
      id_cliente = as.factor(id_cliente),
      idade = as.integer(idade),
      sexo = as.factor(sexo),
      tipo = as.factor(tipo),
      score_de_credito = factor(score_de_credito, ordered = TRUE),
      tempo_da_conta = as.integer(tempo_da_conta),
      metodo_pagamento = as.factor(metodo_pagamento),
      faturamento = as.numeric(faturamento),
      devolucao = as.logical(devolucao),
      tipo_de_anuncio = as.logical(tipo_de_anuncio),
      convertido = as.logical(convertido)
   )

# exibe a estrutura da data frame limpa
dplyr::glimpse(dados_lojaonline_limpos)
Rows: 463
Columns: 12
$ data             <date> 2023-10-02, 2023-10-02, 2023-10-02, 2023-10-02, 2023…
$ id_cliente       <fct> cardiB, natalie_hershlag, babe_ruth, homlesspistachio…
$ idade            <int> 27, 42, 48, 60, 93, 36, 56, 35, 24, 36, 37, 27, 56, 2…
$ sexo             <fct> female, female, male, male, male, male, male, male, f…
$ tipo             <fct> NA, NA, 1, 1, 1, 1, NA, 1, 1, 1, 1, NA, NA, 1, 1, 1, …
$ score_de_credito <ord> 3, 4, 2, 5, 5, 4, 5, 5, 5, 4, 4, 4, 3, 4, 5, 4, 1, 3,…
$ tempo_da_conta   <int> 8, 10, 12, 9, 12, 5, 12, 11, 5, 5, 11, 2, 8, 4, 8, 5,…
$ metodo_pagamento <fct> bank transfer, BNPL, BNPL, paypal, credit card, bank …
$ faturamento      <dbl> 44, 34, 34, 500, 43, 47, 286, 48, 625, 40, 42, 31, 32…
$ devolucao        <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
$ tipo_de_anuncio  <lgl> FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, T…
$ convertido       <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE…

b) Aplique a função interna summary ao objeto dados_lojaonline_limpos:

Solução
summary(dados_lojaonline_limpos)
      data                    id_cliente      idade          sexo    
 Min.   :2023-10-02   ron_swanson76: 15   Min.   :21.0   female:155  
 1st Qu.:2023-10-20   cardiB       : 12   1st Qu.:30.0   male  :308  
 Median :2023-11-16   laura_smith  : 12   Median :38.0               
 Mean   :2023-11-15   eilleen_brown: 11   Mean   :42.9               
 3rd Qu.:2023-12-11   jennifer_linn: 11   3rd Qu.:53.0               
 Max.   :2023-12-30   marc_sinclair: 11   Max.   :93.0               
                      (Other)      :391                              
   tipo     score_de_credito tempo_da_conta       metodo_pagamento
 1   :313   1: 22            Min.   : 0.00   bank transfer:109    
 2   : 34   2: 51            1st Qu.: 8.00   BNPL         :174    
 NA's:116   3: 72            Median :10.00   credit card  : 78    
            4:187            Mean   : 8.82   paypal       :102    
            5:131            3rd Qu.:12.00                        
                             Max.   :12.00                        
                                                                  
  faturamento  devolucao       tipo_de_anuncio convertido     
 Min.   : 31   Mode :logical   Mode :logical   Mode :logical  
 1st Qu.: 39   FALSE:429       FALSE:222       FALSE:382      
 Median : 48   TRUE :34        TRUE :241       TRUE :81       
 Mean   :182                                                  
 3rd Qu.:346                                                  
 Max.   :718                                                  
                                                              

Analisando a saída, responda:

b.1) ron_swanson76 é o identificador do cliente, o qual efetuou 15 transações.

b.2) 116 clientes não foram classificados por tipo.

b.3)

  • Faturamento médio: 182 euros

  • Faturamento máximo: 718 euros

  • Faturamento mínimo: 31 euros

Questão 4 (10 pontos)

Tópico: Manipulação e Análises de Dados

a) Lindsey, da equipe de marketing, precisa entender como os diferentes métodos de pagamento afetam o faturamento na loja online. Crie um pipeline de análise cujo resultado seja uma data frame que mostre o faturamento médio por método de pagamento, ordenado do maior valor médio para o menor. Utilize as funções do pacote dplyr para agrupar por meio de pagamento, calcular o faturamento médio e apresentar o resultado ordenado do maior para o menor faturamento médio por meio de pagamento.

Solução
faturamento_medio_pagamento <- dados_lojaonline_limpos %>% 
   group_by(metodo_pagamento) %>% 
   summarize(faturamento_medio = mean(faturamento)) %>% 
   arrange(desc(faturamento_medio))

# exibe o resultado
faturamento_medio_pagamento
# A tibble: 4 × 2
  metodo_pagamento faturamento_medio
  <fct>                        <dbl>
1 BNPL                          232.
2 paypal                        177.
3 bank transfer                 148.
4 credit card                   125.

b) Lindsey, da equipe de marketing, está interessada no comportamento de compra de clientes específicos. Crie uma data frame chamada clientes_especificos que contenha o faturamento médio (faturamento_medio) para os seguintes clientes: ron_swanson76, horst_lüning e dorothy_parker. Utilize as funções do pacote dplyr para filtrar apenas estes três clientes, agrupar por cliente e calcular o faturamento médio para cada um. Apresente o resultado ordenado do maior para o menor valor médio.

Solução
clientes_especificos <- dados_lojaonline_limpos %>% 
   filter(id_cliente == "ron_swanson76" | id_cliente == "horst_lüning" | id_cliente == "dorothy_parker") %>% 
   group_by(id_cliente) %>% 
   summarize(faturamento_medio_clientes = mean(faturamento)) %>% 
   arrange(desc(faturamento_medio_clientes))

# exibe o resultado
clientes_especificos
# A tibble: 3 × 2
  id_cliente     faturamento_medio_clientes
  <fct>                               <dbl>
1 ron_swanson76                        433.
2 dorothy_parker                       248.
3 horst_lüning                         167.

c) Lindsey quer comparar a eficácia dos anúncios em vídeo versus outros tipos de anúncios na loja online. Crie um pipeline de análise que resulte em uma data frame agrupada pela variável tipo_de_anuncio (TRUE para vídeo, FALSE para outros tipos) e mostre:

  • O número total de clientes em cada grupo usando a função n()

  • A porcentagem de conversão para cada tipo (calculada como a média da variável convertido)

  • O faturamento médio por tipo de anúncio (média da variável faturamento)

Complete o código abaixo utilizando as funções do pacote dplyr para obter esta análise:

Solução
dados_conversao <- dados_lojaonline_limpos %>% 
   group_by(tipo_de_anuncio) %>% 
   summarize(
      total_de_clientes = n(),
      porcentagem_de_conversao = mean(convertido),
      faturamento_medio_por_anuncio = mean(faturamento)
   )

# exibe o resultado formatado como tabela
dados_conversao
# A tibble: 2 × 4
  tipo_de_anuncio total_de_clientes porcentagem_de_conversao
  <lgl>                       <int>                    <dbl>
1 FALSE                         222                    0.104
2 TRUE                          241                    0.241
# ℹ 1 more variable: faturamento_medio_por_anuncio <dbl>

d) Lindsey, da equipe de marketing, quer entender melhor como os diferentes tipos de cliente se comportam em relação às devoluções e seus padrões de compra. Escreva um código completo usando as funções do pacote dplyr para criar uma data frame chamada analise_tipo_cliente que mostre, para cada tipo de cliente (1, 2 e NA):

  • O número total de transações
  • A porcentagem de transações com devoluções (campo devolucao)
  • O faturamento médio geral
  • O faturamento médio apenas das transações sem devoluções
Solução
analise_tipo_cliente <- dados_lojaonline_limpos %>%
  # Agrupa os dados pelo tipo de cliente
  group_by(tipo) %>%
  # Calcula as estatísticas solicitadas para cada grupo
  summarize(
    total_transacoes = n(),
    porcentagem_devolucao = mean(devolucao) * 100,
    faturamento_medio = mean(faturamento),
    faturamento_sem_devolucao = mean(faturamento[devolucao == FALSE])
  )

# exibe o resultado 
analise_tipo_cliente
# A tibble: 3 × 5
  tipo  total_transacoes porcentagem_devolucao faturamento_medio
  <fct>            <int>                 <dbl>             <dbl>
1 1                  313                  6.07              166.
2 2                   34                 14.7               242.
3 <NA>               116                  8.62              207.
# ℹ 1 more variable: faturamento_sem_devolucao <dbl>