Показаны сообщения с ярлыком не-экономика. Показать все сообщения
Показаны сообщения с ярлыком не-экономика. Показать все сообщения

11 сент. 2013 г.

Интерактивная карта результатов выборов мэра г. Москвы (8 сентября 2013 года) по отдельным УИКам

Как вы знаете, 8 сентября состоялись выбора мэра г. Москвы.  Уже довольно много материалов в Сети посвящено статистическому и географическому анализу этих выборов на основе официальных данных Мосгоризбиркома.

Я тоже решил посмотреть на эти данные и для начала построить карту с их визуализацией. Карт с результатами выборов в Сети уже довольно много. К примеру, на глаза попала карта Коммерсанта, которая показывает данные по отдельным округам. Есть подобные карты по отдельным районам.

10 авг. 2013 г.

Как построить график с двумя осями Y и другие хитрости построения графиков в Excel

Некоторое время назад с удивлением обнаружил, что довольно много посетителей с поисковых систем попадают сюда с запросами типа "построить график с двумя осями y excel". А там речь идет про R :)

Поэтому специально  решил написать про то, как все же построить такой график именно в Excel, и заодно поделиться другими тонкостями, которые накопились за 10 лет работы с этой программой.

14 июл. 2013 г.

Результаты голосования в Думе о реформе РАН - первое и второе чтения

update. результаты по все чтениям доступны здесь

Все уже слышали про реформу РАН, проталкиваемую в ГД. В лучших традициях российского законодательного процесса все происходит просто с космическими скоростями. До летних каникул Думы законопроект уже прошел два чтения. Напомню, что именно второе чтение является ключевым для законопроекта, а не третье, как можно было бы предположить.
В прессе много об этом писалось и, разумеется, было много противников реформы в предложенным правительством формате. Посмотрим же на фактические результаты голосований в Думе по первому и второму чтению.
О Российской академии наук, реорганизации государственных академий наук и внесении изменений в отдельные законодательные акты Российской Федерации (в части уточнения правового положения, полномочий и функций Российской академии наук, реорганизации государственных академий наук)

Как видно, первое чтение (3 июля) было принято большинством всего лишь в 234 голоса (при необходимом минимуме в 226 голосов). "За" проголосовала почти вся Единая Россия(два ренегата - это депутаты Романов и Говорухин). "Против" были весь состав КПРФ и почти вся СР (ренегаты "за"- депутаты Харлов  и Митрофанов). ЛДПР дружно не голосовала.
Ко второму чтению, которое состоялось уже (!) через два дня (5 июля) уровень поддержки заметно вырос: ЛДПР и Справедливая Россия теперь полным составом голосуют "за". КПРФ вместо "против" не голосует (академик Жорес Алферов кстати тоже не голосовал, а не выступил "против" во втором чтении). Это к вопросу о принципиальности народных избранников.

Ко второму чтению законопроект правда претерпел некоторые изменения. Я детально не углублялся в эту тему, но насколько я понял, внесены правки непринципиального характера, чтобы "задобрить" академиков. К примеру, статус членов-корреспондентов оставляют еще на три года. Изначально речь шла о том, чтобы объединить членкоров и просто "академиков". Понятно, что обычным академикам не хочется объединяться с  младшими академиками (это примерно как кандидатов и докторов наук объединили бы в докторов). Но разумеется, к реформе собственно говоря,  РАН это не имеет ровно никакого отношения. Речь идет исключительно о частных интересах нескольких сотен человек, которым сначала показали кнут, а потом дали маленький пряник.

Вот пофамильные результаты - найдите своего любимого депутата!

15 июн. 2013 г.

Результаты голосования Думы по "анти-пиратскому закону" - первое чтение

Вы, возможно, слышали о новой громкой инициативе народных избранников - так называемый "анти-пиратский закон". Официальное название - "О внесении изменений в законодательные акты Российской Федерации по вопросам защиты интеллектуальных прав в информационно-телекоммуникационных сетях".
Сейчас этот законопроект просто с космической скоростью движется в Государственной Думе. 6 июня три депутата ГД  - оперная певица Максакова-Игенбергс М.П. (ЕР), режиссер Бортко В.В. (КПРФ), актриса Драпеко Е.Г. (СР) - официально представили законопроект. И уже 14 июня, то есть через 8 дней, законопроект прошел первое чтение. Я не буду касаться сути законопроекта, она отлично изложена в последней заметке Ъ.
Посмотрим на результаты голосования по партиям:
О внесении изменений в законодательные акты Российской Федерации по вопросам защиты интеллектуальных прав в информационно-телекоммуникационных сетях"
Добавьте подпись
Ниже можно посмотреть пофамильные результаты и найти своего любимого депутата.


Как видно, законопроект был принят 257 голосами "за" (237 от ЕР, 1 голос от КПРФ и 19 голосов от СР). Причем довольного много депутатов(189 человек всего) не голосовало. Я, честно говоря, до сих пор не очень понимаю эту логику. Кворум составляет 226 депутатов. Поэтому если ЕР голосует дисциплинированно (а так происходит почти всегда), то "не голосовать" смысла нет, кворум будет все равно. "Утопить" законопроект не-голосованием при текущем количественном соотношении депутатов невозможно.

Довольно странным мне показалось, что единственный голос в поддержку законопроекта от КПРФ принадлежит не режиссеру Бортко, который выступил инициатором (как можно было бы ожидать), а некоему депутату Ющенко А.А. Режиссер Бортко почему-то не стал голосовать за свой же законопроект (!). Депутат Драпеко вместе с еще 18 избранниками от СР  проголосовала "за". Три решительных голоса "против" - это депутаты Иванов С.В. (ЛДПР), Пономарев И.В. (СР) и Гудков Д.Г. (СР). Вообще с партийной дисциплиной у эсеров явно не складывается.

Судя по взятым темпам, принято решение принять законопроект до летних каникул. Сейчас наступает наиболее важный этап - второе чтение, на котором возможно, удастся будет придать  ему хоть более или менее разумное представление. Досудебное блокирование целых доменов - это явно что-то из области маразма. И напоследок следующая цитата из пояснительной записки к законопроекту: "Важнейшей новеллой ГПК РФ является введение института предварительных обеспечительных мер защиты интеллектуальных прав в информационно-телекоммуникационных сетях, в том числе в сети «Интернет» (Статья 144'ГПК РФ)." Новеллой!

13 июн. 2013 г.

Расписание подмосковных электричек на диаграмме Маре (Marey's Trains) c помощью d3.js

Начнем сразу с итогового результата, который выглядит вот так:
Для удобства лучше открыть его в полном окне. 




Как читать эту диаграмму (если не очень понятно): 
  • по оси X - время (в данном случае - с 4.30 утра до 12.00). по оси Y - идут станции Ленинградского направления (от Москвы Ленинградской до Твери). Расстояние между названиями по оси соответствует реальному расстоянию между станциями в километрах. Поэтому некоторые станции почти "налезают" друг на друга ‑ расстояние между ними совсем небольшое (по крайней мере, по тем данным, которые у меня есть). 
  • каждая линия представляет собой поезд, каждая точка на линии - станцию. 
  • по умолчанию выбраны оба направления, но можно выбрать отдельно - "в Москву"/"в область". 
  • при наведении мышкой на станцию появляется маленькое окошко, которое показывает название станции и время прибытия. 
  • чем круче линия, тем быстрее идет данный поезд. 
  • Цветом обозначены типы электричек: черный - ежедневно, рыжий - по выходным, фиолетовый - выходные /кроме субботы/кроме воскресенья, красный - электричка отменилась. 
  • Информация по расписанию взята с tutu.ru и соответствует 13 июня 2013 года, со всеми изменениями в расписании. 

Немного об истории вопроса 

Такое представление расписания поездов первым представил в своей книге 1885 года (128 лет назад!) La méthode graphique французский ученый Этьен-Жюль Маре. Таким образом в книге было изображено расписание  поездов между Парижем и Лионом. 
Тем, кто занимается графической визуализацией, это представление во многом известно благодаря культовой книге Эдварда Тафте (Edward Tafte) - "The Visual Display of Quantiative Information". Именно диаграмма Маре вынесена на обложку книги, и Тафте по ходу несколько раз возвращается к этой диаграмме. Такое представление соответствует "принципам графического совершенства" (principles of graphical excellence) от Тафте - хорошая визуальная презентация данных является сочетанием сути вопроса, статистики и дизайна. Сложные идеи представлены ясно, точно и эффективно. Читатель получает максимальное количество идей в минимальный период времени и с минимальным количеством "чернила" на единицу пространства.  
Разумеется, с помощью современных технологий подобной репрезентации можно придать интерактивность и дополнительное удобство представления. 
 К примеру, вот пример расписания пригородных поездов Сан-Франциско в стиле Маре, созданный дизайнером Nicholas Rougeux. Недавно я увидел аналогичный пример, созданный в d3 автором этой удивительной библиотеки (Mike Bostock) и решил сделать аналогичную визуализацию для наших данных в качестве урока по изучению d3, создания визуализации в стиле Тафте, а также потому, что мне кажется, что используемые представления расписания электричек как на самих станциях, так и в Интернете, можно значительно улучшить. 

Исходные данные. 
Разумеется, сначала необходимо получить исходные данные - расписание движения пригородных поездов в удобном для машинной обработки виде. Как ни удивительно, но официальный перевозчик - ОАО «Центральная пригородная пассажирская компания» - не предоставляет общественности подобной информацииии. Раздел "Он-лайн табло" на официальном сайте находится в "стадии наполнения". 
Почему-то компания, имеющая почти $1 млрд ежегодной выручки и более $100 млн чистой прибыли, не нашла возможности сообщать пассажирам о расписании движения. Правительство г. Москвы также не имеет подобной информации.  Широко разрекламированный "Портал открытых данных" содержит информацию о стоимости проезда, но не расписании движения пригородных поездов. 
Разумеется, все кто ездил на электричках, знают альтернативные источники информации :) Это конечно, Яндекс и tutu.ru. Обращает кстати внимание, что оба сервиса используют довольно скудное текстовое представление расписания. 
Я написал небольшой скрипт в R, который собирает данные с tutu.tu, хотя концептуально это не очень правильно - перевозчик, либо местные власти должны предоставлять подобную информацию в удобном виде.   
В нашем случае для Ленинградского направления, но разумеется, можно собрать информацию по и другим направлениям/вокзалам. Причем информацию по расстояниями между станциями пришлось "парсить" тоже с tutu.ru, так как я не смог найти какой-либо официальной информации по этому поводу. 
Итоговый файл представляет собой матрицу, в котором по столбцам идут остановки, а по строкам - отдельные поезда. В названии столбцам закодированы расстояния между станциями и зоны оплаты. Выглядит это вот так: 





Соответственно мы видим, что на Ленинградском направлении в день проходит 165 поездов (по обоим направлениям), которые останавливаются на 45 различных станциях. Матрица состоит из почти трех тысяч значений, поэтому необходимо специальные средства представления этой информации в графическом виде. 

Построение диаграммы в стиле Маре. 
Как уже говорилось, я использовал графическую библиотеку Data-Driven Documents (или d3), которая представляет собой нечто среднее между библиотеками готовых графиков и самостоятельным рисованием диаграмм в графическом редакторе вроде Inkscape. 
Это мой второй опыт самостоятельного рисования в d3 (первый - карты хороплет для РФ). Поэтому я основывался на готовом примере Майка, но несколько видоизменил его для своих данных и дополнил дополнительными интерактивными элементами. 
Вариант с этими "плюшечками" занимает около 300 строк кода, но вполне возможно, потому что я использовал не самые оптимальные конструкции. 


Основная "рабочая" функция преобразует матрицу поезда-станции и преобразует ее в JS-объект. На основе этого объекта собственно и строится вся графическая составляющая. 
function type(d, i) {

  // Extract the stations from the "stop|*" columns.
  if (!i) for (var k in d) {
    if (/^stop\|/.test(k)) {
      var p = k.split("|");
      stations.push({
        key: k,
        name: p[1],
        distance: +p[2],
        zone: +p[3]
      });
    }
  }

  return {
    number: d.number,
    type: d.type,
    direction: d.direction,
    stops: stations
        .map(function(s) { return {station: s, time: parseTime(d[s.key])}; })
        .filter(function(s) { return s.time != null; })
  };

Информационное окно

В дополнении примеру Майка я добавил еще всплывающее окошко, которое появляется при наведении мышкой на любую круг - станцию. Делается это с помощью простого event-listener, реагирующего на mouseover.

train.selectAll("circle")
      .data(function(d) { return d.stops; })
    .enter().append("circle")
      .attr("transform", function(d) { return "translate(" + x(d.time) + "," + y(d.station.distance) + ")"; })
      .attr("r", 3)
       .on("mouseover", function(d) { 
                  var xPosition = x(d.time)+margin.left + margin.right;
                  var yPosition = y(d.station.distance);

      d3.select("#tooltip")
            .style("left", xPosition + "px")
            .style("top", yPosition + "px")           
            .select("#stations")
            .text(d.station.name);
      d3.select("#tooltip")
            .select("#time")
            .text(formatTime(d.time));
      d3.select("#tooltip").classed("hidden", false);
      
            })
       
                .on("mouseout",  function() {
                    d3.select("#tooltip").classed("hidden", true);
                          });



Соответственно объект tooltip то появляется и наполняется информационным содержанием (название станции и время прибытия поезда на эту станцию), то исчезает. 


Выбор направления

В исходном примере Майка отображается только одно направление, я же хотел, чтобы была возможность посмотреть оба направления одновременно, а также по отдельности. Это делается с помощью отдельной формы и функции, которая реагирует на изменение этой формы. 
d3.selectAll("input[name=f_direction]")
  .on("change", function(){
    cur_direction = this.id;
      if (this.id == 'moscow'){
        d3.selectAll(".moscow").classed("hidden", false);
        d3.selectAll(".oblast").classed("hidden", true);
           }
      if (this.id == 'oblast'){
        d3.selectAll(".moscow").classed("hidden", true);
        d3.selectAll(".oblast").classed("hidden", false);
           }
  })


Соответственно все объекта класса "oblast" или "moscow" показываются, либо скрываются от зрителя. Переменная cur_direction нужна для того, чтобы правильно реагировать на выбор для недели, когда направление уже выбрано. 


Выбор дня недели

Исходные данные имеют для каждого поезда его тип: ежедневно, по выходным, по рабочим, кроме суббот, кроме воскресений, отменен. Но пользователя на самом деле интересует какие поезда идут в конкретный день, поэтому я решил целесообразнее предоставить выбор для недели и в зависимости от этого рисовать нужные поезда. Соответственно, поезд, который ходит в режим "кроме воскресений" не будет отображаться в при выборе воскресенья. При выборе субботы или воскресенья также не будут показываться электрички, которые ходят по рабочим дням. 
Реализация этой логики сделана топорным if :) Отмененные электрички (красным цветом) должны отображаться при любом раскладе
d3.selectAll("input[name=type_train]")
  .on("change", function(){

      if (this.id == 'working'){
        d3.selectAll(".daily"+"."+cur_direction).classed("hidden", false);
        d3.selectAll(".working"+"."+cur_direction).classed("hidden", false);
        d3.selectAll(".weekend"+"."+cur_direction).classed("hidden", true);
        d3.selectAll(".ex_saturday"+"."+cur_direction).classed("hidden", true);
        d3.selectAll(".ex_sunday"+"."+cur_direction).classed("hidden", true);
      }
      if (this.id == 'saturday'){
        d3.selectAll(".daily"+"."+cur_direction).classed("hidden", false);
        d3.selectAll(".working"+"."+cur_direction).classed("hidden", true);
        d3.selectAll(".weekend"+"."+cur_direction).classed("hidden", false);
        d3.selectAll(".ex_saturday"+"."+cur_direction).classed("hidden", true);
        d3.selectAll(".ex_sunday"+"."+cur_direction).classed("hidden", false);
      }  

      if (this.id == 'sunday'){
        d3.selectAll(".daily"+"."+cur_direction).classed("hidden", false);
        d3.selectAll(".working"+"."+cur_direction).classed("hidden", true);
        d3.selectAll(".weekend"+"."+cur_direction).classed("hidden", false);
        d3.selectAll(".ex_saturday"+"."+cur_direction).classed("hidden", false);
        d3.selectAll(".ex_sunday"+"."+cur_direction).classed("hidden", true);
      }      
  })



Вот вроде бы и все. Буду рад услышать любые комментарии по оптимальном представления расписания и на сколько это вообще удобно. Как я понимаю, люди, которые ездят на электричках помнят расписание в пределах нужного часа-двух наизусть и в принципе не слишком нуждаются в графической визуализации. Я, к примеру, езжу на электричках изредка, и оно мне кажется удобным. 

12 июн. 2013 г.

Закон об оскорблении чувств верующих - результаты голосований по чтениям

Если вы не в курсе, Государственная Дума вчера окончательно приняла закон об оскорблении чувств верующих. Мы уже рассматривали результаты голосования в первом чтении, которое состоялось 9 апреля 2013 года. Теперь можно посмотреть на результаты всех чтений сразу:


Обращает внимание, что вторых чтений было два - 21 мая 2013 и вчера - 10 июня 2013 года. Вчера было принято решение вернуть законопроект во второе чтение - видимо для того, чтобы принять новые поправки. Процедура работы ГД не позволяет осуществлять содержательную правку законопроекта на этапе третьего чтения, поэтому технически его надо вернуть во второе чтение, внести правки и снова проголосовать. Вообще второе чтение - как правило, наиболее важный этап в судьбе любого законопроекта. Насколько я понял, основное нововведение - дополнить часть с наказанием по ст 148 УК РФ следующим пунктом: "после слов «лишением свободы на тот же срок» дополнить словами «с лишением права занимать определенные должности или заниматься определенной деятельностью на срок до двух лет».


Что значит конкретно - "определенные должности" и "определенная деятельность" - я не понял.

Теперь о результатах. Как видно, результаты практически не изменились от чтения к чтению. ЕР и ЛДПР поддерживают законопроект. КПРФ и большая часть СР не голосуют, что можно трактовать как оппозицию закону.

В третьем итоговом чтении только два депутата голосовали "против". Вот имена этих героев - Гудков Д.Г. (СР) и Журавлев С.В. (ЛДПР). Среди депутатов Единой России не голосовало четыре человека (Ткачев А. Н., Долгих В.И., Кривоносов С.В., Кузин С.П) - то ли их не было, то ли выражали таким образом свое несогласие.

16 апр. 2013 г.

Результаты голосования в Государственной Думе в 2012 году - продолжение

Начало - здесь
В прошлый раз мы посмотрели на результаты работы ГД с точки зрения законопроектов - сколько их было, какие по ним итоговые результаты голосования и так далее. Теперь пришло время для более серьезного анализа.

Сначала необходимо было получить данные. Я собрал по-депутатные результаты голосования голосования по тем 888 законопроектам, которые обсуждались раньше, с помощью АИС Законопроект и набора заранее написанных скриптов.
По этим законопроектам в прошлом году 2389 голосования в ГД. Таким образом, наш исходный набор данных должен иметь  следующую размерность 2389 голосований * 450 депутатов = 1 075 050, то есть свыше 1 млн точек. Фактически их оказалось несколько меньше. Как я понял, это связано с тем, что из-за ротации депутатов по тем или иным причинам (смерть, отказ от мандата и проч) реальное количество голосующих депутатов не всегда равно 450.

Я выложил все используемые данные в Google Drive для желающих позаниматься собственным анализом. Там же есть и описание формата всех строк. Внимание -  итоговый файл с результатами голосования по отдельным депутатам занимает более 50 мегабайт. 

Теперь посмотрим на сами данные. Вот, к примеру, агрегированная сумма голосов в зависимости от результата. Как видно, чаще всего депутаты голосовали "за", либо вообще не голосовали. Количество голосований "против" не превышает 25 тыс. (то есть менее 2,5% от общего количества поданных). Воздерживаться в Думе вообще не принято - таких голосов за прошый год нашлось только 712 (менее 0,01%).
Этот график не учитывает то, что количество депутатов от разных партий сильно отличается, поэтому разбивка по партиям дана просто в иллюстративных целях.
 График. Количество голосований Государственной Думы в 2012 году 
Конечно, же можно смотреть и на отдельных депутатов - так как депутатов много, то подобные результаты сложно визуализировать на одном графике. Если разбить их по партиям получается следующая картина (на графиках приведено процентное соотношение результатов 2389 голосований, которые мы анализируем).

Единая Россия
На графике хорошо видна высокая степень единодушия-единороссов. "За" они, похоже, голосуют крайне дисциплинированным образом. Голосовать против не принято - для крупнейшей фракции проще согласованно не голосовать и таким образом срывать кворум.

КПРФ
Среди коммунистов есть заметный разброс по голосам "за", также хорошо заметно, что иногда (в 5% случаях примерно) коммунисты голосую "против".

ЛДПР
ЛДПР, как ожидалось, похожа ЕР. Разброс по голосам "за" между депутатами небольшой, так же не принято голосовать "против".

Справедливая Россия 
Среди справедливороссов наиболее выражен разброс между теми, как разные депутаты голосуют - как по голосам "за", так и по голосам "против". Ряд депутатов в самом низу графика (Митрофанов, Гасанов, Музыкаев) почему-то не голосовали почти в 75% голосований.

Все это конечно интересно - я построил и другие иллюстративные графики, когда разбирался с собранным массивом, но может быть подвержено серьезной критике. К примеру, графики, которые я привел выше - с большими недостатками. К примеру, они не учитывают то, что один депутат может проголосовать "за" в 50% случаях и другой депутат также проголосует "за" в 50% случаях, но это будут как раз другие 50%. И так далее.

Для того, чтобы постараться как-то "обозреть" имеющиеся данные я использовал традиционную статистическую технику, которая использует для подобных целей - mulidimensional scaling (MDS). Я не буду описывать ее суть - в сети и в учебниках есть куча отличных описаний. Вкратце ее смысл сводится к набору техник для того, чтобы визуализировать различия в сложных наборах данных.
В нашем случае мы хотим визуализировать насколько отличаются голосования разных депутатов друг от друга. Сначала мы трансформируем качественные отметки ("за", "против", "воздержался", "не голосовал"). Я пробовал разные варианты, в данном случае использует такой вариант:

  • "за" = 1 
  • "возд" = 0
  • "не голосовал" = -1 
  • "против"  = -1 

Мне показалось, что так более адекватно описать данные. Голосования "против" очень редко используется в Думе для выражения своего мнения, гораздо чаще депутаты просто не голосуют в знак своего протеста. К такому же выводу я пришел, когда смотрел на результаты по отдельным  "громким" законопроектам.
После преобразованная данных получаем матрицу "депутат-законопроект", которая имеет примерно такой вот вид:

Здесь по строкам, которые начинаются с 99.. находятся депутаты, а по строкам отдельные голосования. То есть первый элемент этой матрица говорит о том, что депутат под номером 99100015 (по vote.duma.gov.ru легко посмотреть, что это Апарина Алевтина Викторовна из КПРФ) проголосовала "за" по голосованию №75668. Вот ссылка на само голосование (как видно, номер голосования соответствует url), депутат Апарина действительно поддержала этот законопроект.
После этого мы рассчитываем матрицу расстояний между совокупными голосованиями разных с помощью функции dist() в R. А с помощью функции cmdscale() осуществляем классический MDS на матрице расстояний.
Что же мы получили в итоге. Вот результат визуального представления полученных результатов, сгруппированных по партиям:

Результат MDS-кластеризации голосований в Государственной думе РФ в 2012 году


 Во первых, сразу хочу отметить, что числа по оси Х и Y не имеют смыслового значения - они зависят от набора данных и используемой кодификации. Во вторых, расстояния между точками - тоже определенный артефакт и их нельзя содержательно интерпретировать. На графике важно выделять кластеры - совокупности точек, которые находятся рядом. Именно по ним можно сказать, что эти точки (то есть депутаты) голосовали схожим образом.

На графике хорошо видно, что слева выделяется ярко выраженный кластер Единой России. Несмотря на то, что единороссов в ГД более всего, они почти все сгруппированы в одну большую точку. Это означает, что почти всегда они голосуют полностью одинаково, никаких различий между отдельными депутатами нет. Несколько отделившихся точек - это в первую очередь депутаты, которые по тем или иными причинам находятся в 6 Думе не с самого начала работы. Поэтому результаты по ним отличаются от других депутатов. К таким относятся депутаты Муцоев, Водолацкий, Зубарев.

На самом верху ярка выражена  Справедливая Россия. Причем депутаты фракции не образуют единый кластер, между ними есть большие различия в голосования. Фактически можно выделить отдельный отдельный кластер и несколько депутатов-еретиков.

Я не ожидал подобных результатов, но депутаты из ЛДПР и КПРФ образуют единый кластер, причем достаточно единообразный. У меня нет содержательных интерпретаций этого результата - буду рад услышать любые предположения. Видимо, его еще нужно проверить на других методах кластерного анализа. Странная желтая (то есть ЛДПР) точка наверху -   это тоже статистический артефакт в виде депутата Катасонова, который появился в Думе только в конце 2012 года.
Тот же график только с фамилиями - на кластерах они сливаются, но по выделяющимся точкам легко определить фамилию:

Вот исходный код для MDS-кластеризации:

# Многомерное шкалирование для анализа результатов голосования в ГД РФ за 2012 года 
require(reshape2)
require(ggplot2)
# Функция, траснформирующая количественные коды голосования в факторы 
SimplifyVotes <- function(result){
  res.q <- vector(length = length(result))
  res.q <- ifelse(result == 'за', 1, res.q)
  res.q <- ifelse(result == 'возд', 0, res.q)
  res.q <- ifelse(result == 'не голосовал', -1, res.q)
  res.q <- ifelse(result == 'против', -1, res.q)
  return(res.q)
}
 
#загрузить данные 
all.votes <- read.csv(file='data4export/votes2012.csv')
laws.2012 <- read.csv(file='data4export/laws2012.csv')
depDuma <- read.csv(file = 'data/DeputatDuma.csv', stringsAsFactors = FALSE)
 
all.votes$res.q <- SimplifyVotes(all.votes$result)
v.unique <- unique.data.frame(all.votes) #почему то есть повторения в исходных данных - убираем их
 
rollcall <- dcast(data = v.unique[, c('id', 'url','res.q')], id ~ url, fun.aggregate= sum)
row.names(rollcall) <- rollcall$id #присвоить названия столбцам 
rollcall <- rollcall[, -1] #убрать из матрицы коды депутатов 
rollcall <- as.matrix(rollcall) 
 
rollcall.dist <- dist(rollcall %*% t(rollcall)) #рассчитать матрицу расстояний 
rollcall.mds <- as.data.frame(cmdscale(rollcall.dist,k=2)) # провести кластеризацию 
 
names(rollcall.mds) <- c('x', 'y')
rollcall.mds$id <- row.names(rollcall)
sname <- strsplit(as.character(depDuma$name), ' ') # добавить к матрице фамилии депутатов 
depDuma$sname <- sapply(sname, function(x){ paste0(x[[1]], ' ', substr(x[[2]],1,1),'.', substr(x[[3]],1,1),'.')})
rollcall.mds <- merge(rollcall.mds, depDuma, by = 'id') 
# построить график с помощью ggplot2 
 
p <- ggplot(data = subset(rollcall.mds), aes(x=x, y=y, group = party))+scale_size(range=c(2,2))
p+geom_jitter(aes(color = party))+ief.theme+
  scale_colour_manual(name = '', values = c('ЕР' = '#4d6b8d', 'КПРФ' = '#bf0d0d', 
                                            'ЛДПР' = '#fad000', 'СР' = '#e6871d' ))+
 
Created by Pretty R at inside-R.org


Полные коды доступны в репозитарии на  github - правда в черновом пока виде.





11 апр. 2013 г.

Результаты голосования по законопроекту о защите чувств верующих (первое чтение)

Update. Результаты голосования по всем чтениям - здесь.
На этой неделе Государственная дума приняла в первом чтении новое "чудо" - законопроект о защите чувств верующих. Официально он называется "О внесении изменений в Уголовный кодекс Российской Федерации и отдельные законодательные акты Российской Федерации в целях противодействия оскорблению религиозных убеждений и чувств граждан, осквернению объектов и предметов религиозного почитания (паломничества), мест религиозных обрядов и церемоний".

Инициаторами внесения стали следующие депутаты: Член Совета Федерации Б.И.Шпигель; Депутаты Государственной Думы А.Ю.Воробьев, С.В.Железняк, С.А.Попов, В.В.Жириновский, Я.Е.Нилов, Н.В.Левичев, Е.Б.Мизулина, З.Я.Рахматуллина, С.А.Гаврилов, С.П.Обухов, И.А.Яровая, Е.Н.Сенаторова, В.И.Лысаков, А.И.Аршинова, Т.К.Агузаров, М.Ю.Маркелов, Е.Л.Николаева.
Сколько знакомых фамилий! 

Авторы предложения предлагают следующее - дополнить статью УК 243 («Преступления против здоровья населения и общественной нравственности») следующей подстатьей 243.1 -
«Оскорбление религиозных убеждений и чувств граждан и/или осквернение объектов и предметов религиозного почитания (паломничества), мест, предназначенных для совершения религиозных обрядов и церемоний». 

Статья предусматривает следующие наказания: 
  • за публичное оскорбление, унижение богослужений, других религиозных обрядов и церемоний религиозных объединений, а также оскорбление религиозных убеждений и чувств граждан – штраф до 300 тысяч рублей или обязательные работы  на срок до 200 часов или лишение свободы на срок  до 3-х  лет. 
  • за осквернение объектов и предметов религиозного почитания (паломничества), мест, предназначенных для совершения богослужения, других религиозных обрядов и церемоний религиозных объединений, а равно повреждение и/или разрушение таких предметов (мест) – штраф от 100 тысяч рублей до 500 тысяч рублей или обязательные работы на срок до 400 часов или лишение свободы  на срок до 5 лет.

Хотя авторов у законопроекта много, оформлен он крайне неубедительно. Пояснительная записка по сути ничего не проясняет - какого-либо обоснования в ней просто нет. Зато содержатся вот подобные шедевры: "такого рода посягательства являются общественно опасными, поскольку нарушают традиционные и религиозные нормы, выработанные обществом на протяжении многих веков, его нравственные устои, противоречат морали, влекут тяжкие последствия и носят яркую антисоциальную направленность". 
Дума получила ряд отзывов на законопроект: 
  1. Общественная палата выступает против и обстоятельно написала почему. 
  2. Верховный суд "в целом поддерживает", с некоторыми замечаниями. 
  3. Правительство "в целом поддерживает", но считает, что можно ограничиться внесением изменением в действующие статьи УК, новые создавать необязательно. 
9 апреля состоялось первое чтение по законопроекту. ГД одобрила с результатом в 330 человек "за". 
Вот партийные результаты этого голосования: 

Как видно, "против" проголосовало только 7 человек (4 коммуниста и 3 справоросса). Половина справороссов и почти все коммунисты не стали голосовать, видимо, таким образом, выступая против, но не слишком. Остальная часть СР и ЕР с ЛДПР в полном составе поддержали законопроект.  









1 мар. 2013 г.

Результаты голосования по закону 207-ФЗ

В комментариях меня попросили посмотреть результаты голосований в ГД по отдельному закону 207-ФЗ,  внесшему ряд изменений в  УК РФ. Закон действительно любопытный и не громкий (я о нем вообще не слышал до этого)  был быстро принят Госдумой в конце ноября прошлого года и подписан президентом в начале декабря.
Закон дополнил состав ст. 159 УК РФ ("мошенничество")  шестью отдельными подпунктами:
  1. Мошенничество в сфере кредитования 
  2. Мошенничество при получении выплат  
  3. Мошенничество с использованием платежных карт 
  4. Мошенничество в сфере предпринимательской деятельности 
  5. Мошенничество в сфере страхования
  6. Мошенничество в сфере компьютерной информации
а также дополнил ст. 303 УК РФ ("Фальсификация доказательств и результатов оперативно-розыскной деятельности"). 
Насколько я понял, одновременно произошло ужесточение наказания по всем подпунктам ст. 159 УК в части увеличения штрафов и сроков наказания. 
Законопроект №53700-6, который привел к 207-ФЗ, был изначально внесен Верховным Судом РФ в апреле прошлого года. В ГД по этому законопроекту состоялось три чтения: первое - 23.10.2012, второе и третье чтение - прошли вместе, ровно через месяц -  23.11.2012.

Вот результаты голосования  в трех чтениях по этому законопроекту: 

Как видно, все партии, за исключением КПРФ, последовательно поддерживали законопроект. КПРФ почему-то просто не голосовала практически полным составом, но и  не голосовала "против". 

15 февр. 2013 г.

Игра в промилле - про содержание алкоголя в крови водителей

Вчера прочитывая Ъ за утренней чашкой кофе, натыкаюсь на такую новость - В Госдуме предлагают вернуть 0,2 промилле для водителей. Вкратце - депутат "Справедливой России" Антон Беляков предлагает отменить "нулевой промилле". Из статьи непонятно, на сколько эта инициатива пользуется поддержкой хотя бы части депутатов  фракции СР. Вполне возможно, что личный самопиар на животрепещущей теме.
Метания властей со с "промилле" действительно удивляют. Напомню, что в середине 2008 года по инициативе президента Д. Медведева были введены поправки, допускающие содержание алкоголя в крови до 0,3 промилле. Но уже в 2009 году, когда воздействие этой меры на дорожную безопасность было еще совершенно непонятно, Д. Медведев сам раскритиковал свою же инициативу и установил нулевой норматив. После известного ДТП на Минской Д. Медведев предложил закрутить гайки еще дальше - штрафы в 500 тыс. рублей + лишение свободы до 15 лет за ДТП с жертвами. Я уже говорил, о том, что мне кажется, способ "закручивания гаек" не самый оптимальный, а проблему пьянства за рулем не решить показной "казнью" виновников резонансных ДТП.
В качестве побочных последствий в суда появились "кефирные дела", в Москве вдоль дорог висят вот такие вот плакаты (точно видел такой на Ленинградском шоссе):

Я видел разные апелляции в дискуссиях к международному опыту, поэтому решил посмотреть на данные. Это данные ВОЗ за 2007 год по максимальному разрешенному содержанию алкоголя в крови (BAC - blood alcohol content). С тех прошло уже 5 лет, поэтому вероятно, что-то изменилось, но тем нее менее, выборка очень большая. Более того она разделена по группам водителей (обычные-профессиональные водители  то есть водители коммерческого и общественного транспорта, а также новички, которые имеют небольшой стаж).
График. Максимальное разрешенное содержание алкоголя в крови для водителей, 2007
Какие выводы можно сделать? Удивительно, но большинство стран разрешают определенное содержание в крови водителя. В большинстве случаев это 0,5-0,8 промилле, причем есть три страны - ОАЭ, Лесото и Бурунди, в которых разрешено содержание в 1 промилле или 0,01 процента (!). 1 промилле - это средний мужчина после 50-75 г водки, как я понимаю. Всемирная организация здравоохранения официально рекомендует странам устанавливать норматив по содержанию алкоголя в 0,5 промилле и меньше. Эти рекомендации основаны на исследованиях, которые показывают, что после 0,4 промилле относительный риск попадания в ДТП начинает резко возрастать. Вот результат некоторых таких исследований:
Поэтому в установлении норматива по содержанию алкоголя в 0,2-0,3 промилле нет ничего зазорного. Подобный уровень не означает, что можно выпить даже бутылку пива и садиться за руль (это диапазон 0,4-0,5 промилле), но позволяет фиксировать фоновый уровень. Большинство стран именно так и делает.

Те же самые данные из первого графика (для обычных водителей) на интерактивной карте, так как на графике сложно выделить отдельные страны.

Максимальное разрешенное содержание алкоголя в крови для обычных водителей, 2007

//--> -->
а вот и сам законопроект, о котором шла речь. Депутат тоже аппелирует к международному опыту :)

9 февр. 2013 г.

Про безопасность на дорогах (ч. 2). Насколько разные страны отличаются друг от друга?

Первая часть

В первой части я вкратце описал, откуда родилась идея заниматься статистикой безопасности на дорогах и описал некоторые источники, которые мне удалось найти. Во второй части я опишу основные показатели дорожной безопасности (смертности) по разными странам. 
Межстрановой контекст кажется довольно важным для того, чтобы понимать нашу российскую действительность. Аварии и смерти на дороге - это неизбежность, определенное их количество будет происходить всегда, независимо от какие правила принимаются. Можно считать, что есть некий фоновый уровень аварийности, не зависящий от действия властей и принятых правил.
К примеру, если в следующему году население стало перемещаться по дорогам по любым причинам на 10% больше (в терминах совокупного автопробега всех автомобилей), то при прочих равных условиях это приведет к тому, что количество ДТП и смертей на дорогах увеличится на 10%. Этот аспект довольно часто, как мне показалось, упускается из виду при анализе данных. Любые изменения в количестве аварий мы пытаемся соотнести с теми или иными управляющими изменениями - новыми законами, правилами или чем-то, не всегда понимая, что возможно, причины изменений находятся за пределами нашего контроля.
Поэтому необходимо разделить итоговую безопасность на две части: 1 ) определяется некоторыми  внешними причинами 2) факторами, которые также оказывают воздействие на безопасность, но являются управляемыми. К примеру, общее количество автомобилей, которое ездит по дорогам, или их совокупный пробег, относится к первой группе факторов, а размер штрафов или количество сотрудников дорожной полиции - ко второй.
Чтобы выделить именно первую группу факторов полезно обратиться к межстрановым сопоставлениям. Безопасность на дорогах сильно отличаются между странами. Отличаются также и факторы первой и второй групп. Если соотнести внешние причины и результирующие показатели безопасности, можно выделить уровень безопасности, который определяется исключительно ими.  А отклонения от этих значений можно считать, что определяются факторами второй группы.
Для начала посмотрим на сами данные по безопасности по странам. Здесь сразу возникают проблемы. Критерии того, что считается "дорожно-транспортным происшествием" могут сильно отличаться между странами. Более того всегда возникают вопросы о том, какая доля "реальных" ДТП фиксируется в статистике. Поэтому обычно для того, чтобы сравнивать на сколько безопасность на дорогах отличается между разными странами, используют данные по смертности, так как они вполне справедливо считаются наиболее надежными. По международным правилам считается, что человек погиб в ДТП если он погибает в течение 30 дней после происшествия. Соответственно, основным источником информации считаются данные дорожной полиции, которые дополняются информацией из больниц. Есть даже большой специальный большой отчет IRTAD (International Traffic Safety Data and Analysis Group), посвященный тому, каким образом учитываются данные по авариям в разных странах мира.
Посмотрим наконец на данные для стран с населением более 10 млн человек. Это данные за 2007 год (то есть, довольно старые) - последние имеющиеся данные, собранные Всемирной организацией здравоохранения (ВОЗ) по широкому кругу стран.
График. Уровень смертности в ДТП по странам с населением более 10 млн человек, 2007


Видно, что развитые страны имеют уровень смертности около 10 на 100 тыс. населения, развивающиеся страны - в пределах 25. "Худшие" страны имеют показатели смертности в пределах 30 человек и больше.  Обратим внимание на Россию - в 2007 году она находилась в не лучшей компанией - между Замбией и Пакистаном. Однако с тех пор показатели дорожной смертности сильно улучшились. Если в 2007 году это было чуть больше 25 человек, то в 2011 году смертность на дорогах оказалась около 19 человек на 100 тыс. Это все существенно больше, чем показатели большинства развитых странах, то налицо большой прогресс. Мы постараемся разобраться в причинах этого прогресса позже.
Обратим внимание на то, что США имеют относительно высокие показатели дорожной смертности - гораздо хуже практически всех развитых стран. В лидерах - Западная Европа и Япония. Высокое место Кубы, по всей видимости, связано с тем, что в стране совсем не развит автомобильный транспорт (или по крайней мере, был не развит в 2007 году).
Теперь  посмотрим на те же данные на карте мира. Видно, что наиболее удручающая ситуация в африканских странах, а также некоторых странах Ближнего Востока.
Карта. Уровень смертности в ДТП по странам, 2007

Примечание: карта интерактивная. При наведении мышкой на страну показываются значения смертности (чел на 100 тыс. населения) в 2007 году.
Мы посмотрели на межстрановой срез данных - имеет смысл взглянуть и на длинную историю, хотя бы некоторому списку стран (Германия, Франция, Ирландия, Япония, Южная Корея, Польша, Россия, Украина, США). Это максимально длинная история, которую я смог найти.
График. Динамика уровня смертности в ДТП по некоторым странам, 1970-2010
 Хотя в целом по развитым странам уровень дорожной смертности снижается, есть некоторые интересные паттерны. Южная Корея (верхняя зеленая линия) испытала всплеск смертности в начале 90-х годов, которая потом стала снижаться. Данные по Польше показывают аналогичную тенденцию, хотя и с меньшим размахом. По России (я нашел пока данные с 1984 года) также наблюдался всплеск смертности в начале 90-х годов, который достиг сошел на нет к 1997 году, а затем снова пошел вверх. С 2006-2007 годов показатели российской смертности снижаются. Довольно странная тенденция - возможно, это связано с нашими российскими особенностями учета (или недоучета в 90-е годы) - надо будет поподробнее изучить этот вопрос.
Продолжение последует.

16 янв. 2013 г.

Статистика голосований в Госдуме (1) - первые результаты

Когда в Государственной Думе принимался печально известный анти-Магнитский "закон Димы Яковлева",  многие обратили внимание на то, как персонально голосовали депутаты за этот закон. Многие СМИ и интернет-ресурсы писали об этом - кто и как проголосовал, поименно. Напомню, что к третьему, то есть финальному чтению этого законопроекта, противников осталась всего 7 человек из 448 имеющихся в наличии депутатов, то есть всего лишь 1,5%. Вот их имена:

  1. Алферов Жорес Иванович (КПРФ)
  2. Гудков Дмитрий Геннадьевич (Справедливая Россия - СР)
  3. Озеров Андрей Александрович (Справедливая Россия - СР)
  4. Петров Сергей Анатольевич (Справедливая Россия - СР)
  5. Пономарев Илья Владимирович  (Справедливая Россия - СР)
  6. Резник Борис Львович (Единая Россия)
  7. Смолин Олег Николаевич (КПРФ). 
Меня, честно говоря, удивила редкая степень единодушия наших народных избранников в отношении явно неадекватного закона, принимаемого с необычайной скоростью. Сразу же был понятен и огромный общественный резонанс. В любом случае, в России явно не 1,5% противников этого закона, а гораздо больше. Тем не менее, депутаты проголосовали именно так.  

Поэтому я решил посмотреть на то, как вообще голосуют наши депутаты. Хотя я не слишком слежу за политикой и не смотрю ТВ, но у меня были давно смутные догадки о том, что о чем говорят депутаты и то, что они делают  - это довольно разные вещи. К примеру, хорошо известно, что ЛДПР хотя и имеет свое номинально независимое мнение и крикливого лидера, по факту практически всегда выступает сторонником партии власти. Но одно дело - подозревать, другое дело - смотреть на ситуацию объективно, на данных. 

Это была довольно давняя идея, но по каким-то причинам несколько лет назад я не смог найти информации по этому поводу. Возможно, просто был невнимателен. Когда принимался "закон Димы Яковлева" я решил проверить сайт Госдумы еще раз и был приятно удивлен. Благодаря на удивление квалифицированному ИТ-персоналу аппарата ГД, за любым законотворческим телодвижением довольно легко и удобно смотреть. 
Во первых, есть "Система анализа результатов голосований на заседаниях Государственной Думы", на которой собственно можно найти результаты голосований по тому или иному вопросу. Для быстрой проверки результатов голосований - самое то. 
Во вторых, есть "Автоматизированная информационная система «Законопроект»", в которой можно получать автоматизированным способом (API) множество интересной информации в удобном формате, в первую очередь, списки принятых законопроектов за тот или иной период времени. 
В третьих, есть "Автоматизированная система законотворческой деятельности", в которой удобно смотреть любые телодвижения и хронологию событий по любому законопроекту, включая дополнительные материалы такие как пояснительные записки к законопроектам. Вы не поверите, но порой там встречаются абсолютные шедевры бюрократической мысли и канцелярского языка и чудеса логики! 

Когда я посмотрел на это все, то понял, что эта информация заслуживает того, чтобы ее аккуратно и бережно собрать и проанализировать. Вообще эта тема для отдельного большого исследовательского проекта. В США есть отличный проект voteview.com, на котором ученые в области политической экономии Кит Пул (Keith T Poole) и Говард Розенталь (Howard Rosenthal) собирают, анализируют и разрабатывают новые методы анализа данные по результатам голосований в Конгрессе и Сенате США. 
С помощью подобного анализа можно ответить на довольно любопытные вопросы. К примеру, насколько вообще поляризирована наша Дума. Это вообще место для дискуссий и различных мнений или мнение может быть только одно? Кто оппозиционных фракций и насколько оппозиционен? Или оппозиционность это только ширма для публики. И так далее. Я буду по мере сил и времени заниматься этим проектом и делиться результатами. За последние несколько дней я успешно решил технические вопросы получения данных с помощью отличного языка для статистического анализа R. Возможно, напишу еще более подробно именно про технические аспекты более подробно для себя и для интересующихся. Впереди - заниматься анализом и интерпретацией полученных результатов. 

Вот некоторые первые результаты. Я посмотрел на результаты голосований наиболее запомнившимся законам 2012 года. Во всех случаях для простоты речь идет о голосовании в третьем, окончательном чтении. 

Закон Димы Яковлева 

Официальное название - О проекте федерального закона № 186614-6 "О мерах воздействия на лиц, причастных к нарушениям основополагающих прав и свобод человека, прав и свобод граждан Российской Федерации"
Результаты голосования по фракциям:
Cтатистика голосовоний по закону Димы Яковлева
 В принципе, можно смотреть и пофамильные результаты, но результаты по фракциям легче визуализировать и воспринимать. Легко видеть, что все фракции поддержали законопроект, "против" голосовали только единицы-еретики. 

Закон о цензуре в Интернете

Официальное название - О проекте федерального закона № 89417-6 "О внесении изменений в Федеральный закон "О защите детей от информации, причиняющей вред их здоровью и развитию" и отдельные законодательные акты Российской Федерации" (по вопросу ограничения доступа к противоправной информации в сети Интернет)
Результаты голосования: 
Статистика госолованя по закону о цензуре в Интернете
Как легко увидеть, закон принят единогласно - против нет вообще ни кого! У депутатов Госдумы нет совершенно никаких сомнений. 

Закон об ужесточении наказаний за митинги

Официальное название - О проекте федерального закона № 70631-6 "О внесении изменений в Кодекс Российской Федерации об административных правонарушениях и Федеральный закон "О собраниях, митингах, демонстрациях, шествиях и пикетированиях" (в части уточнения порядка организации и проведения публичных мероприятий, прав, обязанностей и ответственности организаторов и участников публичных мероприятий)
Результаты голосования: 

Статистика голосовия по закону об ужесточении наказаний за митинги
О, наконец-то возникли несогласные в лице КПРФ и ЛДПР. Справедливая Россия не голосует вообще, хотя три человека проголосовали "за" вместе с Единой Россией (Митрофанов, Зотов, Лакутин). 


Закон об иностранных агентах

Официальное название: О проекте федерального закона № 109968-6 "О внесении изменений в Кодекс Российской Федерации об административных правонарушениях" (в части установления административной ответственности за нарушение законодательства, регулирующего деятельность некоммерческих организаций, выполняющих функции иностранного агента)
Результаты голосования: 
Статитистика голосовия по закону об иностранном агенте
И снова редкое единодушие - против только справороссы, да и то - не все. КПРФ и ЛДПР слились в едином порыве в борьбе с иностранными агентами. 

Как я говорил, я предполагаю получить агрегированную картину по результатам всех голосований Думы 6 созыва (можно посмотреть и предыдущие созывы) и посмотреть, что получится. Пишите, если возникнут вопросы или вспомните какой-нибудь яркий законопроект, который заслуживает отдельного внимания.