Trabalho de Estatistica em Data Science - INFNET

Estatística para Ciência de dados

Author

Alan C. Echer

Published

March 12, 2026

Github: https://github.com/echer/26E1-infnet-trabalho-pd-estatistica-em-data-science.git

RPUBS: https://rpubs.com/alanecher/infnet-data-science-em-ia-trabalho-estatistica-em-data-science

1 Mostre através de prints que você tem acesso a uma plataforma RStudio (instalado localmente ou nuvem).

Para realizar as análises deste trabalho foi utilizada a plataforma RStudio, que é um ambiente de desenvolvimento integrado (IDE) utilizado para programação na linguagem R.

Neste trabalho foi utilizado o RStudio instalado localmente.

2 Escolha uma base de dados para realizar esse projeto. Essa base de dados será utilizada durante toda sua análise. Essa base necessita ter 4 (ou mais) variáveis de interesse. Caso você tenha dificuldade para escolher uma base, o professor da disciplina irá designar para você.

A base de dados foi obtida através da planilha disponibilizada pela professora com o link para o kaggle (https://www.kaggle.com/datasets/rajagrawal7089/electronic-store-dataset) e contém dados gerados relacionados ao comportamento de consumidores em compras para uma loja de eletronicos, a base possui 5000 linhas e 15 colunas com uma mistura de dados numéricos e categóricos.

3 Explique qual o motivo para a escolha dessa base e explique os resultados esperados através da análise.

A base foi escolhida pois possui dados de vendas de uma loja de eletronicos, assim podemos analisar os dados e obter informações sobre seus compradores conhecendo melhor os pontos fortes e fracos de venda, podendo assim tomar decisões estratégicas para ajudar no desenvolvimento do negócio.

4 Carregue a base para o RStudio e comprove o carregamento tirando um print da tela com a base escolhida presente na área “Ambiente”/Enviroment. Detalhe como você realizou o carregamento dos dados.

A base foi carregada através do arquivo csv da pasta dados utilizando a função read.csv conforme a print abaixo:

# Carregar a base de dados
dados <- read.csv("dados/dataset.csv")

library(dplyr)
glimpse(dados)
Rows: 5,000
Columns: 15
$ Age                  <int> 56, 69, 46, 32, 60, 25, 38, 56, 36, 40, 28, 28, 4…
$ Items.Purchased      <int> 1, 10, 4, 9, 13, 14, 10, 6, 6, 1, 10, 2, 11, 6, 2…
$ Total.Spent          <dbl> 29.22620, 420.14261, 127.74282, 417.72268, 608.03…
$ Discount....         <dbl> 47.077380, 7.985739, 37.225718, 8.227732, 5.00000…
$ Satisfaction.Score   <dbl> 1.000000, 3.760294, 1.771240, 1.926831, 3.902927,…
$ Warranty.Extension   <int> 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0…
$ Gender               <chr> "Male", "Female", "Male", "Female", "Female", "Ma…
$ Region               <chr> "South", "South", "East", "East", "South", "North…
$ Product.Category     <chr> "Accessories", "Accessories", "Laptop", "Tablet",…
$ Payment.Method       <chr> "UPI", "Cash", "Credit Card", "UPI", "UPI", "Cred…
$ Revenue              <dbl> 149.25215, 1485.52422, 85.55013, 824.11872, 2463.…
$ Store.Rating         <dbl> 3.660461, 3.551553, 3.922839, 3.860422, 3.812820,…
$ Loyalty.Score        <dbl> 3.597133, 25.764903, 7.022399, 7.635412, 29.46111…
$ Membership.Status    <int> 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1…
$ Preferred.Visit.Time <chr> "Evening", "Evening", "Morning", "Afternoon", "Mo…
any(is.na(dados))
[1] FALSE

5 Instale e carregue os pacotes de R necessários para sua análise (mostre o código necessário):

Aqui realizei o carregamento dos pacotes R necessário para a análise.

library(ggplot2)
library(tidyverse)
library(summarytools)

6 Escolha outros pacotes necessários, aponte sua necessidade e instale e carregue (mostrando o código necessário).

library(gtsummary)
library(gt)
library(corrplot)

7 Aplique uma função em R que seja útil para sua análise e mostre.

dados |>
  tbl_summary()
Characteristic N = 5,0001
Age 43 (31, 56)
Items.Purchased 7 (4, 11)
Total.Spent 222 (119, 346)
Discount.... 28 (15, 38)
Satisfaction.Score 2.34 (1.00, 4.13)
Warranty.Extension 1,102 (22%)
Gender
    Female 2,372 (47%)
    Male 2,447 (49%)
    Other 181 (3.6%)
Region
    East 1,208 (24%)
    North 1,201 (24%)
    South 1,310 (26%)
    West 1,281 (26%)
Product.Category
    Accessories 1,015 (20%)
    Laptop 1,013 (20%)
    Mobile 984 (20%)
    Tablet 997 (20%)
    Television 991 (20%)
Payment.Method
    Cash 1,016 (20%)
    Credit Card 1,011 (20%)
    Debit Card 980 (20%)
    Net Banking 1,039 (21%)
    UPI 954 (19%)
Revenue 381 (165, 1,047)
Store.Rating 3.97 (3.80, 4.15)
Loyalty.Score 14 (8, 24)
Membership.Status 1,542 (31%)
Preferred.Visit.Time
    Afternoon 1,661 (33%)
    Evening 1,662 (33%)
    Morning 1,677 (34%)
1 Median (Q1, Q3); n (%)

Foram utilizados as seguintes funções:

  1. min() - Utilizado para encontrar o valor mínimo da coluna

    min(dados$Age, na.rm = TRUE)
    [1] 18
  2. quantile() - Utilizado para encontrar os quartis passando por parametro decimal

    quantile(dados$Age, 0.25, na.rm = TRUE)
    25% 
     31 
  3. IQR() - Utilizado para calcular o IQR valor que representa a diferença entre Q3 e Q1

    cat("IQR:",IQR(dados$Age, na.rm = TRUE),"\n")
    IQR: 25 
  4. mean() - Utilizado para encontrar a média da coluna

    cat("Média:",mean(dados$Age, na.rm = TRUE),"\n")
    Média: 43.5846 
  5. sd() - Utilizado para encontrar o desvio padrão da coluna

    cat("Desvio padrão:",sd(dados$Age, na.rm = TRUE),"\n")
    Desvio padrão: 14.91909 
  6. ggplot() - Utilizado para imprimir os dados em gráficos

  7. as.factor() - Utilizado para converter os dados numéricos em categóricos

    dados$Membership.Status <- as.factor(dados$Membership.Status)
    dados$Warranty.Extension <- as.factor(dados$Warranty.Extension)
  8. round() - Utilizado para arredondar os dados numéricos antes de converter para categóricos

    dados$Store.Rating <- as.factor(round(dados$Store.Rating))
    dados$Satisfaction.Score <- as.factor(round(dados$Satisfaction.Score))
  9. Além das funções das libs acima foi feito também a criação de duas funções para auxiliar na análise de cada coluna

    1. analyze_categorical: Utilizado para fazer a análise das colunas com valores categóricos, esta função imprime o gráfico de barras com a distribuição e frequencia dos valores da coluna analisada.
    2. plot_analysis: Utilizado para fazer a análise das colunas com valores numéricos, esta função imprime o gráfico de boxplot e o histograma.
analyze_categorical <- function(column, label){
  ggplot(data.frame(column), aes(x=column)) +
    geom_bar(fill="lightblue") +
    labs(
      title=paste("Distribuição de", label),
      x=label,
      y="Frequência"
    ) +
    theme_minimal()
}

plot_analysis <- function(column, columnLabel){

  Q0 <- min(column, na.rm = TRUE)
  Q1 <- as.numeric(quantile(column, 0.25, na.rm = TRUE))
  Q2 <- as.numeric(quantile(column, 0.50, na.rm = TRUE))
  Q3 <- as.numeric(quantile(column, 0.75, na.rm = TRUE))
  Q4 <- as.numeric(quantile(column, 1.00, na.rm = TRUE))

  IQR_val <- IQR(column, na.rm = TRUE)
  
  mean_val <- mean(column, na.rm = TRUE)
  sd_val <- sd(column, na.rm = TRUE)
  
  # binwidth automático (Freedman-Diaconis)
  n <- length(column)
  binwidth <- 2 * IQR_val / (n^(1/3))

  LI <- Q1 - 1.5 * IQR_val
  LS <- Q3 + 1.5 * IQR_val
  
  cat("Média:",mean_val,"\n")
  cat("Mediana:",Q2,"\n")
  cat("Desvio padrão:",sd_val,"\n")
  cat("Q1:",Q1,"\n")
  cat("Q3:",Q3,"\n")
  cat("IQR:",IQR_val,"\n")

  # Boxplot
  box <- ggplot(data.frame(column), aes(x = "", y = column)) +
    geom_boxplot(fill = "lightblue") +
    geom_hline(yintercept = LI, color = "red", linetype = "dashed") +
    geom_hline(yintercept = LS, color = "blue", linetype = "dashed") +
    geom_hline(yintercept = Q0, color = "orange", linetype = "dashed") +
    geom_hline(yintercept = Q4, color = "orange", linetype = "dashed") +

    annotate("text", x = 1.2, y = Q0, label = "(0%)") +
    annotate("text", x = 1.2, y = Q1, label = paste("Q1 =", Q1)) +
    annotate("text", x = 1.2, y = Q2, label = paste("Q2 =", Q2)) +
    annotate("text", x = 1.2, y = Q3, label = paste("Q3 =", Q3)) +
    annotate("text", x = 1.2, y = Q4, label = "(100%)") +

    annotate("text", x = 1.2, y = LI, label = paste("Limite Inf:", round(LI,2))) +
    annotate("text", x = 1.2, y = LS, label = paste("Limite Sup:", round(LS,2))) +

    labs(title = paste("Boxplot -", columnLabel),
         y = columnLabel,
         x = "")

  # Histograma
  hist <- ggplot(data.frame(column), aes(x = column)) +
    geom_histogram(binwidth = binwidth,
                   aes(y=..density..),
                   fill = "lightblue",
                   color = "black") +
    geom_density(color="darkblue", size=1) +
    geom_vline(xintercept=mean_val,
               color="red",
               linetype="dashed") +

    geom_vline(xintercept=Q2,
               color="green",
               linetype="dashed") +
    labs(title = paste("Histograma -", columnLabel),
         x = columnLabel,
         y = "Frequência")
  
  qqplot <- ggplot(dados, aes(sample = column)) +
    stat_qq() +
    stat_qq_line(color = "red") +
    labs(title = paste("QQPlot -", columnLabel))

  print(box)
  print(hist)
  print(qqplot)

}

8 Escolha uma variável de seu banco de dados e calcule:

dados |>
  summarise(
    min = min(Age, na.rm = TRUE),
    q1 = quantile(Age, probs = 0.25, na.rm = TRUE),
    mediana = median(Age, na.rm = TRUE),
    media = mean(Age, na.rm = TRUE),
    q3 = quantile(Age, 0.75, na.rm = TRUE),
    max = max(Age, na.rm = TRUE),
    desvio_padrao = sd(Age, na.rm = TRUE)
  ) |>
  gt()
min q1 mediana media q3 max desvio_padrao
18 31 43 43.5846 56 69 14.91909

Foi realizado também a analise de todas as metricas acima em todos as colunas numéricas da base de dados no item 11 do trabalho.

9 Utilizando o pacote summarytools (função descr), descreva estatisticamente a sua base de dados.

Aqui utilizei o summarytools para descrever os dados estatisticamente, coloquei as principais métricas e filtrei apenas as colunas numéricas

descr(dados[sapply(dados, is.numeric)], stats = c("mean","sd","min","q1","med","q3","max"))
Descriptive Statistics  
dados  
N: 5000  

                  Age   Discount....   Items.Purchased   Loyalty.Score   Revenue   Total.Spent
------------- ------- -------------- ----------------- --------------- --------- -------------
         Mean   43.58          26.62              7.54           15.64    718.00        243.72
      Std.Dev   14.92          13.59              4.01            9.14    776.79        154.95
          Min   18.00           5.00              1.00            0.00   -201.43         15.11
           Q1   31.00          15.38              4.00            7.94    164.66        119.12
       Median   43.00          27.85              7.00           13.97    380.55        221.51
           Q3   56.00          38.09             11.00           23.52   1047.48        346.21
          Max   69.00          48.49             14.00           39.24   3523.47        699.61

10 Escolha uma variável e crie um histograma. Justifique o número de bins usados. A distribuição dessa variável se aproxima de uma “normal”? Justifique.

A variável escolhida foi “Total Spent”, que representa o valor total gasto por cada cliente. Inicialmente foi gerado um histograma utilizando bins = 1, porém o gráfico ficou difícil de interpretar, pois os valores da variável variam até valores superiores a 600. Dessa forma, foi utilizado bins = 10, dividindo os dados em dez classes, o que permite visualizar melhor a distribuição dos valores e a concentração de observações em diferentes faixas de gasto.

Observando o histograma, nota-se que a distribuição não apresenta um formato aproximadamente simétrico, característico de uma distribuição normal. A distribuição apresenta assimetria à direita, com uma cauda mais longa para valores mais altos de gasto. Isso indica que a maior parte dos clientes apresenta valores de gasto menores ou intermediários, enquanto apenas uma pequena parcela apresenta valores de gasto elevados.

O histograma também foi aplicado para todas as colunas numéricas da base de dados no item 11.

column = dados$Total.Spent
columnLabel = "Total Gasto"
bins = 10
mean_val = mean(column, na.rm = TRUE)
Q2 = quantile(column, 0.50, na.rm = TRUE)
ggplot(data.frame(column), aes(x = column)) +
    geom_histogram(bins=bins,
                   aes(y=..density..),
                   fill = "lightblue",
                   color = "black") +
    geom_density(color="darkblue", size=1) +
    geom_vline(xintercept=mean_val,
               color="red",
               linetype="dashed") +

    geom_vline(xintercept=Q2,
               color="green",
               linetype="dashed") +
    labs(title = paste("Histograma -", columnLabel),
         x = columnLabel,
         y = "Frequência")

ggplot(dados, aes(sample = Total.Spent)) +
  stat_qq() +
  stat_qq_line(color = "red") +
  labs(title = "QQPlot - Total Spent")

11 Calcule a correlação entre todas as variáveis dessa base. Quais são as 3 pares de variáveis mais correlacionadas?

Primeiramente analisei todas as colunas numéricas com boxplot e histogramas, e as categoricas analisei utilizando o gráfico de barras para entender como estão divididos os dados.

Depois fiz a correção entre as colunas numéricas e selecionei as 3 mais correlacionadas.

11.1 Analisando a coluna Age

plot_analysis(dados$Age, "Idade")
Média: 43.5846 
Mediana: 43 
Desvio padrão: 14.91909 
Q1: 31 
Q3: 56 
IQR: 25 

11.2 Analisando a coluna Item Purchased

plot_analysis(dados$Items.Purchased, "Itens Comprados")
Média: 7.5366 
Mediana: 7 
Desvio padrão: 4.014858 
Q1: 4 
Q3: 11 
IQR: 7 

11.3 Analisando a coluna Total Spend

plot_analysis(dados$Total.Spent, "Total Gasto")
Média: 243.7218 
Mediana: 221.5142 
Desvio padrão: 154.949 
Q1: 119.1301 
Q3: 346.1734 
IQR: 227.0433 

11.4 Analisando a coluna Discount

plot_analysis(dados$Discount...., "Desconto")
Média: 26.62233 
Mediana: 27.84858 
Desvio padrão: 13.58672 
Q1: 15.38266 
Q3: 38.08699 
IQR: 22.70433 

11.5 Analisando a coluna Satisfaction Score

analyze_categorical(dados$Satisfaction.Score, "Indice de Satisfação")

11.6 Analisando a coluna Warranty Extension

analyze_categorical(dados$Warranty.Extension, "Garantia Estendida")

11.7 Analisando a coluna Revenue

plot_analysis(dados$Revenue, "Lucro")
Média: 717.9982 
Mediana: 380.5485 
Desvio padrão: 776.7891 
Q1: 164.6976 
Q3: 1047.426 
IQR: 882.7289 

11.8 Analisando a coluna Store Rating

analyze_categorical(dados$Store.Rating, "Avaliação da Loja")

11.9 Analisando a coluna Loyalty Score

plot_analysis(dados$Loyalty.Score, "Indice de Fidelidade")
Média: 15.63828 
Mediana: 13.96979 
Desvio padrão: 9.144742 
Q1: 7.94479 
Q3: 23.5216 
IQR: 15.57681 

11.10 Analisando a coluna Membership Status

analyze_categorical(dados$Membership.Status, "Status de Associado")

11.11 Analisando a coluna Gender

analyze_categorical(dados$Gender,"Gender")

11.12 Analisando a coluna Region

analyze_categorical(dados$Region,"Region")

11.13 Analisando a coluna Product Category

analyze_categorical(dados$Product.Category,"Product Category")

11.14 Analisando a coluna Payment Method

analyze_categorical(dados$Payment.Method,"Payment Method")

11.15 Analisando a coluna Preferred Visit Time

analyze_categorical(dados$Preferred.Visit.Time,"Preferred Visit Time")

11.16 Analisando correlações

corr_matrix <- cor(dados[sapply(dados, is.numeric)], use = "complete.obs")

corrplot(corr_matrix, 
  method = "color",
  type = "upper",
  tl.srt = 45,
  addCoef.col = "gray",
  tl.col = "black"
)

Foram selecionadas algumas correlações entre variáveis da base de dados relacionadas ao valor total gasto (Total Spent), pois elas apresentam forte relação com essa variável.

Discount - Total.Spent (-0.98): A primeira correlação observada foi entre o desconto e o total gasto. Trata-se de uma correlação negativa muito forte, indicando que, à medida que o total gasto aumenta, o desconto tende a diminuir. De forma inversa, quando o total gasto diminui, o desconto tende a aumentar.

Revenue - Total.Spent (0.88): A segunda correlação observada foi entre a receita e o total gasto. Trata-se de uma correlação positiva forte, indicando que, à medida que o total gasto aumenta, a receita também tende a aumentar. Da mesma forma, quando o total gasto diminui, a receita tende a diminuir.

Items Purchased - Total.Spent (0.84): A terceira correlação observada foi entre o número de itens comprados e o total gasto. Trata-se de uma correlação positiva forte, indicando que clientes que compram mais itens tendem a apresentar maior valor total gasto. Da mesma forma, quando o número de itens comprados diminui, o total gasto também tende a diminuir.

12 Crie um scatterplot entre duas variáveis das resposta anterior. Qual a relação da imagem com a correlação entre as variáveis.

Podemos ver visualmente no scatterplot a relação entre as duas variáveis numéricas Items.Purchased e Total.Spent, temos uma correlação forte positiva formando um padrão ascendente ou seja quando uma variavel aumenta a outra também aumenta.

ggplot(dados, aes(x = Items.Purchased, y = Total.Spent)) +
  geom_point() +
  geom_smooth(method = "lm", color = "red") +
  labs(
    title = "Scatterplot entre Items Purchased e Total Spent",
    x = "Items Purchased",
    y = "Total Spent"
  )

13 Crie um gráfico linha de duas das variáveis. Acrescente uma legenda e rótulos nos eixos.

ggplot(dados, aes(x=Items.Purchased, y=Total.Spent)) +
  geom_line( color="#69b3a2", size=2, alpha=0.9, linetype=2) +
  ggtitle("Evolução de Itens Comprados x Total Gasto")

Aqui podemos ver como de alguma forma pelo gráfico de linha há uma relação também crescente de Total Spent com Items Purchased, mesmo havendo alguns pontos de variação, no contexto mais amplo podemos perceber a crescente positiva.