Я решил проанализировать распределение голосов за разных кандидатов по времени. Для этого я взял 2 млн. расшифрованных бюллетеней (опять же, спасибо @Peter_Zhizhinза ссылку) и сопоставил их с данными о транзакциях. Получилось отображение (время голосования -> id кандидата). Здесь использована база из .sql-дампа с observer.mos.ru, чуть подробнее про неё было в упомянутой статье.
Примерный код на PostgreSQL
-- Таблицы и колонки названы неудачно, простите
CREATE table decrypted_choices (
tx_store_hash character varying(64),
decoded_vote bigint);
COPY decrypted_choices
FROM '//path/to/decoded_votes_manual.csv' WITH (FORMAT csv);
CREATE table vote_times (
datetime timestamp with time zone,
vote bigint);
insert into vote_times (datetime, vote)
select transactions.datetime, decrypted_choices.decoded_vote as vote
FROM transactions
inner join decrypted_choices
ON transactions.hash = decrypted_choices.tx_store_hash;
\o vote_times.jsonl
COPY
(SELECT ROW_TO_JSON(t) FROM(select * from vote_times order by datetime) t)
TO stdout;
Далее я стал рисовать графики для пар кандидатов (код в ноутбуке). Для этого я брал по каждому округу трёх кандидатов, набравших максимальное число голосов, и рисовал попарное соотношение их результатов: 1-го ко 2-му и 2-го к 3-му. Например, в округе №197 распределение голосов среди медалистов такое: Попов -- 50420, Лобанов -- 30034, Бальмонт -- 8144. Берём результаты Попова и Лобанова. Разобьём всё время голосования на 70 равных интервалов и посчитаем, сколько каждый из кандидатов набрал в этот промежуток. Получится пара гистограмм, которые мы изобразим на одной картинке. Также давайте посчитаем отношение результата Попова к результату Лобанова на каждом интервале (то есть получим отношение гистограмм). Чего мы ожидаем от этих графиков? Интуитивно кажется, что так как случайные величины "время, когда избиратель проголосовал" и "кандидат, за которого отдан голос" практически независимы, то второй график (отношение гистограмм) должен колебаться вокруг константы. Проще говоря, странно, если в условном интервале 08:30-09:00 в воскресенье проголосует 700 человек за Лобанова и 1300 за Попова, а в интервале 15:30-16:00 -- наоборот: 600 за Лобанова и 300 за Попова. Но это интуиция, а что на самом деле?
Выглядит очень странно, как по мне. Но может быть, у меня какая-то неправильная интуиция? Давайте сравним Лобанова и Бальмонта (бронзового медалиста).
Совсем другой график! Гораздо более похожий на то, что я ожидал увидеть. Единственное, что смущает -- горбик на графике отношения вечером воскресенья. Оказывается, однако, что так ведут себя графики по всем 15-ти округам. Первое и второе место ведут себя похоже на график Попов-Лобанов, а второе и третье -- на график Лобанов-Бальмонт! Убедиться в этом можно самостоятельно запустив Jupyter Notebook или скачав графики с github. Давайте посмотрим ещё на пару округов.
Может быть, это только у коммунистов так? Давайте посмотрим на округ, по которому баллотировалась Брюханова, выдвинутая "Городскими проектами Варламова и Каца".
Выводы
Итак, графики "золото-серебро" и "серебро-бронза" кардинально отличаются друг от друга во всех округах. Более того, судя по всему, если сравнивать между собой любую пару мест, не включающую победителя, графики отношения гистограмм получаются похожими -- колеблющимися вокруг константы, но иногда с небольшим горбом или, наоборот, впадиной под вечер воскресенья. Случаются и выбросы, но обычно ночью, когда голосов совсем мало и закон больших чисел работает плохо.
Графики "золото-серебро" очень похожи между собой: пик в 8 утра пятницы, затем плавное падение, снова горб утром субботы, затем довольно существенный горб утром воскресенья, а затем резкая впадина (в ней отношение бывает даже меньше одного) после 14:00 воскресенья (этот последний интервал загадочен ещё и тем, что он проявляется на графиках "серебро-бронза" и других попарных сравнениях).
Исходя из какой модели можно объяснить такое гладкое и систематическое поведение графика "золото-серебро" во всех округах, я пока не понимаю. Поэтому развитие идей и дальнейший анализ горячо приветствуется!