Steam — одна из крупнейших платформ цифровой дистрибуции игр, и одновременно огромный источник данных: каталоги игр, отзывы, достижения, ценовые метрики, активность игроков, региональные различия и многое другое. Однако прямого доступа к агрегированным данным у исследователей нет — их необходимо собирать вручную через Steam Web API и сторонние сервисы.

В этом проекте мы разработали полноценный программный комплекс для автоматизированного сбора, хранения и анализа данных Steam. Построили двухуровневую архитектуру хранилища, реализовали оркестрацию чанков, разработали пайплайны работы с API и конфигурацию параллельного масштабирования. На основе собранных данных сформирован датасет объёмом десятки тысяч игр и сотни тысяч пользователей — и проведён базовый аналитический обзор рынка.

Цели проекта

Мы хотели создать систему, которая:

  • автоматически собирает данные из Steam Web API и SteamСharts;

  • хранит их в структурированном аналитическом хранилище;

  • предоставляет удобные инструменты для анализа: статистика, временные ряды, кластеризация, корреляции, рекомендации;

  • масштабируется горизонтально за счёт параллельной обработки чанков.

Иными словами, инфраструктурный фундамент для дата-проекта на больших игровых данных.

Архитектура: две базы, фасады, медиаторы

Основная аналитическая база

База данных steam-analysis.db содержит доменную модель:

  • игры, пользователи, друзья;

  • жанры, категории, платформы, издатели;

  • динамические метрики: цена, онлайн, отзывы;

  • временные ряды и достижения.

Аналитическая база данных

Служебная база

База данных db-analytics.db управляет оркестрацией пайплайнов:

  • чанки игр и пользователей (AnalysisChunk, AnalysisUserChunk);

  • логирование результатов обработки;

  • статусы ошибок.

Таким образом основная модель изолирована от технических аспектов ETL.

Паттерны

Проект использует Facade для изоляции модулей и Mediator для координации пайплайнов:

  • DBFacade — единая точка доступа к аналитическим таблицам;

  • AnalysisDbFacade — оркестрация обработки чанков;

  • SteamAnalysisFacade — изолирует работу с API;

  • GameService и PlayerService — слой API-клиентов.

Архитектура программного решения
Верхнеуровневая архитектура
Модуль по работе с Steam Web API
Архитектура взаимодействия с аналитической базой данных

Работа со Steam Web API и Steamcharts

Steam Web API накладывает ограничения:

  • Ограничения по частоте запросов. Для ключа разработчика допускается только определённое количество запросов в минуту. Поэтому в сервисе реализованы пакетные вызовы и искусственные паузы между запросами, чтобы избежать блокировок.

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

  • Изменчивость схемы API. Некоторые методы Steam Web API считаются устаревшими или меняют формат ответов. Для минимизации риска в коде использованы DTO-схемы и централизованный слой клиентов, позволяющий локализовать изменения.

  • Региональные различия. Часть информации (цены, отзывы, языки) зависит от региона и локализации, что учитывается при разработке аналитических сценариев.

  • Потенциальные ошибки в получаемых данных. Некоторые запросы могут возвращать неполные данные или возвращать ошибку. Для обеспечения отказоустойчивости и стабильности работы системы была реализована обработка ошибок в коде, позволяющая пропускать "битые"ответы и логировать проблему.

Работа со Steamcharts также имеет свой список ограничений, а именно:

  • Отсутствие публичного API. Сайт собирает данные через внутренний сервис, но не предоставляет публичного API для сторонних разработчиков. Для автоматизированного сбора данных был реализован функционал парсинга HTML.

  • Ограничения по частоте запросов. Активный парсинг с одного IP может быть расценен как DDoS-атака и привести к блокировке, поэтому возникает необходимость сбора данных с двух ip-адресов и соблюдения интервалов между запросами.

  • Потенциальные ошибки на страницах. Некоторые страницы могут не загружаться или некорректно отображать данные. Для обеспечения отказоустойчивости и стабильности работы системы была реализована обработка ошибок в коде, позволяющая пропускать"битые"страницы и логировать проблему.

Горизонтальное масштабирование

Система масштабируется за счёт:

  • Чанковая обработка. Все операции сбора данных выполняются над ограниченными диапазонами app_id или набором steam_id. Это позволяет запускать несколько экземпляров сервиса параллельно, распределяя чанки между машинами.

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

  • Пакетная работа с API. Методы сервисов принимают списки идентификаторов, что позволяет эффективно использовать лимиты API (только для некоторых запросов).

  • Промежуточное хранение в JSON. Данные сохраняются в формате JSON на этапе сбора, что обеспечивает отказоустойчивость, гибкость схемы и возможность повторной обработки. Файлы служат буфером между источниками и финальной базой, позволяя декомпозировать пайплайн на независимые этапы сбора и добавления данных в основное хранилище.

Характеристики датасета и описание модели данных

Объем собранных данных

Аналитические результаты

Распределение продуктов Steam по типам

Распределение собранных данных по типам

На рисунке видно, что основная масса продуктов Steam — игры, демоверсии и DLC.

Популярность категорий

Распределение игр по категориям

По популярности лидируют следующие категории:

  • Single-player

  • Family Sharing

  • Steam Achievements

Сезонность выхода игр

Распределение выпущенных игр по сезонам
Распределение выпущенных игр по месяцам

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

Динамика жанров

Динамика выпуска игр по жанрам
Динамика выпуска игр по категориям

По графикам видим:

  • бурный рост сегмента Indie;

  • рост категорий Single-player и Family Sharing;

  • заметный общий спад около 2019 года.

Кластеризация игр по набору признаков с целью выявления игровых сегментов

В индустрии и сообществе существует устоявшаяся парадигма деления продуктов на сегменты (Tier-1/AAA, Indie и т.д.). Мы решили проверить, будет ли такое разделение иметь четкое математическое отражение в пространстве объективных рыночных метрик (цена, вовлеченность, доступность).

Результат кластеризации K-means с количеством кластеров = 7
Результат кластеризации K-means с количеством кластеров = 4

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

Карта региональных предпочтений

Для построения карты региональных предпочтений, сервис отдает список игр с координатами региона и количеством пользователей, которые играют в данную игру в конкретном регионе. Список игр может быть выгружен в формате json или в Google Таблицу. Для визуализации мы предлагаем использовать сервис Datawrapper.

Карта популярности игр

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

Граф с отображением наиболее популярных игр среди друзей для формирования рекомендаций

Для анализа наиболее популярных игр среди друзей пользователя был построен граф. Данные для графа сервис выгружает в формате json или в Google Таблицу. Для визуализации предлагаем воспользоваться сервисом Kumu.

На данной визуализации кружком в центре, от которого идут линии к другим кругам, обозначен сам пользователь, круги вокруг него - игры, в которые играют его друзья. Размер круга пропорционален количеству друзей пользователя, которые играют в данную игру. Таким образом, проанализировав данный граф, пользователь может найти для себя новые игры, которые популярны среди его друзей.

Дистрибутив проекта

Состоит из:

  • exe-файла пайплайна (через PyInstaller);

  • двух БД с минимальным набором данных;

  • конфигурации Steam API;

  • скриптов для обновления данных;

  • README с инструкциями.

Функциональная схема дистрибутива
Временные характеристики

Итоги

Мы разработали:

  • масштабируемую архитектуру для сбора данных Steam;

  • двухуровневое хранилище;

  • ETL-процессы с оркестрацией чанков;

  • средства анализа, визуализации и экспорта в внешние сервисы (Google Sheets, Datawrapper, Kumu);

  • аналитический датасет и набор исследовательских результатов.

Проект может служить основой для:

  • корреляционного анализа,

  • регрессий,

  • кластеризации,

  • анализа временных рядов,

  • рекомендательных моделей,

  • бизнес-исследований рынка.