Пила Чурова своими руками, или как провести честные выборы

в 11:06, , рубрики: big data, python, анализ данных, визуализация данных, выборы, статистика

Пила Чурова своими руками, или как провести честные выборы - 1

На данном ресурсе с завидной регулярностью появляются статьи о выборах в России. Если тезисно передавать их суть, то получается что-то вроде:

  • Выборы в России фальсифицированы, и это аксиома, совершенно неоспоримый факт.
  • Признаки фальсификации — характерные «пики» на графиках около «круглых» чисел процентов явки либо голосов. Или некруглых, вроде «Пика Володина» на 62,2%.
  • А ещё признаки фальсификации — это отсутствие «колокола» на графиках, характерного для нормального распределения.

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

Поэтому, для проверки этих утверждений мы проведём свои, максимально честные выборы!

Сам себе Чуров

Честно говоря, я до сих пор не понимаю обоснованности утверждения, что выборы должны подчиняться закону нормального распределения. Уже даже учитывая большое количество весьма специфичных избирательных участков, типа воинских частей. Но пусть! Пусть будут максимально честные и транспарентные сферические выборы в вакууме. Строго по Гауссу.

Итак, весь процесс электорального волеизъявления будет имитировать один простой скрипт.

Знакомьтесь, ЧАС (Честная Автономная Система) Выборы 2018!

# -*- coding: utf-8 -*-

import random
import csv


def vote(num_tiks, min_voters, max_voters, vote_result):
    for i in range(0, num_tiks):

        # Формируем избирательный участок
        voters_list = random.randrange(min_voters, max_voters, 1)

        # Задаём целевую явку, пусть будет 67%
        mu = int(voters_list*0.67)
        sigma = int(mu * 0.25)

        # Голосуем
        voters_voted = int(random.gauss(mu, sigma))
        if voters_voted > voters_list:
            voters_voted = voters_list
        if voters_voted < 0:
            voters_voted = 0

        # Считаем явку
        turnout = round(100*voters_voted/voters_list, 1)
        if turnout in vote_result:
            vote_result[turnout][0] += 1
            vote_result[turnout][1] += voters_voted
            continue

        vote_result[turnout] = [1, voters_voted]


voted_total = {}

# День Выборов настал, все взяли в руки бюллетни!
vote(10000, 10, 100, voted_total)
vote(15000, 101, 500, voted_total)
vote(30000, 501, 1000, voted_total)
vote(20000, 1001, 2000, voted_total)
vote(10000, 2001, 3000, voted_total)


# Сохраняем результаты в итоговый протокол
with open('voted_total_tiks.csv', 'w') as csv_tiks_file:
    csv_writer = csv.writer(csv_tiks_file)
    for turnout_step in voted_total:
        csv_writer.writerow([turnout_step,
                             voted_total[turnout_step][0],
                             voted_total[turnout_step][1]])

Небольшие пояснения

Структура избирательных участков и общее количество их в целом имитирует реальную ситуацию. Наибольшее количество избирателей голосует на участках размером от 500 до 3000 человек. Участки размером больше 3000 избирателей по закону существовать не могут. Средняя явка выбрана в 67 процентов — это официальные данные явки последних выборов Президента РФ. Шаг явки выбираем 0,1%.

В остальном код прекрасно объясняет сам себя, это же Python.

Результаты

Мне было лень заморачиваться с графиками в питоне, поэтому результаты выгружаю в csv и обрабатываю в LibreOffice Calc.

Вот он, итоговый протокол за подписью главы моего карманного ЦИК:

Пила Чурова своими руками, или как провести честные выборы - 2

Налицо характерные признаки «фальсификации» и «вбросов ради выполнения задания по явке». Обратите внимание на эти кошмарные пики на 50, 60, 75%, и на 67 тоже.

Исходный код программы опубликован под лицензией WTFPL.

Всем спасибо за внимание.

Автор: Shaltay

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js