kouprianov: (Default)
turnout.diff

Казанские наблюдатели совершили подвиг. Они смогли пересчитать явку на Думских выборах 2016 г. по видеозаписям с избирательных участков и на 140 участках выявили различные аберрации явки. Эти данные находятся в открытом доступе, как и данные ЦИК по всей стране. Что это позволяет сделать? Можно взять данные ЦИК и сравнить их между собой. На диаграмме рассеяния (внизу) показано смещение абсолютных показателей ЦИК (по вертикальной оси) относительно пересчета по данным наблюдателей (по горизионтальной оси). Видно, что в большинстве случаев явка была искусственно завышена (и только в двух несколько занижена) -- почти все точки лежат выше прямой Y=X (красная прерывистая линия). Вверху даны гистограммы явки (в долях от единицы). Для обеспечения споставимости данных к проголосовавшим на участке пришлось добавить надомное голосование (и потом разделить на численность зарегистрированных на участке избирателей). Видно, что, помимо смещения распределения вправо, в сторону более высоких явок, нарастает асимметрия распределения. При расчете явки по данным наблюдателей (темно-синяя гистограмма) медиана и среднее арифметическое практически совпадают (ярко-голубая прерывистая линия), а границы второго и третьего квартилей расположены относительно медианы почти симметрично UPD: слегка смещены влево. При расчете по данным ЦИК среднее арифметическое (красная пунктирная линия) уезжает от медианы (красная прерывистая линия) вправо и границы квартилей тоже сползают вправо (UPD: сильнее, чем они были смещены влево, см. доп. boxplot ниже):

> summary(kaz.check$TURN.REL) # По результатам пересчета
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
 0.3315  0.4216  0.4590  0.4598  0.4873  0.9953       2 
> summary(kaz.check$turn.rel) # По данным ЦИК
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.4503  0.5100  0.5336  0.5609  0.5788  0.9929 
turnout.abs.diff_plot

UPD: дополнительный boxplot:

turnout.abs.diff_boxplot
kouprianov: (Default)

В этом тексте суммировал то, к чему вели записи последних ней (каюсь, я скрывал в них основной вектор движения, но важные промежуточные результаты вывешивал). Хорошо, что была возможность разместить скрипт R в качестве supplementum. Определенно, буду показывать его студентам.

«Главное – не в том, что в результате более тщательно проведенного исследования антиправительственная позиция могла бы набрать или потерять несколько процентных пунктов, а в том, что на повестку дня вынужденно встает вопрос: можно ли вообще использовать собранные таким образом данные для сколько-нибудь обоснованных выводов о чем бы то ни было, кроме как о неудовлетворительном качестве данных.»
...
«Для желающих, к статье приложен скрипт (*.zip), написанный для работы в среде статистического программирования и анализа данных R, при помощи которого были выполнены все необходимые для написания этого текста расчеты и иллюстрации. На его основе любой человек, владеющий R, может воспроизвести и продолжить анализ самостоятельно. Для работы с ним необходимо также скачать с сайта ВЦИОМ архив с данными (см. http://wciom.ru/index.php?id=237&uid=115540), распаковать его и переименовать извлеченный из архива файл в crimea.sav»

http://trv-science.ru/2016/01/12/kouprianov/

kouprianov: (Default)

Почему-то никогда об этом не задумывался, а оно вот оно, как... Данные -- из соответствующих статей Википедии.


population.wiki.5-1

population.wiki.3
kouprianov: (Default)

Поначалу я не собирался оптимизировать скрипт, о котором писал в минувшую среду. Однако совершенно неожиданно выяснилось, что оптимизировать его-таки придется (потребовалась возможность разбивать временной ряд на интервалы произвольной длины). Задействовал циклы и объекты типа list. Ему полегчало, но все равно строк на триста набралось. Полный и на большее потянет, просто карты я решил больше не рисовать пока -- прежний, разросшись до 12700 строк, порождал 539 карт за 1 мин. 50 сек. Новый полный без карт потянет строк на 750, а с картами -- на все 2500+ (что, все же в пять раз короче прежнего + меньше ручной работы).

Из важного для себя вынес из этой битвы возможность генерировать имена файлов по шаблону с вариативной частью при помощи команды paste()

kouprianov: (Default)

Скрипт длиной примерно в 6700 строк и почти в 10 а. л. букв жует данные и рисует 315 карт (15 серий по 21 карте -- серий должно быть больше, а скрипт -- длиннее, но пока -- столько) за несколько десятков секунд. Теперь их можно просматривать в режиме грустного кино, думать о смысле увиденного, генерировать заново по мере пополнения исходного массива данных... Чувствую какое-то опустошение...

kouprianov: (Default)

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

1. Все расчеты будут выполняться только в R.
2. Все данные будут храниться только в машиночитаемых форматах, непосредственно пригодных для чтения и последующей обработки в R.
3. Курсовые работы и бакалаврские диссертации выполняются только в TeX. Вместе с итоговым PDF-файлом высылается макет в TeX, включая иллюстрации и релевантные библиографические базы в формате BibTeX. Оформление библиографии вручную не допускается.
4. Вместе с курсовой работой или бакалаврской диссертацией сдаются как данные, так и скрипты для их обработки, выполнения всех необходимых расчетов и изготовления пригодных к печати иллюстраций (с аккуратно написанными комментариями, позволяющими разобраться в сути записанных в скрипте процедур).
5. В процессе работы все данные по всем проектам, помимо текстовых файлов в csv-подобных форматах, должны храниться в копиях на GoogleDrive (возможно использование табличного процессора), и мне должен быть обеспечен к ним полный доступ.
6. Если к моменту предзащиты (конец апреля) готовность текста бакалаврской диссертации будет составлять менее 60-80%, я буду настаивать на недопуске к защите.

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

kouprianov: (Default)

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

> mallet.instances <- mallet.import(text.ids, doc.text, "ru.txt", token.regexp = "[\\p{L}\\p{N}-]*\\p{L}+")
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl,  :
  java.lang.NoSuchMethodException: No suitable method for the given parameters

Решение нагуглилось внезапно после нескольких непонятно почему неудачных попыток. Оказалось, что id текстов и сами тексты должны иметь вид character. Каким образом его утрачивают вторые -- не ясно (как впрочем и то, зачем его должны иметь первые).

> mallet.instances <- mallet.import(as.character(text.ids), as.character(doc.text), "ru.txt", token.regexp = "[\\p{L}\\p{N}-]*\\p{L}+")
kouprianov: (Default)

Эта запись сделана для памяти и будет носить эзотерический характер. Чем дальше от старых добрых статистических методов, тем страшнее и тем меньше стандартизации. Забрел, с подачи Кирилла Маслинского, в область компьютерного анализа текстов. Довольно быстро выяснилось, что какие-то пакеты для обработки текстов написаны под более позднюю версию R, чем та, что стоит у меня на машине, за обновлением R потянулась необходимость обновления Java, за ними -- недокументированные причуды самих новых версий пакетов и т. д. и т. п.

Коротко говоря, чтобы не забыть:

(1) Для установки пакета mallet нужна библиотека, которой у меня не было, пришлось ставить (без нее не компилируется):

apt get install liblzma-dev

(2) В новой версии пакета tm иначе работает функция tolower (конвертация всех заглавных букв в строчные):

corpus<-tm_map(corpus, content_transformer(tolower))

если использовать старый способ работы с нею, то потом не работает стемминг (усечение слов до основы):

corpus<-tm_map(corpus, stemDocument)

Восстановление слов от основ до наиболее обычной по корпусу формы

corpus<-tm_map(corpus, stemCompletion, dictionary=corpus, type="prevalent")

(надобное, как я понимаю, в эстетических целях) пока не заработало и гугление никакого ответа пока не принесло.

kouprianov: (Default)

Писал тут недавно про то, как считали, а потом рисовали. Вот, что получилось:

flickr_plot.5

Она пока не идеальна, но уже довольно близка к тому, что хотелось бы видеть. Теперь два слова о том, как это получилось.

детали -- под cut'ом... )

P. S. 2/306/-90/216.

kouprianov: (Default)

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

код под cut... )
kouprianov: (Default)
ars.colored.gender

Клуб клиентов Диссернета, в общем, довольно мужской, вполне на уровне мировых достижений. Забегая вперед, скажу, что доля женщин (~25%) не зависит от роли (автор, руководитель, оппонент). На этой картинке -- все (от авторов до оппонентов), мужчины синие, женщины -- красные, несколько человек неясно какого пола -- серые. Кто надумает качать: полный размер картинки -- пять на пять тысяч, а весит она 5.4 МБ (по нынешним временам не много, но знать надо).

kouprianov: (Default)

Интересно, почему разработчики igraph и sna:gplot решили, что никто не будет рисовать сети в виде black and white line drawing? Зачем angle и density не включены в список атрибутов для рисования узлов? Да и вообще, чтобы сделать их black and white приходится приложить какое-то непропорциональное важности задачи количество усилий.

P. S. Давно не писал про 216. 28 января было: 2/302/-86/216; в минувшую среду (11 февраля) стало 2/304/-88/216.

kouprianov: (Default)

Это, собственно, извлеклось и посчиталось одним из первых, но почему-то руки не доходили выложить. Это кусочки кандидатской или докторской степеней, от которых откушены слова «кандидат» или «доктор». Всего это поле заполнено в 644 записях из 648.

Картинку и таблицу под cut... )
kouprianov: (Default)

Нередко бывает надобно создать вектор с накопленными значениями на основе имеющегося вектора моментальных значений. Революционное студенчество обычно делает это в табличных процессорах, вроде Excel или Calc, но вообще-то, это можно сделать прямо не выходя из R при помощи циклов.

Занудство (код и толкование его) под cut... )
kouprianov: (Default)

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

kouprianov: (Default)

Продолжаю вглядываться в списки Диссернета. Вроде бы, вычистка от дублей идет к концу. На настоящий момент имеется 629 авторов, 437 научных руководителей и 1004 официальных оппонента.

При сопоставлении списков (сопоставляю, разумеется, не я, я только чищу то, что неподвластно машине, а сопоставляет intersect()) выяснилось, что 65 руководителей отметились также и среди рецензентов, 15 авторов диссертаций успели побывать руководителями и 10 -- рецензентами, при этом четверо успели выступить во всех трех амплуа. Как мне кажется, это указывает на то, что выявленный сегмент сети работает не столько на воспроизводство сообщества, сколько на экспорт (как я понимаю, авторы тут, в основном, чиновники). В качестве бонуса -- список четырех потенциальных передовиков-многостаночников.

Bonus... )

kouprianov: (Default)

Продолжаю возиться с dataset'ом на основе материалов Dissernet.org. Упорядочил еще два поля -- научные руководители / консультанты и официальные оппоненты. Всего поле «руководитель / консультант» было заполнено в 539, а «официальные оппоненты» -- в 555 из 648 карточек. Списки на настоящий момент включают 439 предположительно уникальных имен руководителей и консультантов и 1006 имен предположительно уникальных официальных оппонентов. Не менее 57 человек фигурируют в обоих списках (один даже попал в приводимые ниже top-13 и top-10). Теперь -- пара таблиц и пара картинок.

пара таблиц и пара картинок... )
kouprianov: (Default)

diss_by_hostorg.hist Закончил первый раунд очистки сортиров при авгиевых конюшнях. Как я уже говорил, решил посмотреть на данные, выложенные в сеть проектом Диссернет. На настоящий момент удалось скачать массив из 648 страниц (некоторые, весьма немногие, совершенно пустые), вынуть из него (1) имена диссертантов, (2) названия диссертаций, (3) степени, на соискание которых эти диссертации были представлены и, по возможности, коды специальностей, (4) имена научных руководителей и / или консультантов, (5) имена официальных оппонентов и названия ведущих организаций, (6) названия организаций, в которых были подготовлены диссертации, (7) названия советов, в которых происходила защита, (8) даты защит. Естественно, полный набор данных доступен не для каждой диссертации, но некоторые поля заполнены почти у всех.

В ознаменование частичной победы над мусором в коде и пугающим разнообразием вариантов написания названий одних и тех же организаций, выкладываю top-10 организаций по количеству диссертаций, подготовленных клиентами «Диссернета», и картинку. Поле «диссертация подготовлена в...» было заполнено в 628 случаях, всего пока получилось 257 организаций (есть еще перспективы по незначительному сокращению списка за счет выявления еще какого-то количества синонимов, но на структуру лидирующей группы это не повлияет), филиалы рассматривались как отдельные организации. Оценку степени самостоятельности работ я в данном случае не провожу -- это дополнительная довольно трудоемкая работа, даже при полуоткрытых данных; только список тех, кто так или иначе попал в базу на настоящий момент.

1. Академия народного хозяйства при Правительстве РФ / Российская академия государственной службы при президенте РФ [РАНХиГС] -- 49 клиентов (7.80% от всех работ).
2. Московский педагогический государственный университет [МПГУ] -- 26 (4.14%)
3. Научный центр сердечно-сосудистой хирургии им. А. Н. Бакулева РАМН -- 23 (3.66%)
4. Московский государственный институт электроники и математики (технический университет) [МИЭМ] -- 17 (2.70%)
5. Российский государственный гуманитарный университет [РГГУ] -- 15 (2.49%)
6-7. Российский государственный социальный университет [РГСУ] -- 14 (2.23%)
6-7. Санкт-Петербургский государственный университет Государственной противопожарной службы МЧС РФ -- 14 (2.23%)
8-10. Московский государственный медико-стоматологический университет им. А. И. Евдокимова -- 13 (2.07%)
8-10. Московский государственный университет им. М. В. Ломоносова [МГУ] -- 13 (2.07%)
8-10. Санкт-Петербургский государственный инженерно-экономический университет [ИНЖЭКОН] -- 13 (2.07%)

kouprianov: (Default)

Вздумалось мне тут положить один нарисованный в R график на другой. Нет, я потом, конечно, сделал все через par(new=T), как подобает настоящему самураю, но поначалу мне показалось, что совместить два готовых PNG изображения в GIMP будет быстрее. Не тут-то было. Сделав это, я тут же обнаружил, что меньший по размеру график нарисован на светло-сером фоне, который хорошо заметен на белом фоне большего по размерам графика. Первая мысль была, конечно, о том, что надо принудительно указать белый цвет фона через par(..., bg="white"). Безрезультатно. Фон остался серым. Вторая -- о том, что можно сделать фон не белым, а прозрачным при помощи par(..., bg="transparent") (паника: за несколько лет успел забыть, как сделать прозрачность в GIMP). Никакого толку. Фон, возможно, стал прозрачным, но вместе с ним прозрачными стали и черные линии, причем они стали бледно серыми до почти полной невидимости. Зашел в тупик, отправился гуглить.

По результатам гугления поставил imagemagick (почему-то его по умолчанию не стояло), после чего все оказалось элементарно. Написал в командной строке:

convert filename.png -transparent white filename.png

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

Подсказку про imagemagick нашел тут: http://stackoverflow.com/questions/25354479/opaque-legend-in-an-r-plot-with-transparent-background

Но через par(new=T), разумеется, проще...

kouprianov: (Default)

... в стрельбе из пушки по воробьям. Достаем Rогатку...

> df <- read.table("file.txt",h=T)
> head(df)
        DATE   PRICE
1 13.12.2014 56.8919
2 12.12.2014 54.7932
3 11.12.2014 54.2758
4 10.12.2014 54.2116
5 09.12.2014 53.3079
6 06.12.2014 53.1088
> summary(df)
         DATE         PRICE
 01.01.2014:  1   Min.   :32.66
 01.02.2014:  1   1st Qu.:34.80
 01.03.2014:  1   Median :35.79
 01.04.2014:  1   Mean   :37.63
 01.05.2014:  1   3rd Qu.:38.40
 01.07.2014:  1   Max.   :56.89
 (Other)   :229
> df$DT <- as.Date(df$DATE, format="%d.%m.%Y")
> summary(df)
         WEEK         PRICE             DT
 01.01.2014:  1   Min.   :32.66   Min.   :2014-01-01
 01.02.2014:  1   1st Qu.:34.80   1st Qu.:2014-04-02
 01.03.2014:  1   Median :35.79   Median :2014-07-01
 01.04.2014:  1   Mean   :37.63   Mean   :2014-06-27
 01.05.2014:  1   3rd Qu.:38.40   3rd Qu.:2014-09-19
 01.07.2014:  1   Max.   :56.89   Max.   :2014-12-13
 (Other)   :229
>

September 2017

S M T W T F S
     12
34567 89
10111213141516
17181920212223
24252627282930

Syndicate

RSS Atom

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 19th, 2017 05:05 pm
Powered by Dreamwidth Studios