Agrupamento (ou clusterização)

Uma das operações mais comuns quando se trabalha com dados é o agrupamento dos mesmos. Muitas vezes esse agrupamento é explicito, como por exemplo grupos de deputados pertencentes a um mesmo partido. Entretanto, pode ser também muito interessante buscar outras formas de agrupamento nem sempre tão explicitas.

Existem diversas técnicas para esse propósito. O princípio de todas essas técnicas é buscar relações de proximidade ou distância entre os atributos dos seus dados e encontrar grupos coesos de elementos com características próximas entre si (por exemplo, deputados podem ser agrupados por seus padrões de votos, renda, discursos, etc...)

Titulo

Esse é um exemplo de MarkDown.

  • laranjas
  • maças
  • goiabas

Uma das técnicas mais conhecidas para esse agrupamento não supervisionado é o algoritmo k-means. O k-means consegue, a partir da distribuição dos atributos dos dados, detectar grupos.

O único porém do método é que o número de grupos deve ser determinado antes de sua execução. Nem sempre é possível prever de antemão esse número e diferentes valores devem ser testados em alguns casos.

Veremos a seguir alguns exemplos de utilização do k-means, utilizando a biblioteca de aprendizado de máquina "scikit-learn" e dados de exemplo que contém dois atributos (coordenada x e y), que permitirá a visualização gráfica do algoritmo.

Exemplo 1: Base Mouse

O primeiro exemplo utilizará como base o arquivo mouse.csv. Vamos carregar e plotar suas coordenadas.

Também usaremos bibliotecas python que nos auxiliarão:

  • A biblioteca NumPy permite a manipulação de arranjos multi-dimensionais, além de diversas outras facilidades;
  • PyLab também nos oferece alguns recursos numéricos, mas a usaremos principalmente para exibir imagens;
  • A biblioteca scikit-learn oferece um conjunto grande de algoritmos de aprendizado de máquina - incluindo uma implementação do k-means.

In [1]:
import numpy as np
import pylab as pl
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans

#carrega base com base "mouse"

mouse = np.load("/hackday/mouse.npy") #le arquivo local csv, com dados, usando pandas
print "dimensão da base:", mouse.shape 
plt.scatter(mouse[:,0], mouse[:,1]) #plota pontos em 2D
plt.show()


/usr/lib/python2.7/site-packages/pandas/io/excel.py:626: UserWarning: Installed openpyxl is not supported at this time. Use >=1.6.1 and <2.0.0.
  .format(openpyxl_compat.start_ver, openpyxl_compat.stop_ver))
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-1-e810acd756c2> in <module>()
      7 #carrega base com base "mouse"
      8 
----> 9 mouse = np.load("/hackday/mouse.npy") #le arquivo local csv, com dados, usando pandas
     10 print "dimensão da base:", mouse.shape
     11 plt.scatter(mouse[:,0], mouse[:,1]) #plota pontos em 2D

/usr/lib/python2.7/site-packages/numpy/lib/npyio.pyc in load(file, mmap_mode)
    368     own_fid = False
    369     if isinstance(file, basestring):
--> 370         fid = open(file, "rb")
    371         own_fid = True
    372     elif isinstance(file, gzip.GzipFile):

IOError: [Errno 2] No such file or directory: '/hackday/mouse.npy'

Observe a imagem plotada. Se você está vendo uma imagem de um personagem protegido por direitos autorais, nós não nos responsabilizamos por isso.

Tente perceber como os pontos se agrupam no espaço. Em quantos grupos você dividiria a imagem? Quais pontos pertencem a cada grupo?

Utilizando a implementação do kmeans do scikit-learn, vamos agrupar os dados em 3 grupos:


In [ ]:
k_means = KMeans(n_clusters=3) #inicializa a classe kmeans, com 3 clusters
k_means.fit(mouse) #atribui clusters aos dados
k_means_labels = k_means.labels_ #obtem o rotulo (classe) para cada amostra da colecao

Cada ponto do gráfico recebeu um rótulo (label), referente a sua classe. Podemos colorir o gráfico, dando uma cor diferente para elementos de cada grupo:


In [ ]:
plt.scatter(mouse[:,0], mouse[:,1], c=k_means_labels)
plt.show()

Exemplo 2: Base Mistério

Agora é a vez de você treinar. Analise o seguinte conjunto de pontos "mistério":


In [ ]:
misterio = np.load("/hackday/misterio.npy")
plt.scatter(misterio[:,0], misterio[:,1]) #plota pontos em 2D
plt.show()

Tarefa:

  1. Quantos grupos você acha que compõem a base mistério? Tente rodar o kmeans, variando o número de clusters e observe o resultado para diferentes valores.

  2. Como comparar diferentes resultados de clusterização? Que medidas podem ser feitas para avaliar a coesão de um cluster?

  3. Opcional: Implemente alguma forma de medir a qualidade de uma clusterização, dado o número de clusters. Dica: A classe kmeans possui o atributo clustercenters (acessível como k_means.clustercenters), que contém as coordenadas do ponto central de cada grupo.

Utilize os espaços abaixo para implementar sua solução


In [ ]:
#rode o kmeans, para a base "misterio" alterando o valor da variavel "n_clusters"

#plote o resultado e faca comparacoes

#meça a qualidade de cada resultado