Вопрос или проблема
У меня есть словарь следующей формы:
datetimes = {год : {имя : (оценка1, оценка2)}} # есть 50+ имен/год
Таким образом, по сути, я пытаюсь получить общее представление о том, как оценка1 в год_n коррелирует с оценкой2 в год_n.
Применение конкретной формулы корреляции зависит от типа данных (непрерывные или ранговые данные и т. д.). Учитывая, что ваши данные непрерывные, вы можете применить формулу Карла Пирсона. Однако, если вас интересуют причинно-следственные связи, вам может быть предпочтительнее использовать простую регрессионную модель.
Ответ или решение
Для вычисления временной корреляции между двумя переменными с учетом задержки, важно понять структуру ваших данных и подходящие статистические методы. В вашем случае, у вас есть словарь, представляющий данные в формате:
datetimes = {year: {name: (score1, score2)}}
Этот словарь содержит для каждого года набор имен, каждой из которых сопоставлены две оценки: score1
и score2
. Мы хотим выяснить, как score1
в год n
коррелирует с score2
в тот же год.
1. Подготовка данных
Первым шагом является преобразование данных в формат, который подойдет для вычисления корреляции. Это может быть сделано с помощью библиотеки pandas
. Например:
import pandas as pd
# Преобразование словаря в DataFrame
data = []
for year, names in datetimes.items():
for name, scores in names.items():
data.append([year, name, scores[0], scores[1]]) # score1 и score2
df = pd.DataFrame(data, columns=['Year', 'Name', 'Score1', 'Score2'])
Теперь у вас есть датафрейм с годами, именами и оценками.
2. Вычисление временной корреляции
Корреляцию можно вычислить с использованием метода .corr()
, который в pandas
применяет коэффициент корреляции Пирсона.
2.1 Простой подход
Если вы хотите получить корреляцию score1
и score2
за каждый год, вы можете сделать это следующим образом:
# Группировка по годам и вычисление корреляции
correlation = df.groupby('Year')[['Score1', 'Score2']].corr().iloc[0::2,-1]
print(correlation)
Этот код группирует данные по годам и вычисляет корреляцию для каждой группы.
3. Корреляция с временной задержкой
Если же необходимо вычислить корреляцию с учетом временных задержек, например score1
в год n
с score2
в год n-1
, вы можете использовать метод сдвига данных:
# Создаем сдвинутую версию Score2 на 1 год назад
df['Score2_lagged'] = df.groupby('Name')['Score2'].shift(1)
# Вычисляем корреляцию между Score1 и Score2_lagged
correlation_lagged = df[['Year', 'Score1', 'Score2_lagged']].dropna().groupby('Year').corr().iloc[0::2,-1]
print(correlation_lagged)
Таким образом, в результате получится таблица с корреляциями между score1
и score2
, при этом score2
будет с учетом задержки в один год.
4. Более сложные примеры
В зависимости от ваших аналитических потребностей, вы можете дальше анализировать данные, используя регрессионный анализ для проверки причинно-следственных связей. Для этого можно использовать statsmodels
:
import statsmodels.api as sm
# Настройка регрессионной модели
X = df['Score1']
Y = df['Score2_lagged']
X = sm.add_constant(X) # Добавление константы для свободного члена
model = sm.OLS(Y, X, missing='drop').fit()
print(model.summary())
Заключение
Корреляция является мощным инструментом для понимания взаимосвязей между переменными. Важно помнить, что большая корреляция не всегда означает причинную связь. Применяя вышеописанные методы, вы сможете получить полезные инсайты на основе ваших данных, что позволит лучше понять динамику score1
и score2
в зависимости от времени.