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

  • Добавить построение других типов графиков.
  • Ускорить расшифрование.
  • Замечания и вопросы приветствуются :).
An application that allows you to design and test your own stock trading algorithms in an attempt to beat the market.

StockBot is a Python application for designing and testing your own daily stock trading algorithms. Installation Use the

Ryan Cullen 280 Dec 19, 2022
Visualization ideas for data science

Nuance I use Nuance to curate varied visualization thoughts during my data scientist career. It is not yet a package but a list of small ideas. Welcom

Li Jiangchun 16 Nov 03, 2022
Visualization of the World Religion Data dataset by Correlates of War Project.

World Religion Data Visualization Visualization of the World Religion Data dataset by Correlates of War Project. Mostly personal project to famirializ

Emile Bangma 1 Oct 15, 2022
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-

Aditya Thakekar 1 Jan 11, 2022
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
Data Visualization Guide for Presentations, Reports, and Dashboards

This is a highly practical and example-based guide on visually representing data in reports and dashboards.

Anton Zhiyanov 395 Dec 29, 2022
Analytical Web Apps for Python, R, Julia, and Jupyter. No JavaScript Required.

Dash Dash is the most downloaded, trusted Python framework for building ML & data science web apps. Built on top of Plotly.js, React and Flask, Dash t

Plotly 17.9k Dec 31, 2022
https://there.oughta.be/a/macro-keyboard

inkkeys Details and instructions can be found on https://there.oughta.be/a/macro-keyboard In contrast to most of my other projects, I decided to put t

Sebastian Staacks 209 Dec 21, 2022
Flipper Zero documentation repo

Flipper Zero Docs Participation To fix a bug or add something new to this repository, you need to open a pull-request. Also, on every page of the site

Flipper Zero (All Repositories will be public soon) 114 Dec 30, 2022
NorthPitch is a python soccer plotting library that sits on top of Matplotlib

NorthPitch is a python soccer plotting library that sits on top of Matplotlib.

Devin Pleuler 30 Feb 22, 2022
Curvipy - The Python package for visualizing curves and linear transformations in a super simple way

Curvipy - The Python package for visualizing curves and linear transformations in a super simple way

Dylan Tintenfich 55 Dec 28, 2022
Create matplotlib visualizations from the command-line

MatplotCLI Create matplotlib visualizations from the command-line MatplotCLI is a simple utility to quickly create plots from the command-line, levera

Daniel Moura 46 Dec 16, 2022
NumPy and Pandas interface to Big Data

Blaze translates a subset of modified NumPy and Pandas-like syntax to databases and other computing systems. Blaze allows Python users a familiar inte

Blaze 3.1k Jan 01, 2023
Color maps for POV-Ray v3.7 from the Plasma, Inferno, Magma and Viridis color maps in Python's Matplotlib

POV-Ray-color-maps Color maps for POV-Ray v3.7 from the Plasma, Inferno, Magma and Viridis color maps in Python's Matplotlib. The include file Color_M

Tor Olav Kristensen 1 Apr 05, 2022
📊📈 Serves up Pandas dataframes via the Django REST Framework for use in client-side (i.e. d3.js) visualizations and offline analysis (e.g. Excel)

📊📈 Serves up Pandas dataframes via the Django REST Framework for use in client-side (i.e. d3.js) visualizations and offline analysis (e.g. Excel)

wq framework 1.2k Jan 01, 2023
Streamlit component for Let's-Plot visualization library

streamlit-letsplot This is a work-in-progress, providing a convenience function to plot charts from the Lets-Plot visualization library. Example usage

Randy Zwitch 9 Nov 03, 2022
script to generate HeN ipfs app exports of GLSL shaders

HeNerator A simple script to generate HeN ipfs app exports from any frag shader created with: GlslViewer GlslEditor The Book of Shaders glslCanvas VS

Patricio Gonzalez Vivo 22 Dec 21, 2022
A workshop on data visualization in Python with notebooks and exercises for following along.

Beyond the Basics: Data Visualization in Python The human brain excels at finding patterns in visual representations, which is why data visualizations

Stefanie Molin 162 Dec 05, 2022
Domain Connectivity Analysis Tools to analyze aggregate connectivity patterns across a set of domains during security investigations

DomainCAT (Domain Connectivity Analysis Tool) Domain Connectivity Analysis Tool is used to analyze aggregate connectivity patterns across a set of dom

DomainTools 34 Dec 09, 2022
visualize_ML is a python package made to visualize some of the steps involved while dealing with a Machine Learning problem

visualize_ML visualize_ML is a python package made to visualize some of the steps involved while dealing with a Machine Learning problem. It is build

Ayush Singh 164 Dec 12, 2022