# Imports necessários
import altair as alt
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
# Carregar dataset Palmer Penguins
penguins = pd.read_csv('https://raw.githubusercontent.com/allisonhorst/palmerpenguins/master/inst/extdata/penguins.csv')
penguins = penguins.dropna()Clusterização com K-médias
Já se perguntou como o Google Notícias consegue agrupar artigos sobre a mesma história de diferentes veículos de comunicação? Ou como empresas identificam perfis similares de clientes para personalizar ofertas? A resposta está no aprendizado não supervisionado, especificamente na técnica de clusterização.
Diferentemente dos modelos supervisionados que aprendemos até agora, os algoritmos de clusterização trabalham com dados sem rótulos, tentando descobrir padrões e agrupar instâncias semelhantes de forma autônoma. É como pedir para alguém organizar uma gaveta cheia de objetos sem dar instruções específicas - a pessoa naturalmente agrupará itens similares.
Nesta aula, vamos explorar o K-médias (K-means em inglês), um dos algoritmos mais populares e intuitivos para essa tarefa, aprendendo como ele funciona e quando utilizá-lo.
A Tarefa de Clusterização
Clusterização é a tarefa de identificar instâncias semelhantes e atribuí-las a clusters (grupos de instâncias similares). É uma ferramenta poderosa tanto para análise exploratória de dados quanto para descobrir tendências, padrões e valores discrepantes em nossos dados.
É útil pensar na clusterização como uma tentativa de encontrar agrupamentos naturais em dados para descobrir quais categorias podem existir e o que define essas categorias.

A clusterização também pode ajudar na detecção de anomalias, ao identificar pontos de dados que não estão contidos em nenhum cluster ou estão fracamente associados a um cluster.
O Algoritmo K-médias
O K-médias é um dos algoritmos de clusterização mais utilizados devido à sua simplicidade e eficiência. Seu parâmetro principal é o número de clusters (k), onde cada instância dos dados será associada a um dos k clusters definidos.
Vamos utilizar o mesmo dataset dos pinguins de Palmer que já conhecemos do módulo de análise exploratória de dados.
Para aplicar o K-médias, usaremos o scikit-learn (sklearn), a biblioteca padrão para machine learning em Python. A padronização dos dados é fundamental porque o K-médias calcula distâncias entre pontos - se uma variável tem valores muito maiores que outras (como peso em gramas vs comprimento em milímetros), ela dominará o cálculo.
# Usar apenas variáveis numéricas para clustering
X_penguins = penguins[['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']].values
# Padronizar os dados (importante para K-médias)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_penguins)
# Aplicar K-médias com k=3 (sabemos que há 3 espécies)
k = 3
kmeans = KMeans(n_clusters=k, random_state=42)
penguins['cluster_kmeans'] = kmeans.fit_predict(X_scaled)
# Visualizar o dataset com a nova coluna
penguins[['species', 'bill_length_mm', 'bill_depth_mm', 'cluster_kmeans']].head()| species | bill_length_mm | bill_depth_mm | cluster_kmeans | |
|---|---|---|---|---|
| 0 | Adelie | 39.1 | 18.7 | 0 |
| 1 | Adelie | 39.5 | 17.4 | 0 |
| 2 | Adelie | 40.3 | 18.0 | 0 |
| 4 | Adelie | 36.7 | 19.3 | 0 |
| 5 | Adelie | 39.3 | 20.6 | 0 |
# Visualizar clusters usando duas dimensões principais
alt.Chart(penguins).mark_point(size=120, opacity=0.7, filled=True).encode(
x=alt.X('bill_length_mm:Q',
title='Comprimento do Bico (mm)',
scale=alt.Scale(domain=[30, 60])),
y=alt.Y('bill_depth_mm:Q',
title='Profundidade do Bico (mm)',
scale=alt.Scale(domain=[12, 22])),
color=alt.Color('cluster_kmeans:N',
scale=alt.Scale(scheme='category10'),
title='Cluster K-médias',
legend=alt.Legend(
orient='none',
direction='horizontal',
titleAnchor='start',
legendX=30,
legendY=265
)),
shape=alt.Shape('species:N',
title='Espécie Real',
legend=alt.Legend(
orient='none',
direction='horizontal',
titleAnchor='start',
legendX=30,
legendY=305
)),
tooltip=['species:N', 'bill_length_mm:Q', 'bill_depth_mm:Q', 'cluster_kmeans:N']
).properties(
width=680,
height=350
).resolve_scale(
color='independent',
shape='independent'
)O K-médias conseguiu identificar padrões importantes nos dados, criando agrupamentos coerentes que se aproximam das espécies reais. Porém, há algumas classificações incorretas - especialmente na região de sobreposição entre Adelie e Chinstrap. Isso é esperado em algoritmos não supervisionados, que trabalham apenas com características numéricas sem conhecer as categorias reais.
Como Funciona o K-médias
O K-médias utiliza como base para fazer os agrupamentos a ideia de centroides - pontos que servem como “centro” de cada cluster. Se uma instância estiver próxima o suficiente de um centroide, ela pertencerá àquele grupo.
O agrupamento K-médias é um processo iterativo que:
- Inicializa aleatoriamente a posição dos k centroides
- Atribui cada ponto ao centroide mais próximo
- Recalcula a posição dos centroides (média dos pontos do cluster)
- Repete os passos 2-3 até que os centroides parem de se mover
Note que a partir da iteração 6, os centroides param de se mover - eles “convergem” para suas posições finais. Este é um dos critérios de parada do algoritmo K-médias: quando os centroides não mudam mais entre iterações, o algoritmo detecta que chegou ao seu ótimo e para automaticamente, mesmo que ainda restassem iterações.
Encontrando o Número Ideal de Clusters
Escolher aleatoriamente um valor k para definir o número de clusters pode levar a resultados arbitrários. Por isso, foram desenvolvidas métricas para guiar a escolha da quantidade ideal de clusters.
Coeficiente Silhouette
O coeficiente Silhouette varia entre -1 e 1, onde:
- 1: a instância está bem dentro do seu cluster e distante dos demais
- 0: a instância está na fronteira entre dois ou mais clusters
- -1: a instância pode ter sido atribuída ao cluster errado
Na prática, buscamos valores altos de Silhouette, mas nem sempre valores altos são ótimos. Por exemplo, 2 clusters e 40 clusters podem estar no top 2 de valores mais altos, mas isso não significa que sejam as melhores escolhas. Existe um trade-off entre a métrica e o conhecimento do problema - sabemos que há 3 espécies de pinguins, então k=3 faz sentido mesmo que não seja o maior score.
A definição formal do coeficiente Silhouette para uma instância é:
\[ \text{Silhouette}(x_i) = \frac{b - a}{\max(a, b)} \]
Onde:
- a: distância média da instância às outras do mesmo cluster
- b: distância média da instância às instâncias do cluster mais próximo
- x_i: uma instância qualquer do conjunto de dados
# Aplicar K-médias com k=3 e calcular Silhouette Score
kmeans_final = KMeans(n_clusters=3, random_state=42)
labels_final = kmeans_final.fit_predict(X_scaled)
score_final = silhouette_score(X_scaled, labels_final)
print(f"Silhouette Score para k=3: {score_final:.3f}")Silhouette Score para k=3: 0.446
Outras Métricas de Avaliação
Além do Silhouette Score, existem outras métricas para avaliar a qualidade da clusterização:
- Índice Dunn: Razão entre a menor distância inter-cluster e a maior distância intra-cluster
- Índice Davies-Bouldin: Mede a separação e compacidade dos clusters
- Índice Calinski-Harabasz: Razão entre dispersão inter e intra-cluster
- Within-Cluster Sum of Squares (WCSS): Soma das distâncias quadráticas dentro dos clusters
Na prática, você pode utilizar múltiplas métricas em conjunto para justificar sua escolha de clusters, já que cada uma captura aspectos diferentes da qualidade da clusterização. É possível até mesmo criar métricas híbridas que combinam diferentes indicadores, proporcionando uma avaliação mais robusta e confiável.
Conclusão
A clusterização com K-médias é uma ferramenta poderosa para descobrir padrões ocultos em dados não rotulados. Pode ser aplicada em diferentes contextos, desde segmentação de clientes até análise de dados socioeconômicos, sempre fornecendo insights valiosos para a tomada de decisão.
Os principais pontos que vimos foram: - K-médias agrupa dados baseado na proximidade a centroides - A escolha do número de clusters é crucial e deve ser guiada por métricas - O Silhouette Score é uma métrica confiável para avaliar a qualidade dos clusters - A padronização dos dados é importante quando as variáveis têm escalas diferentes
Com essa base, você está pronto para aplicar clusterização em seus próprios projetos de ciência de dados!
Recursos Adicionais
- Hands-On Machine Learning with Scikit-Learn and TensorFlow (Aurélien Géron)
- IBM: Unsupervised Learning
- IBM: Clustering
- Bombay Softwares: Introduction to K-means Clustering