обработка данных
April 28, 2023

Передовой способ вычисления взаимосвязи с библиотекой  phik

Раскрываемый в статье метод более универсален, чем другие, так как позволяется вычислять взаимосвязи между различными типами признаков (категориальными, непрерывными и их комбинациями), в нем используются передовые статистические методики и его легко применить с библиотекой phik.

Суть метода базируется на подсчете хи-квадрат статистики, затем ее трансформации в нечто подобное коэффициенту корреляции только на отрезке от 0 (нулевая взаимосвязь) до 1 (максимальная взаимосвязь). С этой целью разработчики считают аналогичную хи-квадрат статистику для различных значений корреляции p случайных величин из двумерного нормального распределения. Опуская нюансы, возвращается p двумерного распределения, соответствующее найденной хи-квадрат статистике между заданными признаками.

Для нахождения хи-квадрат статистики двумерного распределения значения разбиваются на площади, где для каждой находится совместная вероятность путем интегрирования плотности распределения:

Затем статистику хи-квадрат для заданного коэффициента взаимосвязи считают так:

Эта формула аналогична определению хи-квадрат статистики, о которой я рассказывал ранее (сумме квадратов разности между наблюдаемым и ожидаемым количеством точек в заданной области, деленных на ожидаемое количество в заданной области). То есть функция (2) позволяет по p найти хи-квадрат для двумерного нормального распределения.

Еще нам понадобится способ отображения (2) на диапазон значений хи-квадрат величин для исследуемых переменных. Этот способ базируется на статистической оценке минимальных и максимальных хи-квадрат значений, исходя из характеристик распределения - параметров таблицы совместной встречаемости, количестве исследуемых точек (N). В результате устанавливается следующее соответствие:

Для потенциальных хи-квадрат исследуемых переменных меньше оцененного минимума считаем p=0, остальные значения возрастают вплоть до посчитанного максимума (с увеличением p до 1):

Имея функцию (2), мы можем найти такое значение p, при котором масштабированная к заданному диапазону (3), становится равной наблюдаемому значению. Эта задача решается путем нахождения корня на отрезке от 0 до 1 для функции:

Резюмируя, алгоритм подсчета p=phi_k следующий:

  • Непрерывные признаки разбиваются на n равных отрезков (по умолчанию n=10);
  • Составляется таблица совместной встречаемости признаков и считаются ее показатели - хи-квадрат статистика, степени свободы, параметры таблицы;
  • Решается задача нахождения p двумерного нормального распределения на отрезке от 0 до 1, для которого масштабированная величина хи-квадрат (3) совпадает с полученной на предыдущем шаге. Результат принимается равным phi_k .

Теперь рассмотрим, как считать коэффициенты на практике. Для этого сгенерируем набор данных о продажах авто в трех областях с заданными вероятностями и ценами:

import numpy as np
import pandas as pd
np.random.seed(0)

autos_l = ['BMW', 'Mercedes', 'VOLGA', 'GEEP']
locations_l = ['Russia', 'Germany', 'USA']
prob_d = {'BMW':[0.2, 0.7, 0.1], 'Mercedes':[0.15, 0.75, 0.10], 
          'VOLGA':[0.99, 0.01,0], 'GEEP':[0.1, 0.3, 0.6]}
N=1000

autos = np.random.choice(autos_l, size=N)
locations = [np.random.choice(a=locations_l, p=prob_d[it]) for it in autos]
df = pd.DataFrame({'auto':autos, 'location':locations})

costs_d = pd.DataFrame([('GEEP', 'Russia', 10), ('GEEP', 'Germany', 25), ('GEEP', 'USA', 20),
                        ('BMW', 'Russia', 20), ('BMW', 'Germany', 20), ('BMW', 'USA', 30), 
                        ('Mercedes', 'Russia', 25), ('Mercedes', 'Germany', 25),
                        ('Mercedes', 'USA', 35), ('VOLGA', 'Russia', 5), ('VOLGA', 'Germany', 7),
                        ('VOLGA', 'USA', 10)], columns=['auto', 'location', 'cost'])\
                        .set_index(['auto', 'location'])['cost'].to_dict()

df['cost'] = df.apply(lambda x: tuple(x), axis=1).map(costs_d)

df.head(3)

Коэффициенты взаимосвязи считаются путем вызова метода phik_matrix:

import phik

df.phik_matrix()

Таблица отражает взаимосвязь между признаками, которую мы установили при генерации данных.

Непрерывные признаки разбиваются по бинам (по умолчанию на 10 равномерных частей). Однако это можно регулировать с аргументами interval_cols, в котором задается список колонок, и словаря bins, задающего для колонки число бинов или список границ:

df.phik_matrix(interval_cols=['cost'], bins={'cost':5})

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

Для сверки ее аналог можно получить вручную так:

df['cost_str'] = pd.cut(df['cost'], 5, labels=[1,2,3,4,5], ordered=False).astype(str)

df.groupby(['auto', 'cost_str']).size().unstack().fillna(0)

Для демонстрации качества нового подхода выведем коэффициент корреляции Пирсона между действительной переменной и ее квадратом, а также значение зависимости, устанавливаемое phik:

N = 1000
ar = np.random.randint(-100, 100, N)
display(pd.DataFrame({'ar':ar, 'ar2':ar**2}).corr())
(pd.DataFrame({'ar':ar, 'ar2':ar**2}).phik_matrix())

Как можно заметить, во втором случае связь диагностируется, в то время как корреляция Пирсона выводит близкое к нулю значение (разбирал ранее).

Полезные ссылки:

  1. Теория по phik;
  2. Сайт библиотеки;
  3. Блокнот с демонстрацией работы;
  4. Репозиторий phik;
  5. Определение взаимосвязи между категориальными величинами с хи-квадрат тестом;
  6. Корреляция Спирмена;
  7. Пример подсчета корреляции Пирсона вручную;
  8. Опасность применения корреляции Пирсона с данными, имеющими псевдоупорядоченность;
  9. Пример, когда корреляции Пирсона не работает.