Existe um algoritmo para estimar a mediana, modo, assimetria e / ou curtose de um conjunto de valores, mas isso NÃO exige o armazenamento de todos os valores na memória de uma vez?
Eu gostaria de calcular as estatísticas básicas:
- média: média aritmética
- variância: média dos desvios quadrados da média
- desvio padrão: raiz quadrada da variância
- mediana: valor que separa a metade maior dos números da metade menor
- modo: valor mais frequente encontrado no conjunto
- assimetria: tl; dr
- curtose: tl; dr
A fórmula básica para calcular qualquer um desses é a aritmética do ensino fundamental, e eu as conheço. Existem muitas bibliotecas de estatísticas que as implementam também.
Meu problema é o grande número (bilhões) de valores nos conjuntos que estou lidando: Trabalhando em Python, não posso simplesmente fazer uma lista ou hash com bilhões de elementos. Mesmo se eu escrever isso em C, os arrays de bilhões de elementos não são muito práticos.
Os dados não são classificados. É produzido aleatoriamente, em tempo real, por outros processos. O tamanho de cada conjunto é altamente variável e os tamanhos não serão conhecidos com antecedência.
Já descobri como lidar muito bem com a média e a variância, iterando cada valor no conjunto em qualquer ordem. (Na verdade, no meu caso, eu os considero na ordem em que são gerados.) Aqui está o algoritmo que estou usando, cortesia http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm :
- Inicialize três variáveis: count, sum e sum_of_squares
- Para cada valor:
- Contagem de incremento.
- Adicione o valor à soma.
- Adicione o quadrado do valor a sum_of_squares.
- Divida a soma pela contagem, armazenando como a média variável.
- Divida sum_of_squares por count, armazenando como a variável mean_of_squares.
- Média quadrada, armazenando como quadrada_de_média.
- Subtraia square_of_mean de mean_of_squares, armazenando como variância.
- Média e variação da saída.
Este algoritmo "on-line" tem pontos fracos (por exemplo, problemas de precisão, pois sum_of_squares cresce rapidamente além do intervalo inteiro ou precisão flutuante), mas basicamente me dá o que preciso, sem ter que armazenar todos os valores em cada conjunto.
Mas não sei se existem técnicas semelhantes para estimar as estatísticas adicionais (mediana, modo, assimetria, curtose). Eu poderia conviver com um estimador tendencioso, ou mesmo um método que comprometa a precisão até certo ponto, desde que a memória necessária para processar N valores seja substancialmente menor que O (N).
Indicar uma biblioteca de estatísticas existente também ajudará se a biblioteca tiver funções para calcular uma ou mais dessas operações "on-line".