1. Code
  2. Python

Módulos Matemáticos em Python: Estatística

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.
Scroll to top
This post is part of a series called Mathematical Modules in Python.
Mathematical Modules in Python: Decimal and Fractions
Mathematical Modules in Python: Statistics

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:

1
import statistics
2
from fractions import Fraction as F
3
from decimal import Decimal as D
4
5
statistics.mean([11, 2, 13, 14, 44])
6
# returns 16.8

7
8
statistics.mean([F(8, 10), F(11, 20), F(2, 5), F(28, 5)])
9
# returns Fraction(147, 80)

10
11
statistics.mean([D("1.5"), D("5.75"), D("10.625"), D("2.375")])
12
# 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.

1
import random
2
import statistics
3
4
data_points = [ random.randint(1, 100) for x in range(1,1001) ]
5
statistics.mean(data_points)
6
# returns 50.618

7
8
data_points = [ random.triangular(1, 100, 80) for x in range(1,1001) ]
9
statistics.mean(data_points)
10
# 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.

1
import random
2
import statistics
3
4
data_points = [ random.randint(1, 100) for x in range(1,1001) ]
5
statistics.mode(data_points)
6
# returns 94

7
8
data_points = [ random.randint(1, 100) for x in range(1,1001) ]
9
statistics.mode(data_points)
10
# returns 49

11
12
data_points = [ random.randint(1, 100) for x in range(1,1001) ]
13
statistics.mode(data_points)
14
# returns 32

15
16
mode(["cat", "dog", "dog", "cat", "monkey", "monkey", "dog"])
17
# 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.

1
import random
2
import statistics
3
4
data_points = [ random.randint(1, 100) for x in range(1,50) ]
5
statistics.median(data_points)
6
# returns 53

7
8
data_points = [ random.randint(1, 100) for x in range(1,51) ]
9
statistics.median(data_points)
10
# returns 51.0

11
12
data_points = [ random.randint(1, 100) for x in range(1,51) ]
13
statistics.median(data_points)
14
# returns 49.0

15
16
data_points = [ random.randint(1, 100) for x in range(1,51) ]
17
statistics.median_low(data_points)
18
# returns 50

19
20
statistics.median_high(data_points)
21
# returns 52

22
23
statistics.median(data_points)
24
# 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.

1
import statistics
2
from fractions import Fraction as F
3
4
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
5
6
statistics.pvariance(data)     # returns 6.666666666666667

7
statistics.pstdev(data)        # returns 2.581988897471611

8
statistics.variance(data)      # returns 7.5

9
statistics.stdev(data)         # returns 2.7386127875258306

10
11
more_data = [3, 4, 5, 5, 5, 5, 5, 6, 6]
12
13
statistics.pvariance(more_data)   # returns 0.7654320987654322

14
statistics.pstdev(more_data)      # returns 0.8748897637790901

15
16
some_fractions = [F(5, 6), F(2, 3), F(11, 12)]
17
statistics.variance(some_fractions)
18
# returns Fraction(7, 432)

19

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.