Леонид Волков недавно сообщил о том, что обнаружена фальсификация голосования на сайте РОИ (Российской общественной инициативы)
тут. Фальсификация заключается в том, что в голосовании за отмену предела в 0‰ алкоголя для водителей кроме натурально выглядещей компоненты прироста голосов примерно раз в час счётчик голосов сразу скачет примерно на 20--50. Массух, представитель РОИ, написал
комментарий в ответ на это. Кроме всяких общих слов он высказал мысль, что выбросы голосов в 20 могут быть и случайными с учётом того, что за инициативу Навального голосовало вначале по 120 человек за интервал измерения. В поддержку он ещё показывает статистику открытий страницы в минуту, на которых видны случайные флуктуации количества с разбросом где-то до 50 (при среднем ~50). Тут я собираюсь с цифрами выяснить, могут ли эти пики в 20 голосов быть случайными. (И заодно ссылка на
инициативу Навального, из-за которой и разгорелся весь этот сыр-бор.)
Для начала отступление про критерий истины в естественных науках. У нас есть какое-то количество наблюдательных данных (в нашем случае это то, что можно посчитать из данных о скорости роста числа голосов). И есть разные гипотезы о процессе, который дал эти данные. Например, гипотезы "голоса набрасывают" или "голоса не набрасывают". Чтобы сравнить одну из гипотез с данными надо дополнить её предположениями до теории, из которой можно посчитать (получить) что-нибудь наблюдаемое, и сравнить это с реально наблюдаемым. Чем менее экзотическими предположениями надо дополнять (в лучшем случае) и лучше при этом согласие с данными, тем гипотеза лучше. Творческая компонента тут в том, чтобы 1) придумать какие именно параметры сравнивать с наблюдениями, чтобы предположитльно неверная гипотеза не проходила, как её ни дополняй предположениями, 2) наиболее удачным способом дополнить гипотезу до теории-гипотезы, и 3) суметь вывести из теории-гипотезы наблюдаемые следствия. Оппонент может улучшать 2 для своей гипотезы или находить ошибки в нашем 3.
Данные о росте числа голосов брались по ссылкам из поста Волкова
здесь (машины чиновников) и
здесь (промилле). Там данные идут 1) сначала раз в примерно 5 минут (11--15 апреля), 2) потом раз в 5 минут (15--22 апреля), 3) потом раз в 10 минут (с 23 апреля). Вначале (до 15 апреля), похоже, период взятия данных с сайта не совсем стабильный (может быть, например, сайт тормозил и не отдавал данные сразу, может, какие-то непонятные тормоза в скрипте, который скачивал, или на сайте данные обновлялись тогда не со стабильным периодом). На сайте, откуда брались данные, они, похоже, обновляются раз в 10 минут. Из-за этого увеличение сначала идёт нерегулярно: иногда между соседними данными голоса не меняются совсем, потому что на сайте не обновились, а изредка случается, что между соседними они обновляются сразу два раза (прирост при этом примерно вдвое больше, чем рядом -- такое до 15 апреля встречалось). Для моего метода важно, чтобы все приросты голосов брались за одинаковый промежуток времени, поэтому с данными до 15 апреля он ничего хорошего не даёт. После 15 апреля всё нормально.
Раз Массух говорит, что скачки на 20 голосов -- это нормально, надо разобраться что тут на самом деле нормально. Если считать, что люди приходят независимо и в случайный момент времени, для числа пришедших в какой-нибудь интервал времени из теории вероятности известно, что его стандартное отклонение равно квадратному корню из его же среднего значения. Стандартное отклонение -- это мера разброса случайной величины, равна корню из среднего квадрата отклонения от её среднего значения. Если взять два соседних интервала по 10 минут, то среднее число пришедших голосов Ed1 и Ed2 должно быть примерно одинаковым, значит их разность (d1−d2) будет иметь нулевое среднее значение: E(d1−d2)=0, а стандартное отклонение разности sqrt(E(d1−d2)2)=sqrt(E(d1+d2)), т.е. равно корню из суммы их значений. Проще говоря, типичное значение для разности соседних приростов голосов (за одинаковые периоды времени) -- корень из суммы этих приростов.
Чтобы количественно проверить насколько правильно ведут себя флуктуации числа голосов, можно рассмотреть такую величину ("показатель дёргания"):
si=(di+1−di)2 / (di+1+di),
где di -- величины соседних приростов голосов. Среднее этой величины в теории равно 1 (я это проверил численно; реализации, в которых получается 0/0, откидываются), стандартное отклонение меняется от 0,31 при среднем приросте Edi=0,1 до ~1,4 при приросте 10 и больше. Т.е. разброс получается довольно большой:
По горизонтали откладываются сутки от полуночи 0 апреля. Так что 25 -- это 0:00 25 апредя, 35 -- это 0:00 5 мая.
Чтобы шум стал поменьше, сгладим простейшим IIR-фильтром:
ui = (1−r)ui−1 + rsi,
где r=1/24 определяет характерное время сглаживания в 4 часа (=24×10 минут). Шум при этом должен уменьшится в sqrt(24...12) раз (12 -- потому что соседние si положительно коррелируют), т.е. составить где-то в районе 0,2...0,8 (удвоенное стандартное отклонение).
Видно, что голосование за машины чиновников (красная линия) хорошо укладывается в эту схему за исключением редких выбросов. Выбросы связаны, похоже, с неполадками сайта в основном: счётчик там не увеличивается по 5...30 минут (на t=24,6, 44,75, 44.83, 29,69, 53,75, 53,93, 54,43) -- на графике приростов там провалы. В основном эти короткие провалы там случаются при наплыве голосующих. Странно выглядит разве что t=50,8...51,1 -- приросты там дёргаются туда-сюда. Может быть, там какие-нибудь проблемы с сайтом были, которые так модулировали возможность голосовать.
А вот голосование за промилле дёргается сильно больше, чем должно по теории. Варианты объяснения без предположения о фальсификации такие. 1) Если люди приходят не независимо, может быть Esi≠1. Например, если все голосуют парами (например, семьями), каждая пара одновременно, то Esi=2. Если n-ками, то Esi=n. Одновременно значит в пределах ~5 минут, чтобы попадать в один 10-минутный интервал. Даже для этих данных получается, что должны голосовать "семьи" минимум по 5 человек и очень быстро, по минуте на человека максимум. (В исходных же данных видно, что "семьи" вообще человек по 20.) 2) Глядя на исходные данные, можно было бы подумать, что данные для промилле на сайте обновляются не раз в 10 минут, а раз в примерно час. Но это тоже не проходит, потому что голоса потихоньку увеличиваются и между этими "обновлениями". И это межденное увеличение как раз соответствует теории, как видно на не сглаженном графике (t=38...44 и 48...50) -- там есть нижняя компонента, которая выглядит вполне нормально и соответствует этому медленному росту между скачками. Да и вообще это как-то странно, если бы одни голоса обновлялись с периодом 10 минут, а другие с ~60 минут. 3) Ещё вариант объяснения -- что на сайте roipetition.ru, который, похоже, связан с Навальным, испорченные данные по голосованию за промилле. То, что данные испорчены случайно непохоже: а) данные качаются тем же скриптом, что и по машинам (потому что это делается синхронно, одинаковые форматы и т.п.); б) таких проблем, которые были до 15 апреля по машинам, в данных по промилле нет -- там не нули и, иногда, удвоенные приросты, а скачки, сильно превышающие фоновые приросты: например, раз в 40 больше фоновых приростов. Что данные испортили специально тоже не похоже: как я уже написал, рост между скачками идёт с правдоподобными флуктуациями, не больше и не меньше, чем должны быть. 4) Других идей как объяснить эти скачки без фальсификаций у меня нет. Зато с фальсификациями легко,-- например, на сервере roi работает скрипт, который через случайный интервал времени около часа увеличивает счётчик голосов на нужную случайную величину.
Архив с данными и исходниками:
roi-stat.zip (под AWK и gnuplot).