Estatística Descritiva em Java

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (5)  (0)

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:

1)    Java SE 5 (1.5) plenamente instalado e configurado

2)    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. ;)

 

Gostaria de ouvir seus comentários e críticas construtivas ;)

 

OBS: Este artigo, bem como o código-fonte, é de livre divulgação, desde que, citada a fonte.

 

Dave Fernandes – Analista Programador Java - UFPA

Blog: http://consubr.blogspot.com

Email: consubr@yahoo.com.br

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?