В качестве введения
Вы все наверняка помните о таком явлении как Российская общественная инициатива (www.roi.ru) — провозглашенная государством в лице федерального правительства инициатива по сбору подписей за онлайн петиции. Предполагается что если за 1 год по петиции будет собрано 100 тысяч голосов, то и петиция будет официально рассмотрена нашими властями. И даже имеет шанс получить статус законопроекта.
При этом уже 6 петиций прошли такой фильтр — https://www.roi.ru/complete/ две из них настоящему прошедшие сбор по 100 тысяч голосов и 4 петиции набравшие голосов сильно меньше, но органы власти успели прореагировать.
И, хотя петиции не дают гарантии что решение вообще какое-либо будет принято, многие создают их не только в надежде на положительное решение, но и для того чтобы поместить проблему в «медийную повестку» иначе говоря, для того чтобы об этом начали писать СМИ и была бы публичная государственная реакция.
Поэтому РОИ, пока что, не последний из государственных проектов и интерес к нему есть. При этом у РОИ есть ряд недостатков и проблем.
Проблемы РОИ
Авторизация через ЕСИА (Госуслуги)
Об этом писали уже много — авторизация, конечно, привела к тому что сотни тысяч людей начали регистрироваться на госуслугах для возможности голосовать, но она по любому является барьером. Это не так просто организовано и пока не у всех граждан такая регистрация есть. Можно было бы организовать регистрацию онлайн с привязкой к номеру мобильного телефона например.
Это то ограничение которое мы пока не можем преодолеть.
Открытые данные и API
Многих людей РОИ интересует не только с точки зрения их петиций, но и петиций вообще. Петиции интересный материал для всех кто хочет понять что волнует граждан и какие проблемы затрагивают всех более всего.
Открытые данные нужны для многих задач:
- для мобильных приложения для отслеживания инициатив
- для визуализации и аналитики
- для прогнозирования успешности/провальности инициативы
- для создания сервисов продвижения инициатив и привлечения внимания к ним
Собираем данные
Прежде чем начать делать полноценное API для РОИ, я начал с того что стал моделировать сбор информации оттуда и написал вот такой краткий документ на Github'е — API для РОИ
Где предварительно расписал основные понятия которые есть в системе и которые можно извлечь теоретически.
Причем сразу выявились ограничения:
- Данные по голосам за/против доступны только авторизованным пользователям. Учитывая что авторизация через Госуслуги — это накладывает определенные ограничения. Авторизация, понятное дело, преодолима, однако «в лоб» пока собираем те данные в которых таких ограничений нет.
- Данные разделены между описанием петиции на странице петиции и в списке петиций. В списке есть данные по голосам за, а на странице, как я уже писал, данные по голосам есть только при наличии авторизации.
Для того чтобы скачать данные был написан небольшой скрипт который выкачивал данные из списка петиций и из их страниц, а потом сводил их в одно общее описание. В качестве хранилища использовался MongoDB. Вот тут его можно скачать и посмотреть — github.com/ivbeg/apiroi/blob/master/scripts/data_extract.py
Скрипт простой насколько возможно и конечно, далее он будет основательно меняться чтобы регулярно обновлять петиции и сразу сводить их в единый формат.
Данные довольно быстро были собраны — заняло это буквально несколько часов. Я не буду вдаваться в подробности того как пишут парсеры — это совсем простой случай, тут нет никаких неожиданностей.
Полученные данные теперь доступны на Github'е вот тут github.com/ivbeg/apiroi/tree/master/scripts/data/raw и на хабе открытых данных — hubofdata.ru/dataset/roi-dump
Итак, данные собраны, что дальше?
Анализируем данные
Я назвал этот пост постом про API, потому что конечной целью является получение именно его. Однако пока мы его делаем мы можем понять о том как сделать API наиболее удобным и образом и не надо ли включить туда какие-либо данные и создать дополнительные срезы данных на основе собранных. API ведь может быть не просто API на отдачу данных, API может выполнять гораздо больше задач.
Для начала подумаем что мы можем извлечь из наших данных удобного для визуализации. Предположим что потребителями API будут СМИ и те кто захочет представить их наглядно.
Вот какие мысли посетили меня о том что может быть интересно:
1. Понять вероятность инициативы набрать 100 тысяч голосов.
2. Оценить интенсивность голосования за инициативу.
3. Определить самых «голосуемых авторов»
4. Определить самые востребованные темы
Собственно для того чтобы начать определять вот это все — был написан скрипт data_process.py, он есть там же на github'е и с его помощью были подсчитаны индикаторы выше.
В папке данных — refined — лежат результаты предварительных расчетов в JSON.
Как оценить вероятность прохождения инициативы? В идеале желательно иметь подробности по статистике голосования за все время существования инициативы и по дням, но идеальной ситуации у нас нет и такая детализация доступна только авторам инициатив.
Пока же формула предсказаний очень проста. Подсчитать сколько людей потенциально может проголосовать можно по формуле:
votes + (votes / (probe_date_seconds — start_date_seconds)) * (end_date_seconds — probe_date_seconds)
- votes — число голосов на дату выборки данных
- probe_date_seconds — дата выборки данных в секундах
- start_date_seconds — дата публикации петиции в секундах
- end_date_seconds — дата завершения сбора информации о петициях в секундах
Иначе говоря все считается из предположения что люди будут голосовать также как голосовали раньше и распределение голосов будет, примерно, равномерным. Это, конечно же, скорее всего не так и многое зависит от медийной активности инициаторов, однако начальное приближение дает.
И вот первый анализ показал картинку что приведена на скриншоте.
Получается что:
- 6 петиций набирают до 100 тысяч голосов
- 5 петикий наберут до 50 тысяч голосов
- остальные 2492 петиции не наберут и этого
- а 1641 петиция, скорее всего не наберет и по 1 тысяче голосов из которых
Или то же самое картинкой
Из чего я делаю вывод что в API полезно включать много дополнительных возможностей:
- надо предусмотреть сохранение всей истории голосования для корректировки шансов на успех/неуспех петиции
- надо сделать возможность расчета успешности по любой из петиций
- нужен сокращатель ссылок для каждой петиции потому как оперировать их ссылками сейчас ну совсем неудобно — они незапоминаемы
- нужна возможность RSS подписки
- и многое другое
Очень жаль что сами создатели РОИ сами не предпринимают никаких усилий чтобы сделать РОИ открытым и с точки зрения API и данных.
Но благодаря тому что 1-й шаг сделан — первая выгрузка данных есть и есть примеры скрипта для выгрузки, теперь такое API может сделать любой желающий. А в последующих постах я еще напишу об этом подробнее.
Автор: ibegtin