НОВОСТИ [Из песочницы] Аномалии общероссийского голосования по поправкам к Конституции России. Часть 1

NewsBot
Оффлайн

NewsBot

.
.
Регистрация
21.07.20
Сообщения
40.408
Реакции
1
Репутация
0
Аномалии общероссийского голосования по поправкам к Конституции России. Часть 1



Общероссийское голосование по вопросу одобрения изменений, вносимых в Конституцию Российской Федерации, проводилось с 25 июня по 1 июля 2020 года .


Основная цель данной заметки — это продемонстрировать как можно быстро начать работать с данными голосования и показать наличие определенного вида аномалий в них.


Все вычисления, визуализации и парсинг данных приведены в Google Colab, который доступен по этой ссылке



Мы сконцентрируемся на выявлении случаев голосования с нулевой дисперсией, то есть результатов, когда все УИКи внутри одного ТИКа голосуют одинаково или с минимальным разбросом. Данные случаи не имеют естественного объяснения кроме того, что подсчет голосов не осуществлялся.


Примерно это выглядит так:

rjmj7fG2chYLIdaYn7Bf557KvqS3JXKfojrcnXN0vu7rhERpVPX2NShB5mY6l3qie3mz79v5DFOvqymao2vfPJx7tJsm0vkGsxGGM2V1XyI7Vkzf4i2EJL-edENuMaAV7FYn4Zef


EAZQrfVxo6y0XJzIQ_7TfCRhHc6xTVZqKHGWtbPp6lexsuZS-t1FqnSEEaYth4tLumZydzIipo2mE4-czAbqSgVa1i8lED2Xi8TCWcyit3dFDaZGKS6jV37-mfJMsEWqn_Ypcbu0


JyFNzSf5CVXbfVidnhWBsZSn7elaSuQSPNzXTynRQTnzFS2QxPoTHQJn4W5G5lp4z2YI6_RCPWNTip_maZ5PIJcnx-p5cjDsQDID2LCyB-qR8nOhJwbl4gTJ3aS0719F1SH7omC0


05iZXviaRlLmsD0y4si3tbUVOgwXN1J8OdZnd2weE2om-sIz-Xn3-T8blFGjoAXrrcH34kyZSudo6NRT73DfALob-dH9owz0x0McpdndcZCBrIOlo8qqf2tIplB44IZTWwZDr8Rt


Источники данных



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


Сергей Шпилькин одним из первых в нашей стране стал предоставлять данные голосования в режиме реального времени в формате JSON и CSV файлов. За что ему отдельное спасибо (no data, no job!). Соответственно, я использую данные результатов и явки, которые взяты из его телеграм-канала .

Основной результат


  1. Найдены ТИКи имеющие близкий к нулю разброс явки и результата голосования.
  2. Найдены ТИКи, где волатильность приращения внутридневной явки между контрольными точками 10.00 12.00 15.00 и 18.00 крайне мала.
  3. Данные случаи не имеют естественного объяснения кроме того, что подсчет голосов не осуществлялся.


Можно сказать, что общее количество аномальных ТИКов исчисляется сотнями.


Избранные результаты сохранены в .


Самый математически красивый результат показал ТИК 18 «Клинцовская городская» из Брянской области. Для всех участков (кроме одного) приращение явки между 12.00 и 10.00 часами составило 3%, а приращение явки между 15.00 и 12.00 часами составило 5% ( ).

QzMBHm1l2bt68d1OLnLr9_E1HZQ_n8oCvitzH-SxEuAw9pjZ7TyDtwUNtG74U8Zgo0D4g-pRuf3OFm6c_252G-BluMBcC43JeJ4uTR5aAPkzOP_vOzTgfSqUTsGHcGuacqyPBCUk



Но самое интересное, что на УИКах с четными номерами явка составила 91%, а на участках с нечетными номерами — 90%.

Gov3rC28FYrAaf47WsU_JjWJrkGEKJ1x0zI-O_FiCYveJSuwMgMPhqyAZ1SX4tJ2LA1rJpd5aa5C1vZeMNTLffgle_tirGkkYzpT4VE8Vym7lCIRjGW_U50980o8AcogkoS-wKjR


Описание кода



Весь код можно прогнать через меню Runtime->Run All. Это займет около 15 минут.


Для загрузки данных с Google Drive необходимо иметь Google account. GoogleCredentials выведет ссылку с кодом доступа. Скопировав код доступа в колаб, вы сможете загрузить необходимые данные. Это стандартная процедура для колаба.


В самом конце будет предложена возможность сохранить результаты вычисления на локальном компьютере.


Ниже идет детальное описание основных частей программы.


Начнём с загрузки данных явки и результатов голосования (раздел «Загрузка данных явки и результатов голосования»). Данные соответствуют файлам turnouts_05_Jul_2020_14_56.zip и results_06_Jul_2020_19_05.zip из телеграм канала .


Далее данные по явке df2 и результатам голосования df1 совмещаются в один дата фрейм df:


df= pd.merge(df1, df2.drop(columns=['reg']), how='inner',on=['tik', 'uik'])


Для транслитерации названий регионов и ТИКов я использую пакет transliterate:


!pip install transliterate
from transliterate import translit


После этого сосчитаем значения явки и результата референдума в процентах:


df['turnout_pct']=df['n_ballots_all']/df['n_registered_voters']*100.
df['yes_pct']=df['yes']/df['n_ballots_polling_station']*100.
df['no_pct']=df['no']/df['n_ballots_polling_station']*100.
df['non_valid_pct']=df['n_ballots_invalid']/df['n_ballots_all']*100.


И сделаем резервную копию получившегося дата фрейма:


df_original=df.copy(deep=True)


Теперь можно приступать к анализу. В разделе «Визуализация явки и результатов голосования» приводится визуализация процентов голосов «За» и «Против». Предварительно отфильтруем участки с явкой ровно 100%.


df=df[df['turnout_pct']

UYloKXA4QVkMTerN8u2Ck47nK3A5oZFWB_4kRND_C-IdTYT-na0OiTUgomjM3Y2g4jlXaMyqxzoaW0yYEQ9gch_jZPwAZ900akn9q6q_taL1mnu6Uw2TQ_ZK0T7YRDwMXLgPkos-



Далее, в качестве разогрева, приведем ставшие уже классическими оценки аномальных голосов на графиках голоса «За» против явки:

Rzxo8HH054cQLsw1nwPhXsh1DlJIGPU3vQMqTBOhP9lJgEd63EgJQWvg4HzjXOEnWT3OiIWeGXcPo2HLY0vBnLLoV7NsT5c1qmRBe_lVxhf87JV3Jq3C-CMZVeCYBJ_8qlp-HRBA



И гистограммы голосов «За» и явки:

z5Suj-XwxIbU0PJ0maWHrpxwtGAmkbu_Q2AslEn53-G6_dTPnby_PVTGqGsR8Vkm9AZ6XcLviU8dMlIFUcNkYEKEpq6cyA7G34Qe6o_YNKRtfSu1kGLJTialI5pIywfsrajZEvIp


0iEXxVZsMSJr_2-1CWPnhyPCGDEYJYkFwAyetHLNqhfi61dH7V2wxwc0LGTu6x2G_MqoBaLsUL4h1kpFE-96U-fOWsQfWHqogsisxKEEXAWAyHHbrO0Vwqr0xZc93EcSvuVgeRMp



Обратите внимание на пики в районе круглых чисел 80%, 85%, 90% и 95%.


На главное блюдо у нас обнаружение аномалий с низкой дисперсией. В отличие от многих других методов, данный метод прост (результат и его интерпретация понятна и человеку без специального образования) и свободен от модельных предположений (Помни: A Model Is Only as Good as Its Assumptions).


В разделе «Расчет дисперсии процентов явки и голосов За» сосчитаны основные статистики и записаны в Excel файл. Для оценки разброса (дисперсии) наиболее подходит робастная версия стандартного отклонения .


Аномальные результаты можно обнаружить изучая дисперсию голосов «За» и явки. Дополнительно я изучил суммы дисперсий голосов «За» и явки и дисперсии внутридневной явки. Четыре последующих раздела посвящены детальному исследованию каждого случая.


Графики ТИКов с низкой дисперсией голосов и явки выглядят как прямые линии. Графики ТИКов с низкой дисперсией суммы дисперсий голосов и явки выглядят жирное пятно (окружность).


Поскольку все 4 раздела имеют одну и ту же структуру, я подробно разберу лишь один из них: «Результаты с низкой дисперсией процента голосов 'За'».


В подразделе «Таблица результатов» приведены топ 50 ТИКов с малой дисперсией по проценту голосов 'За'.

j1QejrvLsIHuXFIfY9jNlTqzN73s0Y_jjrAxn9TIAMsPc9zkEvBVeVMlhPlRvxwYGive7D3FUKLyx87QLTIzJKf7G2PHs3hTTIXKEWGUDUHfVmkuFoqdWuXJhyMvzF_CDp0b_hjE



В подразделе «Детальная визуализация отдельных ТИКов», я привожу пример как можно визуализировать отдельные ТИКи. Для этого надо выбрать соответствующий индекс (цифра в первой колонке) и присвоить переменной id_num её значение. Для примера можно посмотреть id_num 1616, 1995 или 2165.


Значение id_num=1616 соответствует ТИКу 33 Пермь, Орджоникидзевская в Пермском крае. В табличной форме он выглядит так:

h2G1ugn1c2SFGYbYQWnLwqkm-RNpzEVnHSCiDH0Fnv0EFvLr70UdEfsY9OTY6X-FD2lNeoUpBc1gkbwgqgWtCRy_3Y1F72ozM5ebS-tbKtMpcymmUMdXNTlCGK4gMb20iAoDI3X6



При том что каждый УИК имеет под тысячу избирателей, голоса «За» (колонка yes_pct) распределились невероятно близко к 71.9%. На графиках это выглядит так:

wzM6vL5c3o1u3gCshsO6GM2GlMB-Zu9T6cdmZXCBSXzwmyPMPPis8DZZepGGoBK65M850wTOpU7ozFFC3dxWZpg0-fq58850m1FU8vcH4lVy1fW3aEYuefp-2FU5slJ9NgU-4_EB


-_vsoPrQeOF1Y9bdOHE0Q1c3Gvz7fTcXC2aV1sttfKOfxsyVxTAs8w9xoE1meIcnQQHH9BRob23ymMsRrxcyMj1IRwsNtrftTAeWgAYGcrEfsttAIeiehlCp8pd0SRMcQ3goSoeO



Наконец, в подразделе «Визуализация всех аномальных результатов» отсортируем ТИКи по величине разброса голосов «За». Затем визуализируем и сохраним plot_top_n_results лучших результатов. Я рекомендую глазами посмотреть от plot_top_n_results=50 до plot_top_n_results=300 результатов.


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


import shutil
from google.colab import files
directory='/content/drive/anomaly/dispersion'
shutil.make_archive(directory, 'zip', directory)
files.download('/content/drive/anomaly/dispersion.zip')

Дополнительные ссылки



Много интересных результатов приведено в Facebook'е и .


В журнале


и .


По возможности, поддержите борьбу за честные выборы и общероссийское общественное движение в защиту прав избирателей «Голос» ( )


Визуализация результатов референдума:











Хабр о федеральных выборах в РФ:





 
Сверху Снизу