Корреляционный анализ или Почему существуют странные корреляции

На данный опус меня навела публикация «Деньги, товар и немного статистики. Часть вторая», в которой автор исследовал зависимости между ценами на различные товары. Несколько смутило то, что несмотря на мастерское обращение с MatLab'ом, автор ни разу не упомянул об уровне значимости полученных корреляций. Ведь, связь между двумя величинами может и существовать, но если она статистически не значима, говорить о ней мы можем лишь в контексте рассуждений и домыслов.

Пощупать данные «руками» долго не получалось, но вот выдался свободный час, и я, вооружившись R, двинулся в путь.

d = read.csv("data.csv", sep = ";") # загружаем данные
names(d) <- c("time","oil", "gold", "iron", "logs", "maize", "beef",
              "chicken", "gas", "liquid_gas", "tea", "tobacco", "wheat", "sugar", "soy", "silver",
              "rice", "platinum", "cotton", "copper", "coffee", "coal", "aluminum") # присваиваем удобочитаемые имена

# в своем посте автор использовал среднее геометрическое (СГ) - я пошел проторенной им тропой.
# так как в базовой комплектации R нет функции для расчета СГ, набросал свою:
gm_mean = function(x, na.rm=TRUE){
  exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x)) }

d.gm = apply(d[,2:23], 2, gm_mean) # получаем значение СГ для всех групп товаров
d.t = d[,2:23]/d.gm # получаем относительные цены
apply(d.t, 2, shapiro.test) # проверяем нормальность распределения
cor.m = cor(d.t, method = "spearman") # строим корреляционную матрицу


Немаловажный момент — распределение нормированных цен на все товары отличалось от нормального (р-значение для критерия Шапиро-Уилка значительно меньше 0.001), что неумолимо приводит нас к тому, что использование относительно «доброго» для поиска взаимосвязей коэффициента корреляции Пирсона не представляется возможным. К счастью, существует его непараметрический аналог — тест Спирмена.

Итак, корреляционная матрица получена. Взглянем на нее:

Piccy.info - Free Image Hosting

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

out <- data.frame(X1 = rownames(cor.m)[-1],
                  X2 = head(colnames(cor.m), -1),
                  Value = cor.m[row(cor.m) == col(cor.m) + 1])

for(x in 1:length(out$X1)) {
  print(
    cor.test(
      d.t[as.character(out[x,1])][[1]],
      d.t[as.character(out[x,2])][[1]],
      method = "sp")$p.value)
  }


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

1 gold oil 0.2451402
2 iron gold 0.2503873
3 logs iron 0.2446200
4 maize logs 0.2547667
5 beef maize 0.2398418
6 chicken beef 0.2385301
7 gas chicken 0.2481030
8 liquid_gas gas 0.2544752
9 tea liquid_gas 0.2367907
10 tobacco tea 0.2416664
11 wheat tobacco 0.2553935
12 sugar wheat 0.2505641
13 soy sugar 0.2440920
14 silver soy 0.2589974
15 rice silver 0.2403048
16 platinum rice 0.2418105
17 cotton platinum 0.2343923
18 copper cotton 0.2498545
19 coffee copper 0.2321891
20 coal coffee 0.2482226
21 aluminum coal 0.2423581


Как видим, полученные rho не превышают 0.3, что указывает на слабую силу связи (согласно шкале Чеддока). Фактически, оперировать такими данными можно, но всегда нужно понимать, что колебания цен одного товара будет не боле чем на 10% сказываться на цене своего «партнера» по корреляции.

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

Спасибо jatx за то, что дал повод поиграть с цифрами!
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 16

    0
    Подозрительно, что матрица корреляции выглядит как циркулянт.
      0
      По правде сказать, что такое «циркулянт» не знал. Но википедия помогла, и теперь я могу предположить, что матрица корреляции скорее похожа на антициркулянт. Правда, что-либо подозрительное не обнаружил.
        +1
        Мне вот непонятно, почему корреляции между товарами со смещением 6 одинаковы:
        oil — chicken
        iron — liquid gas
        logs — tea

        PS как раз на циркулянт: элементы вдоль вдоль вот таких \ диагоналей одинаковы.
          0
          Понял, о чем вы, спасибо.
          Скорее всего, тут сыграла шутку дискретность окраски. Коэффициенты не одинаковы, но лежат узком интервале.
          Почему так получается, судить не возьмусь — возможно, из-за использования среднего геометрического для нормирования цен, возможно, из-за сезонной компоненты.
            0
            Мне тоже кажется что матрица очень подозрительная.
            Ну не может иметь beef схожие коэффициенты что и soy, просто сдвинутые на разницу номеров позиций в вашем списке. И так для всего остального.
            По идее, если убрать хотя бы 1 инструмент то циркуляр должен поломаться (образуются ступеньки по обеим осям). Попобуйте, если все останется как было — ошибка в реализации рассчетов.
      0
      Так собственно, «Почему существуют странные корреляции»?
        +1
        Потому что зачастую используется неверно подобранный метод анализа.
        Параметрический коэффициент корреляции Пирсона может показывать заведомо большее значение на данных, закон распределения которых отличается от нормального. Но и высокий коэффициент корреляции ничего не говорит без указания уровня значимости — существует вероятность того, что найденная закономерность проявилась случайно.
          +3
          Чего вы тут велосипед изобретаете.
          Достаточно помнить что корреляция может быть отлична от нуля в трёх случаях.
          1. Величины действительно зависят одна от другой.
          2. Случайность (что пытаются доказать часто здесь в статьях), недостаточность данных.
          3. Обе величины не зависят друг от друга, но зависят от некоей третьей величины, не учтённой в исследовании.

          Третий фактор почему-то часто (почти всегда) забывают.
          Например, избавившись от тренда, мы убрали третью величину от которой зависят первые две — возрастающий тренд.
          Это то что можно было убрать математически из исходных данных.
          Но 110% что существует ещё масса других «зависимостей» от «третьей» величины — сезонность, солнечные циклы и т.д. и т.п.
            0
            Целиком и полностью согласен с вами, если под корреляцией вы понимаете ее статистическую значимость, а не величину коэффициента корреляции.
            Если коэффициент корреляции значим при р = 0.05, значит ошибиться мы можем в 1 случае из 20. И какой бы величины не была сам коэффициент, с ним приходится считаться.
            Выявление скрытой переменной (3 пункт) может приводить к неверной интерпретации результатов корреляционного анализа, но этот момент лежит целиком и полностью на совести исследователя.
              +1
              Я в основном напирал на 3-й пункт.
              Потому что просто диву даёшься, как даже в повседневной и личной жизни люди делают ложные выводы, что A и Б вроде бы зависят одно от другого.
              Хотя на самом деле эти А и Б или никак не связаны, или слабо связаны, или даже связаны отрицательной корреляцией, но сильное влияние третьей переменной (про которую не знают, не замечают, или не хотят замечать) это скрывает.

              Чисто интуитивно — ну не имеет никакого смысла и значения ни величина корреляции, ни её знак, ни статистическая значимость, если не исключено влияние третьей переменной (или не доказано, что оно пренебрежимо мало).
                +1
                Как в этом случае :)
                С другой стороны, парадоксальные корреляции могут быть полезны — есть бородатая история о том, что некие маркетологи при анализе потребительской корзины покупателей некоего магазина обнаружили связь пива и подгузников. Оказалось, что новоиспеченные отцы, отправленные супругами за «памперсами», для компенсации прикупали бутылочку-другую пивка. Как гласит легенда, после этого к стеллажам с «детскими» товарами поставили мини-витрину с алкоголем.
                  +1
                  Парадоксальная или не парадоксальная, но в этой истории корреляция есть (если она действительно была конечно), так что естественно полезно использовать знание о том что она есть.

                  Впрочем, для примера про «третью переменную», вполне можно придумать как использование этой корреляции могло бы привести наоборот к снижению выручки магазина, из-за третьей переменной про которую не знали/не заметили.
                  Например, поставили витрину с алкоголем к памперсам, и по выходным выручка увеличилась, а по рабочим дням — упала. И общая выручка упала.
                  Возможно из-за того что жёны отправляют мужей в магазин только по выходным, а по рабочим дням сами ходят за подгузниками. И по какой-нибудь «женской логике», наличие пива рядом с памперсами заставляет их меньше памперсов покупать.
                  Правда не знаю что здесь «третья переменная» — женская логика что ли :)

                  В реальном мире «третьи переменные» есть всегда, и учесть их все невозможно, так что как оно на самом деле — показывает только эксперимент.
          +1
          Спасибо за ответ на статью.

          Хочу поделиться еще одним скриптом.

          github.com/tabatsky/jatx/tree/master/random_processes

          В нем я попробовал спроецировать нормированные цены на собственные векторы матрицы ковариаций.
          Таким образом получаем условно независимые случайные процессы.
          Тогда все цены можно получить как линейные комбинации этих «независимых» процессов.

          Что интересно — некоторым из этих процессов в некоторой степени присуща периодичность.

          Если Вам интересно, можете попробовать спроецировать цены на собственные векторы Вашей матрицы корреляций, основанной на тесте Спирмена.
          Возможно, удастся выявить какие-либо закономерности.
            +1
            Вообще говоря, условие нормальности распределения случайной величины для линейного коэффициента корреляции — вовсе не догма, поэтому Вы зря так просто его откинули. Кроме того, как я замечал в одной из статей jatx, весьма смело выдвигать гипотезу об однородности распределения цены на длительном промежутке времени, и неудивительно, что тест Шапиро-Уилка провалился. Вот если бы Вы анализировали коэффициенты корреляции на небольших временных интервалах, тем самым получая зависимость этих коэффициентов от времени, это, на мой взгляд, была бы куда более занимательная оценка.

            А полученная матрица действительно дает основания для подозрений, что закрался баг.
              0
              Основной работы много, как появится свободная минута, попробую отнормировать иначе и отпишусь.
              0
              Все же где-то у Вас закрался баг.

              Я попробовал вычислить коэффициенты корреляции Спирмена и p-значения.

              R = zeros(goods_count,goods_count);
              P = zeros(goods_count,goods_count);
              
              for i = 1:goods_count
                 for j = 1:goods_count
                     [R(i,j) P(i,j)] = corr(all_goods_rel(:,i),all_goods_rel(:,j),'type','Spearman');
                 end
              end
              
              threshold = 0.5;
              Q = and(R>threshold,P<0.01)-and(-R>threshold,P<0.01);
              


              Отбираем значения с корреляцией >0.5 и <-0.5 (что по шкале Чеддока характеризуется как заметная), с p-значениями < 0.01.

              Получаем следующую табличку:

              tabatsky.ru/corr.html

              Красные клетки — положительная корреляция, синие отрицательная.

              Only users with full accounts can post comments. Log in, please.