0:00
В этом видео мы поговорим про поиск
зависимости данных и потренируемся считать корреляцию Пирсона.
Анализировать мы будем довольно интересный набор данных Foodmart product sales.
В этом наборе данных для каждого продукта известно количество покупок этого продукта
в некоторую дату, в определенном магазине.
Мы с вами будем искать связи вида: правда ли,
что покупки этого товара влияют на покупку второго товара?
Правда ли,
что покупки товара a приводят к увеличению или уменьшению покупок товара b?
Давайте для начала загрузим данные.
Наши данные состоят из двух файлов.
Первый файл, Foodmart sales, говорит о том,
сколько раз каждый продукт был продан в каждом магазине за некоторую дату.
Давайте посмотрим, как это выглядит.
Видим, что у нас всего 4 столбца.
Первый столбец соответствует id продукта, второй — id магазинов, в
которых произошли покупки, третий столбец — это дата в которую это произошло, ну и,
соответственно, количество покупок.
Второй файл, foodmart products, содержит огромное количество полей.
На самом деле, нам далеко не все отсюда интересно.
Нам просто не очень удобно работать с id продуктов,
потому что они не несут смысловой нагрузки, нам хочется получить их имена.
Соответственно, этот файл содержит столбец с id и столбец с именами,
поэтому с помощью него мы сможем связать информацию о id продукта с его именем.
Это довольно просто делается, для этого мы будем пользоваться функцией merge.
Вызываем функцию merge у первого dataframe sales.
Дальше в качестве первого аргумента передаем второй dataframe.
Давайте сразу отрежем только те столбцы, которые нам интересны,
а так же указываем по какому столбцу можно производить соединение,
в данном случае это столбец product id.
И говорим, что мы хотим делать inner join,
то есть мы хотим оставить только свое совпадающее значение.
Ну в данном случае у нас с вами все значения совпадают,
поэтому размер исходной таблицы будет совпадать с размером получившейся таблицы.
Давайте посмотрим, как это выглядит.
Видим, что наша таблица sales теперь содержит дополнительное поле product name.
Давайте проанализируем взаимное влияние продуктов друг на друга.
Для этого давайте рассчитаем корреляцию Пирсона между каждой парой продуктов.
Будем это делать по рассчитанной на предыдущем шаге таблице sales.
Однако в таком виде, в каком она сейчас существует, это делать не очень удобно.
Дело в том, что в этой таблице у нас есть информация только о покупках товара,
и нет информации об отсутствии покупок некоторого товара.
Ну то есть в некоторую дату в некотором магазине продукт a, скажем, не покупали,
то у нас нет соответствующей строчки со значением sales = 0.
Вот давайте эти строчки получим и вообще в целом немножечко изменим внешний
вид таблицы.
Давайте будем работать с таблицей, у которой индексом является дата и магазин,
а в столбцах расположена информация о покупках продуктов.
То есть каждый столбец соответствует своему продукту.
Тогда в каждой строчке мы получим значение покупок этого продукта за соответствующую
дату в соответствующем магазине.
Таким образом, мы сможем добавить туда эти самые нулевые значения, которых нам не
хватало, и сможем рассчитать корреляцию между всеми парами столбцов.
Давайте сначала получим правильную таблицу,
это делается с помощью метода pivot table.
Передаем туда исходную таблицу.
Указываем, что нас интересует значение столбца sales, в качестве значений,
которые мы будем заполнять.
Дальше индексами будут являться дата и id магазина, как мы уже говорили,
и в качестве столбцов будут выбраны продукты.
Ну в данном случае мы могли бы взять, как product id, так и product name.
Но с именами работать немножко удобней, поэтому давайте остановимся на них.
Итак, давайте соответствующую таблицу получим и посмотрим, как она выглядит.
Понятно, что она будет очень большая.
Ну давайте выведем только начало.
Видим, что, действительно, индексами у нас являются дата и id магазина,
и, соответственно, каждый столбец соответствует своему продукту.
Вот мы видим, что их очень-очень-очень много.
Добавилось огромное количество нулей.
Ну и вот мы видим, что в тех местах, где у нас были покупки,
вот эти значения остались, их можно найти.
Что ж, теперь давайте рассчитывать корреляции.
Так как мы с вами работаем с pandas dataframe,
это делает очень просто — для этого достаточно просто вызвать метод corr.
Запишем результат в новый dataframe, в новую таблицу.
И так же давайте выведем только ее начало.
Мы видим, что корреляция выглядит приблизительно так, как бы нам хотелось.
По диагонали мы видим значения, соответствующие 1,
ну по понятным причинам это корреляции между одним и тем же продуктом.
И в остальных ячейках мы видим корреляции между парами продуктов.
Такую таблицу очень удобно анализировать.
По этой таблице для каждого продукта мы можем посмотреть, как его покупки
коррелируют с покупками других продуктов и найти наиболее сильные корреляции.
Причем, как в положительную, так и в отрицательную сторону.
Вот давайте попробуем что-то такое сделать.
Зафиксируем некоторый продукт, например, american chicken hot dogs и посмотрим,
какие продукты, покупки каких продуктов, коррелируют с ним сильней всего.
Для этого сначала просто выберем столбец, соответствующий этому продукту.
На самом деле, можно было бы и строчку выбрать, данные будут те же самые.
И просто отсортируем этот столбец по корреляциям.
Сортировать будем по убыванию: ascending = false.
Давайте выведем тоже самое начало.
Ну понятно,
что со значением 1 в топ попадает этот же самый продукт, это нам не так интересно.
Давайте смотреть следующее.
Вот следующий продукт, это какой-то журнал.
Мы вот видим, что его покупки коррелируют с покупками хот-догов на 0,24.
Ну вот следующий, это frozen chicken wings (замороженные крылышки).
Потом идет сметана, маффины.
Мы видим, что довольно такой понятный топ продуктов.
В принципе, мы можем посмотреть продукты, которые коррелируют меньше всего.
Для этого давайте отсортируем просто в обратном порядке.
Вернее, неверно сказать, что они меньше всего коррелируют,
они коррелируют просто с отрицательным знаком.
По сути, если корреляция по модулю большая,
но перед ней стоит знак минус, значит,
что покупки этих продуктов отрицательно влияют на покупки этого продукта.
Ну давайте посмотрим.
Меняем порядок, которым мы хотим сортировать и выводим топ.
Ну вот видим, что есть некоторые продукты,
которые коррелируют с одним отрицательным знаком, нельзя сказать, что очень сильно,
потому что все эти значения очень близки к нулю.
Поэтому тут сложно сделать выводы.
Давайте сделаем следующее.
Давайте посмотрим, в принципе, максимальное по модулю отрицательное
значение корреляции, чтобы понять, есть ли они в наших данных.
Возможно, все отрицательные значения близки к 0 и мы просто ничего не
сможем найти.
Да, мы видим, что так и есть.
У нас нет больших по модулю отрицательных значений.
Так, давайте посмотрим тогда на положительные значения.
Может быть, они есть.
Ну вот видим,
что с положительными значениями корреляции ситуация обстоит несколько лучше.
Вот есть довольно большие значения по модулю.
Вот давайте посмотрим на первый продукт и видим, что есть какие-то продукты,
которые неплохо с ним коррелируют.
Ну, вот, да, видим, что с кофе покупают внезапно молочный суп.
Ну то есть по таким таблицам достаточно просто можно получить представление о том,
как покупки одного товара коррелируют с покупками другого товара и попытаться
сделать соответствующие выводы.
Мы с вами на этом заканчиваем.
В этом видео мы поговорили о том, как считать корреляцию Пирсона.
В следующем видео мы продолжим говорить о поиске взаимосвязи в данных.