Сравниваем цены в книжных интернет магазинах c помощью python, pandas и matplotlib
Сегодня мы попробуем найти самый дешевый и самый дорогой интернет магазин книг. Сравнивать будем бумажные книги, которые есть в наличии. В разных магазинах очень разное количество книг. Где-то менее 1000, а где-то более 200 000 книг.
Кстати, гистограмма настоящая. Как она построена и другие интересные закономерности под катом. Для начала нужно найти список книг, которые есть во всех магазинах.
Я выгрузил базу с сайта bookradar.org, в виде csv файла. Конечно не просто выгрузил, а специальным образом обработал с помощью Python, чтобы удобно было анализировать. Столбцы у нас — магазины, строки — это книги, ячейки строк — цены на эту книгу в конкретном магазине. Если книги в магазине нет, то пустое значение (NaN).
Выгружены только бумажные книги, у которых указан ISBN. Книги у которых ISBN не указан нет возможности понять, что это одна и та же книга. Даже книги которые называются одинаково и выглядят одинаково могут отличаться ценой, если например это издания разных лет. Поэтому для упрощения анализа используем только те книги которые легко можно сопоставить.
Когда первый раз рисовал графики, масштаб был совершенно нечитаемый, т.к. есть отдельные экземпляры, которые стоят 30-50 тыс руб. Поэтому при выгрузке я удалил книги которые стоят дороже 1500 руб.
Выбираем магазины для анализа
Сделаем необходимые импорты и загрузим файл в DataFrame:
Так выглядят первые несколько строк нашего DataFrame. isbn dmkpress.com rufanbook.ru read.ru setbook.ru moymir.ru boffo.ru my-shop.ru . 1 9785994911389 NaN NaN 69 100 NaN NaN NaN . 2 9789855497791 NaN NaN NaN 310 NaN NaN 403 . 3 9785942802943 NaN NaN NaN NaN NaN NaN NaN . 4 9785779717533 NaN NaN 177 160 NaN NaN 177 . Посчитаем сколько книг к каждом магазине:
Совсем маленькие магазины смысла брать нет, т.к. пересекающихся книг будет очень мало или вовсе ноль. Выберем магазины примерно от 100 тыс книг или чуть меньше
- mean — среднее
- std — стандартное отклонение
- 50%, 25% и 75% — медианы среднего, нижнего и верхнего кванитилей
Распределение цен
Построим гистограмму и посмотрим, в каком диапазоне больше всего книг. Эта гистограмма аналогична картинке в начале поста, только здесь больше столбиков.
Интересно, получилось два пика, примерно в 75 руб и 215 руб.
А искаженный вид я получил добавлением пары строк вначале предыдущего куска кода:
Корреляция цен
Теперь посмотрим корреляцию цен в магазинах:
books.ru labirint.ru ozon.ru my-shop.ru read.ru bookvoed.ru book-stock.ru setbook.ru books.ru 1.000000 0.971108 0.969906 0.965291 0.978453 0.970747 0.965809 0.966226 labirint.ru 0.971108 1.000000 0.973731 0.968637 0.979923 0.970600 0.969971 0.965970 ozon.ru 0.969906 0.973731 1.000000 0.973783 0.979620 0.967151 0.974792 0.971946 my-shop.ru 0.965291 0.968637 0.973783 1.000000 0.976491 0.956980 0.996946 0.970588 read.ru 0.978453 0.979923 0.979620 0.976491 1.000000 0.974892 0.976164 0.974129 bookvoed.ru 0.970747 0.970600 0.967151 0.956980 0.974892 1.000000 0.958787 0.961217 book-stock.ru 0.965809 0.969971 0.974792 0.996946 0.976164 0.958787 1.000000 0.972701 setbook.ru 0.966226 0.965970 0.971946 0.970588 0.974129 0.961217 0.972701 1.000000 Видна хорошая корреляция между ценами всех магазинов. А если посмотреть на пару my-shop.ru и book-stock.ru, то тут корреляция аж 0.996946, т.е. цены в них почти одинаковые.
Построим гистограмму распределения цены на книги в каждом магазине и диаграмму рассеяния для каждой пары магазинов:
По диаграммам рассеяния опять видим ту же картину, что и в таблице корреляции. Корреляция явно есть, ее хорошо видно. Увеличим пару магазинов для наглядности.
А теперь посмотрим на нашу пару магазинов с очень похожими ценами:
Получилась почти идеальная прямая. Но все таки есть точки которые расположились вне ее, т.е. не 100% цен одинаковы.
График со всеми ценами
Попробуем изобразить нашу таблицу графически.
Диаграмма красивая, но бесполезная. Точки просто перекрывают друг друга. Последний слой фиолетовый, явно закрасил все предыдущие.
Количество книг по минимальной цене
Давайте теперь определим количество книг по минимальной цене в каждом магазине. Нужно учесть, что минимальная цена на конкретную книгу может быть сразу в нескольких магазинах. Поэтому добавим колонки вида «min_ozon.ru» — если в данном магазине на данную книга установлена минимальная цена среди всех магазинов, устанавливаем 1 иначе NaN. Такие значения выбраны для удобства подсчета.
Получилась такая таблица
Теперь выведем количество книг по минимальной и максимальной цене в каждом магазине:
По количеству книг с минимальной ценой лидируют book-stock.ru, my-shop.ru, setbook.ru. Что похоже на то, что мы уже видели из медиан, но порядок поменялся.
И по максимальным ценам лидриуют books.ru, labirint.ru и bookvoed.ru.
Отсортируем по минимальной цене
Для того чтобы точки не затирали друг друга, ограничимся небольшим количеством книг.
На графике отображены цены на
60 книг, взятых из отсортированного набора на равных интервалах. Видно что цены в среднем достаточно похожи. Однако если посмотреть на отдельную зеленую точку, то цена там явно непомерно завышена. Если бы мы отобразили не 60 точек, а все 17 тыс. То таких выбросов было бы явно больше.
Выводы
Получается, что в среднем цена на книги в магазинах отличается не очень сильно, грубо говоря из последнего графика в диапазоне 100-150 руб. С другой стороны — это как средняя температура по больнице. Цены вроде почти одинаковые, а за конкретную книгу того и гляди сдерут в 3 раза дороже. Актуальную информацию по цене на ту ли иную книгу, всегда можно посмотреть на сайте.
Также мы не учитывали условия доставки (цену и удобство) и персональные скидки.