Estatística Descritiva em Java

Este artigo não têm o objetivo de abordar toda a estatística descritiva, e nem conseguiria ;), porém servirá de subsídio para sistemas mais complexos

Para uso em sistemas analíticos, concursos, mineração de dados etc...

Este artigo não têm o objetivo de abordar toda a estatística descritiva, e nem conseguiria ;), porém servirá de subsídio para sistemas mais complexos, pois mesmo sendo simples tem um desempenho surpreendente, devido as otimizações da jvm. Espero que gostem! ;).

Pré-Requisitos:

Testando a Classe

Ao executar a classe Client.java o resultado será o seguinte:

Listagem 01. Classe Client.java
public class Client { public static void main(String[] args) { //Instancia a classe utilitária Estatistica e = new Estatistica(); //seta valores do array double array[] = {4,5,6,2,6,1}; //para teste com 700000 mil valores, //array = new double[700000]; //Arrays.fill(array, 999); e.setArray(array); //Marca o início do tempo double t1 = System.currentTimeMillis(); //e.imprimeArray(); ////Cuidado com esta linha, pois se o array tiver milhoes de valores seu console vai encher //System.out.print("\n"+e.buscaPor(9)); System.out.print("\n mediana: "+ e.getMediana()); System.out.print("\n Soma Elementos: "+e.getSomaDosElementos()); System.out.print("\n Media Aritmética: "+e.getMediaAritmetica()); System.out.print("\n SomaDosElementosAoQuadrado: "+e.getSomaDosElementosAoQuadrado()); System.out.print("\n Variância Amostral: "+e.getVariancia()); System.out.print("\n Desvio Padrão: "+e.getDesvioPadrao()); System.out.print("\n Coeficiente Variação de Pearson: "+e.getPearson()); System.out.print("\n Moda: "+e.getModa()); System.out.print("\n Coeficiente de Assimetria: "+e.getCoefAssimetria()); //marca o fim do processamento double t2 = System.currentTimeMillis(); //exibe o tempo em segundos System.out.print("\n Tempo Total: "+ (t2-t1)/Double.valueOf(1000)+ " segundos"); } }

Percebam que o tempo de processamento num Pentium 4 com 512MB é desprezível, entretanto fiz um teste com um array de 700.000 elementos e demorou apenas 2.3 segundos :) , ao tentar com 7.000.000 minha máquina não deu conta por motivos de memória :(

A Listagem 02 abaixo apresento a classe Estatistica.java referenciada acima:
import java.util.Arrays; import java.util.HashMap; public class Estatistica { private double array[]; // Coeficiente de Variação de Pearson public double getPearson() { return (getDesvioPadrao() / getMediaAritmetica()) * 100; } public double getMediaAritmetica() { double total = 0; for (int counter = 0; counter < array.length; counter++) total += array[counter]; return total / array.length; } public double getSomaDosElementos() { double total = 0; for (int counter = 0; counter < array.length; counter++) total += array[counter]; return total; } public double getSomaDosElementosAoQuadrado() { double total = 0; for (int counter = 0; counter < array.length; counter++) total += Math.pow(array[counter], 2); return total; } public double getMediaAritmetica(double array[]) { double total = 0; for (int counter = 0; counter < array.length; counter++) total += array[counter]; return total / array.length; } public double getSomaDosElementos(double array[]) { double total = 0; for (int counter = 0; counter < array.length; counter++) total += array[counter]; return total; } public void ordenar() { Arrays.sort(array); } public void imprimeArray() { System.out.print("\nElementos do Array: "); for (int count = 0; count < array.length; count++) System.out.print(array[count] + " "); } // Array não pode conter valores duplicados public int buscaPor(int value) { return Arrays.binarySearch(array, value); } // Variância Amostral public double getVariancia() { double p1 = 1 / Double.valueOf(array.length - 1); double p2 = getSomaDosElementosAoQuadrado() - (Math.pow(getSomaDosElementos(), 2) / Double .valueOf(array.length)); return p1 * p2; } // Desvio Padrão Amostral public double getDesvioPadrao() { return Math.sqrt(getVariancia()); } public double getMediana() { this.ordenar(); int tipo = array.length % 2; if (tipo == 1) { return array[((array.length + 1) / 2) - 1]; } else { int m = array.length / 2; return (array[m - 1] + array[m]) / 2; } } public double getModa() { HashMap map = new HashMap(); Integer i; Double moda = 0.0; Integer numAtual, numMaior = 0; for (int count = 0; count < array.length; count++) { i = (Integer) map.get(new Double(array[count])); if (i == null) { map.put(new Double(array[count]), new Integer(1)); } else { map.put(new Double(array[count]), new Integer(i.intValue() + 1)); numAtual = i.intValue() + 1; if (numAtual > numMaior) { numMaior = numAtual; moda = new Double(array[count]); } } } // System.out.print("\n Eis o mapa: "+map.toString()); return moda; } public double getCoefAssimetria() { return (getMediaAritmetica() - getModa()) / getDesvioPadrao(); } public double[] getArray() { return array; } public void setArray(double[] array) { this.array = array; } }

Até a próxima. ;)

Artigos relacionados