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
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 :(
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. ;)