Neste tutorial, você aprenderá
- O que é análise de cluster?
- Algoritmo K-means
- K ideal
O que é análise de cluster?
A análise de cluster faz parte da aprendizagem não supervisionada . Um cluster é um grupo de dados que compartilha recursos semelhantes. Podemos dizer que a análise de agrupamento é mais uma descoberta do que uma previsão. A máquina procura semelhanças nos dados. Por exemplo, você pode usar a análise de cluster para o seguinte aplicativo:
- Segmentação de clientes: procura semelhanças entre grupos de clientes
- Agrupamento do mercado de ações: ações do grupo com base no desempenho
- Reduza a dimensionalidade de um conjunto de dados agrupando observações com valores semelhantes
A análise de agrupamento não é muito difícil de implementar e é significativa e acionável para os negócios.
A diferença mais marcante entre aprendizagem supervisionada e não supervisionada está nos resultados. O aprendizado não supervisionado cria uma nova variável, o rótulo, enquanto o aprendizado supervisionado prevê um resultado. A máquina ajuda o praticante na busca de rotular os dados com base em parentesco próximo. Cabe ao analista fazer uso dos grupos e dar um nome a eles.
Vamos dar um exemplo para entender o conceito de clustering. Para simplificar, trabalhamos em duas dimensões. Você tem dados sobre o gasto total dos clientes e suas idades. Para melhorar a publicidade, a equipe de marketing deseja enviar e-mails mais direcionados a seus clientes.
No gráfico a seguir, você plota o gasto total e a idade dos clientes.
library(ggplot2)df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54),spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24))ggplot(df, aes(x = age, y = spend)) +geom_point()
Um padrão é visível neste ponto
- No canto inferior esquerdo, você pode ver os jovens com menor poder aquisitivo
- Médio alto reflete as pessoas com um emprego que podem pagar para gastar mais
- Finalmente, pessoas mais velhas com um orçamento mais baixo.
Na figura acima, você agrupa as observações manualmente e define cada um dos três grupos. Este exemplo é um tanto direto e altamente visual. Se novas observações forem anexadas ao conjunto de dados, você pode rotulá-las dentro dos círculos. Você define o círculo com base em nosso julgamento. Em vez disso, você pode usar o Machine Learning para agrupar os dados objetivamente.
Neste tutorial, você aprenderá como usar o algoritmo k-means .
Algoritmo K-means
K-mean é, sem dúvida, o método de agrupamento mais popular. Os pesquisadores lançaram o algoritmo décadas atrás, e muitas melhorias foram feitas no k-means.
O algoritmo tenta encontrar grupos minimizando a distância entre as observações, chamadas de soluções ótimas locais . As distâncias são medidas com base nas coordenadas das observações. Por exemplo, em um espaço bidimensional, as coordenadas são simples e.
O algoritmo funciona da seguinte maneira:
- Etapa 1: Escolha grupos no plano de recursos aleatoriamente
- Etapa 2: Minimize a distância entre o centro do cluster e as diferentes observações ( centróide ). Resulta em grupos com observações
- Etapa 3: mude o centroide inicial para a média das coordenadas dentro de um grupo.
- Etapa 4: Minimize a distância de acordo com os novos centróides. Novos limites são criados. Assim, as observações irão se mover de um grupo para outro
- Repita até que nenhuma observação mude os grupos
K-means geralmente leva a distância euclidiana entre o recurso e o recurso:
Diferentes medidas estão disponíveis, como a distância de Manhattan ou a distância de Minlowski. Observe que, K-mean retorna grupos diferentes cada vez que você executa o algoritmo. Lembre-se de que as primeiras estimativas iniciais são aleatórias e calcule as distâncias até que o algoritmo alcance uma homogeneidade dentro dos grupos. Ou seja, a média k é muito sensível à primeira escolha e, a menos que o número de observações e grupos seja pequeno, é quase impossível obter o mesmo agrupamento.
Selecione o número de clusters
Outra dificuldade encontrada com k-mean é a escolha do número de clusters. Você pode definir um valor alto de, ou seja, um grande número de grupos, para melhorar a estabilidade, mas você pode acabar com o ajuste excessivo dos dados. Overfitting significa que o desempenho do modelo diminui substancialmente para os novos dados que estão chegando. A máquina aprendeu os pequenos detalhes do conjunto de dados e lutou para generalizar o padrão geral.
O número de clusters depende da natureza do conjunto de dados, da indústria, dos negócios e assim por diante. No entanto, existe uma regra para selecionar o número apropriado de clusters:
com igual ao número de observações no conjunto de dados.
De um modo geral, é interessante gastar tempo procurando o melhor valor para se adequar à necessidade do negócio.
Usaremos o conjunto de dados Preços de computadores pessoais para realizar nossa análise de agrupamento. Este conjunto de dados contém 6259 observações e 10 recursos. O conjunto de dados observa o preço de 1993 a 1995 de 486 computadores pessoais nos Estados Unidos. As variáveis são preço, velocidade, memória RAM, tela, cd entre outras.
Você procederá da seguinte forma:
- Importar dados
- Treine o modelo
- Avalie o modelo
Importar dados
K significa não é adequado para variáveis de fator porque é baseado na distância e os valores discretos não retornam valores significativos. Você pode excluir as três variáveis categóricas em nosso conjunto de dados. Além disso, não há valores ausentes neste conjunto de dados.
library(dplyr)PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv"df <- read.csv(PATH) %>%select(-c(X, cd, multi, premium))glimpse(df)Resultado
## Observations: 6, 259## Variables: 7## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2… ##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25,… ##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210… ##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4,… ##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14,… ##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,… ## $ trend1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
Nas estatísticas de resumo, você pode ver que os dados têm valores grandes. Uma boa prática com k cálculo de média e distância é redimensionar os dados de modo que a média seja igual a um e o desvio padrão seja igual a zero.
summary(df)
Resultado:
## price speed hd ram## Min. : 949 Min. : 25.00 Min. : 80.0 Min. : 2.000## 1st Qu.:1794 1st Qu.: 33.00 1st Qu.: 214.0 1st Qu.: 4.000 `## Median :2144 Median : 50.00 Median : 340.0 Median : 8.000## Mean :2220 Mean : 52.01 Mean : 416.6 Mean : 8.287## 3rd Qu.:2595 3rd Qu.: 66.00 3rd Qu.: 528.0 3rd Qu.: 8.000## Max. :5399 Max. :100.00 Max. :2100.0 Max. :32.000## screen ads trend## Min. :14.00 Min. : 39.0 Min. : 1.00## 1st Qu.:14.00 1st Qu.:162.5 1st Qu.:10.00## Median :14.00 Median :246.0 Median :16.00## Mean :14.61 Mean :221.3 Mean :15.93## 3rd Qu.:15.00 3rd Qu.:275.0 3rd Qu.:21.50## Max. :17.00 Max. :339.0 Max. :35.00
Você redimensiona as variáveis com a função scale () da biblioteca dplyr. A transformação reduz o impacto de outliers e permite comparar uma única observação com a média. Se um valor padronizado (ou pontuação z ) for alto, você pode ter certeza de que essa observação está realmente acima da média (uma pontuação z grande implica que este ponto está longe da média em termos de desvio padrão. a pontuação de dois indica que o valor está a 2 desvios padrão da média. Observe que a pontuação z segue uma distribuição gaussiana e é simétrica em torno da média.
rescale_df <- df % > %mutate(price_scal = scale(price),hd_scal = scale(hd),ram_scal = scale(ram),screen_scal = scale(screen),ads_scal = scale(ads),trend_scal = scale(trend)) % > %select(-c(price, speed, hd, ram, screen, ads, trend))
A base R tem uma função para executar o algoritmo de média k. A função básica da média k é:
kmeans(df, k)arguments:-df: dataset used to run the algorithm-k: Number of clusters
Treine o modelo
Na figura três, você detalhou como o algoritmo funciona. Você pode ver cada etapa graficamente com o ótimo pacote construído por Yi Hui (também criador do Knit para Rmarkdown). A animação do pacote não está disponível na biblioteca conda. Você pode usar a outra maneira de instalar o pacote com install.packages ("animação"). Você pode verificar se o pacote está instalado em nossa pasta Anaconda.
install.packages("animation")
Depois de carregar a biblioteca, você adiciona .ani após kmeans e R traçará todas as etapas. Para fins de ilustração, você apenas executa o algoritmo com as variáveis redimensionadas hd e ram com três clusters.
set.seed(2345)library(animation)kmeans.ani(rescale_df[2:3], 3)
Explicação do código
- kmeans.ani (rescale_df [2: 3], 3): Selecione as colunas 2 e 3 do conjunto de dados rescale_df e execute o algoritmo com k conjuntos de 3. Faça o gráfico da animação.
Você pode interpretar a animação da seguinte maneira:
- Etapa 1: R escolhe aleatoriamente três pontos
- Etapa 2: Calcule a distância euclidiana e desenhe os clusters. Você tem um cluster em verde na parte inferior esquerda, um grande cluster colorido em preto à direita e um vermelho entre eles.
- Etapa 3: calcular o centróide, ou seja, a média dos clusters
- Repita até que nenhum cluster mude de dados
O algoritmo convergiu após sete iterações. Você pode executar o algoritmo k-mean em nosso conjunto de dados com cinco clusters e chamá-lo de pc_cluster.
pc_cluster <-kmeans(rescale_df, 5)
- A lista pc_cluster contém sete elementos interessantes:
- pc_cluster $ cluster: indica o cluster de cada observação
- pc_cluster $ centers: os centros do cluster
- pc_cluster $ totss: a soma total dos quadrados
- pc_cluster $ withinss: Dentro da soma do quadrado. O número de componentes retornados é igual a `k`
- pc_cluster $ tot.withinss: Soma de withinss
- pc_clusterbetweenss: soma total do quadrado menos dentro da soma do quadrado
- pc_cluster $ size: Número de observações dentro de cada cluster
Você usará a soma da soma interna do quadrado (ou seja, tot.withinss) para calcular o número ideal de clusters k. Encontrar k é de fato uma tarefa substancial.
K ideal
Uma técnica para escolher o melhor k é chamada de método do cotovelo . Este método usa homogeneidade dentro do grupo ou heterogeneidade dentro do grupo para avaliar a variabilidade. Em outras palavras, você está interessado na porcentagem da variância explicada por cada cluster. Você pode esperar que a variabilidade aumente com o número de clusters; alternativamente, a heterogeneidade diminui. Nosso desafio é encontrar k que está além dos retornos decrescentes. Adicionar um novo cluster não melhora a variabilidade dos dados porque poucas informações são deixadas para explicar.
Neste tutorial, encontramos esse ponto usando a medida de heterogeneidade. A soma dos quadrados do Total dentro dos clusters é tot.withinss no retorno da lista por kmean ().
Você pode construir o gráfico de cotovelo e encontrar o k ideal da seguinte forma:
- Etapa 1: construir uma função para calcular o total dentro da soma dos quadrados dos clusters
- Etapa 2: execute o algoritmo vezes
- Etapa 3: crie um quadro de dados com os resultados do algoritmo
- Etapa 4: Plote os resultados
Etapa 1) Construir uma função para calcular o total dentro da soma dos quadrados dos clusters
Você cria a função que executa o algoritmo k-mean e armazena o total na soma dos quadrados dos clusters
kmean_withinss <- function(k) {cluster <- kmeans(rescale_df, k)return (cluster$tot.withinss)}
Explicação do código
- função (k): Defina o número de argumentos na função
- kmeans (rescale_df, k): Execute o algoritmo k vezes
- return (cluster $ tot.withinss): Armazene o total na soma dos quadrados dos grupos
Você pode testar a função com igual a 2.
Resultado:
## Try with 2 cluster
kmean_withinss(2)
Resultado:
## [1] 27087.07
Etapa 2) Execute o algoritmo n vezes
Você usará a função sapply () para executar o algoritmo em um intervalo de k. Essa técnica é mais rápida do que criar um loop e armazenar o valor.
# Set maximum clustermax_k <-20# Run algorithm over a range of kwss <- sapply(2:max_k, kmean_withinss)
Explicação do código
- max_k <-20: Defina um número máximo de 20
- sapply (2: max_k, kmean_withinss): Execute a função kmean_withinss () em um intervalo 2: max_k, ou seja, 2 a 20.
Etapa 3) Crie um quadro de dados com os resultados do algoritmo
Após a criação e teste de nossa função, você pode executar o algoritmo k-mean em um intervalo de 2 a 20, armazenar os valores tot.withinss.
# Create a data frame to plot the graphelbow <-data.frame(2:max_k, wss)
Explicação do código
- data.frame (2: max_k, wss): Crie um quadro de dados com a saída do armazenamento de algoritmo em wss
Etapa 4) Trace os resultados
Você plota o gráfico para visualizar onde está o ponto do cotovelo
# Plot the graph with gglopggplot(elbow, aes(x = X2.max_k, y = wss)) +geom_point() +geom_line() +scale_x_continuous(breaks = seq(1, 20, by = 1))
No gráfico, você pode ver que o k ótimo é sete, onde a curva está começando a ter um retorno decrescente.
Depois de obter nosso k ideal, você executa novamente o algoritmo com k igual a 7 e avalia os clusters.
Examinando o cluster
pc_cluster_2 <-kmeans(rescale_df, 7)
Como mencionado antes, você pode acessar as demais informações interessantes na lista retornada por kmean ().
pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size
A parte de avaliação é subjetiva e depende do uso do algoritmo. Nosso objetivo aqui é reunir computadores com recursos semelhantes. Um cara do computador pode fazer o trabalho manualmente e agrupar computadores com base em sua experiência. No entanto, o processo levará muito tempo e estará sujeito a erros. O algoritmo K-mean pode preparar o campo para ele / ela sugerindo clusters.
Como uma avaliação prévia, você pode examinar o tamanho dos clusters.
pc_cluster_2$size
Resultado:
## [1] 608 1596 1231 580 1003 699 542
O primeiro cluster é composto por 608 observações, enquanto o menor cluster, o número 4, possui apenas 580 computadores. Pode ser bom ter homogeneidade entre os clusters, caso contrário, uma preparação de dados mais fina pode ser necessária.
Você tem uma visão mais aprofundada dos dados com o componente central. As linhas referem-se à numeração do cluster e as colunas às variáveis utilizadas pelo algoritmo. Os valores são a pontuação média de cada cluster para a coluna interessada. A padronização torna a interpretação mais fácil. Valores positivos indicam que o z-score para um determinado cluster está acima da média geral. Por exemplo, o cluster 2 tem a maior média de preço entre todos os clusters.
center <-pc_cluster_2$centerscenter
Resultado:
## price_scal hd_scal ram_scal screen_scal ads_scal trend_scal## 1 -0.6372457 -0.7097995 -0.691520682 -0.4401632 0.6780366 -0.3379751## 2 -0.1323863 0.6299541 0.004786730 2.6419582 -0.8894946 1.2673184## 3 0.8745816 0.2574164 0.513105797 -0.2003237 0.6734261 -0.3300536## 4 1.0912296 -0.2401936 0.006526723 2.6419582 0.4704301 -0.4132057## 5 -0.8155183 0.2814882 -0.307621003 -0.3205176 -0.9052979 1.2177279## 6 0.8830191 2.1019454 2.168706085 0.4492922 -0.9035248 1.2069855## 7 0.2215678 -0.7132577 -0.318050275 -0.3878782 -1.3206229 -1.5490909
Você pode criar um mapa de calor com ggplot para nos ajudar a destacar a diferença entre as categorias.
As cores padrão do ggplot precisam ser alteradas com a biblioteca RColorBrewer. Você pode usar a biblioteca conda e o código para iniciar no terminal:
conda install -cr r-rcolorbrewer
Para criar um mapa de calor, proceda em três etapas:
- Construa um quadro de dados com os valores do centro e crie uma variável com o número do cluster
- Remodele os dados com a função gather () da biblioteca tidyr. Você deseja transformar os dados extensos em longos.
- Crie a paleta de cores com a função colorRampPalette ()
Etapa 1) Construir um quadro de dados
Vamos criar o conjunto de dados de remodelagem
library(tidyr)# create dataset with the cluster numbercluster <- c(1: 7)center_df <- data.frame(cluster, center)# Reshape the datacenter_reshape <- gather(center_df, features, values, price_scal: trend_scal)head(center_reshape)
Resultado:
## cluster features values## 1 1 price_scal -0.6372457## 2 2 price_scal -0.1323863## 3 3 price_scal 0.8745816## 4 4 price_scal 1.0912296## 5 5 price_scal -0.8155183## 6 6 price_scal 0.8830191
Etapa 2) Remodele os dados
O código abaixo cria a paleta de cores que você usará para traçar o mapa de calor.
library(RColorBrewer)# Create the palettehm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
Etapa 3) Visualize
Você pode traçar o gráfico e ver a aparência dos clusters.
# Plot the heat mapggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) +scale_y_continuous(breaks = seq(1, 7, by = 1)) +geom_tile() +coord_equal() +scale_fill_gradientn(colours = hm.palette(90)) +theme_classic()
Resumo
Podemos resumir o algoritmo k-mean na tabela abaixo
Pacote |
Objetivo |
função |
argumento |
---|---|---|---|
base |
Train k-mean |
kmeans () |
df, k |
Cluster de acesso |
kmeans () $ cluster | ||
Centros de cluster |
kmeans () $ centros | ||
Cluster de tamanho |
kmeans () $ tamanho |