lab2
Métodos de agrupamento¶
De forma geral as estratégias de agrupamento são:¶
- Partição: exemplo KMeans
- Densidade: exemplo DBSCAN
- Hierarquicas: exemplo AGNES
Utilizamos a ferramenta orange-canvas
para obter uma intuição sobre esses algoritimos além de compreender suas principais diferença.
Desafio 1 (Sugestão)¶
Faça a instalação do orange-canvas
em sua maquina e realize os exemplos dados em sala de aula.
Para usuarios linux o site oficial https://orangedatamining.com/ recomenda o uso de virutal env, eu uso direto sem virtual env:
Instalação:
sudo apt install python3-pyqt5.*
pip install --upgrade --user pyqtwebengine==5.12
pip install --upgrade --user pyqt5==5.12
pip3 install orange3 --user
pip install orange3-educational
Execute:
python3 -m Orange.canvas
ou
orange-canvas
Agrupamento por estratégia Hierarquica¶
Introdução ao Problema: Segmentação de Clientes¶
Você é um analista de dados contratado por um grande shopping center. O shopping quer melhorar suas campanhas de marketing e otimizar o atendimento aos clientes. Atualmente, eles possuem uma vasta quantidade de dados sobre seus clientes, mas enfrentam um desafio: Como identificar grupos de clientes que compartilham características semelhantes para criar estratégias de marketing mais eficazes?
Descrição do Problema¶
Você recebeu um dataset contendo informações sobre os clientes do shopping. Este dataset inclui variáveis como a idade dos clientes, sua renda anual, e uma pontuação de gastos, que representa o quanto esses clientes tendem a gastar. Com base nesses dados, sua tarefa é identificar grupos distintos de clientes que possam ser tratados de forma diferente pelo shopping.
Por exemplo, pode haver um grupo de clientes jovens com alta renda que gasta muito, ou outro grupo de clientes mais velhos com uma renda menor, mas que são clientes fiéis e regulares. Entender essas segmentações pode ajudar o shopping a personalizar ofertas, melhorar a satisfação do cliente e, consequentemente, aumentar as vendas.
Reflexão Inicial¶
Antes de mergulharmos nas técnicas de clustering, pense nas seguintes questões:
Quais características dos clientes são mais importantes para identificar padrões de comportamento?
Como você definiria um "grupo" de clientes em termos de características como idade, renda e pontuação de gastos?
O que você esperaria encontrar após agrupar os clientes? Quais tipos de grupos ou segmentos você acha que poderiam surgir?
Como você pode preparar os dados para que sejam adequados para análise de clustering?
Qual técnica de clustering você escolheria para este problema e por quê?
Como você pode avaliar se os grupos identificados realmente fazem sentido?
Importa libs¶
%matplotlib inline
# O scipy é bastante utilizada para Data Science
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
Importa dataset¶
url_db= 'https://stackabuse.s3.amazonaws.com/files/hierarchical-clustering-with-python-and-scikit-learn-shopping-data.csv'
df = pd.read_csv(url_db)
#renomeando o nome das colunas para tirar espaço
df.columns = ['CustomerID', 'Genre', 'Age', 'Annual_Income_k','Spending_Score_1_100']
df.head()
CustomerID | Genre | Age | Annual_Income_k | Spending_Score_1_100 | |
---|---|---|---|---|---|
0 | 1 | Male | 19 | 15 | 39 |
1 | 2 | Male | 21 | 15 | 81 |
2 | 3 | Female | 20 | 16 | 6 |
3 | 4 | Female | 23 | 16 | 77 |
4 | 5 | Female | 31 | 17 | 40 |
Descrição das colunas do dataset:
CustomerID = Identificação do usuario
Genre = Genero
Age = Idade
Annual Income (k$) = Rendimento anual em k$
Spending Score (1-100) = Indice de "vontade de gastar no shooping"
Criando um subset¶
data = df.iloc[:,[3,4]].values;
data
array([[ 15, 39], [ 15, 81], [ 16, 6], [ 16, 77], [ 17, 40], [ 17, 76], [ 18, 6], [ 18, 94], [ 19, 3], [ 19, 72], [ 19, 14], [ 19, 99], [ 20, 15], [ 20, 77], [ 20, 13], [ 20, 79], [ 21, 35], [ 21, 66], [ 23, 29], [ 23, 98], [ 24, 35], [ 24, 73], [ 25, 5], [ 25, 73], [ 28, 14], [ 28, 82], [ 28, 32], [ 28, 61], [ 29, 31], [ 29, 87], [ 30, 4], [ 30, 73], [ 33, 4], [ 33, 92], [ 33, 14], [ 33, 81], [ 34, 17], [ 34, 73], [ 37, 26], [ 37, 75], [ 38, 35], [ 38, 92], [ 39, 36], [ 39, 61], [ 39, 28], [ 39, 65], [ 40, 55], [ 40, 47], [ 40, 42], [ 40, 42], [ 42, 52], [ 42, 60], [ 43, 54], [ 43, 60], [ 43, 45], [ 43, 41], [ 44, 50], [ 44, 46], [ 46, 51], [ 46, 46], [ 46, 56], [ 46, 55], [ 47, 52], [ 47, 59], [ 48, 51], [ 48, 59], [ 48, 50], [ 48, 48], [ 48, 59], [ 48, 47], [ 49, 55], [ 49, 42], [ 50, 49], [ 50, 56], [ 54, 47], [ 54, 54], [ 54, 53], [ 54, 48], [ 54, 52], [ 54, 42], [ 54, 51], [ 54, 55], [ 54, 41], [ 54, 44], [ 54, 57], [ 54, 46], [ 57, 58], [ 57, 55], [ 58, 60], [ 58, 46], [ 59, 55], [ 59, 41], [ 60, 49], [ 60, 40], [ 60, 42], [ 60, 52], [ 60, 47], [ 60, 50], [ 61, 42], [ 61, 49], [ 62, 41], [ 62, 48], [ 62, 59], [ 62, 55], [ 62, 56], [ 62, 42], [ 63, 50], [ 63, 46], [ 63, 43], [ 63, 48], [ 63, 52], [ 63, 54], [ 64, 42], [ 64, 46], [ 65, 48], [ 65, 50], [ 65, 43], [ 65, 59], [ 67, 43], [ 67, 57], [ 67, 56], [ 67, 40], [ 69, 58], [ 69, 91], [ 70, 29], [ 70, 77], [ 71, 35], [ 71, 95], [ 71, 11], [ 71, 75], [ 71, 9], [ 71, 75], [ 72, 34], [ 72, 71], [ 73, 5], [ 73, 88], [ 73, 7], [ 73, 73], [ 74, 10], [ 74, 72], [ 75, 5], [ 75, 93], [ 76, 40], [ 76, 87], [ 77, 12], [ 77, 97], [ 77, 36], [ 77, 74], [ 78, 22], [ 78, 90], [ 78, 17], [ 78, 88], [ 78, 20], [ 78, 76], [ 78, 16], [ 78, 89], [ 78, 1], [ 78, 78], [ 78, 1], [ 78, 73], [ 79, 35], [ 79, 83], [ 81, 5], [ 81, 93], [ 85, 26], [ 85, 75], [ 86, 20], [ 86, 95], [ 87, 27], [ 87, 63], [ 87, 13], [ 87, 75], [ 87, 10], [ 87, 92], [ 88, 13], [ 88, 86], [ 88, 15], [ 88, 69], [ 93, 14], [ 93, 90], [ 97, 32], [ 97, 86], [ 98, 15], [ 98, 88], [ 99, 39], [ 99, 97], [101, 24], [101, 68], [103, 17], [103, 85], [103, 23], [103, 69], [113, 8], [113, 91], [120, 16], [120, 79], [126, 28], [126, 74], [137, 18], [137, 83]])
Visualização no espaço 2D¶
plt.figure(figsize=(10,7))
plt.scatter(data[:, 0], data[:, 1])
<matplotlib.collections.PathCollection at 0x1483ec7f0>
Desafio 2¶
Realize uma análise visual e determine uma quantidade de cluster.
[ ] - 2 clusters
[ ] - 3 clusters
[ ] - 4 clusters
[ ] - 5 clusters
[ ] - 6 clusters
[ ] - 7 clusters
[ ] - 8 clusters
Dendrograma¶
O dendrograma é uma forma grafica de visualizar o agrupamentos de objetos.
O agrupamento (linkage
) é feito de forma iterativa: No inicio, cada objeto é um cluster e no fim, todos os objetos fazem parte do mesmo cluster.
plt.figure(figsize=(10,10))
den = dendrogram(linkage(data, method='average'))
#plt.axhline(y=30)
Desafio 2¶
Visualmente, com base no dendrograma acima, qual seria o melhor corte para realizar a clusterização hierarquica?
[ ] - 2 clusters
[ ] - 3 clusters
[ ] - 4 clusters
[ ] - 5 clusters
[ ] - 6 clusters
[ ] - 7 clusters
[ ] - 8 clusters
Desafio 3¶
O agrupameno dos dados foi realizado a partir do calculo da média (average). Realize um estudo para comparar com outros linkage methtods.
single
complete
average
weighted
centroid
median
ward
Compare os resultados de pelo menos 3 métodos: single, average e ward
Referência: Leia a documentação oficial https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html#scipy.cluster.hierarchy.linkage
## sua resposta aqui.....
AGNES¶
AGNES (AgglomerativeClustering) é uma estratégia de agrupamento de dados do tipo botton-top.
Como parametros deve ser passado o numero de cluster que foi encontrado no dendrograma e os metodos utilizados affinity e linkage.
cluster = AgglomerativeClustering(n_clusters=5, affinity="euclidean", linkage="ward")
cluster.fit_predict(data)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[9], line 1 ----> 1 cluster = AgglomerativeClustering(n_clusters=5, affinity="euclidean", linkage="ward") 2 cluster.fit_predict(data) TypeError: __init__() got an unexpected keyword argument 'affinity'
cluster.labels_
array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2])
plt.figure(figsize=(10,7))
plt.scatter(data[:,0],data[:,1], c=cluster.labels_, cmap="rainbow")
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[10], line 2 1 plt.figure(figsize=(10,7)) ----> 2 plt.scatter(data[:,0],data[:,1], c=cluster.labels_, cmap="rainbow") NameError: name 'cluster' is not defined
<Figure size 1000x700 with 0 Axes>
Desafio 4¶
Utilizando este dataset compare com os resultados para KMeans e DBSCAN
## implemente sua resposta