Portuguese (Português) translation by Erick Patrick (you can also view the original English article)
Análise estatística de dados ajuda-nos a entender informações como um todo. Ela tem aplicação em vários ampos, de bioestatística a análise de negócios.
Ao invés de passar por cada ponto de dados, apenas uma olhada em seu valor médio ou variança coletiva pode revelar tendências e recurso que talvez deixamos passar ao observar os dados crus. Também facilita a comparação de dois conjuntos de dados grandes.
Tendo isso em mente, Python provê-nos o módulo statistics.
Nesse tutorial, aprenderemos sobre as diferentes formas de calcular médias e calcular a dispersão de um conjunto de dados. A menos que dito o contrário, todas as funções do módulo aceitam conjuntos de dados de entrada de tipos int
, float
, decimal
e fraction
.
Calculando a Média
Podemos usar mean(data)
para calcular a média de algum conjunto. É calculada dividindo a soma de todos os valores pela quantidade deles. Se o conjunto é vazio, um erro StatisticsError será lançado. Eis alguns exemplos:
import statistics from fractions import Fraction as F from decimal import Decimal as D statistics.mean([11, 2, 13, 14, 44]) # returns 16.8 statistics.mean([F(8, 10), F(11, 20), F(2, 5), F(28, 5)]) # returns Fraction(147, 80) statistics.mean([D("1.5"), D("5.75"), D("10.625"), D("2.375")]) # returns Decimal('5.0625')
Aprendemos várias funções de geração de dados aleatórios no tutorial anterior. Usemo-nas para gerar nossos dados e ver se a média final bate com o que é esperado.
import random import statistics data_points = [ random.randint(1, 100) for x in range(1,1001) ] statistics.mean(data_points) # returns 50.618 data_points = [ random.triangular(1, 100, 80) for x in range(1,1001) ] statistics.mean(data_points) # returns 59.93292281437689
Com randint()
, espera-se que a média esteja próxima ao meio de ambos extremos e em um distribuição triangular, espera-se que esteja perto de min + high + moda / 3
. Assim, a média nos primeiro e segundo casos deve ser 50 e 60.33, respectivamente, o que é bem próximo do que obtemos.
Calculando a Moda
Média é um bom indicador de valor médio, mas alguns valores extremos podem resultar em uma média longe do valor central. Em alguns casos é desejável determinar o valor mais frequente num conjunto. mode()
retornará o valor mais comum de um conjunto numérico discreto bem como dados não numéricos. Essa a única função estatística que pode ser usada com valores não numéricos.
import random import statistics data_points = [ random.randint(1, 100) for x in range(1,1001) ] statistics.mode(data_points) # returns 94 data_points = [ random.randint(1, 100) for x in range(1,1001) ] statistics.mode(data_points) # returns 49 data_points = [ random.randint(1, 100) for x in range(1,1001) ] statistics.mode(data_points) # returns 32 mode(["cat", "dog", "dog", "cat", "monkey", "monkey", "dog"]) # returns 'dog'
A moda de inteiros gerados aleatoriamente pode ser qualquer número já que a frequência de cada valor é imprevisível. Os três exemplos acima provam isso. O último exemplo mostra como podemos calcular a moda de dados não numéricos.
Calculando a Mediana
Depender da moda para calcular o valor central pode ser um pouco ilusório. Como vimos na seção anterior, sempre será o valor mais popular, independente dos outros valores no conjunto. Outra forma de determinar o local central é usando median()
. Ela retornará a mediana de um conjunto numérico ao calcular a média de dois pontos médios, se necessário. Se a quantidade de valores for ímpar, retornará o valor do meio. Se for par, retornará a média dos valores centrais.
O "problema" com a median()
é que o valor final pode não ser um número do conjunto se a quantidade de dados for par. Nesses casos, podemo usar median_low()
ou median_high()
para calcular a mediana. Com um número ímpar de valores, essas funções retornará o menor e o maior valores entre os pontos centrais, respectivamente.
import random import statistics data_points = [ random.randint(1, 100) for x in range(1,50) ] statistics.median(data_points) # returns 53 data_points = [ random.randint(1, 100) for x in range(1,51) ] statistics.median(data_points) # returns 51.0 data_points = [ random.randint(1, 100) for x in range(1,51) ] statistics.median(data_points) # returns 49.0 data_points = [ random.randint(1, 100) for x in range(1,51) ] statistics.median_low(data_points) # returns 50 statistics.median_high(data_points) # returns 52 statistics.median(data_points) # returns 51.0
No último caso, o menor e maior médio eram 50 e 52. Isso significa que não havia valor de número 51 em nosso conjunto, mas a função median()
ainda calculou a média 51.0
Calculando a Dispersão dos Dados
Determinar o quanto os valores desviam do valor típico ou mediando de um conjunto é tão importante quanto calcular o valor central ou médio em si. O módulo statistics tem quatro funções diferentes para nos ajudar a calcular a dispersão.
Podemos usar pvariance(data, mu=None)
para calcular a variação da população de um conjunto.
O segundo argumento é opcional. O valor de mu, quando passado, deve ser igual à media do conjunto. A média é calculada automaticamente se não for passada. A função é útil quando queremos calcular a variação de uma população inteira. Se os dados são apenas uma amostra da população, podemos usar variance(data, xBar=None)
para calcular variança de exemplo. xBar é a média do exemplo dado e é calculada automaticamente se não for passada.
Para calcular o desvio padrão e desvio padrão de amostra de população, podemo usar pstdev(data, mu=None)
e stdev(data, xBar=None)
, respectivamente.
import statistics from fractions import Fraction as F data = [1, 2, 3, 4, 5, 6, 7, 8, 9] statistics.pvariance(data) # returns 6.666666666666667 statistics.pstdev(data) # returns 2.581988897471611 statistics.variance(data) # returns 7.5 statistics.stdev(data) # returns 2.7386127875258306 more_data = [3, 4, 5, 5, 5, 5, 5, 6, 6] statistics.pvariance(more_data) # returns 0.7654320987654322 statistics.pstdev(more_data) # returns 0.8748897637790901 some_fractions = [F(5, 6), F(2, 3), F(11, 12)] statistics.variance(some_fractions) # returns Fraction(7, 432)
Como evidente no exemplo acima, varianças menores implicam que vários valores estão próximos da média. Também podemos calcular o desvio padrão de decimais e frações.
Ideias Finais
Nesse último tutorial desta série, aprendemos sobre diferentes funções disponíveis no módulo statistics. Talvez tenhamos percebido que os dados passados para a função estão ordenados na maioria das vezes, mas não é preciso. Usamos listas ordenadas no tutorial para facilitar o entendimento de como o valor retornado por funções diferentes se relacionam à entrada.