geg_MOPO4

Весёлые картинки

Все рисуют картинки — нарисую и я.

Знаменитая «гребёнка Чурова» имеет две особенности — сильную несимметричность и пики на «красивых» процентах. Чем меньше брать размер бина, тем заметнее пики (при широких пики размазываются). Если взять достаточно узкий бин, то заметны пики и на графиках других партий. О Яблоке речи не идёт, это маргиналы, а вот такой весь правильный из себя график КПРФ имеет пики не только на 20% и 25% (что можно было бы объяснить понижением голосов вниз), но и на 1/3, 1/7, 1/8. Вряд ли кто стал фальсифицировать голоса ровно до 1/7. Объясняется это тем, что отношение двух случайных чисел (числа проголосовавших за партию и действительных бюллетеней) с большей вероятностью будет точно равно отношению двух небольших чисел (1/2, 3/4, 2/5), чем любой другой близкой к нему несокращаемой дробью с большими числами. Избавляются от этого, например, зашумлением исходных данных, или учитывая результаты с диапазоном погрешности.

Это была присказка. Сказка же будет не о том, как избавляться, а как получить и показать этот эффект. _winnie промоделировал это. Он взял реальные данные, сколько проголосовало людей на каждом участке, принял, что вероятность выбора некоторой партии на каждом участке — случайная величина со средним 0.4 и стандартным отклонением 0.2, и запустил рандом. Без каких-либо фальсификаций (мы ведь не думаем, что количество проголосовавших имеет отношение к фальсификациям, правда?) на красивой гауссиане получились заметные пики и выемки именно там, где и ожидались.

Но это если страна однородна, с произвольным распределением лояльности к партии. А если взять реальные предпочтения? Я взял скрипты _winnie и повторил эксперимент, но вероятность голосования за партию тоже брал из реальных данных. Предположим, что участки могут сильно отличаться один от другого, но на каждом участке люди голосуют независимо. Если из 100 человек 90 отдало голоса за некую партию, то вероятность проголосовать за неё каждого на этом участке скорее всего 90%. Но не точно 90%, если бы вероятность была 90.1% или 89.8%, то тоже скорее всего проголосовало бы 90 человек. Точность, с которой мы знаем величину вероятности, зависит от количества проголосовавших, в данном случае стандартное отклонение вероятности — 3%. На участке, где партии отдали голоса 9000 человек из 10000 вероятность тоже будет 90%, но уже со средним отклонением 0.3%. Если все, как один проголосовали за Партию, то у нас нет данных, чтобы усомниться в их полной преданности — единогласно проголосуют и в эксперименте.

Вычисляем на каждом участке среднюю оценку вероятности и её отклонение и берём случайную величину с этими параметрами. По полученной случайной вероятности вычисляем случайное же число людей, проголосовавших за партию на этом участке. Строим гистограмму по всем участкам и получаем график, очень близкий к графику по реальным данным (ну ещё бы). Разумеется, поскольку и вероятность выбора партии, и сам выбор были случайными, есть выбросы, как совпадающие с действительными данными, так и не очень. Часть этих выбросов связана с вышеупомянутым эффектом отношения целых чисел, часть — с используемыми данными (ну если на многих участках 90% за партию, то и при моделировании на них получится около того), третьи — просто случайность. Чтобы избавиться от последнего, повторил эксперимент 1000 раз и усреднил. График получился более плавный, отображающий только артефакты деления и особенности электоральной культуры. Если бы результаты голосования отражали реальные настроения народа, не было бы никаких приписок на круглых числах, в комиссиях заседали роботы, чуждые пиетета перед десятичной системой счисления, реальный график был бы близок к этому.

Вот график для «Единой Росии»:

Вот для КПРФ:

Синее — усреднение экспериментов, красное — реальные данные. Всего 500 бинов, через каждые 0.2%. На синем видны ожидаемые пики на простых дробях (красный тоже их имеет, но часто намного выше), в остальном графики почти совпадают.

Разумеется, на красном полно случайных выбросов, синий-то усреднён. Насколько они случайны? Это тоже можно посмотреть. 1000 экспериментов понадобилась не только для того, чтобы получить хорошо усреднённый синий график, этих данных достаточно и для того, чтобы посчитать стандартное отклонение для каждого участка. На следующих графиках красным показана разница между реальными и усреднённым моделируемым графиками, а синим — 1, 2, 3 и 4 стандартных отклонения (сигмы) моделируемых данных на каждом бине. Оранжевый — усреднённый сглаженный красный график отклонения (систематическое расхождение модели и данных).

Для нормально распределённой (да, да, Гаусс) величины вероятность выбиться в ту или другую сторону от среднего за пределы сигмы — около 1/3, за пределы двух сигм — менее 5%, за три сигмы выходит только каждый 400-й, за четыре — 16000-й, за пять — менее, чем один из 1.7 миллиона, за шесть — из полмиллиарда. То есть ничего удивительного, что полно выплесков за одну-две сигмы, и даже один-два за три сигмы. Вот выход за четыре сигмы — уже редкое везение, а дальше — ненаучная фантастика (волшебство). Пик на 75% достигает девятки сигм, на 85% и 95% выходят за шесть. Обратили внимание на пик на 50%? Его нет. Не выделяется на фоне шума, поглощённый предсказанным моделью. Как и другие пики — 1/3, 2/3, 25%=1/4, 40%=2/5, 60%=3/5. Остались только неожиданные кратные 5% на высоких процентах.

Это перекликается с результатом kobak, полученным другим способом.

Понятно, что эти картинки ничего не доказывают, это просто картинки.

P. S. Для знающих Питон и желающих поиграться, вот скрипты (на основе скриптов _winnie):

Данные я брал у _winnie (пробегали ссылки и на более точные). Как использовать — разберётесь по коду. Требуются matplotlib и numpy. Я с ними раньше не работал, поэтому кое-что может быть неоптимально.

P. P. S. По подсказке sassa_nf нарисовал и усреднённый график отклонений.

P. P. P. S. А вот графики интегральной функции распределения относительных разбросов (по отношении к сигме). Бины с менее, чем 10 участками отброшены (слишком большая флюктуация).

  • Чёрная линия — идеальное нормальное распределение.
  • Красная линия — относительное отклонение реальных данных от среднего по экспериментам.
  • Оранжевая линия — скомпенсированное относительное отклонение реальных данных от сглаженного отклонения реальных данных (от оранжевой линии на предыдущих графиках).
  • Фиолетовая линия — относительное отклонение одного из экспериментов от среднего по экспериментам.

Как видно, фиолетовая линия довольно близка к чёрной (это Гаусс), оранжевая близка к чёрной в отрицательной области (это тоже Гаусс), а в положительной компенсация совсем не работает, оранжевая близка к красной — выбросы сильнее и это не Гаусс.

1. впечатляет оценка вероятностей
2. подобный подход был уже опробован Сашей Хановым: http://oude-rus.livejournal.com/548240.html; но вычитаний мы не делали
3. сейчас дам на вас ссылку
4. техническое:
а). не могли бы вы уменьшить картингу хотя бы до 1200? проблема не в ней, проблема в тексте
б). на мой вкус, бин в 0.5% представляет лучший компромисс между шумом и выбросами.
Саша Ханов, насколько я понимаю, принимает вероятность p не зависящей от участка (т.е. на разных участках-то вероятность разная, но не зависит, на Кавказе этот участок, или в Москве). Только по размеру сгруппировано (грубая зависимость от размера). И эта модель дала удивительно похожий результат (вы, правда, не наложили графики, возможно есть систематические расхождения). Я же гулял вероятностью для каждого участка независимо, это намного более сильная привязка к исходным данным (может слишком сильная), потому и графики получились практически совпадающими. Кроме… кроме некоторых пиков, которых не должно быть.

Идею провести несколько симуляций и усреднить я позаимствовал где-то у kobak. А где среднее, там и разброс, и попытка посмотреть, что из него вылезло.

Изначально я бин в 0.5% и использовал, а потом увидел, что kobak использует меньшие и тоже уменьшил (_winnie вообще по 0.1% бил, но это уже чересчур). При меньших бинах пики заметнее и заметны провалы перед пиками. При 0.5% они сглаживаются, исчезнет полностью пик на 1/3 для КПРФ (при 0.1% хорошо видны и 1/8, и 1/7).

Картинки может и уменьшу (пока не разобрался, как же в этом pylab задавать точные размеры в пикселях). Если уменьшить число бинов, то можно уменьшить и разрешение для хорошей видимости бинов. Впрочем, у вас разве браузер картинки не масштабирует? По ссылке откроются в полный размер.
и еще одно предложение (раз уж у вас все на мази): распределение реальных голосов (probability density function) не гауссово, a более крутое при низких голосах, и пологое - при высоких. Если взять из реальных данных асимметрию распределения, и моделировать распределение голосов соответственно, то можно (я думаю) избавиться от систематических отклонений, тем самым еще увеличив реалистичность модели.
Это неважно, гаусс очень узкий. Для 100 человек в максимуме (при p=50%) сигма будет 5%, а участки обычно больше и вероятность в интересных случаях ближе к краям.

Если точнее, для p следовало бы взять тоже биномиальное распределение (в этой модели ассиметрия глобального распределения не имеет отношения к распределению на отдельном участке), но разница ничтожна. Главное сомнение у меня — нужно ли вообще варьировать p, или взять просто фиксированную (для участка) долю голосов? Не слишком ли я размываю? Обоснования у меня нет.

Потому это просто картинки. Они ничего не доказывают.
Замечательный пост, спасибо. Действительно, распределение отношения целочисленных случайных величин даёт забавный «макроэффект», а аналогия с распределением отношения непрерывных величин подводит. Казалось бы, простая вещь, а всё равно красиво (правда, при увеличении максимального размера выборки пики на несократимых дробях должны размываться – было бы интересно посмотреть, насколько быстро).
А вот любопытнее пиков на 75%, 85% и 95%, пожалуй, только отсутствие таковых (выходящих за пределы трёх стандартных отклонений от среднего, во всяком случае) на 80% и 90%.
Об этом макроэффекте много интересного написали kobak (у которого несколько последних постов только этому и посвящены, там есть много ссылок), oude_rus и другие.

Пики на 80% и 90% совсем немного недотягивают до трёх сигм (с вероятностью трёх сигм, кстати центральная линия может быть на десятую сигмы ниже). Если есть какая-то ещё причина, приводящая к возникновению пиков, кратных 5%, то она должна провлять себя и на этих пиках, и тогда они были бы скомпенсированы.

Интереснее пики где-то на 92% и 98%. Для обоснованных гипотез пока мало данных.
Супер, дам сейчас на Вашу запись ссылку у себя.

Это у Вас распределение количества участков, или общего количества людей, проголосовавших "за"? Интересно, что я вижу сильнейший пик на 65%, а у Вас его вообще нет. Он есть у меня и на гистограмме по кол-ву людей, и на гистограмме по кол-ву участков (в предыдущей записи). Правда, у меня везде бин 0.25% (и везде зашумленные данные).
Участков («единиц вранья»). Попробовал людей — там интересные «числовые» пики вообще не видны, кроме как на 50% (а ведь я моделировал, чтобы их воспроизвести). А вот кратные 5% — в полным рост. Нужны графики? Стоит ли увеличить размер бина до 0.5% (некоторые пики пропадут, но всё будет глаже)?

Пик на 65% есть, но он частично компенсируется и не дотягивает до трёх сигм. Может есть, а может и нет (и таких «может» не один). Графики не зашумлены, задача стояла не избавиться от артефактов, а воспроизвести.
а почему такой маленький объем эксперимента? В делаете выводы о 99% вероятности на основании где прошли 5 крайних значений из 1000 выборки?

ну хотя бы 100000 надо посчитать, или так медленно работает?
Не то, что медленно, 8 минут на партию, но при этом генерируется 350 Мб данных. 3.5 Гб данных (а в бинарном виде может ещё больше) одновременно в памяти я не потяну. Раньше аккумулировал по ходу, но вот если считать не количество участков, а количество людей — потеря точности, переполнение, нужно или грузить всё, или усложнять алгоритм аккумуляции (это нетрудно, но меня устраивает и так). Ну и время возрастёт непропорционально (данные от запуска к запуску уже не закешированы).

Объём эксперимент достаточен. Стандартное отклонение средней синей линии — около 1/30 стандартного отклонения данных экспериментов (можете оценить на графиках масштаб, это немного толще самой линии). Реальные данные — это ещё один эксперимент. 5 результатов из 500 вышли за 4 сигмы (и далеко вышли). Значит, по крайней мере в этих точках реальные данные описываются другой моделью. Может я схалтурил с моделью, может есть какие-то неучтённые силы.
У КПРФ кстати тоже какая то хуетень лезет между 15-20% за пределы 4 сигм.
Там ещё весь график поднят. Систематическое расхождение между синим и красным графиками. Если его гладко опустить, верхние пики станут приличнее и нижние не вылезут.
а среднее красного графика нарисуйте? т.е. линию для среднего отклонения на 3-м графике параллельно 0 синего графика.
Параллельная ничего не даст, масштаб отклонений разный (для ЕР прижимается к 0 слева, для КПРФ — справа). А вот сгладить график отклонений — отличная идея (для ликвидации выбросов из 41 соседей отбрасывалось 10 максимальных и 10 минимальных, по остальным среднее).
вы неправильно выбираете среднюю вероятность голосования. Если на участке набрано 90% голосов, то при условии, что голосование независимо и случайно, вам нужно оценивать разброс p^x, при этом p совершенно не 0.9. Легко проверить: взять один бин и посмотреть закон распределения голосов по ИКам. Если присутствует лог-нормальная характеристика, то у вас случайная величина в показателе степени, а среднее и разброс значений не будут следовать нормальному распределению.
Если взять, допустим, бин от 58.4% до 58.6%, то в него попадут только те ИК, где проголосовало от 58.4% до 58.6%. Узкая полосочка, а вне её — 0. Какое можно увидеть распределение сквозь эту щёлку?
спасибо за обновлённые графики. на последнем графике у КПРФ оранжевая линия стОит фиолетовой - т.е. отклонения фиолетовой от чёрной примерно такие, как отклонения оранжевой от чёрной. Т.е. отклонения пиков от среднего настолько плохо моделируют нормальное, насколько плохо моделирует нормальное фиолетовый.
Для КПРФ точек после фильтрации осталось вдвое меньше, потому и колебания больше. Но на больших отклонениях фиолетовая жмётся к Гауссу, а оранжевая — нет. Я нарисовал только одну фиолетовую, потому, что несколько путались бы друг с другом, но ведут они себя одинаково.

Из этого я заключаю, что исходный механизм моделирования не очень хорошо соответствует реальности, если смотреть на такие детали. Нужно попробовать немного иначе.