Особенностью российских президентских выборов 2018 года стало то, что главным показателем теперь стал не процент за основного кандидата, а величина явки. Другим важным показателем стало рекордно высокое количество наблюдателей по всей стране. Наблюдатели были отправлены, в том числе, в республики Северного Кавказа, где традиционно результаты попросту рисовались.
Президентские выборы, даже без учёта масштабной кампании по повышению явки с помощью конкурсов, местных референдумов, и административного давления, привлекают значительно выше внимания, чем парламентские выборы. Однако, проведя анализ результатов, можно продолжать замечать аномалии в результатах, хоть уже и менее выраженными на федеральном уровне.
Я провел анализ результатов как на федеральном, так и (что интереснее) региональных уровнях, а также расскажу о том, как создавал сервис для анализа выборов.
Если рассмотреть распределение доли голосов за кандидатов в зависимости от явки, можно увидеть классическую уже ситуацию, когда чем выше явка, тем выше доля голосов за основного кандидата, стремясь к 100% и 100% явке. Доля остальных кандидатов, соответственно, пропорционально уменьшается. Все картинки кликабельны.
(На этой картинке и на последующих точка — УИК).
Также можно вспомнить множество математических исследований, показывающих достаточно необычное распределение участков в зависимости от явки на них. Вместо нормального или логнормального распределения мы видим интересную кривую, с очень странными пиками на круглых значениях (70%, 75%, 80% и т.д.), возрастающую на около-100% явке и уходящей далеко вверх на 100%. Вот результаты президентских выборов 2012 года:
На выборах 2018 года кривая выглядит ещё более странно. Значительно возросло количество участков с явкой более 80%, а пики на круглых значениях ещё сильнее возросли.
Примечательно, что высокая явка наблюдается не только на мелких избирательных участках: нередки случаи, когда 90%-100% явки приходится на участки, к которым приписано 1500-2000 человек. Вот результаты выборов 2012 года:
а вот итоги выборов 2018 года:
Как видно, уменьшилось количество участков с 100% явкой, но теперь они распределились на отрезке явки 70%-100%. Также здесь можно увидеть более проявившееся распределение УИКов на круглых числах, таких как 80%, 85% и т. д.
Кстати говоря, закругления линий из точек на низком количестве избирателей на участках — это нормально. Дело в том, что из-за сильно проявляющейся дискретности возможных значений явки при малых количествах избирателей наблюдается картина, при которой количество возможных значений явки уменьшается с уменьшением количества избирателей. Вот, я даже составил график из тестовых данных, полученных рандомайзером:
Анализ выборов на региональном уровне
Но гораздо интереснее рассматривать данные о выборах по регионам. Например, республика Ингушетия. Абсолютное большинство УИКов очень удобно расположились в районе 80% явки, ± 2%.
Другая аномалия наблюдается в Самарской области: там на участках с явкой выше 80% доля за основного кандидата хоть и возрастает, но незначительно. Более того, примерно на этом участке возрастает доля голосов за двух последующих кандидатов, конечно же, за счёт всех остальных. Также можно видеть, что участки по явке распределяются совсем не нормально и не логнормально, а в виде двух «гор».
Можно было бы подумать, что это связано с различием в голосовании города и деревни, однако в Чувашии ситуация ещё показательнее, потому что там пропадают участки с явкой 77%, зато второе скопление УИКов, с около-100% явкой, в 2 раза больше, чем с естественной явкой.
Что касается Чечни, где традиционно рисовались 100%-ные результаты, на президентских выборах 2018 года появились много артефактов с необычной, не 100% явкой. Скорее всего, конечно, это результат работы независимых наблюдателей со всей страны, которые поехали в Чечню для наблюдения за голосованием. На каких-то участках заметны снижения явки до, примерно, 40%, на каких-то явка упала до 90%. Всё это в лишний раз показывает масштаб фальсификаций в республике.
Также нельзя пройти мимо возле результатов выборов в Кемеровской области, где в 2012 году наблюдалось значительное количество участков с ровно 80% долей за основного кандидата, а теперь УИКи разделились на два типа:
Первый тип (таких участков мало) — это участки с низкой явкой.
Второй тип (а таких очень много) — это участки с явкой от 75% до 100% и равно сниженной долей голосов за других кандидатов, кроме основного.
Однако, существуют и примеры регионов, в которых аномалии слабо представляются, из-за чего можно сделать предположение, что там фальсификации носили единичный характер. Например, в Тверской области, несмотря на пики на 70% и 100%, и другие мелкие аномалии, в сравнении с описанными выше регионами и общей статистикой по России, распределение довольно похоже на логнормальное.
Разработка сервиса по анализу выборов
Посмотрев на различные графики для федерального уровня, мне захотелось их повторить, но только для своей области. Нашёл репозиторий с кодом для ipython, который строил подобные графики, но то ли в коде были какие-то ошибки, то ли сайт избиркома обновился, толи ещё что-то, но парсинг сайта избиркома завершался ошибкой.
Тогда я оставил от того кода только визуализацию данных, а парсинг страниц полностью переписал. После этого удалось получить картинку с результатами, чего и хотел, однако тогда возникло желание иметь возможность навести курсор на какой-либо участок и, как минимум, получить его номер, чтобы затем найти подробную информацию. Но это было невозможно, из-за чего и возникла идея создания сервиса по подобного вида анализу любых выборов для любого региона.
Не хотелось разрабатывать десктопное приложение, ведь это повысило бы порог вхождения для пользователей, а мне могло бы принести неожиданные проблемы на платформах, на которых я не тестировал программу. Это же приложение, которое повседневно необходимо пользователю, потому этот вариант не подходит.
Также мне не хотелось разбираться в современном сборище javascript библиотек, рассматривал даже вариант транслировать Qt приложение в браузер, где изображение рендерится через WebGL.
К счастью, я нашел библиотеку Dash для Python, который позволяет логику и html страницу описать на Python, а страница будет сама сформирована с использованием ReactJS. Страница составляется из готовых блоков, если их не хватает, можно и свои добавить. Dash предоставляет реактивный декоратор для управления данными страницы в стиле событий: например, меняется значение в поле, это приводит к вызову привязанной функции, которая какой-то вычисленный результат возвращает, скажем, в заголовок. В итоге, из собственноручно написанного javascript кода мне пришлось лишь написать лишь логику работы всплывающего окна с подсказкой по работе.
Так как пока что на выборах кандидаты меняются, для упрощения работы с данными было решено использовать NoSQL базу, а конкретно — MongoDB, как самую находящуюся на слуху. Раньше я с ней не работал, о чём и пожалел, так как Mongo очень сильно понравилась, хоть и пришлось некоторое время адаптироваться после традиционных SQL и приведения данных к третьей нормальной форме.
Таким образом, примерно за полтора месяца я создал бета-версию сервиса, которую и представил публике, после чего также вносил различные изменения. Например, раньше загрузка данных с сайта избиркома занимала около 12 часов, а после внедрения асинхронности и массового отложенного добавления информации в базу данных, это время сократилось до трёх часов. Основное время, конечно, занимает процедура загрузки страниц. Почему-то ГАС «Выборы» не хочет быстро отдавать страницы, часто теряет соединение. В связи с этим у меня была идея предоставлять API для удобной загрузки данных сторонними приложениями, но не уверен, насколько это интересно пользователям.
Мой сервис позволяет посмотреть результаты на участках любой территории для любых (пока доступны 4) выборов, формируются 4 наиболее важных графика зависимости различных параметров от явки, даже показываются адреса УИКов, при выделении группы точек можно увидеть, где расположены эти участки. Адреса УИКов я не сам парсил, а воспользовался готовой базой данных, которую выкачали ребята с GIS-Lab.
Посмотреть сервис в онлайне можно по адресу cikinfo.modos189.ru
Также можно запустить на своем компьютере, исходники размещены на GitLab.
Автор: modos189