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

  • Добавить построение других типов графиков.
  • Ускорить расшифрование.
  • Замечания и вопросы приветствуются :).
The Metabolomics Integrator (MINT) is a post-processing tool for liquid chromatography-mass spectrometry (LCMS) based metabolomics.

MINT (Metabolomics Integrator) The Metabolomics Integrator (MINT) is a post-processing tool for liquid chromatography-mass spectrometry (LCMS) based m

Sören Wacker 0 May 04, 2022
OpenStats is a library built on top of streamlit that extracts data from the Github API and shows the main KPIs

Open Stats Discover and share the KPIs of your OpenSource project. OpenStats is a library built on top of streamlit that extracts data from the Github

Pere Miquel Brull 4 Apr 03, 2022
HW_02 Data visualisation task

HW_02 Data visualisation and Matplotlib practice Instructions for HW_02 Idea for data analysis As I was brainstorming ideas and running through databa

9 Dec 13, 2022
An interactive dashboard for visualisation, integration and classification of data using Active Learning.

AstronomicAL An interactive dashboard for visualisation, integration and classification of data using Active Learning. AstronomicAL is a human-in-the-

45 Nov 28, 2022
Seismic Waveform Inversion Toolbox-1.0

Seismic Waveform Inversion Toolbox (SWIT-1.0)

Haipeng Li 98 Dec 29, 2022
Insert SVGs into matplotlib

Insert SVGs into matplotlib

Andrew White 35 Dec 29, 2022
🎨 Python3 binding for `@AntV/G2Plot` Plotting Library .

PyG2Plot 🎨 Python3 binding for @AntV/G2Plot which an interactive and responsive charting library. Based on the grammar of graphics, you can easily ma

hustcc 990 Jan 05, 2023
A high-level plotting API for pandas, dask, xarray, and networkx built on HoloViews

hvPlot A high-level plotting API for the PyData ecosystem built on HoloViews. Build Status Coverage Latest dev release Latest release Docs What is it?

HoloViz 697 Jan 06, 2023
These data visualizations were created as homework for my CS40 class. I hope you enjoy!

Data Visualizations These data visualizations were created as homework for my CS40 class. I hope you enjoy! Nobel Laureates by their Country of Birth

9 Sep 02, 2022
Because trello only have payed options to generate a RunUp chart, this solves that!

Trello Runup Chart Generator The basic concept of the project is that Corello is pay-to-use and want to use Trello To-Do/Doing/Done automation with gi

Rômulo Schiavon 1 Dec 21, 2021
D-Analyst : High Performance Visualization Tool

D-Analyst : High Performance Visualization Tool D-Analyst is a high performance data visualization built with python and based on OpenGL. It allows to

4 Apr 14, 2022
A D3.js plugin that produces flame graphs from hierarchical data.

d3-flame-graph A D3.js plugin that produces flame graphs from hierarchical data. If you don't know what flame graphs are, check Brendan Gregg's post.

Martin Spier 740 Dec 29, 2022
Create animated and pretty Pandas Dataframe or Pandas Series

Rich DataFrame Create animated and pretty Pandas Dataframe or Pandas Series, as shown below: Installation pip install rich-dataframe Usage Minimal exa

Khuyen Tran 92 Dec 26, 2022
A concise grammar of interactive graphics, built on Vega.

Vega-Lite Vega-Lite provides a higher-level grammar for visual analysis that generates complete Vega specifications. You can find more details, docume

Vega 4k Jan 08, 2023
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 29, 2022
A Bokeh project developed for learning and teaching Bokeh interactive plotting!

Bokeh-Python-Visualization A Bokeh project developed for learning and teaching Bokeh interactive plotting! See my medium blog posts about making bokeh

Will Koehrsen 350 Dec 05, 2022
Python scripts for plotting audiograms and related data from Interacoustics Equinox audiometer and Otoaccess software.

audiometry Python scripts for plotting audiograms and related data from Interacoustics Equinox 2.0 audiometer and Otoaccess software. Maybe similar sc

Hamilton Lab at UT Austin 2 Jun 15, 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
Simple Inkscape Scripting

Simple Inkscape Scripting Description In the Inkscape vector-drawing program, how would you go about drawing 100 diamonds, each with a random color an

Scott Pakin 140 Dec 27, 2022
daily report of @arkinvest ETF activity + data collection

ark_invest daily weekday report of @arkinvest ETF activity + data collection This script was created to: Extract and save daily csv's from ARKInvest's

T D 27 Jan 02, 2023