Зачем маркетологу считать коэффициент корреляции Спирмена

Это незаконченная статья про интернет-маркетинг, и я перепишу ее, как будет больше данных. Как обычно поводом послужило полное отсутствие материала на русском и английском языках приминительно к данным веб-аналитики.

Если вы еще не разобрались, как считать коэффициент корреляции в Эксцеле, то у меня есть об этом видео на Ютубе. Коэффициент корреляции принимает значения от -1 до 1и записывается буквой:

r = [-1;1]

Если r = 1 это означает положительную линейную взаимосвязь. Если равен -1, то отрицательную линейную взаимосвязь. Если лежит в интервале от -0.3 до 0.3, то обычно считается, что никакой взаимосвязи нет или она очень слаба.

Данные о посещаемости, как обычно возьмем в live-demo Яндекс.Метрики по ссылке. Я поставил фильтр на посетителей из социальных сетей, добавил в метрики достижения всех целей (что бы было больше данных) и сгруппировал данные по дням.

Корреляции коэффициент в Excel рассчитывается по формуле:
Корреляции коэффициент в Excel рассчитывается по формуле:
=КОРРЕЛ(диапазон)
За одно посчитаем Отказы, Глубину и Время на сайте
За одно посчитаем Отказы, Глубину и Время на сайте

Тут Время на сайте в секундах я вычислил по формуле:

=ЧАС(ячейка)*3600+МИНУТЫ(ячейка)*60+СЕКУНДЫ(ячейка)

Иначе просто не считало, хотя вроде как должно все считать.

Как видим, между Визитами и Достижениями любой цели никакой взаимосвязи нет r=0,176384. Зато с Глубиной просмотра есть умеренная положительная связь, потому что лежит в диапазоне от 0,3 до 0,7. Или можно еще сказать, что взаимосвязь между Глубиной просмотра и достижением любой цели сильнее, чем с количеством визитов из соц. сетей.

А вот с Отказами никакой взаимосвязи обычно нет. Так, что если кто-то убеждает вашего начальника\клиента, что трафик на сайте не качественный, смело считайте ему коэффициент корреляции с Отказами и Числом визитом и предъявляйте, что чем больше на сайте визитов - тем больше конверсий (обычно это так).

А как быть с ситуацией, когда коэффициент корреляции то убывает, то возрастает? Например, что будет если посчитать его для синусойды:

Зачем маркетологу считать коэффициент корреляции Спирмена

Посмотрим, что происходит с корреляцией на синусоиде в долгосрочном периоде. Проведем симуляцию из 10 тыс. циклов:

В зависимости от точки начала функции коэффициент корреляции будет достигать положительной или отрицательной единицы, но в долгосрочной перспективе крутится вокруг нуля.
В зависимости от точки начала функции коэффициент корреляции будет достигать положительной или отрицательной единицы, но в долгосрочной перспективе крутится вокруг нуля.
Корреляция на синусойде затухает в диапазоне от -0.005 до 0.0125 и стремится к 0 на бесконечности.
Корреляция на синусойде затухает в диапазоне от -0.005 до 0.0125 и стремится к 0 на бесконечности.

Дальше можно было бы рассчитать коэффициент корреляции Спирмена в Эксцеле, но там это немного сложно реализовано, так что я возьму Питон:

import os import numpy as np import pandas as pd from dotenv import load_dotenv import matplotlib.pyplot as plt from tapi_yandex_metrika import YandexMetrikaStats # Загрузить переменные окружения из файла .env load_dotenv() # Получить значения переменных окружения METRICA_TOKEN = os.getenv("TOKEN") DIRECT_CLIENT_LOGINS = os.getenv("LOGIN") COUNTER_ID = "44147844" client = YandexMetrikaStats(access_token=METRICA_TOKEN) params = { "ids": COUNTER_ID, 'direct_client_logins': DIRECT_CLIENT_LOGINS, "date1": "2023-01-01", "date2": "2023-12-31", "metrics": "ym:s:visits,ym:s:sumGoalReachesAny", # Метрики "dimensions": "ym:s:date,ym:s:TrafficSource", # Группировки "filters": "ym:s:TrafficSource=='social'", # Фильтр по социальным сетям "sort": "ym:s:date", # Сортируем по дате "lang": "en", # Язык вывода ошибок "accuracy": "high", "limit": 10000, # Максимальное количество строк данных на странице отчета (по умолчанию 100) # https://tech.yandex.ru/metrika/doc/api2/api_v1/attrandmetr/dim_all-docpage/ - параметры тут } report = client.stats().get(params=params) df = pd.DataFrame(report().to_dicts(), columns=report.columns) df['ym:s:date'] = pd.to_datetime(df['ym:s:date']) # Преобразование колонки с датами в datetime df = df.set_index('ym:s:date')

Данные:

Так выглядит ДатаФрейм Пандас в Ноутбуке Вижал Студио Код
Так выглядит ДатаФрейм Пандас в Ноутбуке Вижал Студио Код

Коэффициент корреляции Пирсона рассчитывается по формуле:

df.corr(numeric_only=True)

Результат - корреляционная матрица:

ym:s:visits ym:s:sumGoalReachesAny ym:s:visits 1.000000 0.171775 ym:s:sumGoalReachesAny 0.171775 1.000000

Корреляция с самим собой всегда единица - образуется по диагонали. Т.е. между Визитами и Достижениями любой цели никакой взаимосвязи нет т.е. r=0.171775 (от значения r=0,176384 рассчитанного в Эксцеле это значение отличается тем, что данные по АПИ были выгружены немного иначе. Как выгрузить данные 1 в 1 немного выходит за рамки данной статьи).

Теперь рассчитаем коэфф. ранговой корреляции Спирмена, обычно обозначается буквой ρ (rho):

df.corr(method='spearman', numeric_only=True)

Получим значение ρ = 0.294311, что намекает на то, что нелинейная связь между переменными начинает нарастать. Воспользуемся лайфхаком, чтобы заполнить нулями пропущенные значения, т.е. добавим даты, в которых из соц. сетей не было кликов:

df = df.resample('d').sum()

И снова посчитаем оба коэффициента корреляции:

Коэффициент Пирсона = 0.221396 (что говорит об отсутствии связи)

Коэффициент Спирмена = 0.470609 (что говорит об умеренной связи)

Не пора ли взглянуть, а что мы выгрузили за данные? На самом деле давно пора:

Визуализация данных Я.Метрики в стандартной библиотеке Питона matplotlib.pyplot
Визуализация данных Я.Метрики в стандартной библиотеке Питона matplotlib.pyplot

Если пройтись по данным скользящим окном, то взаимосвязь станет значительно сильнее. Но, я подумал, что хватит натягивать сову на глобус и пора объяснить, а что же именно я только что посчитал, и что такое нелинейная взаимосвязь.

В терминологии ранговой корреляции Спирмена под нелинейной подразумевается любая монотонная функция отличная от y = kx + b. Т.е. для квадратичной, логарифмической, экспоненциальной и т.д. функций.

Снова посчитаем Пирсона и Спирмена, но для 1/4 синусоиды:

Зачем маркетологу считать коэффициент корреляции Спирмена

Теперь для квадратичной функции y = x**2:

Зачем маркетологу считать коэффициент корреляции Спирмена

Для логарифмической y = np.log(x):

Зачем маркетологу считать коэффициент корреляции Спирмена

И корреляция для экспоненциальной функции y=e^x:

Зачем маркетологу считать коэффициент корреляции Спирмена

Как видим, чем круче возрастает функция, тем больше разница между коэффициентами корреляции.

Теперь рассмотрим еще один пример из Википедии:

Коэффициент корреляции Спирмена менее чувствителен, чем коэффициент корреляции Пирсона, к сильным выбросам, которые находятся в хвостах обеих выборок. Это происходит потому, что ρ Спирмена ограничивает выброс значением его ранга.
Коэффициент корреляции Спирмена менее чувствителен, чем коэффициент корреляции Пирсона, к сильным выбросам, которые находятся в хвостах обеих выборок. Это происходит потому, что ρ Спирмена ограничивает выброс значением его ранга.

Пример из Википедии я не проверял, пока поверим авторам на слово, но отмечу, что коэфф. Спирмена довольно чувствителен к зашумленности в данных, так что если он приобретает высокое значение, что-то там нелинейное видимо есть.

Выводы:

1. Если вам не интересные нелинейные зависимости в данных, то ранговый коэффициент корреляции Спирмена можете не считать. Мне показались интересными нелинейные связи и я 2 дня потратил на подготовку статьи об этом.

2. Тем более, что в Пандас эти корреляции считаются одной строкой кода, что невозможно в Excel:

df.corr(method='pearson', numeric_only=True) df.corr(method='spearman', numeric_only=True) # С версии Pandas 2.0 numeric_only=False по умолчанию. Этот параметр отвечает за игноририрование строковых значений (таких как категориальные переменные) в данных.

3. В целом Pandas легко справляется с 1 миллионом строк в выгрузке данных, что делает его хорошей бесплатной альтернативной Эксцелью. И не нужно мучатся с конвертацией времени в секунды, т.к. по АПИ все это выгружается уже в секундах. Возможно, что эти факты вдохновит вас изучать Пандас.

4. Как я писал ранее, статья не является законченной. Надо бы еще изучить влияние заполнения пропусков и скользящие окна на коэффициенты корреляции.

5. Если корреляция Пирсона находится в дипазоне от -0.3 до 0.3, это не означает, что никакой корреляции нет, это значит, что линейная взаимосвязь не очень сильна.

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

Начать дискуссию