Agrupamento de dados mistos (numéricos e categóricos) em R

O principal problema de todos os algoritmos clássicos para análise de dados é sua baixa aplicabilidade a problemas práticos. Isso também se aplica a tarefas de cluster.





Em problemas reais (e também científicos), torna-se necessário agrupar dados de tipo misto - por exemplo, quando metade das variáveis ​​são numéricas e metade das variáveis ​​são categóricas.





Separadamente, essas tarefas são resolvidas de maneiras padrão (por exemplo, um artigo sobre agrupamento hierárquico de dados puramente categóricos - https://habr.com/ru/company/otus/blog/461741/ ), no entanto, resolvendo o problema de agrupamento os dados mistos apresentam algumas dificuldades, principalmente associadas à complexidade do cálculo da distância entre as observações.





Um momento de teoria

Os métodos existentes assumem o cálculo da distância para Gower usando a função margarida (margarida (método = "gower")) no pacote do cluster.





No entanto, de acordo com os criadores do pacote clustMixType , esse método não é aplicável ao processar grandes quantidades de dados e um método diferente é implementado em seu pacote.





Os fundamentos teóricos do método de agrupamento implementado foram desenvolvidos em 1999 no trabalho de Z. Huang. Extensões ao algoritmo k-means para agrupar grandes conjuntos de dados com variáveis ​​categóricas. Data Mining and Knowledge Discovery, 2: 283-304, 1998. doi: 10.1023 / A: 1009769707641. É chamado de método k-protótipos e é baseado na seguinte fórmula de distância:





Onde





Na verdade, a distância é calculada combinando a soma dos quadrados da diferença das variáveis ​​numéricas e a soma do número de classes incompatíveis nas variáveis ​​categóricas, multiplicada por algum parâmetro γ.





Assim, para a aplicação bem-sucedida deste método, dois parâmetros externos são necessários: k (o número de clusters) e γ (a importância das variáveis ​​categóricas; se γ = 0, então a distância é reduzida à distância euclidiana clássica)





De volta à prática





, (CollegeDistance AER). , :





score ( : )





fcollege ( : )





mcollege ( : )





urban ( : )





education ( : )





income ( : 25 000 ?)





# 
library(tibble)
library(clustMixType)
library(AER)
data("CollegeDistance")
glimpse(CollegeDistance)
XX<-CollegeDistance[,c(3,4,5,7,10,12,13)] #  
      
      







clus_2<-kproto(XX, k = 2) # k -  
      
      



RStudio :





, , 0 , γ 84.15475 ( ). clus_2 :





clus_2$cluster  #  ,    
clus_2$centers  # 
      
      



, , –





clus_2$size #  
      
      



:





library(wesanderson)
par(mfrow=c(4,2))
clprofiles(clus_2, XX, col = wes_palette("Royal1", 2, type = "continuous"))
      
      



, :





-





-





-





- .









table(XX$income, clus_2$cluster)
      
      



, 482 1790 , – 883 1584 .





– γ ( γ ). lambdaest





lambdaest(XX, num.method = 1, fac.method = 1, outtype = "vector")
      
      



– γ





– γ





Es <- numeric(10)
for(i in 1:10){
  kpres <- kproto(XX,lambda = c(0.01320599,3.03450559,4.21940823,2.79814318,0.18950893,0.31241193,2.43817959), k = i )
  Es[i] <- kpres$tot.withinss
}
plot(1:10, Es, type = "b", ylab = "Objective Function", xlab = "# Clusters",
     main = "Scree Plot")
      
      



, – 4 ( ; 6 9 – - ). :





Artigo original dos desenvolvedores do pacote clustMixType: https://journal.r-project.org/archive/2018/RJ-2018-048/RJ-2018-048.pdf








All Articles