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

Вот почему в этой статье мы собираемся изучить основы статистики, используя всеми любимый язык программирования Python! Мы научимся анализировать, обобщать и описывать данные с помощью статистики.

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

И. Показатели центральной тенденции
1) Среднее арифметическое
2) Среднее геометрическое
3) Средневзвешенное
4) Медиана
5) Мода

II. Мера асимметрии
1) Асимметрия

III. Показатели изменчивости
1) Диапазон
2) Процентили
3) Межквартильный диапазон
4) Дисперсия
5) Стандартное отклонение
6) Коэффициент вариации
7) Среднее абсолютное отклонение
8) Стандартная ошибка среднего
9) Медианное абсолютное отклонение

IV. Показатели взаимосвязи
1) Ковариация
2) Корреляция Пирсона
3) Ранговая корреляция Спирмена
4) Ранговая корреляция Кендалла
5) V Крамера

Установка библиотек статистики в Python

Для проведения статистического анализа в Python вам потребуется набор библиотек и модулей:

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

Установите NumPy с PIP:

pip install numpy

Установите NumPy с помощью Conda:

conda install -c anaconda numpy

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

Установите SciPy с PIP:

pip install scipy

Установите SciPy с Conda:

conda install -c anaconda scipy

Pandas. Pandas — это библиотека Python для обработки и анализа данных. В частности, он предлагает структуры данных, такие как фреймы данных, которые очень полезны для статистического анализа.

Установите Панды с PIP:

pip install pandas

Установите Панды с Кондой:

conda install -c anaconda pandas

Модуль статистики Python. Модуль sстатистики предоставляет функции для вычисления математической статистики числовых данных. Это встроенный модуль Python.

Математический модуль Python. Модуль math предоставляет доступ к математическим функциям, которые мы можем использовать для математических задач. Это также встроенный модуль Python.

I. Меры центральной тенденции

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

1) Среднее арифметическое

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

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

Среднее арифметическое вручную:

x = [46, 35, 42, 16, 22, 49, 39, 3, 4, 11, 32, 19, 12, 26]
mean = sum(x) / len(x)
print(mean)

25.4285

Среднее арифметическое с модулем статистики Python:

import statistics as sts

x = [46, 35, 42, 16, 22, 49, 39, 3, 4, 11, 32, 19, 12, 26]
mean = sts.mean(x)
print(mean)

25.4285

Среднее арифметическое с помощью NumPy:

import numpy as np

x = [46, 35, 42, 16, 22, 49, 39, 3, 4, 11, 32, 19, 12, 26]
mean = np.mean(x)
print (mean)

25.4285

2) Среднее геометрическое

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

Среднее геометрическое "вручную":

values = [46, 35, 42, 16, 22, 49, 39, 3, 4, 11, 32, 19, 12, 26]
multiplier = 1
n = len(values)

for i in values:
    multiplier = (multiplier)*(i)

geometric_mean = (multiplier)**(1/n)
print(geometric_mean) 

19.4872

Среднее геометрическое с математическим модулем Python:

import math

x = [46, 35, 42, 16, 22, 49, 39, 3, 4, 11, 32, 19, 12, 26]
geometric_mean = math.prod(x) ** (1/len(x))
print(geometric_mean)

19.4872

Среднее геометрическое в SciPy:

from scipy.stats import gmean

x = [46, 35, 42, 16, 22, 49, 39, 3, 4, 11, 32, 19, 12, 26]
geometric_mean = gmean(x)
print(geometric_mean)

19.4872

3) Средневзвешенное значение

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

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

Среднее взвешенное "вручную":

values = [24, 12, 52]
weight = [2, 4, 1]

def weighted_mean(distribution, weights):
    numerator = sum([distribution[i]*weights[i] for i in range(len(distribution))])
    denominator = sum(weights)
    return (numerator/denominator)

result = weighted_mean(values, weight)
print(result)

21.1428

Среднее взвешенное с NumPy:

import numpy as np

values = [24, 12, 52]
weight = [2, 4, 1]

weighted_mean = np.average(values, weights=weight)
print(weighted_mean)

21.1428

4) Медиана

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

Чтобы вычислить медиану, точки данных в наборе данных должны быть сначала расположены в числовом порядке, от наименьшего к наибольшему. После заказа медиану можно найти, указав среднее значение в списке чисел. Если набор данных содержит нечетное количество значений, медиана — это просто среднее значение. Однако если набор данных содержит четное количество значений, медиана вычисляется как среднее двух средних значений.

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

Среднее значение "вручную":

x = [46, 35, 42, 16, 22, 49, 39, 3, 4, 11, 32, 19, 12, 26]

def median(dataset):
    dataset.sort()
    if len(dataset)%2 == 0:
        return (dataset[len(dataset)//2-1]+dataset[len(dataset)//2])/2
    else:
        return (dataset[len(dataset)//2])

result = median(x)
print(result)

24.0

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

import statistics as sts

x = [46, 35, 42, 16, 22, 49, 39, 3, 4, 11, 32, 19, 12, 26]
median = sts.median(x)
print(median)

24.0

Медиана с NumPy:

import numpy as np

x = [46, 35, 42, 16, 22, 49, 39, 3, 4, 11, 32, 19, 12, 26]
median = np.median(x)
print(median)

24.0

● Медиана максимума и медианы минимума с модулем статистики Python:

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

import statistics as sts

x = [1, 3, 8, 15]
median_low = sts.median_low(x)
median_high = sts.median_high(x)

print(f'low median: {median_low} | high median: {median_high}')

low median: 3 | high median: 8

5) Режим

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

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

● Режим "вручную":

def mode(List):
    counter = 0
    num = List[0]
     
    for i in List:
        current_frequency = List.count(i)
        if(current_frequency > counter):
            counter = current_frequency
            num = i
 
    return num
 
dataset = [45, 11, 65, 45, 85, 35, 35, 14, 45, 11, 65, 85]
dataset_mode = mode(dataset)
print(dataset_mode)

45

● Режим с модулем статистики Python:

import statistics as sts

x = [45, 11, 65, 45, 85, 35, 35, 14, 45, 11, 65, 85]
mode = sts.mode(x)
print(mode)

45

● Режим с SciPy:

from scipy import stats

x = [45, 11, 65, 45, 85, 35, 35, 14, 45, 11, 65, 85]
mode = stats.mode(x)
print(mode)

ModeResult(mode=array([45]), count=array([3])

● Несколько режимов с модулем статистики Python:

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

import statistics as sts

x = [1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 6, 7, 7, 8, 8, 8]
modes = sts.multimode(x)

print(f'All the modes: {modes}')
print(f'First mode: {min(modes)}')
print(f'Last mode: {max(modes)}')

All the modes: [1, 4, 6, 8]
First mode: 1
Last mode: 8

II. Мера асимметрии

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

1) Асимметрия

Асимметрия — наиболее распространенная мера асимметрии. Он дает информацию о степени асимметрии распределения вероятностей.

Коэффициент асимметрии момента Фишера определяет асимметрию переменной X, как и третий стандартизированный момент, определяемый как:

Существует три типа асимметрии:

  1. Асимметрия = 0 (нулевая асимметрия): набор данных является симметричным и нормально распределенным.
  2. Асимметрия › 0 (положительная асимметрия): данные сосредоточены в левом хвосте распределения.
  3. Асимметрия ‹ 0 (отрицательная асимметрия): данные сосредоточены в правой части распределения.

● Асимметрия с Pandas:
метод Pandas skew() возвращаетбеспристрастную асимметрию, нормализованную N-1.

import pandas as pd

data = [2, 8, 7, 9, 2, 7, 0, 4, 0, 4, 1, 9, 9, 9, 9, 8]
dataframe = pd.DataFrame(data=data)
skewness = dataframe.skew()
print(skewness)

-0.4533

● Асимметрия с SciPy:
функция SciPy’ skew вычисляет асимметрию как коэффициент асимметрии Фишера-Пирсона.

from scipy.stats import skew

data = [2, 8, 7, 9, 2, 7, 0, 4, 0, 4, 1, 9, 9, 9, 9, 8]
skewness = skew(data)
print(skewness)

-0.4096

Мы можем проверить эти результаты, визуализировав распределение данных с помощью Seaborn:

import seaborn as sns
sns.displot(x=data)

III. Меры изменчивости

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

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

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

1) Диапазон

Диапазон — это разница между самым высоким значением и самым низким значением набора данных.

Диапазон является общепринятой мерой изменчивости:
- Большой диапазон означает высокую изменчивость в наборе данных,
- Маленький диапазон означает низкую изменчивость в наборе данных.

● Диапазон "вручную":

data = [9, 2, 2.5, 5, 42, 6]
range = max(data) - min(data)
print(range)

40

● Диапазон с NumPy:

import numpy as np

data = [9, 2, 2.5, 5, 42, 6]
range = np.ptp(data)
print(range)

40

2) Процентили

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

Например, если ваш результат теста равен 65 из 100, его значимость зависит от процентиля, которому он соответствует. Если вы находитесь в 90-м процентиле, ваша успеваемость лучше, чем у 90% тех, кто прошел тест. Если вы находитесь в 20-м процентиле, ваши показатели ниже, чем у 80% тех, кто прошел тест.

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

● Процентили вручную и с помощью математического модуля Python:

import math
data = [3,5,1,9,6,7,2,6,3,7,4,8,10,1,5,9,7,8,8,8,10,2,1,6]

def percentile(input, percentile):
    size = len(input)
    return sorted(input)[int(math.ceil((size * percentile) / 100)) - 1]

percentile_25 = percentile(data, 25)
percentile_50 = percentile(data, 50)
percentile_75 = percentile(data, 75)
percentile_90 = percentile(data, 90)

print("25th percentile: ", percentile_25)
print("50th percentile: ", percentile_50)
print("75th percentile: ", percentile_75)
print("90th percentile: ", percentile_90)

25th percentile: 3
50th percentile: 6
75th percentile: 8
90th percentile: 9

● Процентили с NumPy:

import numpy as np

data = [3,5,1,9,6,7,2,6,3,7,4,8,10,1,5,9,7,8,8,8,10,2,1,6]

percentile_25 = np.percentile(data, 25)
percentile_50 = np.percentile(data, 50)
percentile_75 = np.percentile(data, 75)
percentile_90 = np.percentile(data, 90)

print("25th percentile: ",percentile_25)
print("50th percentile: ",percentile_50)
print("75th percentile: ",percentile_75)
print("90th percentile: ",percentile_90)

25th percentile: 3
50th percentile: 6
75th percentile: 8
90th percentile: 9

3) Межквартильный диапазон

Межквартильный размах (IQR) — это мера статистической дисперсии, которая представляет собой диапазон значений между первым и третьим квартилями набора данных.

Первый квартиль (Q1) представляет точку данных, которая больше или равна 25% точек данных, а третья квартиль (Q3) представляет точку данных, которая больше или равна 75% точек данных. IQR рассчитывается как разница между Q3 и Q1.

IQR полезен для определения разброса средних 50% точек данных. Таким образом, IQR можно рассматривать как надежную меру, на которую не сильно влияют выбросы.

● IQR с NumPy:

import numpy as np
  
data = [3,5,1,9,6,7,2,6,3,7,4,8,10,1,5,9,7,8,8,8,10,2,1,6]
  
# First quartile (Q1)
Q1 = np.percentile(data, 25)
  
# Third quartile (Q3)
Q3 = np.percentile(data, 75)
  
# Interquaritle range (IQR)
IQR = Q3 - Q1
  
print(IQR)

5

Другой способ получить IQR с помощью NumPy:

import numpy as np
  
data = [3,5,1,9,6,7,2,6,3,7,4,8,10,1,5,9,7,8,8,8,10,2,1,6]

IQR = np.subtract(*np.percentile(data, [75, 25]))

print(IQR)

5

● IQR с помощью SciPy:

from scipy.stats import iqr

data = [3,5,1,9,6,7,2,6,3,7,4,8,10,1,5,9,7,8,8,8,10,2,1,6]

IQR = iqr(data)
print(IQR) 

5

4) Дисперсия

Дисперсия — это еще одна мера изменчивости, измеряющая среднюю степень отклонения каждой точки данных от среднего значения в наборе данных.

Более высокая дисперсия указывает на то, что данные более широко распределены, тогда как более низкая дисперсия означает, что данные более плотно сгруппированы вокруг среднего значения.

Дисперсия рассчитывается путем получения среднего квадрата отклонений от среднего. Мы проводим различие между дисперсией генеральной совокупности и дисперсией выборки:
 – Дисперсия генеральной совокупности – это дисперсия, которая вычисляется на основе данных всей генеральной совокупности. Знаменатель в формуле дисперсии для выборочных данных – "n"
 – Выборочная дисперсия – это дисперсия, вычисляемая на основе подмножества генеральной совокупности. Знаменатель в формуле дисперсии для данных о населении равен «n-1».

● Отклонение "вручную":

x = [9, 2, 2.5, 5, 42, 6]

def variance(data, ddof=0):
    mean = sum(data) / len(data)
    deviations = [(xi-mean) ** 2 for xi in data]
    variance = sum(deviations) / (len(data) - ddof)
    return variance

sample_variance = variance(x, ddof=1)
population_variance = variance(x, ddof=0)

print(f'Sample variance: {sample_variance}')
print(f'Population variance: {population_variance}')

Sample variance: 235.841
Population variance: 196.534

● Расхождение с модулем статистики Python:

import statistics as sts

dataset = [9, 2, 2.5, 5, 42, 6]

sample_variance = sts.variance(dataset)
population_variance = sts.pvariance(dataset)

print(f'Sample variance: {sample_variance}')
print(f'Population variance: {population_variance}')

Sample variance: 235.841
Population variance: 196.534

● Разница с NumPy:

import numpy as np

x = [9, 2, 2.5, 5, 42, 6]

sample_variance = np.var(x, ddof=1)
population_variance = np.var(x)

print(f'Sample variance: {sample_variance}')
print(f'Population variance: {population_variance}')

Sample variance: 235.841
Population variance: 196.534

5) Стандартное отклонение

Стандартное отклонение — это квадратный корень из дисперсии. В отличие от дисперсии, которая выражается в квадратах, стандартное отклонение выражается в тех же единицах, что и исходные данные.

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

Подобно дисперсии, мы различаем стандартное отклонение выборки и стандартное отклонение совокупности:

● Стандартное отклонение "вручную":

x = [9, 2, 2.5, 5, 42, 6]

def stdeviation(data, ddof=0):
    mean = sum(data) / len(data)
    deviations = [(xi-mean) ** 2 for xi in data]
    variance = sum(deviations) / (len(data) - ddof)
    std = variance**(1/2)
    return std

sample_std = stdeviation(x, ddof=1)
population_std = stdeviation(x, ddof=0)

print(f'Sample std: {sample_std}')
print(f'Population std: {population_std}')

Sample std: 15.35
Population std: 14.01

● Стандартное отклонение с модулем статистики Python:

import statistics as sts

x = [9, 2, 2.5, 5, 42, 6]

sample_std = sts.stdev(x)
population_std = sts.pstdev(x)

print(f'Sample std: {sample_std}')
print(f'Population std: {population_std}')

Sample std: 15.35
Population std: 14.01

● Стандартное отклонение с NumPy:

import numpy as np

x = [9, 2, 2.5, 5, 42, 6]

sample_std = np.std(x, ddof=1)
population_std = np.std(x)

print(f'Sample std: {sample_std}')
print(f'Population std: {population_std}')

Sample std: 15.35
Population std: 14.01

6) Коэффициент вариации

Коэффициент вариации (CV) — это статистическая мера, представляющая отношение стандартного отклонения к среднему значению набора данных. Он выражается в процентах и ​​используется для измерения изменчивости набора данных относительно его среднего значения.

Более низкий CV указывает на более согласованный набор данных, а более высокий CV указывает на большую изменчивость.

● Коэффициент вариации "вручную":

x = [9, 2, 2.5, 5, 42, 6]

def stdeviation(data, ddof=0):
    mean = sum(data) / len(data)
    deviations = [(xi-mean) ** 2 for xi in data]
    variance = sum(deviations) / (len(data) - ddof)
    std = variance**(1/2)
    return std

mean = sum(x) / len(x)
std = stdeviation(x, ddof=0)

coefficient_variation = std/mean*100
print(f'Coefficient of variation: {coefficient_variation}')

Coefficient of variation: 126.48

● Коэффициент вариации с модулем статистики Python:

import statistics as sts

x = [9, 2, 2.5, 5, 42, 6]

coefficient_variation = sts.stdev(x) / sts.mean(x) * 100

print(f'Coefficient of variation: {coefficient_variation}')

Coefficient of variation: 126.48

● Коэффициент вариации с NumPy:

import numpy as np

x = [9, 2, 2.5, 5, 42, 6]

coefficient_variation = np.std(x) / np.mean(x) * 100

print(f'Coefficient of variation: {coefficient_variation}')

Coefficient of variation: 126.48

7) Среднее абсолютное отклонение

Среднее абсолютное отклонение (MAD) является статистической мерой изменчивости набора данных. Он рассчитывается как среднее абсолютных отклонений значений в наборе данных от их среднего значения.

● Среднее абсолютное отклонение вручную:

def absolute_mean_deviation(data):
    n = len(data)
    mean = sum(data) / n
    diff_sum = 0
    for x in data:
        if x >= mean:
            diff_sum += x - mean
        else:
            diff_sum += mean - x
    return diff_sum / n

x = [9, 2, 2.5, 5, 42, 6]
mad = absolute_mean_deviation(x)
print(f'Mean absolute deviation: {mad}')

Mean absolute deviation: 10.305

● Среднее абсолютное отклонение с помощью модуля статистики Python:

import statistics

def mean_absolute_deviation(data):
    mean = statistics.mean(data)
    abs_diff = [abs(x - mean) for x in data]
    mad = statistics.mean(abs_diff)
    return mad

x = [9, 2, 2.5, 5, 42, 6]
mad = mean_absolute_deviation(x)
print(f'Mean absolute deviation: {mad}')

Mean absolute deviation: 10.305

● Среднее абсолютное отклонение с помощью NumPy:

import numpy as np
  
data = [9, 2, 2.5, 5, 42, 6]
 
mad = np.mean(np.absolute(data - np.mean(data)))
print(f'Mean absolute deviation: {mad}')

Mean absolute deviation: 10.305

8) Стандартная ошибка среднего

Стандартная ошибка среднего (SEM) оценивает изменчивость выборки. Он измеряет, насколько вероятно среднее значение выборки данных от истинного среднего значения генеральной совокупности. Он показывает, насколько вероятны расхождения в среднем по выборке по сравнению со средним по генеральной совокупности.

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

● Стандартная ошибка среднего значения "вручную":

import math 

def standard_error_of_mean(data):
    n = len(data)
    mean = sum(data) / n
    deviations = [(x - mean) for x in data]
    variance = sum([d**2 for d in deviations]) / (n - 1)
    std_err = math.sqrt(variance / n)
    return std_err

x = [9, 2, 2.5, 5, 42, 6]
std_error_mean = standard_error_of_mean(x)
print(f'Standard error of the mean: {std_error_mean}')

Standard error of the mean: 6.2695

● Стандартная ошибка среднего с NumPy:

import numpy as np

x = [9, 2, 2.5, 5, 42, 6]
std_error_mean = np.std(x, ddof=1) / np.sqrt(np.size(x))
print(f'Standard error of the mean: {std_error_mean}')

Standard error of the mean: 6.2695

● Стандартная ошибка среднего в SciPy:

from scipy import stats

x = [9, 2, 2.5, 5, 42, 6]

std_error_mean = stats.sem(x, axis=0)
print(f'Standard error of the mean: {std_error_mean}')

Standard error of the mean: 6.2695

9) Среднее абсолютное отклонение

Среднее абсолютное отклонение (MAD) измеряет среднее расстояние между каждой точкой данных и медианой набора данных. MAD определяется как медиана абсолютных отклонений данных от медианы набора данных.

Меньшее значение MAD указывает на то, что точки данных имеют тенденцию быть ближе к медиане, в то время как большее значение MAD указывает на то, что точки данных более разбросаны от медианы.

● Среднее абсолютное отклонение "вручную":

def median_absolute_deviation(data):
    median = sorted(data)[len(data)//2]
    abs_deviations = [abs(x - median) for x in data]
    mad = sorted(abs_deviations)[len(data)//2]
    return mad

x = [9, 2, 2.5, 5, 42, 6]
mad = median_absolute_deviation(x)
print(f'Median absolute deviation: {mad}')

Median absolute deviation: 3.25

● Среднее абсолютное отклонение с помощью NumPy:

import numpy as np

def median_absolute_deviation(data):
    # Calculate the median of the dataset
    median = np.median(data)
    
    # Calculate the absolute deviations from the median
    abs_deviations = np.abs(data - median)
    
    # Calculate the median of the absolute deviations
    mad = np.median(abs_deviations)
    
    return mad

x = [9, 2, 2.5, 5, 42, 6]
mad = median_absolute_deviation(x)
print(f'Median absolute deviation: {mad}')

Median absolute deviation: 3.25

● Среднее абсолютное отклонение для SciPy:

from scipy import stats

x = [9, 2, 2.5, 5, 42, 6]
mad = stats.median_abs_deviation(data)
print(x)

Median absolute deviation: 3.25

IV. Меры отношения

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

Анализируя взаимосвязь между переменными, исследователи могут выявить закономерности или тенденции в своих данных и сделать выводы на основе силы и направления связи.

Наиболее распространенными мерами взаимосвязи являются ковариация, коэффициент корреляции Пирсона, ранговый коэффициент корреляции Спирмена и ранговый коэффициент корреляции Кендалла.

1) Ковариация

Ковариация — это мера степени, в которой две переменные изменяются вместе. Другими словами, он измеряет, насколько переменные перемещаются по отношению друг к другу.

Знак ковариации показывает тенденцию в линейной зависимости между двумя переменными:
› 0: две переменные движутся вместе
‹ 0: две переменные движутся в противоположных направлениях
= 0: две переменные независимы

● Ковариация "вручную":

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]

mean_x = sum(x) / len(x)
mean_y = sum(y) / len(y)

covariance = sum((x[i] - mean_x) * (y[i] - mean_y) for i in range(len(x))) / (len(x) - 1)

print(f'Covariance: {covariance}')

Ковариация: 63337,28

● Ковариация с NumPy:

import numpy as np

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]

covariance_sample = np.cov(x, y)
covariance_population = np.cov(x, y, bias=True)

print(f'Sample covariance: {covariance_sample}')
print(f'Population covariance: {covariance_population}')

Sample covariance: [[66638.14 63337.28] [63337.28 85562.23]]
Population covariance: [[57118.40 54289.10] [54289.10 73339.06]]

2) Коэффициент корреляции Пирсона

Коэффициент корреляции Пирсона — это статистическая мера, которая количественно определяет степень линейной зависимости между двумя переменными. Он рассчитывается как ковариация между двумя переменными, деленная на произведение их стандартных отклонений.

Коэффициент корреляции Пирсона варьируется от -1 до 1. Знак коэффициента указывает на направление связи, а абсолютное значение указывает на силу связи:
– Чем ближе коэффициент к -1, тем сильнее отрицательная линейная связь между переменными,
– Чем ближе коэффициент к 0, тем слабее линейная связь между переменными,
– Чем ближе коэффициент к 1, тем сильнее положительная линейная связь между переменные.

● Коэффициент корреляции Пирсона "вручную":

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]


mean_x = sum(x) / len(x)
mean_y = sum(y) / len(y)
std_x = (sum([(xi - mean_x) ** 2 for xi in x]) / len(x)) ** 0.5
std_y = (sum([(yi - mean_y) ** 2 for yi in y]) / len(y)) ** 0.5

# compute Pearson correlation coefficient
cov_xy = sum([(xi - mean_x) * (yi - mean_y) for xi, yi in zip(x, y)]) / len(x)
corr_xy = cov_xy / (std_x * std_y)

print("Pearson correlation coefficient:", corr_xy)

Pearson correlation coefficient: 0.838

● Коэффициент корреляции Пирсона с NumPy:

import numpy as np

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]

pears_corr_coef = np.corrcoef(x, y)
print(f'Pearson correlation coefficient: {pears_corr_coef}')

Pearson correlation coefficient: [[1. 0.838] [0.8387 1.]

● Коэффициент корреляции Пирсона с SciPy:

from scipy.stats import pearsonr

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]

corr  = pearsonr(x, y)
print(corr)

PearsonRResult(statistic=0.838, pvalue=0.0183)

3) Коэффициент ранговой корреляции Спирмена

Коэффициент ранговой корреляции Спирмена является мерой ранговой корреляции между двумя переменными. Он оценивает силу линейной зависимости между двумя переменными.

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

Коэффициент ранговой корреляции Спирмена находится в диапазоне от -1 до 1, где -1 указывает на полную отрицательную связь, 0 указывает на отсутствие связи и 1 указывает на полную положительную связь:
0 – 0,19 : очень слабый
0,20 — 0,39 : слабый
0,40 — 0,59 : умеренный
0,60 — 0,79 : сильный< br /> 0,80 — 1: очень сильный

● Коэффициент ранговой корреляции Спирмена "вручную":

def spearman_rank_correlation(x, y):
    n = len(x)
    x_rank = {xi: i+1 for i, xi in enumerate(sorted(set(x)))}
    y_rank = {yi: i+1 for i, yi in enumerate(sorted(set(y)))}
    rank_diff_squared = [(x_rank[x[i]] - y_rank[y[i]])**2 for i in range(n)]
    return 1 - (6*sum(rank_diff_squared))/(n*(n**2-1))

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]

spear_corr_coef = spearman_rank_correlation(x, y)
print("Spearman correlation coefficient: ", spear_corr_coef)

Spearman correlation coefficient: 0.8214

● Коэффициент ранговой корреляции Спирмена с SciPy:

from scipy import stats

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]

pears_corr_coef = stats.spearmanr(x, y)
print(pears_corr_coef)

SignificanceResult(statistic=0.8214, pvalue=0.02344)

● Коэффициент ранговой корреляции Спирмена с Pandas:

import pandas as pd

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]

s1 = pd.Series(x)
s2 = pd.Series(y)

spear_corr_coef = s1.corr(s2, method='spearman')
print("Spearman correlation coefficient: ", spear_corr_coef)

Spearman correlation coefficient: 0.8214

4) Ранговая корреляция Кендалла

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

Тест позволяет получить тау Кендалла (или τ Кендалла), который измеряет связь между двумя переменными:
– Если две переменные x и y зависимы, то τ = 1 или τ = -1.
– Если две переменные x и y независимы, то τ = 0.

Коэффициент ранговой корреляции Кендалла находится в диапазоне от -1 до +1, где:
-1 представляет полную отрицательную корреляцию,
0 представляет отсутствие корреляции,
+1 представляет собой идеальную положительную корреляцию.

● Ранговая корреляция Кендалла "вручную":

import math

def kendall_tau(x, y):
    concordant = 0
    discordant = 0
    ties = 0
    n = len(x)

    for i in range(n):
        for j in range(i+1, n):
            if x[i] == x[j] or y[i] == y[j]:
                ties += 1
            elif (x[i] < x[j] and y[i] < y[j]) or (x[i] > x[j] and y[i] > y[j]):
                concordant += 1
            else:
                discordant += 1

    return (concordant - discordant) / math.sqrt((concordant + discordant + ties) * (concordant + discordant + ties - 1) / 2)

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]

kend_corr_coef = kendall_tau(x, y)
print("Kendall rank correlation:", kend_corr_coef)

Kendall rank correlation: 0.6190

● Корреляция рейтинга Кендалла с SciPy:

from scipy import stats

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]

kend_corr_coef = stats.kendalltau(x, y)
print(kend_corr_coef)

SignificanceResult(statistic=0.6190, pvalue=0.0690)

● Корреляция рейтинга Кендалла с Pandas:

import pandas as pd

x = [355, 455, 964, 452, 478, 968, 744]
y = [251, 475, 863, 245, 630, 820, 963]

s1 = pd.Series(x)
s2 = pd.Series(y)

kend_corr_coef = s1.corr(s2, method='kendall')
print("Kendall rank correlation:", kend_corr_coef)

Kendall rank correlation: 0.6190

5) Крамер V

V Крамера — это мера связи между двумя номинальными переменными. Он выводится из статистики теста хи-квадрат и используется для определения силы связи между двумя переменными.

V Крамера варьируется от 0 до 1:
0 указывает на отсутствие связи,
1 указывает на полную связь.

Интерпретация коэффициента V Крамера аналогична интерпретации коэффициента фи: чем ближе значение к 1, тем сильнее связь между переменными.

● Крамер с SciPy и NumPy:

from scipy.stats.contingency import association
import numpy as np

table = np.array([[355, 455, 964, 452, 478, 968, 744], [251, 475, 863, 245, 630, 820, 963]])

cramer_v = association(table, method='cramer')

print("Cramer V: ", cramer_v)

Cramer V: 0.1286

Заключение

В этой статье я рассмотрел некоторые важные статистические концепции и методы, в том числе измерения центральной тенденции, изменчивости и взаимосвязи, и показал, как реализовать их в Python с использованием различных библиотек, таких как NumPy, SciPy и Pandas.

Я надеюсь, что эта статья помогла вам лучше понять статистику и то, как ее применять в Python, и я призываю вас продолжить обучение!