Как правильно вычислить коэффициент корреляции значения столбца из таблицы в Python 3?

Вопрос или проблема

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

id продуктивность итого_часов часов_программирования температура давление влажность шаги танцевальность энергия громкость темп
1 31 13.38 2.6 9.06 1011.0 53.0 0 0.716 0.759 -7.181 105.015
2 65 11.35 5.14 6.78 1012.0 65.0 0 0.908 0.669 -2.827 112.238
3 0 0.0 0.0 0.0 0.0 0.0 0 0.0 0.0 0.0 0.0
4 56 13.57 3.85 8.87 1000.0 68.0 0 0.776 0.697 -6.594 92.548
5 43 11.71 2.12 6.22 1011.0 72.0 0 0.662 0.609 -11.422 127.934
6 64 12.52 5.05 7.54 1021.0 68.0 0 0.276 0.739 -8.851 79.8
7 41 9.67 2.28 5.41 1019.0 67.0 0 0.0 0.0 0.0 0.0
8 56 12.15 2.81 5.58 1018.0 70.0 4825 0.647 0.844 -3.756 146.967
9 44 12.37 0.03 3.79 1028.0 75.0 5350 0.0 0.0 0.0 0.0
10 45 7.7 0.01 4.29 1030.0 77.0 1597 0.399 0.761 -6.318 140.084
11 34 10.19 1.23 2.22 1029.0 53.0 2171 0.399 0.761 -6.318 140.084

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

import pandas as pd
from io import StringIO
from scipy.stats.stats import pearsonr

csv_str = """1,31,13.38,2.6,9.06,1011.0,53.0,0,0.716,0.759,-7.181,105.015
2,65,11.35,5.14,6.78,1012.0,65.0,0,0.908,0.669,-2.827,112.238
3,0,0.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0
4,56,13.57,3.85,8.87,1000.0,68.0,0,0.776,0.697,-6.594,92.548
5,43,11.71,2.12,6.22,1011.0,72.0,0,0.662,0.609,-11.422,127.934
6,64,12.52,5.05,7.54,1021.0,68.0,0,0.276,0.739,-8.851,79.8
7,41,9.67,2.28,5.41,1019.0,67.0,0,0.0,0.0,0.0,0.0
8,56,12.15,2.81,5.58,1018.0,70.0,4825,0.647,0.844,-3.756,146.967
9,44,12.37,0.03,3.79,1028.0,75.0,5350,0.0,0.0,0.0,0.0
10,45,7.7,0.01,4.29,1030.0,77.0,1597,0.399,0.761,-6.318,140.084
11,34,10.19,1.23,2.22,1029.0,53.0,2171,0.399,0.761,-6.318,140.084"""

csv_io = StringIO(csv_str)
col_names = ['id', 'продуктивность','итого_часов','часов_программирования','температура','давление','влажность','шаги','танцевальность','энергия','громкость','темп']
df = pd.read_csv(csv_io, sep=",", header=None,names=col_names)

column_name = "продуктивность"
res = df[df.columns].corr(method="pearson", min_periods=10)[column_name][:]
# min_periods == минимальное количество для учета?
print(res)
# id              0.107193
# продуктивность    1.000000
# итого_часов     0.766020
# часов_программирования     0.714475
# температура            0.667112
# давление        0.784574
# влажность        0.829126
# шаги       0.118479
# танцевальность    0.496831
# энергия          0.516037
# громкость       -0.317449
# темп           0.418411
# Name: продуктивность, dtype: float64

Как я могу быть уверен, что, например, индекс корреляции “влажности” 0.82 является валидным? Что влажный воздух может как-то способствовать моей продуктивности, улучшает кровообращение в мозге или что-то в этом роде? Или это просто корреляция и не имеет никакой ценности? Индекс корреляции 0.82 кажется действительно высоким числом, но могу ли я основывать свои решения на этом, когда у меня всего 2 года данных (около 720 точек данных)? Что это на самом деле означает? Как я могу использовать p-значение для проверки валидности? Как я должен интерпретировать результат, разве что-то выше индекса корреляции 0.5 не является безумно высоким?

Прежде всего, важно понять, что означает вывод .corr(). Значение, которое вы получаете, это корреляция между столбцами. Другими словами, вы проверяете, насколько сильно взаимосвязь. Однако это не имеет ничего общего с причинностью. Вы упомянули, что “влажный воздух может способствовать моей продуктивности”. Это неверное утверждение. То, что вы знаете, так это то, что исходя из ваших данных, всякий раз, когда был высокий показатель влажного воздуха, у вас также была высокая продуктивность. Но нет абсолютно никакой связи с фактической причинностью.

Я бы посоветовал вам прочитать эту статью, чтобы лучше понять эту концепцию https://en.wikipedia.org/wiki/Correlation_does_not_imply_causation

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

Ответ или решение

Чтобы правильно вычислить коэффициент корреляции для столбца данных в таблице с использованием Python 3, вам понадобится использовать библиотеку Pandas для обработки данных и SciPy для статистического анализа. Рассмотрим пошагово, как это сделать, а также обсудим важные аспекты, такие как валидность корреляции и использование p-value.

1. Установка необходимых библиотек

Убедитесь, что у вас установлены необходимые библиотеки. Вы можете установить их с помощью следующих команд:

pip install pandas scipy

2. Подготовка данных

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

import pandas as pd
from io import StringIO

csv_str = """1,31,13.38,2.6,9.06,1011.0,53.0,0,0.716,0.759,-7.181,105.015
2,65,11.35,5.14,6.78,1012.0,65.0,0,0.908,0.669,-2.827,112.238
3,0,0.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0
...
11,34,10.19,1.23,2.22,1029.0,53.0,2171,0.399,0.761,-6.318,140.084"""

csv_io = StringIO(csv_str)
col_names = ['id', 'productivity','total_hours','swdev_hours','temp','pressure','humidity','fit_steps','danceability','energy','loudness','tempo']
df = pd.read_csv(csv_io, sep=",", header=None, names=col_names)

3. Вычисление корреляции

Для вычисления коэффициента корреляции между столбцем «productivity» и другими переменными используйте метод corr():

column_name = "productivity"
correlation_matrix = df.corr(method="pearson")
correlation_with_productivity = correlation_matrix[column_name]
print(correlation_with_productivity)

Метод min_periods=10 в методе corr() указывает минимальное количество не-NaN значений для расчета корреляции. Если у вас есть пропуски, это предотвратит их влияние на расчет.

4. Интерпретация результатов

Результат correlation_with_productivity покажет, насколько сильно коррелируют «productivity» и остальные столбцы. Например, результат 0.82 с «humidity» указывает на сильную положительную корреляцию. Это означает, что с увеличением влажности продуктивность также имеет тенденцию к увеличению.

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

5. Проверка значимости с p-value

Для проверки значимости корреляции следует использовать тест, который предоставит p-value. В Python это можно сделать следующим образом:

from scipy.stats import pearsonr

# Пример для humidity
corr_coefficient, p_value = pearsonr(df['productivity'], df['humidity'])
print(f"Корреляция: {corr_coefficient}, p-value: {p_value}")

6. Интерпретация p-value

  • p-value < 0.05: корреляция статистически значима.
  • p-value ≥ 0.05: корреляция может быть случайной.

Высокий коэффициент корреляции (например, 0.82) может быть значимым, особенно если p-value < 0.05. Однако это не доказывает, что одна переменная вызывает изменение другой.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...