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