Привет! Вы когда-нибудь задумывались, как специалисты по обработке и анализу данных понимают все данные, с которыми они работают? Ну, статистический анализ - большая часть этого! На самом деле, без хорошего понимания статистики легко потеряться в море данных и в конечном итоге сделать ложные выводы.
Вот почему в этой статье мы собираемся изучить основы статистики, используя всеми любимый язык программирования 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, как и третий стандартизированный момент, определяемый как:
Существует три типа асимметрии:
- Асимметрия = 0 (нулевая асимметрия): набор данных является симметричным и нормально распределенным.
- Асимметрия › 0 (положительная асимметрия): данные сосредоточены в левом хвосте распределения.
- Асимметрия ‹ 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, и я призываю вас продолжить обучение!