Skip to content

K-mean

2025-09-30T12:48:27.616933 image/svg+xml Matplotlib v3.10.6, https://matplotlib.org/
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from io import StringIO
from sklearn.cluster import KMeans

# Usa o CSV como base (duas primeiras colunas numéricas, para manter o mesmo plot)
df = pd.read_csv('https://raw.githubusercontent.com/marcelademartini/Machine-Learning-1/refs/heads/main/Testing.csv')
X_num = df.select_dtypes(include=[np.number]).dropna()

if X_num.shape[1] >= 2:
    X = X_num.iloc[:, :2].to_numpy()
else:
    # Se só houver 1 coluna numérica, duplica para conseguir plotar em 2D
    col = X_num.iloc[:, 0].to_numpy().reshape(-1, 1)
    X = np.hstack([col, col])


plt.figure(figsize=(12, 10))


# Run K-Means
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=100, random_state=42)
labels = kmeans.fit_predict(X)

# Plot results
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], 
           c='red', marker='*', s=200, label='Centroids')
plt.title('K-Means Clustering Results')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()

# # Print centroids and inertia
# print("Final centroids:", kmeans.cluster_centers_)
# print("Inertia (WCSS):", kmeans.inertia_)

# # Display the plot
buffer = StringIO()
plt.savefig(buffer, format="svg", transparent=True)
print(buffer.getvalue())

1) Exploração dos dados

  • Leitura e natureza do conjunto: o script lê um CSV remoto para um DataFrame (pd.read_csv(...)). Em seguida, seleciona apenas as colunas numéricas (select_dtypes(include=[np.number])) e remove linhas com valores ausentes nessas colunas (dropna()).
  • Seleção de features para visualização: se houver duas ou mais colunas numéricas, o código pega as duas primeiras (iloc[:, :2]) e as converte para numpy para formar X. Se houver apenas uma coluna numérica, ele duplica essa coluna para construir um plano 2D e permitir o gráfico de dispersão.
  • Visualização: cria uma figura (plt.figure(...)) e, após o agrupamento, plota um scatter dos pontos coloridos pelos rótulos de cluster e marca os centróides com um asterisco vermelho.
  • Estatísticas descritivas: não são calculadas no script (não há describe(), médias, desvios, histogramas etc.).

2) Pré-processamento

  • Tratamento de ausentes: o código faz dropna() nas colunas numéricas selecionadas, removendo linhas com NaN antes do modelo.
  • Normalização/Escala: não há normalização/padronização; as features são usadas no escala original.
  • Outros passos (remoção de outliers, codificação categórica etc.): não são realizados.

3) Divisão dos dados (treino e teste)

  • Não ocorre divisão. O script não cria conjuntos de treino e teste; todo o X é utilizado diretamente no ajuste do algoritmo. (Isso é coerente com o uso atual do script, que faz agrupamento não supervisionado.)

4) Treinamento do modelo

  • Algoritmo implementado: o script treina K-Means com n_clusters=3, inicialização k-means++, max_iter=100 e random_state=42.
  • Ajuste e rótulos: fit_predict(X) executa o agrupamento sobre todas as observações em X e retorna labels, que indicam a qual cluster (0, 1, 2) cada ponto pertence.

5) Avaliação do modelo

  • Avaliação visual: o gráfico resultante mostra a distribuição dos pontos por cluster e a posição dos centróides. Essa é a base de avaliação presente no script.
  • Métricas numéricas: há linhas comentadas para imprimir centróides e inércia (WCSS); como estão comentadas, nenhuma métrica é exibida. Não há cálculo de outras métricas (ex.: silhouette).

6) Relatório final (processo, resultados, possíveis melhorias)

  • Processo implementado:

  • leitura do CSV e filtragem de colunas numéricas;

  • remoção de ausentes;
  • escolha de duas features (ou duplicação da única feature) para visualização 2D;
  • treinamento do K-Means (k=3);
  • geração de gráfico de dispersão com rótulos e centróides;
  • salvamento em SVG para buffer e impressão do conteúdo SVG no stdout.
  • Resultados gerados: um SVG contendo o gráfico de clusters com três grupos e seus centróides.
  • Aspectos não contemplados no script (apenas descrição): estatísticas descritivas, normalização, divisão treino-teste, implementação de KNN e métricas de desempenho supervisionadas não estão presentes no código.