?

Log in

Филипп Минлос
Pēdējie ieraksti 
13.-maijs-2016 11:15 pm(nav temata)
Благодаря kassian прочитал http://gaidar.center/articles/da-da-net-da.htm

Табличку удобно поместить в жж, а обсуждение таблички в фейсбук.






total


city


part


first_da


second_da


third_da


fourth_da


city_part


first_pred


first_diff


m


Республика Ингушетия
472776 195255 75.5 2.4 2.8 93.7 6.5 41.299685 34.259788 -31.859788 1


Республика Дагестан
3015660 1358268 74.0 14.2 14.1 74.8 31.5 45.040489 37.102538 -22.902538 1


Смоленская область
958630 689979 71.2 40.2 37.2 61.4 56.4 71.975528 57.571292 -17.371292 0


Кемеровская область
2717627 2330942 57.3 52.5 47.6 52.8 66.2 85.771226 68.055062 -15.555062 0


Белгородская область
1550137 1039639 77.6 39.6 36.1 62.6 58.1 67.067556 53.841575 -14.241575 0


Чувашская Республика
1236628 758064 71.0 36.9 33.5 60.7 53.4 61.300892 49.459313 -12.559313 0


Ульяновская область
1257621 939781 68.2 47.5 43.7 58.4 64.1 74.726885 59.662132 -12.162132 0


Курская область
1120019 754187 70.1 42.1 38.7 60.1 55.2 67.336983 54.046321 -11.946321 0


Республика Мордовия
807453 499419 70.0 38.0 35.0 59.8 51.2 61.851154 49.877473 -11.877473 0


Брянская область
1225741 856899 67.8 44.4 40.9 59.6 57.8 69.908651 56.000610 -11.600610 0


Амурская область
805689 542240 60.5 43.2 39.7 60.2 56.3 67.301403 54.019283 -10.819283 0


Республика Башкортостан
4071064 2515900 70.5 39.6 35.9 60.1 53.6 61.799569 49.838272 -10.238272 1


Пензенская область
1348703 920885 70.8 45.3 41.1 58.8 57.5 68.279302 54.762418 -9.462418 0


Карачаево-Черкесская Респ.
467797 199840 72.2 25.9 24.6 69.4 43.6 42.719385 35.338661 -9.438661 1


Саратовская область
2487529 1874042 68.0 51.8 47.6 55.0 63.8 75.337494 60.126152 -8.326152 0


Новосибирская область
2762237 2174868 62.5 54.6 48.3 52.2 68.6 78.735749 62.708590 -8.108590 0


Волгоградская область
2545937 1951818 64.8 53.7 49.0 53.0 67.4 76.664034 61.134230 -7.434230 0


Рязанская область
1130103 807392 78.5 49.8 45.1 56.3 64.4 71.444107 57.167449 -7.367449 0


Калужская область
1009772 768770 71.6 53.4 48.2 53.1 66.7 76.133028 60.730703 -7.330703 0


Орловская область
759721 505864 68.4 46.3 42.6 59.7 59.9 66.585497 53.475244 -7.175244 0


Псковская область
646374 455883 72.8 49.7 44.7 56.7 63.1 70.529291 56.472253 -6.772253 0


Кабардино-Балкарская Респ.
862254 450167 57.9 35.8 33.2 63.1 53.8 52.208166 42.549474 -6.749474 1


Тверская область
1304744 984166 69.5 53.9 49.2 52.9 64.7 75.429816 60.196311 -6.296311 0


Тамбовская область
1050295 631716 74.5 44.0 40.2 58.7 61.1 60.146530 48.582078 -4.582078 0


Республика Марий Эл
685865 449492 65.9 48.1 42.2 52.8 61.3 65.536512 52.678089 -4.578089 0


Иркутская область
2412800 1905217 58.7 58.6 51.6 50.6 69.1 78.962906 62.881213 -4.281213 0


Воронежская область
2333477 1566923 72.3 49.7 45.1 55.6 64.3 67.149708 53.904005 -4.204005 0


Сахалинская область
487293 397429 55.9 60.9 51.4 48.9 68.0 81.558528 64.853705 -3.953705 0


Самарская область
3205975 2570835 62.9 60.9 55.1 49.0 68.6 80.188866 63.812857 -2.912857 0


Липецкая область
1156093 742492 68.8 49.2 44.6 56.4 58.4 64.224245 51.680857 -2.480857 0


Кировская область
1297474 985194 68.7 58.6 51.1 51.0 66.1 75.931695 60.577704 -1.977704 0


Омская область
1978466 1431811 68.3 56.1 49.7 51.1 66.7 72.369755 57.870877 -1.770877 0


Калининградская область
976439 758802 63.4 60.3 54.0 48.4 69.4 77.711152 61.929967 -1.629967 0


Магаданская область
146345 139785 57.5 74.4 64.8 40.2 75.7 95.517442 75.461507 -1.061507 0


Костромская область
651450 465858 70.4 56.6 49.6 53.6 65.3 71.510937 57.218235 -0.618235 0


Мурманская область
762173 704954 59.4 72.8 63.9 39.8 75.2 92.492649 73.162876 -0.362876 0


Ивановская область
1029838 837243 70.0 64.7 58.3 47.2 69.9 81.298515 64.656113 0.043887 0


Московская область
7318647 5971811 65.0 65.2 59.1 42.9 72.7 81.597200 64.883093 0.316907 0


Нижегородская область
3260267 2590817 62.4 63.6 56.3 47.8 70.0 79.466406 63.263838 0.336162 0


Курганская область
861896 532610 70.6 50.3 45.4 54.6 62.6 61.795159 49.834920 0.465080 0


Ростовская область
4236000 2872160 65.1 55.5 51.3 52.3 66.4 67.803588 54.400909 1.099091 0


Республика Карелия
629875 503379 62.5 65.0 56.5 47.9 68.3 79.917285 63.606475 1.393525 0


Оренбургская область
1994762 1195812 65.1 50.1 45.8 55.4 63.2 59.947603 48.430907 1.669093 0


Республика Хакасия
536781 369367 56.7 57.9 51.8 50.8 66.0 68.811489 55.166843 2.733157 0


Приморский край
1929008 1485802 55.1 64.3 56.6 45.9 69.7 77.024149 61.407893 2.892107 0


Удмуртская Республика
1517164 994504 61.0 55.9 48.9 50.8 65.7 65.550198 52.688489 3.211511 0


Еврейская автономная область
166120 113891 58.7 58.6 52.8 50.0 65.4 68.559475 54.975330 3.624670 0


Владимирская область
1397168 1088982 69.6 65.8 58.2 49.7 68.4 77.942094 62.105467 3.694533 0


Ярославская область
1271912 1039276 67.0 68.8 61.3 47.8 70.1 81.709741 64.968616 3.831384 0


Тульская область
1506446 1125612 64.7 63.5 57.7 51.5 70.6 74.719705 59.656675 3.843325 0


Республика Бурятия
982284 579350 62.9 51.8 46.1 53.2 60.8 58.979888 47.695511 4.104489 0


Красноярский край
2866490 2206005 61.2 65.7 59.1 45.6 68.7 76.958406 61.357932 4.342068 0


Хабаровский край
1334552 1093945 58.1 70.2 62.3 45.2 70.2 81.970954 65.167119 5.032881 0


Республика Адыгея
451480 213542 63.7 43.9 40.8 59.3 58.9 47.298219 38.818256 5.081744 0


Ставропольский край
2801597 1632068 68.0 52.3 48.0 53.8 65.4 58.254917 47.144583 5.155417 0


Республика Татарстан
3868730 2956100 22.6 66.4 61.4 43.5 70.1 76.410088 60.941249 5.458751 1


Вологодская область
1187685 854791 69.1 63.3 56.6 52.9 69.8 71.971188 57.567994 5.732006 0


Челябинская область
3500716 2891138 60.2 71.5 65.5 42.0 72.9 82.587048 65.635308 5.864692 0


Тюменская область без АО
1454626 949657 59.8 58.4 51.9 51.1 68.5 65.285304 52.487188 5.912812 0


Республика Коми
856831 667146 58.6 69.0 59.9 44.6 70.5 77.862029 62.044623 6.955377 0


Архангельская область
1174078 908861 66.0 68.9 60.0 46.8 70.0 77.410615 61.701580 7.198420 0


Астраханская область
1018626 677741 59.1 60.7 55.0 49.5 68.1 66.534822 53.436735 7.263265 0


Ленинградская область
1778857 1142395 64.1 59.9 52.8 47.4 68.2 64.220733 51.678188 8.221812 0


Камчатский край
316116 246021 60.2 70.3 61.4 40.7 75.3 77.826178 62.017379 8.282621 0


Томская область
1076762 777257 60.7 66.8 59.4 43.1 71.1 72.184661 57.730219 9.069781 0


Краснодарский край
5513804 2994914 62.4 53.8 49.3 53.8 65.2 54.316657 44.151780 9.648220 0


Респ. Северная Осетия-Алания
703745 451441 70.5 63.3 56.0 50.0 67.5 64.148378 51.623203 11.676797 0


Республика Тыва
315637 171156 68.5 56.1 50.4 51.1 59.8 54.225582 44.082569 12.017431 0


Республика Саха (Якутия)
959689 627752 70.4 68.1 60.7 45.4 68.0 65.412024 52.583486 15.516514 0


Пермский край
2634409 1991998 60.6 76.5 68.5 40.3 73.3 75.614607 60.336738 16.163262 0


Свердловская область
4330006 3658043 66.8 84.4 76.2 33.1 78.9 84.481246 67.074767 17.325233 0


Чукотский автономный округ
50157 34720 67.4 74.2 63.5 40.3 75.6 69.222641 55.479290 18.720710 0


Республика Алтай
215161 62861 69.4 48.4 43.4 54.6 58.8 29.215797 25.076874 23.323126 0


Ненецкий автономный округ
43838 31738 62.8 82.8 74.0 36.4 78.5 72.398376 57.892627 24.907373 0


Республика Калмыкия
278733 125974 66.2 67.1 63.9 43.1 70.4 45.195223 37.220125 29.879875 0
'
6.-maijs-2014 08:21 pm - use apply!
WMinlos
В книге А.Б. Шипунова и др. по R на стр. 241 приводятся данные о хронометрировании с помощью system.time(). Там получается, что циклы чуть ли не в 2 раза быстрее, чем sapply.
Ну вот сегодня у меня была рабочая необходимость применить пару нетривиальных функций (моя функция с некоторым строковым преобразованием и levenshteinSim) к реальным данным (таблица из 179000 строк), циклы зависали навсегда, а sapply/mapply давали результат за пару секунд.
WMinlos
На страничке http://www.ethnologue.com/statistics/size находим сведения о количестве носителей язков и количестве стран, в которых на этих языках говорят.
Гипотеза состоит в том, что эти значения коррелируют (скажем, по-английски говорит очень много людей в большом количестве стран, а по-японски сравнительно мало людей всего в трех странах).
Read more...Collapse )
2.-maijs-2014 09:52 pm - лекция 3 (РГГУ)
WMinlos
Файл, примерно соответствующий лекции №3.
В лекциях 1-2 описывалась грамматика R, в лекции 3 разбираем что-то более-менее жизненное (в частности, проверяем Ципфа на Навальном).
https://app.box.com/s/71q7mrqqc7obbsqxr0tp

Оказывается, ссылки на box открываются только пользователям box.net.
Вот ссылки на яндекс-диск
http://yadi.sk/d/0pPuaJvmNvDWo (лекция 3)
http://yadi.sk/d/Pd9BmAG7NvDX6 (1-2)
19.-apr.-2014 03:53 am - от мыши до слона
гвоздь
Встроенные в R данные Animals содержат данные о весе тела и весе мозга для 28 видов животных.
Read more...Collapse )
гвоздь
https://app.box.com/s/c77u4wyjy8tsk6lv476s
Мне справедливо отметили, что из моего pdf текст копируется в неправильной кодировке.
Я новичок в LaTeX, в следующий раз попробую использовать mmap.
11.-apr.-2014 11:00 pm - R-1
гвоздь
На кафедре компьютерной лингвистики РГГУ начал рассказывать про R.
Первая лекция есть в письменном виде:
https://app.box.com/s/83fjdczl6yfq1vyjlpmy
11.-apr.-2014 07:25 pm - окуджава query
гвоздь
Разыскивается стихотворение Окуджавы (не позднее 67 года), под предположительным названием «Мои Боги». Есть только перевод на польский двух первых четверостиший:
Jak grosz miedziany cała Ziemia, / a gdzieś tam, na niebiosach
krążą Bogowie ponade mną, / czytając w moich losach
i Ksiąg Żywota tom ogromny / wertują pomalutku.
Po tych stronicach chodzę skromnie - / ślepy i wesolutki.
(Bułat Okudżawa, „Moi bogowie”, przekład Seweryn Pollak)

Условный перевод:
А вся земля как медный грош/ и где-то там, на небесах,
Кружатся боги надо мной/и обсуждают жребий мой,
Листают потихоньку страницы огромного тома из книги моей жизни...
А я по тем страницам хожу - слепой и веселый(...)
1.-apr.-2014 07:08 am - The R purgatory
в зубах
Когда начинаешь писать на R, возникает устойчивое ощущение, что R - это ад. На самом деле, настоящий ад могут вполне осознать только продвинутые программисты на R (ср. книгу Бёрнса "The R Inferno", для продвинутых). То, с чем сталкиваешься вначале скорее похоже на чистилище, в ад попадаешь - вопреки средневековым представлениям - только после чистилища.

Конечно, особенность R в том, что начинающие скорее пользуются R как статистическим инструментом, не вникая в особенности языка (многие вводные книги именно на такое восприятие и направлены). Можно очень быстро научиться писать на R совсем короткие скрипты (5-20 строк), не пытаясь сделать ничего другого, потому что дальше - адъ.

Важная идеология Python - principle of least astonishment. Почти всё работает так, как можно предположить, даже не читая мануала. Или не работает, если не угадал.
Прелесть языка R - principle of most astonishment. Всё работает не так, как ты предполагаешь, при этом может даже выдавать некий удивительный результат.

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

1) Длина строки. Функция length('John') возвращает значение 1 (а не 4). Потому что в R нет строк. 'John' - это вектор строк длиной 1.

2) Доступ к элементам списка (list) через доллар. К элементам списка есть 2 формы доступа - стандартное индексирование с квадратными скобками и доллар (например, my.list$something). Так вот, на месте something может стоять только литерал. Если писать там переменную (скажем, внутри цикла), R просто выдаст нулевое значение (NULL). Переменные могут быть только внутри стандартного индекса.

3) Конкатенация объектов. Самый простой объект в R - это вектор, он создается конкатенацией литералов, например my.vector = c(1, -9, 50). Естественное желание, казалось бы - использовать вектор как контейнер для каких-то созданных объектов (скажем, матриц или таблиц, с которыми в R в основном и работают). Операция типа super.vector = c(matrix1, matrix2, matrix3) отлично работает, только она распаковывает все элементы этих матриц в один вектор.

Ну есть еще индексирование элементов списка, оно бывает с одинарными скобками (my.list[1]) и с двойными (my.list[[1]]), вместо нужных двойных можно употребить одинарные, что приведет, опять же, не к ошибке, а к прикольным эффектам.

Короче, enjoy.
Чем дальше - тем больше мне нравится этот язык.
19.-marts-2014 12:40 pm - R stemming
гвоздь
В R есть 2 пакета, которые позволяют выделять "основу" (stem) у словоформы: RStem и SnowballC.

RStem
Документации практически нет, см. http://www.omegahat.org/Rstem/.
Видимо, есть только 2 функции:
Функция getStemLanguages() выдает список поддержанных языков, на данный момент их 11 штук:
[1] "french" "english" "spanish" "portuguese" "german"
[6] "dutch" "swedish" "norwegian" "danish" "russian"
[11] "finnish"
Функция wordStem(words, language = your_choice) принимает в качестве основного аргумента вектор словоформ words, значение второго аргумента (язык) по умолчанию - 'english'). Функция возвращает вектор основ.

Разделить текст на словоформы
Таким образом, прежде чем осуществлять стемминг, нужно вручную разделить текст на словоформы.
string = "I'm looking for everything related to manga books"
Нужно понимать некоторые особенности функции strsplit().
У нее 2 основных аргумента - строка и разделители. Один разделитель может быть задан символом:
strsplit(string, " ")
В данном случае очевидно, что нужно учитывать два разделителя (пробел и апростроф). На самом деле, второй аргумент strsplit по умолчанию является регулярным выражением. Соответственно, чтобы делить по пробелу или ', можно написать
strsplit(string, "[' ]")
(в квадратных скобках в регулярных выражениях задается множество вариантов, из которых годится любой)
Кроме того, функция strsplit возвращает не вектор, а довольно необычный объект list (ничего похожего на список в языке типа Python). Чтобы сделать вектор из списка, нужна функция unlist.
Таким образом, возможный код такой:
words = unlist(strsplit(string, "[' ]"))
Этот код ничего не делает с пунктуацией, т.е. пунктуаторы остаются приклеены к словам: "language.". Скорее всего, от пунктуации нужно предварительно просто избавиться. Избавиться от всего кроме букв, чисел, пробелов и апострофа, можно с помощью такой строки, использующей регулярное выражение:
clean_string = sub("[^[:alnum:][:space:]']", "", dirty_string)
Дальшейшее зависит от конкретных целей (например, быть может, нужно избавиться от заглавных букв).

Итак, стемминг с RStem
Предположим, вектор словоформ находится в переменной words. Если вектор английский, можно использовать команду
wordStem(words) без дополнительного аргумента, задающего язык.
Результатом вызова при описанном значении words будет такой вектор:
[1] "I" "m" "look" "for" "everyth" "relat" "to"
[8] "manga" "book"
Стеммер относительно агрессивно отрезает то, что похоже на окончание, но при этом не возводит словоформу к какой-то правильной лексеме, потому что не содержит никакого словаря лексем. Т.е. он правильно отрезает окочания от look.ing, relat.ed и book.s, но еще и отрезает -ing от everything, что является сомнительным результатом (с другой стороны, не заменяет, например, m на be).

SnowballC
В принципе, почти то же самое, там только используется немного другой алгоритм. Поддерживает 16 языков:
>getStemLanguages()
[1] "danish" "dutch" "english" "finnish" "french" "german" "hungarian" "italian" "norwegian" "porter" "portuguese" "romanian" "russian" "spanish"
[15] "swedish" "turkish"
Т.е. чуть лучше RStem - поддерживает шведский, венгерский, итальянский, румынский и некий porter.
Что в точности значит в данном контексте porter, не знаю (вероятно, что речь идет об алгоритме Портера без настройки на конкретных язык?)
Те же 2 функции, что и в RStem. В данном случае есть описание: http://cran.r-project.org/web/packages/SnowballC/index.html

Пример
Нам нужен какой-то текст. Я сохранил крымскую речь Путина (http://www.kremlin.ru/transcripts/20603) в файл на диске.
Запоминаем имя файла, например
>fname = "D:/MyRFiles/Putin.txt"
В R, как кажется, нет вполне прямого пути прочитать весь файл как одну строку.
Рекомендуется следующая команда:
>singleString = paste(readLines(fname, encoding = 'UTF-8'), collapse = " ")
Далее, удаляем пунктуаторы:
>clean_string = gsub('[".,/!/?:–«»]', '', singleString)
Заменяем все заглавные буквы строчными:
>clean_string = tolower(clean_string)
Составляем список слов:
>words = unlist(strsplit(clean_string, "[ ]"))
Наконец, стеммируем:
>stemmedPutin = wordStem(words, language = 'russian')
Частотный словарик основ можно составить с помощью стандартной функции table():
>dict = table(stemmedPutin)
Посмотреть самые частотные основы можно отсортировав полученный датафрейм:
>sort(dict)
Если отбросить союзы, местоимения и т.п., самые частотные такие:
"Крым" 63, "Украин" 48, "Росс" 44, "русск" 23, "люд" 22, "стран" 20, "народ" 20, "Севастопол" 17, "прав" 16.
Основываться на словоформах в подобном изучении было бы явно неуклюжим решением.
7.-janv.-2014 01:04 pm - learning LaTeX for great good
гвоздь
Продолжая работать над популяризацией R, осваиваю LaTeX:
https://app.box.com/s/d34bfg4o0wvuvjg1shs7
Следует отметить, что в боксовском превью латеховский шрифт выглядит криво, но это если открыть pdf другими средствами, всё ОК.
28.-dec.-2013 10:28 pm - immigrant song
гвоздь
http://slovene.ru/issue2-1.html
Две большие статьи, которые реально формируют выпуск, посвящены мигрантам.
Статья А. Манькова вообще не по славистике, а про шведский диалект в Херсонской области (отделился от шведского в XVIII веке).
Статья Инзы Клемме про тексты, которые писали литовские татары - арабским письмом на т.н. "старобелорусском" языке, в основном посвященная анализу системы графики и орфографии. Такая обстоятельная немецкая статья по-немецки.
гвоздь
Графики дают неформальное представление о том, что распределения частотности для первого и третьего лица различаются.
Какие тесты можно применить для того, чтобы сопоставить эти распределения?
Можно сравнивать 3 вещи: дисперсию, средние значения и распределение в целом.
Read more...Collapse )
гвоздь
Чтобы сравнить 2 распределения, можно наложить 2 гистограммы одну на другую.

Работаем с таблицей pronouns.df, созданной в предыдущей серии.
Используется библиотека ggplot2, которая до этого должна быть установлена (install.packages) и загружена (library(ggplot2)).
ggplot(pronouns.df, aes(x=pronouns.vector, fill = pronouns.tags)) +
geom_histogram(position = "identity", alpha = 0.3) +
ggtitle("Histograms of first and second pronouns in BNCbiber") +
xlab("Frequency") + ylab("Number of texts") +
theme(plot.title = element_text(size = rel(1.2), face = "bold.italic")) +
scale_fill_manual(values = c("gold", "darkmagenta"))

alpha - степень прозрачности, можно поэкспериментировать
position = "identity" инструкция соотнести две гистограммы
Остальное более-менее очевидно, кажется.
Получается вот так:
2hist
Можно подобрать цвета и получше. scale_fill_manual можно, естественно, опустить, тогда будет дефолтная палитра.
гвоздь
На самом деле, таблица (data.frame) BNCpronouns устроена не так, как нам удобно для текущих целей. Дело в том, что пока мы не изучаем корреляцию признаков. Нигде не используем тот факт, что частотность местоимения первого лица 16.24.. наблюдается в том же документе, что частотность местоимения третьего лица 8.77...
При этом наша таблица устроена так, что ее нельзя скормить некоторым хорошим функциям в R (в частности, функциям ggplot2).
Нужно реструктурировать данные, чтобы в одной колонке таблицы было значение номинального признака лицо ("first", "third"), а в другой колонке - частотность.
pronouns.vector = c(BNCpronouns[,1], BNCpronouns[,3])
len = length(BNCpronouns[,1])
pronouns.tags =c(rep("first", len), rep("third", len))
pronouns.df = data.frame(pronouns.vector, pronouns.tags)

Тут 2 раза используется функция c(), конкатенация.
Первой строчкой мы создаем из двух векторов один длинный.
Второй строчкой выясняем длину исходных векторов (они должны быть одной длины, поэтому неважно, какой измерить).
В третьей строчке мы используем функцию rep(). Команда rep("еще раз", n) создает вектор, в котором "еще раз" повторено n раз. Сначала len раз идет "first", потом len раз идет "third" (len рано 4048).
И наконец из двух векторов создает уже другую таблицу.

Для большинства приложений нужна именно таблица (data.frame). Дело в том, что в матрице можно держать только числа, а таблица состоит из нескольких векторов разного типа.
Строчки таблицы соответствуют объектам.
Колонки таблицы соответствуют свойствам этих объектов.
В статистике это наблюдения (observations) и переменные (variables), в базах данных это записи (records) и поля (fields).

Итак, кажется, теперь можно будет
а) дать статистический анализ того, насколько колебания в первом лице отличается от колебаний в третьем (Колмогоров-Смирнов);
б) сделать диаграммы в ggplot2.
гвоздь

Ящик с усами


Основным способом графической репрезентации всей этой штуки с квартилями является boxplox (with whiskers обычно опускается), по-русски "ящик с усами".Read more...Collapse )
vioplot
гвоздь
BNCbiber - данные из пакета corpora, см. предыдущую серию.

Я решил посмотреть частотность личных местоимений. Соответствующие колонки называются так:
f_06_first_person_pronouns
f_07_second_person_pronouns
f_08_third_person_pronouns
Гигиеничнее сделать новую таблицу, в которой будут данные только по местоимениям.
Я бы делал это так:
>pronouns = c("f_06_first_person_pronouns", "f_07_second_person_pronouns", "f_08_third_person_pronouns")
>BNCpronouns = BNCbiber[,pronouns]

Вероятно, для многих очевидно, что можно сделать это в одну строчку:
>BNCpronouns = BNCbiber[,c("f_06_first_person_pronouns", "f_07_second_person_pronouns", "f_08_third_person_pronouns")]
Для компьютера практически пофиг (второй вариант теоретически чуть оптимальнее), а вот для читателя вашего скрипта разница та же, как между двумя предложениями и одним сложноподчиненным. Два предложения часто проще воспринимать.
Дальше я бы посмотрел обобщенные данные функцией summary():
> summary(BNCpronouns)
В отчете, который выдает summary(), есть среднее арифметическое (Mean), минимальное и максимальное значение (Min., Max.), первая квартиль (1st Qu.), третья квартиль (3rd Qu.) и медиана (Median).
Напомню, что квартили (т.е. "четверти") делят ряд на 4 части так, что 25% значений оказывается меньше чем 1-ая квартиль, 50% меньше чем 2-ая квартиль, она же медиана, и 75% меньше чем 3-ья.
Среднее арифметическое очень чувствительно к периферийным значениям (outlier'ам), поэтому квартили надежнее.
Межквартильный диапазон (interquartile range, IQR), которого нет в summary, характеризует разброс значений.
Значения функции summary() - это строки (тип character, в терминологии R), поэтому извлекать из нее какие-то поля не получится (т.е. можно, в качестве странного упражнения).
Поэтому, пожалуй, осмысленнее функция quantile(), которая выдает числа.
Но фишка в том, что мы хотим применить эту функцию не к одному только столбцу наших данных BNCpronouns, а ко всем. Я уже упоминал, когда речь шла про кламат, функцию apply. Она принимает другую функцию в качестве аргумента и применяет ее к тому, к чему нужно. В данном случае нужно ко второму измерению BNCpronouns, то есть так:
> pron_quantiles = apply(BNCpronouns, 2, quantile)
Посмотрите сами на результат.
Наверное, мы ожидаем, что в совокупности текстов частотность 3его лица выше всего, а 2ого - ниже всего.
Именно это показывают медианы(14 > 10 > 4).
Однако 3-я квартиль у местоимения 1-ого лица больше 3-ей квартили 3-его лица! Понятно, что это означает?
(типа проверочный вопрос, интересно, дочитал ли кто до этого места)
гвоздь

BNCbiber


Попробуем перейти к некоторым лингвистическим данным. Они устроены посложнее, чем отчет о фиджийских магнитудах.
Read more...Collapse )
гвоздь
Как можно сделать менее убогие гистограммы.
Read more...Collapse )

Fiji3
гвоздь
Не думаю, что круговые диаграммы сильно помогают понять разницу между 50% и 20%.
Но когда данных много, по картинке ясен характер распределения.
Чтобы подготовить численный вектор большой длины, я написал на Питоне скрипт, который ходит по файловой системе внутри указанной директории и записывает в список длину имени файла.
В данном случае получилось 169339 значений.
Я сохранил этот эти числа, разделенные запятой, в файл report.txt.
Вот как выглядит этот файл:
https://docs.google.com/file/d/0B_MzDFLeue99UVVzNWdXSTVvTTA

Для создания гистограммы в принципе можно обойтись ровно двумя строчками:
>v = scan("D:\\PyMinlos\\report.txt", sep = ",")
>hist(v)

scan - функция, которая может много разного (в том числе и получать данные с клавиатуры)
sep - разделитель между значениями, в данном случае запятая

В результате чего получаем гистограмму.

HistV

Очень просто и убого, как всегда бывает с базовыми функциями в R.
Чтобы сделать лучше, нужно написать всё-таки чуть больше. Об этом завтра.
15.-okt.-2013 11:07 pm - графика на R: pie charts
гвоздь

Круговые диаграммы


Все рисуют круговые диаграммы (pie charts). Смешно не уметь их нарисовать.
Но. Специалисты указывают, что люди неадекватно воспринимают пропорции на круговых диаграммах. Я вас предупредил.
Read more...Collapse )
3d
15.-okt.-2013 10:37 am - R по-быстрому (2.1)
завтра
В полночь фигня получилось.
Вот вторая версия.
Read more...Collapse )
В следующей серии обязательно будут картинки!
15.-okt.-2013 12:15 am - R по-быстрому (2)
в зубах
ОК, точный тест Фишера.

Для разнообразия возьмем новые данные.
Из статьи: Karen Sundberg Meyer, Word order in Klamath (Pragmatics of word order flexibility, ed. by D.L.Payne, John Benjamins, 1992), стр. 187.

Percent of animate vs. inanimate NPs in the major case-role categories
ANIMATE INANIMATE
SUBJECT 135 5
OBJECT 61 56
LOCATIVE 1 16


Можно создать матрицу следующим образом
klamath = matrix(c(135, 60, 1, 5, 56, 16), ncol=2)

Однако проблема в том, что для этих данных нельзя считать хи-квадрат Пирсона.
В литературе приводятся немного разные методические указания, но как на один из вариантов сошлюсь на следующее правило:
- 80% of the expected frequencies are larger of equal to 5
- all expected frequencies are larger than 1
(Stefan Gries, Statistics for linguistics with R, 152)
Другие указание еще более строгие. В любом случае, для матрицы klamath нужно использовать не хи-квадрат, а точный тест Фишера.
fisher.test(klamath)
Он дает следующие результаты:
Fisher's Exact Test for Count Data
data: klamath
p-value < 2.2e-16
alternative hypothesis: two.sided

2.2e-16 - это значение, записанное в стандартной для компьютерной области форме экспоненциальной записи, значит 2.2, умноженное на 10 в -16 степени. Таким образом, это число сильно меньшее, чем 0.01 или 0.001, и в статистической достоверности можно не сомневаться.

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

В моей компетенции показать, что как извлечь кусок из матрицы.
Легко заметить, что логически таблица всё равно неполна (там нет множества других синтаксических ролей). Вполне возможно, для какой-то цели вам теперь не нужны данные по локативу. Ну предположим обязательно нужно привести именно данные по хи-квадрату, потому что ваш научный редактор знает, что во всех статьях должен быть хи-квадрат, а не какой-то Фишер.
Давайте сделаем новую матрицу klamath1, используя только часть данных матрицы klamath - уберем третью строчку.
Это делает такая команда:
klamath1 = klamath[1:2, ]
Так как у нашей матрицы всего два измерения, индекс состоит из двух частей, разделенных запятой. В первой части указывается, какие взять строки, во второй указывается, какие взять столбцы. Элементы нумеруются с 1, а не с 0 (что не является неожиданностью для большинства людей, но непривычно для большинства программистов). Т.е. [1:2, ] означает "взять столбцы с 1 по 2 и все строки".
Ну и теперь вроде как можно посчитать хи-квадрат, если научный редактор настаивает.
chisq.test(klamath1)

В следующей серии обязательно будут картинки!
гвоздь
Цель заметок - быстрое техническое введение в использование R для тех, кто готов прочитать эти несколько страниц, но (пока) не готов читать целую книгу или рыться в онлайн-мануалах.

Потенциальный читатель - человек, который занимается своей научной областью, при этом, скорее всего, почти ничего не понимает в программировании. Предполагается, что читатель либо имеет какое-то представление о статистике, либо параллельно что-то посмотрит самостоятельно. Перед моим мысленным взором - несколько моих конкретных знакомцев-лингвистов (в частности, petrark, kassian).
Если вы занимаетесь своей научной областью, но у вас не возникает необходимости в статистическом и графическом обследовании ваших данных, эти заметки, видимо, не для вас. Но насколько научны такие занятия?

Итак, это не грамматика R, а разговорник. Ну или cookbook, набор рецептов.
Хотя я надеюсь, конечно, что некоторым читателям чуть позже понадобится и полноценная грамматика.

R скачивается с официального сайта.
Для начала будет достаточно консольного окна R.
Позже советую установить программу RStudio (Stephan Gries в своей книге по R для лингвистов рекомендует Tinn-R; возможно, по функциональности она ничем не хуже, но мне показалось менее понятной в использовании).

Почему именно R?
R распространяется бесплатно; в некоторых областях (в частности, в лингвистике) она стала стандартом.
Некоторые простые вещи, наверное, новичкам было бы чуть проще сделать через меню в программах с графическим интерфейсом.
Однако в перспективе использование меню заведомо ограничивает.

Часто можно сделать осмысленные выводы о корреляции двух бинарных признаков из таблицы 2x2.
Например, возьмем данные о морфологии инфинитива в великорусских текстах XVII в. из книги В.М. Живова ("Очерки исторической морфологии русского языка XVII-XVIII вв."). Живов изучал данные о корреляции двух форм инфинитива ("старые" формы с морфемой ти ~ "новые" формы с морфемой ть) и наличия/отсутствия возвратной частицы (с частицей инфинитивы заканчивались, соответственно, на -тися ~ -ться/тца).
На стр. 156 приводятся данные по Книге бесед Аввакума.
Формы инфинитива в Книге бесед
тип невозвратные (-ть,-ти) возвратные (-тися, -ться/-тца)
старые формы (-ти, -тися) 62 22
новые формы (-ть, -ться/-тца) 40 2


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

Чтобы работать в R с приведенными данными, логичнее всего сделать из них матрицу.
Вот соответствующий код:
besedy=matrix(c(62, 40, 22, 2), ncol=2)

Синтаксический комментарий:
c(62, 40, 22, 2) создает из четырех значений вектор (с - оператор конкатенации)
matrix создает из вектора матрицу (по умолчанию матрица заполняются по столбцам)
ncol задает количество столбцов в матрице
Оператор присвоения = записывает в переменную в левой части результат из правой части. Таким образом, он отличает от математического знака = (с его помощью нельзя проверить равенство). Для программистов такая семантика = вполне привычна, но в R, вероятно, чтобы подчеркнуть отличие присвоения от равенства, часто используют сочетание знаков <-. Если вам прикольно набирать два символа вместо одного, можете так и делать; тогда не забудьте еще разобраться, где <- всё-таки нельзя использовать на месте =.

Чтобы посмотреть, что находится в переменной besedy, введите имя переменной и получите таблицу
[,1] [,2]
[1,] 62 22
[2,] 40 2


Обозначения типа [1,] и [,2] - это индексы соответствующих срезов матрицы. Если это пока непонятно - неважно, об этом будет дальше.

Чтобы получить базовую статистику по матрице besedy, можно ввести команду
chisq.test(besedy)
Будет получен примерно следующий результат:
Pearson's Chi-squared test with Yates' continuity correction
data: besedy
X-squared = 7.0064, df = 1, p-value = 0.008122

Таким образом, с точки зрения статистических стандартов, нулевую гипезу (о том, что выбор форманта инфинитива никак не связан с возвратностью глагола) следует отбросить, даже если принять уровень значимости 0.01 (0.008122 < 0.01).
Может быть, этого вам и достаточно.

В следующей серии покажу, что еще можно сделать, имея матрицу besedy.
гвоздь
если кто не знал - с 6 ноября я уволен из Инслава по собственному желанию, с 7 ноября принят там на работу на 0,4 ставки
This page was loaded febr. 20. 2017, 10:52 am GMT.