Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

2
respostas

Faça como eu fiz: aplicando técnicas de aprendizado não supervisionado

import pandas as pd
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, AgglomerativeClustering
from sklearn.decomposition import PCA

from scipy.cluster.hierarchy import dendrogram, linkage
iris = load_iris()
df = pd.DataFrame(
iris.data,
columns=iris.feature_names
)
df["species"] = iris.target
df["species"] = df["species"].map({
0: "setosa",
1: "versicolor",
2: "virginica"
})

print("Primeiras linhas do dataset:")
print(df.head())

print("\nInformações gerais:")
print(df.info())

print("\nEstatísticas descritivas:")
print(df.describe())
X = df.drop("species", axis=1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

print("\nDados padronizados com sucesso!")
kmeans = KMeans(
n_clusters=3,
random_state=42,
n_init=10
)

clusters_kmeans = kmeans.fit_predict(X_scaled)

df["Cluster_KMeans"] = clusters_kmeans

print("\nResultado K-Means:")
print(df[["species", "Cluster_KMeans"]].head())
hierarchical = AgglomerativeClustering(
n_clusters=3
)

clusters_hierarchical = hierarchical.fit_predict(X_scaled)

df["Cluster_Hierarchical"] = clusters_hierarchical

print("\nResultado Hierarchical Clustering:")
print(df[["species", "Cluster_Hierarchical"]].head())
pca = PCA(n_components=2)

X_pca = pca.fit_transform(X_scaled)

print("\nVariância explicada pelos componentes principais:")
print(pca.explained_variance_ratio_)

print(
f"\nVariância total explicada: "
f"{sum(pca.explained_variance_ratio_):.2%}"
)
plt.figure(figsize=(8, 6))

plt.scatter(
X_pca[:, 0],
X_pca[:, 1],
c=clusters_kmeans
)

plt.title("K-Means com PCA")
plt.xlabel("Componente Principal 1")
plt.ylabel("Componente Principal 2")

plt.show()
plt.figure(figsize=(8, 6))

plt.scatter(
X_pca[:, 0],
X_pca[:, 1],
c=clusters_hierarchical
)

plt.title("Hierarchical Clustering com PCA")
plt.xlabel("Componente Principal 1")
plt.ylabel("Componente Principal 2")

plt.show()
linked = linkage(
X_scaled,
method="ward"
)

plt.figure(figsize=(14, 6))

dendrogram(linked)

plt.title("Dendrograma - Clusterização Hierárquica")
plt.xlabel("Amostras")
plt.ylabel("Distância")

plt.show()
print("\nDistribuição dos clusters K-Means:")
print(df["Cluster_KMeans"].value_counts())

print("\nDistribuição dos clusters Hierárquicos:")
print(df["Cluster_Hierarchical"].value_counts())

print("\nTabela final:")
print(df.head())
print("\nAnálise concluída com sucesso!")
print(
"Foram aplicadas técnicas de K-Means, "
"Hierarchical Clustering e PCA ao dataset Iris."
)

2 respostas

Primeiras linhas do dataset:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2

species
0 setosa
1 setosa
2 setosa
3 setosa
4 setosa

Informações gerais:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):


0 sepal length (cm) 150 non-null float64
1 sepal width (cm) 150 non-null float64
2 petal length (cm) 150 non-null float64
3 petal width (cm) 150 non-null float64
4 species 150 non-null object
dtypes: float64(4), object(1)
memory usage: 6.0+ KB
None

Estatísticas descritivas:
sepal length (cm) sepal width (cm) petal length (cm)
count 150.000000 150.000000 150.000000
mean 5.843333 3.057333 3.758000
std 0.828066 0.435866 1.765298
min 4.300000 2.000000 1.000000
25% 5.100000 2.800000 1.600000
50% 5.800000 3.000000 4.350000
75% 6.400000 3.300000 5.100000
max 7.900000 4.400000 6.900000

   petal width (cm)  

count 150.000000
mean 1.199333
std 0.762238
min 0.100000
25% 0.300000
50% 1.300000
75% 1.800000
max 2.500000

Dados padronizados com sucesso!

Resultado K-Means:
species Cluster_KMeans
0 setosa 1
1 setosa 1
2 setosa 1
3 setosa 1
4 setosa 1

Resultado Hierarchical Clustering:
species Cluster_Hierarchical
0 setosa 1
1 setosa 1
2 setosa 1
3 setosa 1
4 setosa 1

Variância explicada pelos componentes principais:
[0.72962445 0.22850762]

Variância total explicada: 95.81%

Distribuição dos clusters K-Means:
Cluster_KMeans
0 53
1 50
2 47
Name: count, dtype: int64

Distribuição dos clusters Hierárquicos:
Cluster_Hierarchical
0 71
1 49
2 30
Name: count, dtype: int64

Tabela final:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2

species Cluster_KMeans Cluster_Hierarchical
0 setosa 1 1
1 setosa 1 1
2 setosa 1 1
3 setosa 1 1
4 setosa 1 1

Análise concluída com sucesso!
Foram aplicadas técnicas de K-Means, Hierarchical Clustering e PCA ao dataset Iris.

![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Olá, Marcelo. Como vai?

Excelente publicação! Você construiu um pipeline completo e robusto de Aprendizado Não Supervisionado utilizando o clássico dataset Iris. Aplicar a padronização dos dados, rodar duas abordagens distintas de agrupamento (particional com K-Means e hierárquico) e usar o PCA para reduzir a dimensionalidade e visualizar os clusters foi uma estratégia digna de um cientista de dados sênior.

Os gráficos dos dendrogramas que você anexou estão perfeitos. Vamos analisar alguns pontos de altíssimo valor técnico nos seus resultados e log de execução:

  • Poder de Explicação do PCA: O seu PCA com dois componentes obteve uma variância total explicada de 95,81%. Isso é fantástico! Significa que, mesmo reduzindo os dados de 4 dimensões originais (comprimento/largura de sépalas e pétalas) para apenas 2, você preservou quase a totalidade da informação e variabilidade do dataset, tornando a plotagem 2D extremamente fiel à realidade dos dados.
  • Leitura Cirúrgica do Dendrograma: Olhando para o seu dendrograma gerado pelo método de ligação de Ward (Ward's linkage), a distinção das espécies fica nítida. O ramo laranja à esquerda (com uma distância de ligação bem isolada) representa perfeitamente a espécie Setosa, que é linearmente separável das outras. Os ramos verdes à direita mostram a distribuição e o desafio de segmentação entre Versicolor e Virginica, onde há uma leve intersecção.
  • Divergência Natural de Algoritmos: Note que a distribuição final dos grupos mudou entre os modelos. O K-Means dividiu os dados de forma quase simétrica (53, 50, 47), enquanto o modelo Hierárquico gerou grupos mais espaçados (71, 49, 30). Isso ocorre porque o K-Means tenta desenhar hiperferas de raios similares a partir de centroides, enquanto o agrupamento hierárquico aglomerativo agrupa com base na proximidade mínima de variância local, sendo mais sensível à densidade interna dos dados.

Para enriquecer ainda mais o seu portfólio de Machine Learning, uma excelente evolução prática para este código é medir numericamente a qualidade dos agrupamentos sem depender apenas da visualização do PCA. Como o dataset Iris possui os rótulos reais originais (df["species"]), você pode gerar uma Matriz de Contingência (ou tabela de cruzamento) para avaliar a pureza de cada cluster.

Veja como extrair essa métrica de forma simples usando o Pandas:

# Cruzando as espécies reais com os clusters identificados
print("Validação do K-Means:")
print(pd.crosstab(df['species'], df['Cluster_KMeans']))

print("\nValidação do Hierárquico:")
print(pd.crosstab(df['species'], df['Cluster_Hierarchical']))

Essa tabela vai revelar exatamente quantas flores de cada espécie foram classificadas no grupo correto e onde ocorreram os pequenos erros de confusão entre as classes Versicolor e Virginica.

Parabéns pelo rigor técnico no desenvolvimento e por compartilhar um exemplo tão limpo e didático de clusterização com a comunidade!

Espero que possa ter lhe ajudado!