Introdução á base de dados

O Online Retail Dataset é um conjunto de dados amplamente utilizado para análises em ciência de dados e Machine Learning. O mesmo contém informações detalhadas sobre transações realizadas por uma loja online do Reino Unido entre dezembro de 2010 e dezembro de 2011.

Este dataset é particularmente útil para análises de comportamento do cliente e otimização de estratégias de vendas. Ele oferece uma base rica para aplicação de técnicas de análise multivariada, como agrupamento de clientes (clustering), análise de associação e regressão.

Objetivo do Projeto

O objetivo deste projeto é explorar e analisar os padrões de compra registados no Online Retail Dataset. Pretendo aplicar técnicas de análise multivariada para:
1. Identificar grupos de clientes com base em comportamentos de compra.
2. Explorar a relação entre diferentes variáveis, como quantidade comprada, preço e frequência de compras. 3. Descobrir associações entre produtos para recomendar artigos frequentemente adquiridos em conjunto.

Para isso utlizamos tecnicas de Analise Multivaridada como:

  • Analise discriminante
  • Analise de componentes principais (ACP)
  • Analise de Clusters

Descrição do Dataset

O dataset contém as seguintes variáveis:
- InvoiceNo: Número da fatura (identificador único para cada transação).
- StockCode: Código único do produto.
- Description: Nome ou descrição do produto.
- Quantity: Quantidade do produto comprada na transação.
- InvoiceDate: Data

Análise Exploratória

Para iniciar, realizei uma análise exploratória do Online Retail Dataset para entender melhor as suas características e identificar possíveis padrões iniciais nos dados.

# Configuração inicial
library(tidyverse) # Para manipulação de dados e visualizações
library(lubridate) # Para trabalhar com datas

# Carregamento dos dados
url <- "https://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx"
temp <- tempfile(fileext = ".xlsx")
download.file(url, temp, mode = "wb")

# Leitura dos dados
library(readxl)
online_retail <- read_excel(temp)

# Visão geral dos dados
glimpse(online_retail)
## Rows: 541,909
## Columns: 8
## $ InvoiceNo   <chr> "536365", "536365", "536365", "536365", "536365", "536365"…
## $ StockCode   <chr> "85123A", "71053", "84406B", "84029G", "84029E", "22752", …
## $ Description <chr> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL LANTERN…
## $ Quantity    <dbl> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2, 3, 3, …
## $ InvoiceDate <dttm> 2010-12-01 08:26:00, 2010-12-01 08:26:00, 2010-12-01 08:2…
## $ UnitPrice   <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1.85, 1.69…
## $ CustomerID  <dbl> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17…
## $ Country     <chr> "United Kingdom", "United Kingdom", "United Kingdom", "Uni…
# Resumo estatístico básico das variáveis numéricas
summary(online_retail)
##   InvoiceNo          StockCode         Description           Quantity        
##  Length:541909      Length:541909      Length:541909      Min.   :-80995.00  
##  Class :character   Class :character   Class :character   1st Qu.:     1.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :     3.00  
##                                                           Mean   :     9.55  
##                                                           3rd Qu.:    10.00  
##                                                           Max.   : 80995.00  
##                                                                              
##   InvoiceDate                       UnitPrice           CustomerID    
##  Min.   :2010-12-01 08:26:00.00   Min.   :-11062.06   Min.   :12346   
##  1st Qu.:2011-03-28 11:34:00.00   1st Qu.:     1.25   1st Qu.:13953   
##  Median :2011-07-19 17:17:00.00   Median :     2.08   Median :15152   
##  Mean   :2011-07-04 13:34:57.16   Mean   :     4.61   Mean   :15288   
##  3rd Qu.:2011-10-19 11:27:00.00   3rd Qu.:     4.13   3rd Qu.:16791   
##  Max.   :2011-12-09 12:50:00.00   Max.   : 38970.00   Max.   :18287   
##                                                       NA's   :135080  
##    Country         
##  Length:541909     
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 
# Verificar a presença de valores ausentes
colSums(is.na(online_retail))
##   InvoiceNo   StockCode Description    Quantity InvoiceDate   UnitPrice 
##           0           0        1454           0           0           0 
##  CustomerID     Country 
##      135080           0
# Histograma para visualizar a distribuição das quantidades compradas
online_retail %>%
  filter(Quantity > 0) %>% # Remover valores negativos
  ggplot(aes(x = Quantity)) +
  geom_histogram(bins = 50, fill = "blue", alpha = 0.7) +
  scale_x_log10() + # Escala logarítmica para melhor visualização
  labs(title = "Distribuição das Quantidades Compradas",
       x = "Quantidade (escala logarítmica)",
       y = "Frequência")

Análise Discriminante em R

Pré-processamento

# Filtrar e preparar dados para a análise discriminante
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
filtered_data <- na.omit(online_retail[online_retail$Quantity > 0, ])
# Exemplo
filtered_data$class <- ifelse(filtered_data$Country == "United Kingdom", "UK", "Other")

Os dados foram filtrados para incluir apenas transações com quantidade positiva e foram categorizados em “UK” e “Other” com base no país de origem.

Modelo de Análise Discriminante

lda_model <- lda(class ~ Quantity + UnitPrice, data = filtered_data)
lda_model
## Call:
## lda(class ~ Quantity + UnitPrice, data = filtered_data)
## 
## Prior probabilities of groups:
##     Other        UK 
## 0.1095159 0.8904841 
## 
## Group means:
##       Quantity UnitPrice
## Other 20.93265  4.355204
## UK    12.04891  2.963793
## 
## Coefficients of linear discriminants:
##                    LD1
## Quantity  -0.003427645
## UnitPrice -0.035709854

O modelo de análise discriminante linear foi ajustado utilizando as variáveis “Quantity” e “UnitPrice” como preditores. Os resultados mostram os coeficientes discriminantes e as proporções de variância explicada.

Intrepertação de resultados:

Probabilidade a priori dos grupos:

  • O grupo “UK” é muito mais prevalente, representando aproximadamente 89% dos dados.
  • O grupo “Other” compõe cerca de 11% dos dados.

Médias dos grupos:

  • As médias indicam que transações no grupo “Other” (fora do Reino Unido) têm maior quantidade média (Quantity) e preço unitário (UnitPrice) em comparação às transações no grupo “UK”.

Coeficientes das variaveis discriminantes:

  • “Quantity” e “UnitPrice” têm coeficientes negativos. Isso significa que valores maiores dessas variáveis tendem a associar-se mais ao grupo “Other”.

  • O coeficiente de UnitPrice (-0.0357) tem magnitude maior que o de Quantity (-0.0034), indicando que o preço unitário tem uma influência maior na separação entre os grupos.

Conclusão:

  • O modelo sugere que, em média, transações fora do Reino Unido envolvem maiores quantidades e preços unitários mais altos.

  • A separação dos grupos baseada nas variáveis “Quantity” e “UnitPrice” é dominada por “UnitPrice”, devido ao seu maior coeficiente.

Resultados

plot(lda_model)

O gráfico gerado apresenta a separação entre as classes “UK” e “Other” nas dimensões discriminantes. A análise indica a eficácia do modelo em distinguir as categorias. Ambas as classes apresentam distribuições concentradas em torno de valores próximos de zero, indicando que os grupos possuem diferenças pequenas nas dimensões discriminantes.

Distancia entre Grupos:

  • Observa-se que os dois grupos (UK e Other) têm distribuições que se sobrepõem ligeiramente.

  • Isso indica que, embora existam algumas diferenças entre os grupos, a separação não é perfeitamente clara.

Concentração no grupo “UK”:

  • O grupo “UK” tem maior frequência de valores discriminantes em torno de zero, o que reflete sua predominância nos dados (conforme as probabilidades a priori).

Intrepretação das Variaveis Disciminantes:

  • Os coeficientes do modelo (Quantity e UnitPrice) indicam que transações com maior preço unitário e quantidade são mais associadas ao grupo “Other”.

  • No entanto, devido à magnitude dos coeficientes ser pequena, a separação dos grupos pode ser limitada, como visualizado no gráfico.

Conclusão:

  • A análise discriminante é capaz de identificar diferenças entre “UK” e “Other”, mas a sobreposição no gráfico sugere que essas diferenças são sutis.

Análise de Componentes Principais

Pré-processamento

library(FactoMineR)
pca_data <- filtered_data[, c("Quantity", "UnitPrice")]
pca_data <- scale(pca_data)

Nesta secção os dados foram normalizados para garantir que as variáveis tenham a mesma escala antes da aplicação do ACP.

Aplicação do ACP

pca_result <- PCA(pca_data, graph = TRUE)

pca_result$eig
##        eigenvalue percentage of variance cumulative percentage of variance
## comp 1   1.004561               50.22805                          50.22805
## comp 2   0.995439               49.77195                         100.00000

A análise de componentes principais foi realizada, e os valores próprios indicam a proporção de variância explicada por cada componente principal. Os dois primeiros componentes capturam a maior parte da variância nos dados.

Grafico PCA dos Individuos (Primeiro Grafico)

  • Eixo X (Dim 1):

    • Representa a primeira componente principal (Dimensão 1), que explica 50,23% da variância total nos dados.

    • A dimensão captura a maior parte da variabilidade nos dados, sendo influenciada principalmente pelos valores em “UnitPrice” e “Quantity”.

  • Eixo Y (Dim 2):

    • Representa a segunda componente principal (Dimensão 2), explicando 49,77% da variância total.

    • Essa dimensão é ortogonal (independente) à primeira e captura a variabilidade restante.

  • Individuos (Pontos):

    • Cada ponto corresponde a uma observação nos dados (uma transação ou cliente).

    • Algumas observações, como 118353, 37127, e 397452, estão distantes do agrupamento principal. Isso indica que elas são outliers ou têm padrões muito diferentes da maioria (ex.: compras muito altas ou valores unitários atípicos).

Grafico PCA das Variaveis (Segundo grafico):

  • Calculo de Correlação

    • Mostra como as variáveis originais (Quantity e UnitPrice) contribuem para os componentes principais.

    • As setas representam as variáveis e sua direção indica sua contribuição para as dimensões.

  • Interpretação das setas:

    • A seta do UnitPrice está fortemente alinhada com Dim 1 e ligeiramente negativa em Dim 2. Isso sugere que o preço unitário contribui mais para a variabilidade capturada pela primeira dimensão.

    • A seta do Quantity aponta para uma direção oposta. Indica que a quantidade contribui para a variância de forma inversa ao preço unitário.

  • Correlação entre variveis:

    • Como as setas formam um ângulo próximo de 90 graus, “UnitPrice” e “Quantity” são quase ortogonais (independentes) no espaço das componentes principais. Isso reflete baixa correlação linear entre essas variáveis.
  • Tabela de Eigenvalues:

    • Componente 1 (Dim 1):

      Eigenvalue: 1,004561 Explica 50,23% da variância total.

    • Componente 2 (Dim 2):

      Eigenvalue: 0,995439 Explica 49,77% da variância total.

    • Cumulativo: Juntas, as duas dimensões explicam 100% da variância. Isto é esperado, pois apenas duas variáveis foram usadas no PCA.

Conclusão:

  • Outliers: Existem transações muito diferentes da maioria, como 118353 e 397452.

  • Componentes Principais:

    • Dim 1 é mais influenciada pelo UnitPrice.
    • Dim 2 é mais influenciada pelo Quantity.
  • Variáveis: Quantidade e preço unitário têm baixa correlação linear, o que explica o ângulo de 90 graus entre suas setas.

Análise de Clusters

Pré-processamento

library(cluster)
cluster_data <- filtered_data[, c("Quantity", "UnitPrice")]
cluster_data <- scale(cluster_data)

Os dados foram escalados para garantir que nenhuma variável domine o processo de agrupamento devido a diferenças de escala. Todas as variáveis (Quantity e UnitPrice) foram normalizadas (média = 0, desvio padrão = 1). Isso garante que ambas contribuam igualmente para a formação dos clusters, já que têm escalas muito diferentes.

Aplicação do Algoritmo K-Means

set.seed(123)
kmeans_result <- kmeans(cluster_data, centers = 3)
kmeans_result$centers
##       Quantity    UnitPrice
## 1  0.005624405  -0.04574731
## 2 -0.055745408   0.39843398
## 3 -0.066632354 125.80078139

Nesta secção, definimos 3 clusters e os centros (médias dos atributos para cada cluster) foram calculados.

  • Centros:

    • Cluster 1: Quantity: 0.0056 (próximo de zero) UnitPrice: -0.0457 (próximo de zero) Este cluster representa transações médias em termos de quantidade e preço unitário.

    • Cluster 2: Quantity: -0.0557 (ligeiramente abaixo da média) UnitPrice: 0.3984 (moderadamente acima da média) Este cluster representa transações de quantidade um pouco menor, mas com preços unitários mais altos.

    • Cluster 3: Quantity: -0.0666 (abaixo da média) UnitPrice: 125.8007 (extremamente acima da média) Este cluster claramente reflete outliers ou transações com preços unitários muito altos, enquanto a quantidade é menor.

  • Interpretação dos Clusters:

    • Cluster 1 (Transações “médias”): Representa o grupo mais comum, com características que não se destacam em quantidade nem preço.

    • Cluster 2 (Transações de itens premium): Indica clientes que compram itens mais caros em menor quantidade, refletindo um padrão de produtos premium ou itens de luxo.

    • Cluster 3 (Outliers ou transações atípicas): Representa transações raras com preços unitários extremamente altos. Esse comportamento pode estar relacionado a produtos exclusivos ou erros de entrada de dados.

Resultados

clusplot(cluster_data, kmeans_result$cluster, color = TRUE, shade = TRUE, labels = 2, lines = 0)

1. Componentes principais:

  • O gráfico mostra as duas primeiras componentes principais (Component 1 e Component 2), que representam a maior parte da variação nos dados após a redução dimensional.

  • A mensagem na parte inferior confirma que estas duas componentes explicam 100% da variabilidade dos pontos, o que é positivo para uma boa representação gráfica.

2. Clusters:

  • Cada grupo de pontos representa um cluster gerado pelo K-Means.

  • No caso do gráfico:

    • O cluster 1 parece ser formado pelos pontos mais concentrados no lado inferior direito.

    • O cluster 2 está mais disperso e parece incluir pontos na região superior central.

    • O cluster 3 contém pontos isolados (outliers), como os que aparecem no lado superior esquerdo.

3. Interpretação dos clusters:

- Os clusters representam grupos de comportamentos semelhantes, com base em "Quantity" (quantidade) e "UnitPrice" (preço unitário):

    - Cluster 1 (mais concentrado): Clientes que compraram produtos com quantidades e preços médios (ou em torno do centro do cluster).
    
    - Cluster 2 (disperso): Pode representar uma gama de clientes variados em termos de preço e quantidade.
    
    - Cluster 3 (outliers): Clientes que fizeram compras muito fora do padrão em termos de preço ou quantidade.
    

4. Densidade e distâncias:

- A densidade de pontos dentro de cada cluster sugere a proximidade entre os dados. No gráfico, o cluster 1 parece mais coeso, enquanto o cluster 2 é mais disperso

- As linhas que conectam os centros indicam a separação entre os clusters, onde maior distância entre os centros significa maior distinção entre os clusters.

Conclusão Geral

Este projeto demonstrou a aplicação prática de três técnicas de análise multivariada, que permitiram explorar características e padrões significativos na base de dados. Cada técnica contribuiu de forma única para a interpretação dos dados. A análise discriminante destacou diferenças entre grupos de clientes, o ACP revelou as dimensões principais da variação nos dados, e a análise de clusters identificou grupos distintos de comportamento transacional.