- PVSM.RU - https://www.pvsm.ru -
6-7 ноября 2014 года в Перми будет проведен конкурс «Открытый регион. Хакатон» [1] по разработке приложений и сервисов на основе открытых данных Пермского края.
На сайте opendata.permkrai.ru [2] опубликовано примерно 1400 статистических показателей по различным областям жизнедеятельности края. Что можно сделать с этими данными? Первая мысль, которая пришла мне в голову, — создать аналог сайта Spurious Correlations [3] (ложные корреляции).
TL; DR:
Исходники: github.com/yakov-bakhmatov/odpr [4]
Приложение: odpr.bakhmatov.ru/ [5]
Способы получения и форматы данных описаны на странице для разработчиков [6]. Кратко говоря, веб-сервис отдает описание метаданных (список показателей, список «кубов» — дополнительных параметров показателей, таких как ОКАТО, ОКВЭД, страны мира и т. д., список пар показатель-куб) в формате xml и сами данные (по паре идентификаторов показателя и куба) в форматах xml и csv.
Для упрощения первичного анализа «глазами» я выбрал формат csv. В этом формате записи имеют вид
Уровень календаря;Дата;Название показателя;Дополнительные параметры "куба";Значение
Уровень календаря — это число от 1 до 5 (1 — год, 2 — полугодие, 3 — квартал, 4 — месяц, 5 — день).
Беглый анализ показал следующие проблемы:
Все эти проблемы так или иначе решаются, приступим к реализации задумки.
Для каждой пары показателей, имеющих одинаковый уровень календаря и пересекающиеся диапазоны дат, вычислим коэффициент корреляции Пирсона. Отберем те пары, модуль коэффициента корреляции которых больше 0.9 (| r | > 0.9). При открытии (или обновлении) страницы веб-приложения покажем графики случайной пары, построенные в одной системе координат.
Также нужен список всех доступных пар с поиском или фильтром.
Приложение я хотел создать быстро, стараясь оставаться во временных рамках хакатона. Вот мой выбор инструментов:
Во-первых, данные нужно загрузить из источника. Тут поджидала первая неприятность — после выкачивания нескольких десятков файлов с данными сайт opendata.permkrai.ru/ [8] начинал отдавать 500-ую ошибку. Пришлось этот этап растянуть на несколько подходов.
Во-вторых, я решил ограничиться «кубом» ОКАТО.
Всего был загружен 1151 файл общим объемом 256 МиБ.
Далее каждый файл разбирался, строки группировались по набору (уровень календаря; показатель; ОКАТО).
Строки, не относящиеся к Пермскому краю, отбрасывались.
Удалялись дубли, пропущенные периоды. Значения показателей «нормализовывались».
После этого этапа осталось 11468 рядов данных.
Тут ничего сложного. Вычисляем коэффициент корреляции между двумя рядами, если эти ряды относятся к разным показателям, имеют одинаковый уровень календаря, имеют не менее 8 точек в пересечении диапазонов дат.
Получилось 129507 пар с коэффициентом корреляции более 0.9 (или менее -0.9).
Вообще говоря, почти 130 тысяч пар — это очень много. За разумное время такое количество графиков просто не отсмотреть.
Но дело в том, что внутри показателя между рядами может быть очень небольшая разница (а коэффициент корреляции, наоборот, большой — близкий к 1). Если показатель X содержит n рядов, а показатель Y содержит m рядов, то коррелирующих пар будет n * m, хотя для иллюстрации зависимости достаточно одной пары.
Исправляем. Группируем все пары по набору (показатель первого члена пары; показатель второго члена пары; знак коэффициента корреляции) и оставляем из каждой группы одного представителя.
После этого осталось 19390 пар по 11278 рядам из 501 показателя.

Полученные графики можно посмотреть двумя способами. Можно обновлять страницу [5] и каждый раз получать случайный график. Можно перейти к списку всех показателей и выбрать интересующий.
Сайт будет доступен, пока не кончатся отведенные на него пара сотен рублей. Исходники доступны на github-е, при желании каждый сможет развернуть приложение у себя и поэкспериментировать с данными.
Приложение создавалось just for fun в течении трех вечеров. Еще вечер потрачен на написание этой статьи. Можно считать, что в сутки я уложился. Хакатон удался!
Автор: yakov-bakhmatov
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/clojure/73558
Ссылки в тексте:
[1] «Открытый регион. Хакатон»: http://engineerforum.ru/hakaton/
[2] opendata.permkrai.ru: http://opendata.permkrai.ru
[3] Spurious Correlations: http://tylervigen.com/
[4] github.com/yakov-bakhmatov/odpr: https://github.com/yakov-bakhmatov/odpr
[5] odpr.bakhmatov.ru/: http://odpr.bakhmatov.ru/
[6] странице для разработчиков: http://opendata.permkrai.ru/opendata/LoadDataDocumentation/developers-guide.html
[7] highcharts: http://www.highcharts.com/
[8] opendata.permkrai.ru/: http://opendata.permkrai.ru/
[9] Источник: http://habrahabr.ru/post/242333/
Нажмите здесь для печати.