diff --git a/US10 - Analise Tendencia A Grupos.R b/US10 - Analise Tendencia A Grupos.R index ef5e1ef..f45fae3 100644 --- a/US10 - Analise Tendencia A Grupos.R +++ b/US10 - Analise Tendencia A Grupos.R @@ -1,60 +1,90 @@ # Codigo que calcula a tendencia de agrupamento dos dados -# Andrey Menezes - versão 2.0 (Fevereiro 2013) +# Andrey Menezes - vers�o 2.0 (Fevereiro 2013) -dados = read.csv("dados/TabelaParaPerfis.csv") -dados = dados[,2:6] +# Tabela normalizada e com as caracter�sticas correlatas eliminadas +dados = read.csv("dados/TabelaParaPerfisNormal.csv") +caracteristicas = dados[,-1] -library("FNN") +# Fun��es para calcular a estat�stica de hoopkins +intervalo.confianca<-function(dados, significancia = 0.05){ + tamanho = length(dados) + confianca = 1-(significancia/2) + desvio.padrao = sd(dados) + media = mean(dados) + erro <- qnorm(confianca)*desvio.padrao/sqrt(tamanho) + return(data.frame(media - erro, media + erro, media)) +} + +distancia = function(ponto1, ponto2){ + resultado = 0 + for (i in 1:ncol(ponto1)){ + resultado = resultado + ((ponto1[,i] - ponto2[,i])^2) + } + resultado = sqrt(resultado) +} + +ponto.mais.proximo = function(ponto, dados){ + distancia = distancia(ponto, dados[1,]) + for (i in 2:nrow(dados)){ + d = distancia(ponto, dados[i,]) + if (!(d==0) && d < distancia){ + distancia = d + } + } + return(distancia) +} -hopkins = function(dados, p, objetos, minimos) { +gerar.pontos = function(dados, tamanho){ + pontos = NA + for (i in 1:ncol(dados)){ + sample = sample(0:100, tamanho)/100 + pontos = cbind(pontos, sample) + } + pontos = pontos[,-1] + colnames(pontos) = colnames(dados) + return(pontos) + +} + +amostragem = function(dados, tamanho){ + sample = sample(nrow(dados), tamanho) + amostra = dados[sample,] +} + +hopkins = function(dados, n){ + amostra = amostragem(caracteristicas, n) + novos.pontos = as.data.frame(gerar.pontos(caracteristicas, n)) - amostra = sample(length(dados[,1]), size=p, replace = FALSE) + w = 0 + u = 0 - soma_w = 0 - for(i in 1:length(amostra)) { - soma_w = soma_w + minimos[i] + for (i in 1:n){ + w = w + ponto.mais.proximo(amostra[i,], dados) + u = u + ponto.mais.proximo(novos.pontos[i,], dados) } - soma_u = 0 - for(i in 1:length(objetos[,1])) { - dist = knnx.dist(as.matrix(dados),as.matrix(objetos),2,"kd_tree") - soma_u = sum(dist[,2]) - } - if(soma_u > 0) { - return(soma_u/(soma_u + soma_w)) - } else {return(0)} + hopkins = u/(u+w) } -hopkins.table = data.frame() - -#Calcula a menor distancia de cada linha da tabela para ser utilizado em hopkins -minimo = knn.dist(dados, k=1, algorithm="kd_tree") -stats = 0 - -# Monta a tabela com as estatísticas de hopkins -col=0 -for(n in 1:10) { - count=0 - col=col+1 - for(i in 1:(length(dados)-1)) { - for(e in (i+1):length(dados)) { - if(i != e) { - objetos = data.frame(runif(25, min(dados[,i]), max(dados[,i])), runif(25, min(dados[,e]), max(dados[,e]))) - parcial = hopkins(dados[,c(i,e)], 25, objetos, minimo) - if (parcial > stats) { - stats = parcial - atrib1 = i - atrib2 = e - } - count = count+1 - hopkins.table[col,count] = parcial - } +hopkins.para.combinacoes = function(caracteristicas, combinacoes){ + intervalos = NA + for (i in 1:ncol(combinacoes)){ + valores = 0 + for (j in 1:50){ + valor = hopkins(caracteristicas[combinacoes[,i],], 10) + valores = c(valores, valor) } + valores = valores[2:length(valores)] + ic = intervalo.confianca(valores) + + intervalos = rbind(intervalos, data.frame(Atributos=paste(colnames(caracteristicas[combinacoes[,i]]),collapse="+"), + Hopkins=ic)) } + + intervalos = intervalos[-1,] } +# -colnames(hopkins.table) = c("1_2", "1_3", "1_4", "1_5", "2_3", "2_4", "2_5", "3_4", "3_5", "4_5") +combinacoes = combn(ncol(caracteristicas),3) -png(filename="BoxSplot Tendencia Agrupamento.png") -boxplot(hopkins.table) -dev.off() \ No newline at end of file +intervalos = hopkins.para.combinacoes(caracteristicas, combinacoes) \ No newline at end of file