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:

  • Java SE 5 (1.5) plenamente instalado e configurado
  • Eclipse ou a IDE de sua Preferência

Testando a Classe

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

  • mediana: 4.5
  • Soma Elementos: 24.0
  • Media Aritmética: 4.0
  • SomaDosElementosAoQuadrado: 118.0
  • Variância Amostral: 4.4
  • Desvio Padrão: 2.0976176963403033
  • Coeficiente Variação de Pearson: 52.44044240850758
  • Moda: 6.0
  • Coeficiente de Assimetria: -0.9534625892455922
  • Tempo Total: 0.0 segundos
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. ;)