Зачем это нужно?
В сентябре 2016 состоялись выборы в Государственную Думу VII созыва. Когда-то давно, в 2013 году, я написал несколько скриптов для R, которые могли собрать данные по результатам голосований на основе API «Законопроект» и самого сайта Думы. Тогда же написал пару постов с небольшим анализов результатов «работы» законодателей за 2012 год (здесь и здесь). Так как Дума VI созыва уже завершила свою работу, решил обновить результаты с использованием данных не за один год, а за весь период — c 2012 по 2016. Удивительно то, что форматы хранения данных не изменились (за что спасибо сотрудникам ИТ аппарата ГД), поэтому все коды по сбору данных сохранили свою работоспособность — ими можно пользоваться для своих проектов.
И все же — зачем это вообще нужно? Потому, что как правило слова политиков как правило ничего не значат, имеют значения дела, действия. Суть их работы заключается в том, чтобы много говорить, но в конечном итоге для законодателей имеет значение лишь то, как они голосуют. Именно голосование приведет к тому, что может быть принят тот или иной закон, который потом повлияет на жизни миллионов людей. Поэтому в конечном итоге цель подобных занятий заключается в том, чтобы посмотреть на их поступки и сравнить со словами.
На Западе анализ voting behavior — развитое направление. Есть много исследований, который посвящено тому, как правильно анализировать и интерпретировать подобные данные.
В современной России мало кто верит, что Дума представляет собой что-то значимое. «Парламент — не место для дискуссий», «бешеный принтер», «закон Димы Яковлева» или «пакеты Яровой» — все это отражает скептическое отношение к тому, на сколько самостоятельно является Дума.
Описание данных и разведочный анализ
Сами исходные данные по результатам голосования находятся на сайте vote.duma.gov.ru в довольно удобном виде и позволяют посмотреть результаты любого голосования, если знать дату голосования или номер законопроекта. Для Думы 6 созыва там предоставлено 15 767 голосований. Проблема заключается в том, что много голосований являются процедурными (к примеру, «О проекте порядка работы Государственной Думы на 24 июня 2016 года»), а не содержательными. Поэтому для того, чтобы анализировать и интерпретировать результаты голосования необходимо каким-то образом исключить процедурные голосования и оставить только содержательные. Можно было бы собрать все голосования и потом на основе анализа заголовка попытаться отделить «зерна от плевел». Я пошел другим путем и сначала выделил законопроекты, которые рассматривались Думой. К примеру, вот этот url содержит законопроекты (или в первом, или во втором, или в третьем чтении) в 2016 году. Функция GetNumberByURL
, которая принимает url входных аргумента, возвращает вектор с номерами рассмотренных законопроектов. Затем уже мы «проходимся» по этому списку, получаем все голосования по каждому законопроекту, а затем получаем поименные результаты голосования.
Вот некоторое описание использованного массива данных:
- Рассмотрены все законопроекты, внесенные в Думу в 2012-2016 годах. Всего в списке оказалось 4525 законопроекта, по которым прошло 12 563 голосований. То есть, в среднем на каждый законопроект пришлось примерно 2,77 голосования. Это ожидаемо, так как обычная процедура принятия законопроекта предусматривает три чтения, то есть три голосования.
- Большинство голосований заканчивается принятием, то есть большинство депутатов голосует «за». Если быть точнее, голосований, закончившихся принятием 8906 по сравнению с 3657 — «против». Получается, что в примерно 71% всех голосований заканчивается «за», 29% — против. В принципе, это ожидаемо, так как основная часть «непроходных» законопроектов так и не получает шанса быть вынесенной на общее голосование и «зарубается» на этапе рассмотрения профильными комитетами.
Посмотрим гистограмму распределения голосований, в зависимости от того, какой получился итоговый результат по голосованию.
Как видно из графика, довольно большое количество голосований заканчивается единогласной поддержкой — пик в районе 100%. Также примечателен пик в районе 50% — то есть, когда набирается минимально необходимое количество голосов. Отклоненные законопроекты имеют довольно малое количество голосов, так как чаще всего депутаты вообще не голосуют, чтобы отклонить какую-то поправку к законопроекту, а не голосуют против нее. В результате, получается, что голосование «не проходит» из-за отсутствия кворума. В дальнейшем это пригодится нам для анализа по именных результатов голосования — мы будем интерпретировать не-голосование депутата как голосование «против».
— Голосования имеют сезонные паттерны. К примеру, вот распределение голосований по месяцам
- Распределение голосований ГД по месяцам (2012-2016 гг.) *
Видно, что наиболее «напряженные» периоды для депутатов приходятся на июнь и декабрь — как раз перед наступлением каникул.
- Распределение голосований ГД по дням недели (2012-2016 гг.) *
Распределение голосований по дням недели также имеет оригинальный характер. Наиболее активно проходит пятница, и почему-то вообще нет голосований по понедельникам и четвергам. Видимо, это связно с регламентом работы ГД.
— Большинство законопроектов (около половины) законопроектов имееют всего лишь одно голосование. Из почти 3,8 тысячи законопроектов более 10 голосований пришлось всего лишь на 100 законопроектов. Обычно довольно много голосований (несколько десятков) бывает по федеральному бюджету, что в ожидаемо. Но рекордсменом для Думы 6 созыва стал вот этот законопроект, по которому голосовали 252 раза!
Поименные результаты голосований и голосования по партиям
Итак, у нас имеется 3,8 тысячи законопроектов, по которым прошло около 13 тыс. голосований за 4,5 года. Так как в Думе 450 депутатов, то получается, что это около 5,5 млн отдельных «точек» (3800 * 450 * 13 000
). Это относительно большой массив данных, который в виде несжатого csv-файла занимает около 250 мегабайт. Для обеспечения сопоставимости я исключил результаты тех депутатов, которые не проработали до конца срока и которые имеют меньше 10 тыс. голосований.
Посмотрим на некоторые общие результаты.
— Самым «оппозиционным» депутатом Думы VI созыва был депутат Никитчук И.Н. (КПРФ), который голосовал «против» целых 1291 раза. Депутаты из КПРФ чаще других голосуют «против» по сравнению с другими партиями, на втором месте — справороссы. ЛДПР гораздо реже голосует «против» и примыкает к «Единой России» по этому показателю. Кстати известный депутат Дмитрий Гудков имеет гораздо менее впечатляющий трек-рекорд — он проголосовал «против» 466 раз при 4417 голосах «за» и 32 раза — «воздержался». Разумеется, просто доля голосов «против» сама по себе мало о чем говорит — важно за, что именно депутат голосовал против.
Доля голосов «против» (2012-2016 гг.)
— Самым не-оппозиционным депутатом ГД VI созыва была депутат Мукабенова М.А (ЕР). Она проголосовала «за» 8955 раза при 7 голосах «против» — это рекорд.
Поименные результаты голосований — кластерный анализ
Кластерный анализ предполагает группировку депутатов, которые голосуют схожим образом.