Вступление
При работе с переменными при анализе данных всегда возникает вопрос: как переменные зависят, связаны и изменяются друг с другом? Меры ковариации и корреляции помогают в установлении этого.
Ковариация приводит к изменению переменных. Мы используем ковариацию, чтобы измерить, насколько две переменные меняются друг с другом. Корреляция показывает взаимосвязь между переменными. Мы используем корреляцию, чтобы определить, насколько сильно связаны две переменные друг с другом.
В этой статье мы узнаем, как рассчитать ковариацию и корреляцию в Python.
Ковариация и корреляция - простыми словами
И ковариация, и корреляция касаются взаимосвязи между переменными. Ковариация определяет направленную связь между переменными. Значения ковариации варьируются от -inf до + inf, где положительное значение означает, что обе переменные движутся в одном направлении, а отрицательное значение означает, что обе переменные движутся в противоположных направлениях.
Корреляция - это стандартизированная статистическая мера, которая выражает степень, в которой две переменные линейно связаны (то есть насколько они изменяются вместе с постоянной скоростью). Сила и направленность связи между двумя переменными определяются корреляцией, и она варьируется от -1 до +1. Подобно ковариации, положительное значение означает, что обе переменные движутся в одном направлении, тогда как отрицательное значение говорит нам, что они движутся в противоположных направлениях.
Как ковариация, так и корреляция являются жизненно важными инструментами, используемыми при исследовании данных для выбора признаков и многомерного анализа. Например, инвестор, стремящийся распределить риск портфеля, может искать акции с высокой ковариацией, поскольку это предполагает одновременное повышение их цен. Однако одного подобного движения недостаточно. Затем инвестор будет использовать метрику корреляции, чтобы определить, насколько сильно связаны цены этих акций друг с другом.
Настройка для кода Python - получение образцов данных
С основами, изученными в предыдущем разделе, давайте перейдем к
вычислению ковариации в python. В этом примере мы будем работать с
хорошо известным набором данных
Iris . Мы работаем только с setosa
чтобы быть конкретными, поэтому это будет всего лишь образец набора
данных о некоторых прекрасных фиолетовых
цветках !
Давайте посмотрим на набор данных, на котором мы будем проводить анализ:
{.ezlazyload}
Мы собираемся выбрать два столбца для нашего анализа - sepal_length
и
sepal_width
.
В новом файле Python (вы можете назвать его covariance_correlation.py
) давайте начнем с создания двух списков со значениями sepal_length
и
sepal_width
цветка:
with open('iris_setosa.csv','r') as f:
g=f.readlines()
# Each line is split based on commas, and the list of floats are formed
sep_length = [float(x.split(',')[0]) for x in g[1:]]
sep_width = [float(x.split(',')[1]) for x in g[1:]]
В науке о данных всегда помогает визуализировать данные, над которыми вы работаете. Вот график регрессии Сиборна ( диаграмма рассеяния + аппроксимация линейной регрессии) этих свойств сетосы на разных осях:
{.ezlazyload}
Визуально кажется, что точки данных имеют высокую корреляцию рядом с линией регрессии. Посмотрим, соответствуют ли наши наблюдения их значениям ковариации и корреляции.
Вычисление ковариации в Python
Следующая формула вычисляет ковариацию:
{.ezlazyload}
В приведенной выше формуле
- x ~i~ , y ~i~ - отдельные элементы серий x и y
- x̄, y̅ - математические средние рядов x и y
- N - количество элементов в серии
Знаменатель равен N
для всего набора данных и N - 1
в случае
выборки. Поскольку наш набор данных представляет собой небольшую выборку
всего набора данных Iris, мы используем N - 1
.
Используя математическую формулу, упомянутую выше в качестве нашей ссылки, давайте создадим эту функцию на чистом Python:
def covariance(x, y):
# Finding the mean of the series x and y
mean_x = sum(x)/float(len(x))
mean_y = sum(y)/float(len(y))
# Subtracting mean from the individual elements
sub_x = [i - mean_x for i in x]
sub_y = [i - mean_y for i in y]
numerator = sum([sub_x[i]*sub_y[i] for i in range(len(sub_x))])
denominator = len(x)-1
cov = numerator/denominator
return cov
with open('iris_setosa.csv', 'r') as f:
...
cov_func = covariance(sep_length, sep_width)
print("Covariance from the custom function:", cov_func)
Сначала мы находим средние значения наших наборов данных. Затем мы используем анализ списка, чтобы перебирать каждый элемент в наших двух сериях данных и вычитать их значения из среднего. Цикл for можно было бы использовать хорошо, если это ваше предпочтение.
Затем мы используем эти промежуточные значения двух рядов и умножаем их
друг на друга в другом понимании списка. Мы суммируем результат этого
списка и сохраняем его как numerator
. denominator
вычислить намного
проще, не забудьте уменьшить его на 1, когда найдете ковариацию для
выборочных данных!
Затем мы возвращаем значение, когда numerator
делится на его
denominator
, что приводит к ковариации.
Запуск нашего скрипта даст нам такой результат:
Covariance from the custom function: 0.09921632653061219
Положительное значение означает, что обе переменные движутся в одном направлении.
Расчет корреляции в Python
Наиболее широко используемой формулой для вычисления коэффициента корреляции является «r» Пирсона:
{.ezlazyload}
В приведенной выше формуле
- x ~i~ , y ~i~ - отдельные элементы серий x и y
- Числитель соответствует ковариации
- Знаменатели соответствуют отдельным стандартным отклонениям x и y.
Похоже, мы обсудили все, что нам нужно для корреляции в этой серии статей !
Теперь рассчитаем корреляцию:
def correlation(x, y):
# Finding the mean of the series x and y
mean_x = sum(x)/float(len(x))
mean_y = sum(y)/float(len(y))
# Subtracting mean from the individual elements
sub_x = [i-mean_x for i in x]
sub_y = [i-mean_y for i in y]
# covariance for x and y
numerator = sum([sub_x[i]*sub_y[i] for i in range(len(sub_x))])
# Standard Deviation of x and y
std_deviation_x = sum([sub_x[i]**2.0 for i in range(len(sub_x))])
std_deviation_y = sum([sub_y[i]**2.0 for i in range(len(sub_y))])
# squaring by 0.5 to find the square root
denominator = (std_deviation_x*std_deviation_y)**0.5 # short but equivalent to (std_deviation_x**0.5) * (std_deviation_y**0.5)
cor = numerator/denominator
return cor
with open('iris_setosa.csv', 'r') as f:
...
cor_func = correlation(sep_length, sep_width)
print("Correlation from the custom function:", cor_func)
Поскольку это значение требует ковариации двух переменных, наша функция в значительной степени снова вычисляет это значение. После вычисления ковариации мы вычисляем стандартное отклонение для каждой переменной. Отсюда корреляция - это просто деление ковариации на произведение квадратов стандартного отклонения.
Запустив этот код, мы получим следующий вывод, подтверждающий, что эти свойства имеют положительную (знак значения, либо +, -, или нет, если 0) и сильную (значение близко к 1) взаимосвязь:
Correlation from the custom function: 0.7425466856651597
Заключение
В этой статье мы подробно изучили два статистических инструмента: ковариацию и корреляцию. Мы узнали, что их значения означают для наших данных, как они представлены в математике и как реализовать их в Python. Обе эти меры могут быть очень полезны при определении отношений между двумя переменными.