Статьи

Математические модули в Python: статистика

Статистический анализ данных помогает нам разобраться в информации в целом. Это находит применение во многих областях, таких как биостатистика и бизнес-аналитика.

Вместо того, чтобы просматривать отдельные точки данных, просто один взгляд на их общее среднее значение или дисперсию может выявить тенденции и особенности, которые мы могли бы упустить, наблюдая за всеми данными в необработанном формате. Это также делает сравнение двух больших наборов данных более простым и значимым.

Помня об этих потребностях, Python предоставил нам модуль статистики .

В этом руководстве вы узнаете о различных способах расчета средних значений и измерения разброса заданного набора данных. Если не указано иное, все функции в этом модуле поддерживают наборы данных типа int , float , decimal и fraction качестве входных данных.

Вы можете использовать функцию mean(data) для вычисления среднего значения некоторых данных. Он рассчитывается путем деления суммы всех точек данных на количество точек данных. Если данные пусты, будет вызвано StatisticsError . Вот несколько примеров:

01
02
03
04
05
06
07
08
09
10
11
12
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’)

Вы узнали о множестве функций для генерации случайных чисел в нашем последнем уроке . Давайте использовать их сейчас, чтобы сгенерировать наши данные и посмотреть, равно ли окончательное среднее значение тому, что мы ожидаем.

01
02
03
04
05
06
07
08
09
10
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

С помощью функции randint() среднее значение должно быть близко к средней точке обеих крайностей, а с треугольным распределением оно должно быть близко к low + high + mode / 3 . Следовательно, среднее значение в первом и втором случае должно составлять 50 и 60,33 соответственно, что близко к тому, что мы фактически получили.

Среднее значение является хорошим показателем среднего значения, но некоторые экстремальные значения могут привести к тому, что среднее значение будет далеко от фактического центрального положения. В некоторых случаях более желательно определить наиболее частую точку данных в наборе данных. Функция mode() возвращает наиболее распространенную точку данных из дискретных числовых и нечисловых данных. Это единственная статистическая функция, которую можно использовать с нечисловыми данными.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
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’

Режим случайно сгенерированных целых чисел в данном диапазоне может быть любым из этих чисел, так как частота появления каждого числа непредсказуема. Три примера в приведенном выше фрагменте кода подтверждают это. Последний пример показывает нам, как мы можем рассчитать режим нечисловых данных.

Использование режима вычисления центрального значения может быть немного обманчивым. Как мы только что видели в предыдущем разделе, это всегда будет самая популярная точка данных, независимо от всех других значений в наборе данных. Другой способ определения центрального местоположения — использование функции median() . Он вернет среднее значение заданных числовых данных, вычислив среднее значение двух средних точек, если это необходимо. Если количество точек данных нечетное, возвращается средняя точка. Если число точек данных четное, возвращается среднее значение двух медианных значений.

Проблема с функцией median() состоит в том, что конечное значение может не являться фактической точкой данных, когда число точек данных является четным. В таких случаях вы можете использовать median_low() или median_high() для вычисления медианы. При четном количестве точек данных эти функции будут возвращать меньшее и большее значение двух средних точек соответственно.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

В последнем случае медиана низкой и высокой составляла 50 и 52. Это означает, что в нашем наборе данных не было точки данных со значением 51, но функция median() все еще рассчитывала медиану, равную 51,0.

Определение отклонения точек данных от типичного или среднего значения набора данных так же важно, как и вычисление самого центрального или среднего значения. Модуль статистики имеет четыре различные функции, которые помогают нам рассчитать этот разброс данных.

Вы можете использовать pvariance(data, mu=None) чтобы вычислить дисперсию совокупности данного набора данных.

Второй аргумент в этом случае является необязательным. Значение mu , если оно указано, должно быть равно среднему значению данных. Среднее значение рассчитывается автоматически, если значение отсутствует. Эта функция полезна, когда вы хотите вычислить дисперсию всей совокупности. Если ваши данные являются только выборкой совокупности, вы можете использовать функцию variance(data, xBar=None) для расчета выборочной дисперсии. Здесь xBar является средним для данного образца и вычисляется автоматически, если не указано иное .

Чтобы рассчитать стандартное определение совокупности и выборочное стандартное отклонение, вы можете использовать функции pstdev(data, mu=None) и stdev(data, xBar=None) соответственно.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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)

Как видно из приведенного выше примера, меньшая дисперсия означает, что большее количество точек данных ближе по значению к среднему. Вы также можете рассчитать стандартное отклонение десятичных дробей и дробей.

В этом последнем уроке этой серии мы узнали о различных функциях, доступных в модуле статистики . Возможно, вы заметили, что данные, переданные функциям, были отсортированы в большинстве случаев, но это не обязательно. Я использовал отсортированные списки в этом уроке, потому что они облегчают понимание того, как значение, возвращаемое различными функциями, связано с входными данными.