6 мая 2013 г.

статья для Слона - "Скелеты в шкафу – отчетность «Сургутнефтегаза» по МСФО"

Отсюда

В последний рабочий день перед майскими праздниками самая закрытая российская нефтяная компания – «Сургутнефтегаз» – опубликовала отчетность по МСФО за последние два года. И это уже событие. В последний раз отчетность по международным стандартам (GAAP) компания представляла 11 лет назад. Тогда выяснилось, что она владела 17,6 млрд собственных акций (около 41% от общего числа), что, конечно, вызвало фурор на рынке.  С тех пор, чтобы избегать ненужной руководству публичности, «Сургутнефтегаз» ограничивался публикацией бухгалтерских форм по российским стандартам и отчетами эмитента, хотя его депозитарные расписки торгуются и в Лондоне, и в Нью-Йорке. 


24 апр. 2013 г.

Статья для Слона - «Роснефть» угрожает «Газпрому»? Пожалуй

Отсюда


Руководство «Роснефти» во главе с Игорем Сечином провело вчера в Лондоне День инвестора. Иностранным инвесторам презентовали консолидированные показатели компании с учетом покупки ТНК BP. Выручка объединенной компании в 2012 году составила $160 млрд, EBITDA – $33,4 млрд, а чистая прибыль – $16,7 млрд. C учетом того, что Роснефть и ТНК BP по отдельности уже представили финансовые результаты за прошлый год, эта новость выглядит не слишком интересно. 

16 апр. 2013 г.

Статья для Слона - Нефть Urals меньше $100: есть ли повод для паники

Отсюда.
 Цены на наше все – нефть Urals – опустились в начале текущей недели ниже $100 за баррель. В последний раз такой уровень наблюдался в июне прошлого года, в самый разгар долгового кризиса еврозоны. Мировые цены на золото за один только вчерашний день – 15 апреля – обрушились почти на 10%. В последний раз подобные скачки происходили в критические дни осени 2008 года. Российский фондовый рынок с начала апреля снизился более чем на 5%. Новый виток финансового Армагеддона? Наступает очередная пора запасаться гречкой и спичками? 

Результаты голосования в Государственной Думе в 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.

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

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

27 февр. 2013 г.

Работа Государственной Думы РФ в 2012 году


Я уже объяснял, в чем причина интереса к статистике по голосованиям в Госдуме и о том, что планирую собрать и проанализировать не просто результаты голосований по отдельным законопроектам (это и сейчас вполне удобно можно сделать на vote.duma.gov.ru), а собрать и проанализировать достаточно большой массив данных и посмотреть, можно ли извлечь из этого какие-то выводы.
За это время мне удалось написать более или менее полный набор функций для R, которые позволяют собирать данные с помощью API "Законопроект" и самого портала Госдумы. Пока я решил сосредоточиться на результатах голосования за весь 2012 год. Это первый год работы именно Думы шестого созыва.  Год не так давно закончился и имеет смысл хотя бы просто подвести его итоги, чтобы немного понять, что за данные у нас имеются.

Вот краткие итоги работы Государственной Думы РФ в 2012 году по результатам анализа:


  • Дума рассмотрела 888 законопроектов (в  первом и/или втором и/или третьем чтениях).
  • По этим 888 законопроектам было проведено 2395 голосования (Дума провела, конечно, гораздо больше голосований, включая множество голосований, определяющих регламент ее работы, но мы их не учитываем). 
  • Из  2395 законопроектных голосований 1372 голосований (или 57%) завершились положительно, то есть принятием этого чтения или рассматриваемых поправок, а 1023 голосования (43%) завершились отрицательно, то есть отклонением. 
  •  Наиболее активно ГД работала в декабре (469 голосований по законопроектам) и июне (575). Самыми "расслабленными" месяцами были январь-март прошлого года (в среднем, около 70 голосований  в месяц). Видимо, это объясняется тем, депутаты были заняты формированием комитетов и распределением аппаратных должностей.  
График. Распределение голосований в Госдуме по времени в 2012 году 
Источник: анализ по данным Государственной Думы РФ

  • В среднем по каждому законопроекту (из 888) было проведено 2,7 голосования, однако распределение голосований очень своеобразно.  Почти законопроектов (то есть около 67 %) законопроектов рассматривалось только один раз.  
График. Распределение законопроектов по количеству голосований в 2012 году 
Источник: анализ по данным Государственной Думы РФ


  • Самим "голосуемым" законопроектом прошлого года стал проект №70631-6 ( О проекте федерального закона № 70631-6 "О внесении изменений в Кодекс Российской Федерации об административных правонарушениях и Федеральный закон "О собраниях, митингах, демонстрациях, шествиях и пикетированиях" (в части уточнения порядка организации и проведения публичных мероприятий, прав, обязанностей и ответственности организаторов и участников публичных мероприятий). По нему Дума голосовала 389 (!) раз.  
  • На втором месте идет закон "Об образовании" (законопроект № 121965-6) с 89 голосованиями. Ну и на третьем месте - Закон о бюджете, который похоже, не слишком волнует депутатов (или они понимают, что практически ни на что повлиять в бюджете не могут). За бюджет на 2013 год и поправки к нему депутаты голосовали 52 раза. 
  • Достаточно любопытно смотрится распределение голосов, когда Дума голосует "за" или "против" по законопроектым голосованиям. Отклонение поправок происходит по причине отсутствия отсутствия кворума - по этой причине было отклонено 913 голосований из 1023 отклоненных. Остальные отклоненные голосования, как правило, смогли привлечь только несколько голосов (см. красные линии на графике внизу). Зато при положительном  голосовании у депутатов часто наблюдается полное единодушие:  475 голосований из 1372 имели поддержку более чем 90%, а в 71 голосованиях - поддержку более 99% депутатов. 
График. Распределение поддержки в зависимости от принятия/отклонения по голосованиям Государственной думы РФ в 2012 году
Добавьте подпись
Источник: анализ по данным Государственной Думы РФ

Таковы результаты первого взгляда на собранные данные, впереди - более обстоятельный анализ и разбор того, как на самом деле голосуют депутаты Госдумы. 

P.S. Я выложил файл с написанными функциями для R на github, в отдельном репозитарии. Когда оформятся результаты анализа и будут перепроверены данные, они будут выложены там же. Если у кого-то вдруг возникнут вопросы по работе функций - спрашивайте.  




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

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

12 февр. 2013 г.

Построение страновых хороплет-карт (choropleth maps) с помощью пакета rworldmap в статистическом пакете R


Довольно часто социально-экономические данные удобно визуализировать с помощью карт. Стандартным является представление в форме так называемых choropleth maps (похоже, на русском они так и называются - хороплет-карты). Хороплет - это такая карта, на которой с помощью визуального оформления (обычно цвета, но может быть и к примеру, точками или линиями разной густоты/толщины) отображается интенсивность какого-либо показателя для географических регионов. Такие карты очень легко позволяют наглядно отобразить данные по большому количеству географических объектов.
Вот для примера такая карта - правда, наглядно? На ней изображена доля курильщиков среди мужчин по почти 150 странам. Создание такой карты в R заняло 8 строк кода, включая загрузку данных из Сети.
Smoking prevalence, males (% of adults)

Как создавать подобные карты?
Существует множество различных вариантов. В принципе, любая ГИС-программа типа MapInfo или ArcGIS умеет строить хороплет, но покупать эти дорогостоящие системы только для того, чтобы рисовать цветные карты, смысла не имеет. Можно рисовать карты хорорлет и в любимом Excel. Существует несколько "рецептов", как можно это делать.  Как правило, они требуют запуска VBA-макроса - для того, чтобы сопоставить исходный показатель с географическими регионами на карте. Еще одно условние - необходимо иметь исходную карту (линии) в графическом формате SVG. Это обычно не проблема, и другие гео-форматы можно тоже преобразовать в графический SVG, но это требует определенных манипуляций Вот один из предлагаемых рецептов, как построить карту хорорлет в Excel. Обратите внимание на то, сколько телодвижений надо сделать для того, чтобы нарисовать достаточно простую карту. Причем если даже процесс автоматизирован при смене данных (то есть, меняешь данные - карта перерисовывается), то при смене самой карты все ломается и требуется "доводка напильником" под новую карту.
 Наконец - обещанное. Конечно, хороплет-карты можно построить в статистическом пакете R. Возможности по работе с гео-данными в R, в том числе и графические, сопоставимы, а в некоторых случаях даже превосходят возможности полноценных ГИС-систем. И все это - в одном флаконе.

Сейчас я расскажу о простом и часто встречающемся случае - визуализация данных по странам как в случае нарисованного выше графика. Как обычно в R, для каждой специальной задачи уже есть созданный кем-то пакет. В нашем случае мы воспользуемся пакетом - rworldmap, созданный и поддерживамый Andy South. Основная его задача как раз в этом - построение хороплет-карт для страновых данных. Фактически этот пакет  - надстройка над другими, которые обеспечивают работу с гео-данными, но нас это не должно слишком волновать. Для нас пакет rworldmap сильно экономит время и строки для построения типовых страновых карт.

Краткая процедура построения выглядит следующим образом:

  1. Получение данных для отображения. В нашем случае мы используем данные из базы данных World Development Indicators (WDI), которую поддерживает Всемирный банк. В этой базе, как обещано, 331 показатель по 221 стране. Возьмем показатель "Smoking prevalence, males (% of adults)", который мне показался достаточно интересным. Загрузим его в R с помощью специального пакета, который носит название "WDI", как и следовало ожидать. Этот пакет позволяет обратиться напрямую к базе данных из R и получить данные сразу в необходимой разбивке "страна"-"год"-"показатель". Можно сразу загружать несколько показатель для диапазона лет для всех или некоторых стран. Очень удобно! В функции WDI() из одноименного пакета я рекомендую использовать параметр extra = TRUE для того, чтобы получаемые данные содержали код страны по ИСО (двух и трехзначный). 
  2. Сопоставление карты и данных. Для этого уже используется пакет rworldmap и его функция с говорящим названием joinCountryData2Map. Здесь все просто выбираем ключ, по которосу мы сопоставляем данные и карту. Это может быть название страны на английском языке, но лучше всего использовать коды стран по ISO (ISO2 или ISO3). Соответственно это параметр "joinCode". 
  3. Выбор показателя, который мы хотим отобразить на карте с помощью функции mapCountryData. Здесь все понятно  nameColumnToPlot соответственно название показателя, который хотим отобразить. Важными являются также параметры catMethod (определяет методы для категоризации данных, то есть деления их на группы одного цвета), а также colourPalette, который определяет цветовую палитру. Для палитры удобно использовать имеющиеся варианты из пакета RColorBrewer. Как выглядят сами палитры удобно смотреть на специальном сайте. 
  4. Дополнительно. Функция mapCountryData сразу же отображает карту, но если вы хотите внести некоторые изменения - в нашем случае немного поправить легенду с помощью addMapLegend. 
Вот код , который уже нарисует долю курильщиков-женщин по странам мира:

<!-- Styles for R syntax highlighter
require(WDI)
require(rworldmap)
require(RColorBrewer)

smoker <- WDI(country = "all", indicator = "SH.PRV.SMOK.FE", start = 2009, end = 2009, 
    extra = TRUE, cache = NULL)
# получить данные из WDI
fMap <- joinCountryData2Map(smoker, joinCode = "ISO3", nameJoinColumn = "iso3c", 
    nameCountryColumn = "country")
# cопоставить данные с картой по коду ISO3 (трехзначный код страны)
mapParams <- mapCountryData(fMap, nameColumnToPlot = "SH.PRV.SMOK.FE", catMethod = "quantiles", 
    missingCountryCol = gray(0.8), colourPalette = rev(brewer.pal(7, "RdYlBu")), 
    addLegend = FALSE, mapTitle = "")
# добавить легенду
do.call(addMapLegend, c(mapParams, legendLabels = "all", labelFontSize = 0.8, 
    legendWidth = 0.5, sigFigs = 0))

--> А вот и результат его выполнения:
Smoking prevalence, females (% of adults)
По картам можно сразу же сделать несколько наблюдений. Среди мужчин больше всего курят Россия, Китай, Восточная Европа и Малайзия с Индонезией. Среди женщин все по другому - здесь в лидерах жительницы стран Западной Европы (Австрия на первом месте), Чили и  Папуа-Новая Гвинея.

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-е годы) - надо будет поподробнее изучить этот вопрос.
Продолжение последует.