Вопрос или проблема
У меня есть таблица данных о ежедневных значениях за последние 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. Всегда помните о возможности других факторов, которые могут оказывать влияние на ваши данные.