Moscow DEG 2021 elections plots

Overview

Построение графиков на основе публичных данных о ДЭГ в Москве в 2021г.

Описание

Скрипты в данном репозитории позволяют собственноручно построить графики распределения голосов избирателей по времени на основе публичных данных от системы Дистанционного Электронного Голосования Москвы для выборов в Государственную Думу 2021 года. Получаемые графики не учитывают переголосования, так как на настощий момент на основе публичных данных разделить бюллетени проголосовавшие единожды и переголосовавшие невозможно. Дополнительно можно построить распределение электронной "явки" по номеру блока регистрации избирателей, где также наблюдаются аномалии.

Для кого предназначено это руководство

Для людей которые хотели бы собственноручно проанализировать публично доступные данные о дистанционном голосовании, но не обладают достаточным техническим уровнем или желанием разбираться для полностью самостоятельного разворачивания базы данных. Соответственно инструкция написана максимально подробно, насколько это возможно. Руководство разделено на установку (выполняется однажды) и собственно построение графиков.

Установка

Система

Скрипты для построения графиков не должны зависеть от ОС, но на настоящий момент протестированы только под Linux. Установочные скрипты и инструкции рассчитаны на использование дистрибутивов Debian или Ubuntu. Для работы из под Windows или macOS (а для повышения безопасности и под Linux) рекомендуется воспользоваться виртуальной машиной с Ubuntu 20.04. Подойдёт например VirtualBox с вот этим образом. Установка VirtualBox достаточно проста, при необходимости инструкцию легко найти. Для подключения образа достаточно его распаковать, выполнить "Файл"-"Импорт конфигураций" и выбрать распакованный файл ova. После завершения импорта в настройках созданной виртуалки в разделе "Сеть" рекомендуется сменить тип подключения на NAT, при наличии достаточных ресурсов рекомендуется увеличить объём оперативной памяти до 8 ГБайт, остальные параметры можно оставить по-умолчанию. Системный пароль в виртуалке по ссылке выше - "ubuntu".

Клонирование репозитория и получение SQL-дампа

Для получения файлов из данного репозитория необходимо установить git и выполнить клонирование. Для этого необходимо открыть терминал (в Ubuntu нажать Activities, набрать term и нажать Enter) и выполнить в нем:

sudo apt update && sudo apt install -y git
git clone https://github.com/50000-Quaoar/election2021_msk

Для работы также понадобится дамп базы данных голосования, скачать который можно с сайта https://observer.mos.ru . Например данные по одномандатным округам доступны на этой странице, кнопка "Скачать sql dump". Если используете виртуальную машину - скачивайте сразу из неё. Данные по партийным спискам здесь.

Update: observer.mos.ru в последнее время тормозит и дампы могут скачаться битыми. Правильные дампы для голосований в Госдуму имеют в запакованном состоянии размер больше 3 ГБайт. Точно корректность дампа можно проверить следующим образом (займет несколько минут):

gunzip -kc observer-20210927_233000.sql.gz | sha256sum

SHA256 чексумма для распакованного дампа одномандатников: af3ca1f9002a7bc92065fd696e642fca84691dff7a3d8ee5165c009513082c66, а для партийных списков: 63f0cea15928ed31b1dceaaa74d2651fd901be17624bd2435ea925037fa3abec . В теории дампы после 19.09 меняться не должны, соответственно их чексуммы тоже.

Установка зависимостей и импорт базы данных

Для установки зависимостей выполнить в терминале:

cd election2021_msk/install
./install_ubuntu.sh

Для импорта базы данных в том же терминале исполняем:

./import_db.sh /home/ubuntu/Downloads/observer-20210921_143000.sql.gz v2021_om

, где /home/ubuntu/Downloads/observer-20210921_143000.sql.gz - путь до скачанного дампа базы данных, а v2021_om - желаемое имя базы данных. В зависимости от производительности вашего компьютера и ресурсов виртуалки импорт может занять от нескольких минут до ~2 часов. Терминал не закрываем. Если помимо одномандатников есть желание анализировать и другие голосования (партийные списки, Мосгордума), то необходимо эту операцию повторить с другим именем файла и названием базы.

Дорасшифровывание бюллетеней

В публично доступной на https://observer.mos.ru базе данных расшифровывание бюллетеней не была произведено до конца (подробности см. например в статье на Хабре на тему ДЭГ). Чтобы исправить это прискорбное недоразумение необходимо выполнить:

cd ..
./decrypt_ballots.py --dbname v2021_om

, где v2021_om - выбранное имя базы данных. В зависимости от производительности вашего компьютера и ресурсов виртуалки расшифровывание может занять вплоть до нескольких часов. После завершения расшифровки база данных готова к использованию и можно переходить к построению графиков и анализу данных. Строить графики можно и без дорасшифровывания или не дожидаясь его завершения, но тогда часть голосов не будет учтена. Если анализируете несколько баз, то надо дорасшифровывать их все.

Построение графиков

Для построения графика распределения голосов по времени достаточно вызвать в терминале:

./time_plot.py -c plot-config.json --dbname v2021_om

, где plot-config.json - JSON файл с конфигурацией желаемого графика (по-умолчанию plot-config.json), а v2021_om - название базы данных. Полный help можно получить выполнив:

./time_plot.py -h

Для построения графика явки в зависимости от номера блока регистрации избирателей:

./turnout_plot.py --dbname v2021_om

, где v2021_om - название базы данных, других параметров не требуется.

Выбор данных для построения графика распределения по времени

Параметры графиков задаются в виде текстовых JSON-файлов. Параметр minutes_in_bin задаёт число минут на каждую точку по оси X (рекомендуемые значения от 10 до 60). Параметр minutes_per_axis_tick - частоту подписей времени по X. Параметр percentage выбирает отображать ли на графике абсолютное количество голосов (false) или процент голосов в данном временном интервале каждого отдельного кандидата от всех кандидатов на графике (true). Параметр integrate позволяет отобразить сумму (true) всех голосов за кандидата к текущему моменту.

Наконец наиболее важный параметр candidates_to_plot задаёт список (в квадратных скобках) ID кандидатов, которых необходимо отобразить на графике. ID интересующего вас кандидата можно узнать запустив time_plot.py с опцией -l номер_округа. Например:

./time_plot.py -l 198

выведет список кандидатов в 198 округе, а для получения полного списка используйте опцию -l 0.

Время построения каждого графика обычно не превышает пары минут.

Примеры JSON-файлов

В репозитории представлено несколько JSON файлов для примера графиков по одномандатным округам: 198_perc.json - процентное распределение голосов по времени за всех кандидатов по 198 округу; 198_integral.json - полное количество голосов к ка времени за всех кандидатов по 198 округу; 208_abs.json - распределение голосов по времени за всех кандидатов по 208 округу; sobyanin_list.json - распределение голосов по времени за всех "административных" кандидатов по всем округам Москвы, позволяет проследить схожесть динамики набора голосов, в частности т.н. "перерыв на обед" в воскресенье днем; obed.json - распределение голосов по времени за трех административных кандидатов по разным округам и трех их основных конкурентов, позволяет проследить отличие в динамике числа голосов за административных и опозиционных кандидатов, в особенности в воскресенье (стремительное набор голосов за административных в 6:30 утра, отсутствие "обеда" у опозиционных голосов и резкое снижение административных после 14:30); party.json - распределение голосов по времени по партийным спискам, обед у ЕР присутствует;

Примеры графиков

Графики для конфигураций описанных выше, некоторые приближены для наглядности.

198_perc.json

alt text

198_integral.json

alt text

208_abs.json

alt text

sobyanin_list.json

alt text

obed.json

alt text

party.json

alt text

198_perc.json нормированный на официальные результаты

alt text

turnout_plot.py для одномандатных округов

alt text

TODO

  • Добавить построение других типов графиков.
  • Ускорить расшифрование.
  • Замечания и вопросы приветствуются :).
SummVis is an interactive visualization tool for text summarization.

SummVis is an interactive visualization tool for analyzing abstractive summarization model outputs and datasets.

Robustness Gym 246 Dec 08, 2022
Create artistic visualisations with your exercise data (Python version)

strava_py Create artistic visualisations with your exercise data (Python version). This is a port of the R strava package to Python. Examples Facets A

Marcus Volz 53 Dec 28, 2022
Streamlit-template - A streamlit app template based on streamlit-option-menu

streamlit-template A streamlit app template for geospatial applications based on

Qiusheng Wu 41 Dec 10, 2022
RockNext is an Open Source extending ERPNext built on top of Frappe bringing enterprise ready utilization.

RockNext is an Open Source extending ERPNext built on top of Frappe bringing enterprise ready utilization.

Matheus Breguêz 13 Oct 12, 2022
A tool for automatically generating 3D printable STLs from freely available lidar scan data.

mini-map-maker A tool for automatically generating 3D printable STLs from freely available lidar scan data. Screenshots Tutorial To use this script, g

Mike Abbott 51 Nov 06, 2022
🧇 Make Waffle Charts in Python.

PyWaffle PyWaffle is an open source, MIT-licensed Python package for plotting waffle charts. It provides a Figure constructor class Waffle, which coul

Guangyang Li 528 Jan 02, 2023
An animation engine for explanatory math videos

Powered By: An animation engine for explanatory math videos Hi there, I'm Zheer 👋 I'm a Software Engineer and student!! 🌱 I’m currently learning eve

Zaheer ud Din Faiz 2 Nov 04, 2021
Fastest Gephi's ForceAtlas2 graph layout algorithm implemented for Python and NetworkX

ForceAtlas2 for Python A port of Gephi's Force Atlas 2 layout algorithm to Python 2 and Python 3 (with a wrapper for NetworkX and igraph). This is the

Bhargav Chippada 227 Jan 05, 2023
Generate visualizations of GitHub user and repository statistics using GitHub Actions.

GitHub Stats Visualization Generate visualizations of GitHub user and repository statistics using GitHub Actions. This project is currently a work-in-

JoelImgu 3 Dec 14, 2022
Histogramming for analysis powered by boost-histogram

Hist Hist is an analyst-friendly front-end for boost-histogram, designed for Python 3.7+ (3.6 users get version 2.4). See what's new. Installation You

Scikit-HEP Project 97 Dec 25, 2022
Generate the report for OCULTest.

Sample report generated in this function Usage example from utils.gen_report import generate_report if __name__ == '__main__': # def generate_rep

Philip Guo 1 Mar 10, 2022
nvitop, an interactive NVIDIA-GPU process viewer, the one-stop solution for GPU process management

An interactive NVIDIA-GPU process viewer, the one-stop solution for GPU process management.

Xuehai Pan 1.3k Jan 02, 2023
基于python爬虫爬取COVID-19爆发开始至今全球疫情数据并利用Echarts对数据进行分析与多样化展示。

COVID-19-Epidemic-Map 基于python爬虫爬取COVID-19爆发开始至今全球疫情数据并利用Echarts对数据进行分析与多样化展示。 觉得项目还不错的话欢迎给一个star! 项目的源码可以正常运行,各个库的版本、数据库的建表语句、运行过程中遇到的坑以及解决方式在笔记.md中都

31 Dec 15, 2022
Backend app for visualizing CANedge log files in Grafana (directly from local disk or S3)

CANedge Grafana Backend - Visualize CAN/LIN Data in Dashboards This project enables easy dashboard visualization of log files from the CANedge CAN/LIN

13 Dec 15, 2022
Python package to visualize and cluster partial dependence.

partial_dependence A python library for plotting partial dependence patterns of machine learning classifiers. The technique is a black box approach to

NYU Visualization Lab 25 Nov 14, 2022
Generate "Jupiter" plots for circular genomes

jupiter Generate "Jupiter" plots for circular genomes Description Python scripts to generate plots from ViennaRNA output. Written in "pidgin" python w

Robert Edgar 2 Nov 29, 2021
A Python function that makes flower plots.

Flower plot A Python 3.9+ function that makes flower plots. Installation This package requires at least Python 3.9. pip install

Thomas Roder 4 Jun 12, 2022
Color scales in Python for humans

colorlover Color scales for humans IPython notebook: https://plot.ly/ipython-notebooks/color-scales/ import colorlover as cl from IPython.display impo

Plotly 146 Sep 25, 2022
Script to create an animated data visualisation for categorical timeseries data - GIF choropleth map with annotations.

choropleth_ldn Simple script to create a chloropleth map of London with categorical timeseries data. The script in main.py creates a gif of the most f

1 Oct 07, 2021
Project coded in Python using Pandas to look at changes in chase% for batters facing a pitcher first time through the order vs. thrid time

Project coded in Python using Pandas to look at changes in chase% for batters facing a pitcher first time through the order vs. thrid time

Jason Kraynak 1 Jan 07, 2022