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

  • Добавить построение других типов графиков.
  • Ускорить расшифрование.
  • Замечания и вопросы приветствуются :).
mysql relation charts

sqlcharts 自动生成数据库关联关系图 复制settings.py.example 重命名为settings.py 将数据库配置信息填入settings.DATABASE,目前支持mysql和postgresql 执行 python build.py -b,-b是读取数据库表结构,如果只更新匹

6 Aug 22, 2022
🌀❄️🌩️ This repository contains some examples for creating 2d and 3d weather plots using matplotlib and cartopy libraries in python3.

Weather-Plotting 🌀 ❄️ 🌩️ This repository contains some examples for creating 2d and 3d weather plots using matplotlib and cartopy libraries in pytho

Giannis Dravilas 21 Dec 10, 2022
Visualization of hidden layer activations of small multilayer perceptrons (MLPs)

MLP Hidden Layer Activation Visualization To gain some intuition about the internal representation of simple multi-layer perceptrons (MLPs) I trained

Andreas Köpf 7 Dec 30, 2022
The Spectral Diagram (SD) is a new tool for the comparison of time series in the frequency domain

The Spectral Diagram (SD) is a new tool for the comparison of time series in the frequency domain. The SD provides a novel way to display the coherence function, power, amplitude, phase, and skill sc

Mabel 3 Oct 10, 2022
A Python package that provides evaluation and visualization tools for the DexYCB dataset

DexYCB Toolkit DexYCB Toolkit is a Python package that provides evaluation and visualization tools for the DexYCB dataset. The dataset and results wer

NVIDIA Research Projects 107 Dec 26, 2022
Parallel t-SNE implementation with Python and Torch wrappers.

Multicore t-SNE This is a multicore modification of Barnes-Hut t-SNE by L. Van der Maaten with python and Torch CFFI-based wrappers. This code also wo

Dmitry Ulyanov 1.7k Jan 09, 2023
Plot and save the ground truth and predicted results of human 3.6 M and CMU mocap dataset.

Visualization-of-Human3.6M-Dataset Plot and save the ground truth and predicted results of human 3.6 M and CMU mocap dataset. human-motion-prediction

Gaurav Kumar Yadav 5 Nov 18, 2022
A library for bridging Python and HTML/Javascript (via Svelte) for creating interactive visualizations

A library for bridging Python and HTML/Javascript (via Svelte) for creating interactive visualizations

Anthropic 98 Dec 27, 2022
This is a learning tool and exploration app made using the Dash interactive Python framework developed by Plotly

Support Vector Machine (SVM) Explorer This app has been moved here. This repo is likely outdated and will not be updated. This is a learning tool and

Plotly 150 Nov 03, 2022
Tidy data structures, summaries, and visualisations for missing data

naniar naniar provides principled, tidy ways to summarise, visualise, and manipulate missing data with minimal deviations from the workflows in ggplot

Nicholas Tierney 611 Dec 22, 2022
Create 3d loss surface visualizations, with optimizer path. Issues welcome!

MLVTK A loss surface visualization tool Simple feed-forward network trained on chess data, using elu activation and Adam optimizer Simple feed-forward

7 Dec 21, 2022
CPG represent!

CoolPandasGroup CPG represent! Arianna Brandon Enne Luan Tracie Project requirements: use Pandas to clean and format datasets use Jupyter Notebook to

Enne 3 Feb 07, 2022
A research of IT labor market based especially on hh.ru. Salaries, rate of technologies and etc.

hh_ru_research Проект реализован в учебных целях анализа рынка труда, в особенности по hh.ru Input data В качестве входных данных используются сериали

3 Sep 07, 2022
Sky attention heatmap of submissions to astrometry.net

astroheat Installation Requires Python 3.6+, Tested with Python 3.9.5 Install library dependencies pip install -r requirements.txt The program require

4 Jun 20, 2022
patchwork for matplotlib

patchworklib patchwork for matplotlib test code Preparation of example plots import seaborn as sns import numpy as np import pandas as pd #Bri

Mori Hideto 185 Jan 06, 2023
LabGraph is a a Python-first framework used to build sophisticated research systems with real-time streaming, graph API, and parallelism.

LabGraph is a a Python-first framework used to build sophisticated research systems with real-time streaming, graph API, and parallelism.

MLH Fellowship 7 Oct 05, 2022
Using SQLite within Python to create database and analyze Starcraft 2 units data (Pandas also used)

SQLite python Starcraft 2 English This project shows the usage of SQLite with python. To create, modify and communicate with the SQLite database from

1 Dec 30, 2021
Plotting library for IPython/Jupyter notebooks

bqplot 2-D plotting library for Project Jupyter Introduction bqplot is a 2-D visualization system for Jupyter, based on the constructs of the Grammar

3.4k Dec 30, 2022
erdantic is a simple tool for drawing entity relationship diagrams (ERDs) for Python data model classes

erdantic is a simple tool for drawing entity relationship diagrams (ERDs) for Python data model classes. Diagrams are rendered using the venerable Graphviz library.

DrivenData 129 Jan 04, 2023
A simple agent-based model used to teach the basics of OOP in my lectures

Pydemic A simple agent-based model of a pandemic. This is used to teach basic principles of object-oriented programming to master students. It is not

Fabien Maussion 2 Jun 08, 2022