Описательные статистики: одномерные и многомерные частотные распределения
06/04/14 18:47 Относится к категории: Анализ данных | R

Объект данных таблица создается с помощью функции table(), которая может принимать в качестве аргумента различные массивы данных (например, векторы, множества, фреймы). Эта функция является базовой при построении как одномерных, так и многомерных таблиц сопряженности. К полученному в результате ее использования объекту применяются другие функции, позволяющие строить таблицы модифицированные под потребности исследователя.
Одномерные и двумерные таблицы
Рассмотрим, какие результаты функции table() будут получены при использовании векторов:
Рассмотрим, какие результаты функции table() будут получены при использовании векторов:
1 2 3 4 5 6 7 8 9 10 11 | > gender <- c("мужской","женский","женский","мужской","мужской","мужской","женский") > table(gender) gender женский мужской 3 4 > election <- c("да","да","нет","нет","да","да","нет") > table(gender,election) election gender да нет женский 1 2 мужской 3 1 |
Сначана был создан вектор из семи элементов с информацией про пол респондентов, а потом (строка 2) построено одномерное распределение по этому признаку. Далее был создан второй вектор с информацией о том, пойдет ли респондент на ближайщие выборы, после чего построена таблица сопряженности (строка 7) на основании двух имеющихся векторов.
Как вы видите, в обоих случаях на экран были выведены частоты. Вместе с тем, значительно удобнее (в особенности на больших выборках) обращаться не к частотам, а соответствующим пропорциям / процентам. Для этого используется функция prop.table().
В качестве своего главного аргумента она принимает объект типа "table":
Как вы видите, в обоих случаях на экран были выведены частоты. Вместе с тем, значительно удобнее (в особенности на больших выборках) обращаться не к частотам, а соответствующим пропорциям / процентам. Для этого используется функция prop.table().
В качестве своего главного аргумента она принимает объект типа "table":
12 13 14 15 16 17 | > pt <- table(gender,election) # создаем объекти типа "table" > prop.table(pt,1) election gender да нет женский 0.3333333 0.6666667 мужской 0.7500000 0.2500000 |
При создании таблицы сопряженности с пропорциями в качестве второго аргумента можно указать 1 (пропорции рассчитываются по строкам) или 2 (пропорции рассчитываются по столбцам). Если второй аргумент не указывать, то пропорции в таблице будут рассчитаны по отношению к общему числу наблюдений. Если записать в новый объект уже результаты использования функции prop.table(), то также будет получена таблица, но уже с пропорциями.
Приведем наш последний результат к более приемлемому виду:
Приведем наш последний результат к более приемлемому виду:
18 19 20 21 22 23 | > npt <- round(prop.table(pt,1),3)*100 > npt election gender да нет женский 33.3 66.7 мужской 75.0 25.0 |
Здесь таблица с пропорциями округляется до трех знаков после запятой с помощью функции round() и умножается на 100, чтобы перейти к процентам. Полученный результат вызывается с помощью обращения к соответствующему объекту (строка 19).
В некоторых случаях бывает необходимо построить маргинальные частоты (суммы по строкам и/или столбцам). В этом случае работа также ведется с предварительно созданным объектом типа "table" при помощи функции addmargins():
В некоторых случаях бывает необходимо построить маргинальные частоты (суммы по строкам и/или столбцам). В этом случае работа также ведется с предварительно созданным объектом типа "table" при помощи функции addmargins():
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | > addmargins(pt) election gender да нет Sum женский 1 2 3 мужской 3 1 4 Sum 4 3 7 > addmargins(pt,1) election gender да нет женский 1 2 мужской 3 1 Sum 4 3 > addmargins(pt,2) election gender да нет Sum женский 1 2 3 мужской 3 1 4 |
Как видно, функция addmargins() работает схожим образом с функцией prop.table(), за тем исключением, что значения второго аргумента распознаются несколько по-иному. Результаты, полученные в следствие использования функции addmargins() так же можно записывать в объекты типа "table".
Теперь рассмотрим, к каким результатам приведен использование фрейма данных:
Теперь рассмотрим, к каким результатам приведен использование фрейма данных:
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | > gender <- rep(gender,15) > election <- rep(election,15) > fort <- data.frame(gender,election) > table(fort) election gender да нет женский 15 30 мужской 45 15 > table(fort$election,fort$gender) женский мужской да 15 45 нет 30 15 > table(fort[c(1,2)]) election gender да нет женский 15 30 мужской 45 15 |
С помощью функции rep() я продублировал содержание векторов gender и election 15 раз (чтобы в дальнейшем набор данных выглядел более реалистично).
В строке 27 функция table() применена ко всему фрейму данных. В этом случае размерность таблицы будет равна количеству переменных во фрейме. Поскольку в нашем случае фрейм включает только две переменных, то в результате получена двумерная таблица сопряженности. Если переменных большее количество, а необходимо построить таблицу сопряженности с ограниченным количеством размерностей, можно использовать два способа.
Первый показан в строке 32. Как видно, сначала указывается имя массива, оператор доллара, а потом имя переменной. Далее, через запятую, то же самое делается для второй переменной. Главным недостатком такого способа является то, что в результате не выводятся имена переменных.
Второй способ заключается в том, чтобы указать индексы соответствующих переменных. Делается это в виде вектора, набор числовых элементов которого отображает необходимые индексы. Пример приведен в строке 37.
В строке 27 функция table() применена ко всему фрейму данных. В этом случае размерность таблицы будет равна количеству переменных во фрейме. Поскольку в нашем случае фрейм включает только две переменных, то в результате получена двумерная таблица сопряженности. Если переменных большее количество, а необходимо построить таблицу сопряженности с ограниченным количеством размерностей, можно использовать два способа.
Первый показан в строке 32. Как видно, сначала указывается имя массива, оператор доллара, а потом имя переменной. Далее, через запятую, то же самое делается для второй переменной. Главным недостатком такого способа является то, что в результате не выводятся имена переменных.
Второй способ заключается в том, чтобы указать индексы соответствующих переменных. Делается это в виде вектора, набор числовых элементов которого отображает необходимые индексы. Пример приведен в строке 37.
Таблицы с размерностью три и более
Добавим к имеющемуся массиву третью переменную об образовании респондента и построим таблицу сопряженности:
Добавим к имеющемуся массиву третью переменную об образовании респондента и построим таблицу сопряженности:
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | > education <- c("среднее", "среднее специальное", "высшее") > education <- rep(education,35) > education <- sample(education) > education <- factor(education,levels=c("среднее", "среднее специальное", "высшее")) > fort <- cbind(fort,education) > table(fort) , , education = среднее election gender да нет женский 6 7 мужской 16 6 , , education = среднее специальное election gender да нет женский 4 15 мужской 11 5 , , education = высшее election gender да нет женский 5 8 мужской 18 4 |
Таким образом, в результате применения функции table() к массиву с тремя переменными получены три двумерные таблицы в соответствии с тремя категориями переменной education (их в данном случае можно назвать слоями).
Чтобы привести таблицу к компактному виду следует использовать функцию ftable(). Рассмотрим соответствующий пример:
Чтобы привести таблицу к компактному виду следует использовать функцию ftable(). Рассмотрим соответствующий пример:
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | > mini <- table(fort) > ftable(mini) education среднее среднее специальное высшее gender election женский да 6 4 5 нет 7 15 8 мужской да 16 11 18 нет 6 5 4 > round(prop.table(ftable(mini,row.vars=c(1,3)),1),3)*100 election да нет gender education женский среднее 46.2 53.8 среднее специальное 21.1 78.9 высшее 38.5 61.5 мужской среднее 72.7 27.3 среднее специальное 68.8 31.2 высшее 81.8 18.2 |
Первый вариант построения таблицы (строка 86) дает тот же результат, что и в предыдущем примере, но более компактного вида. Здесь может возникнуть вопрос: что делать, если такая последовательность размещения переменных в строках и столбцах является неприемлемой? Для ответа на этот вопрос я продемонстрировал второй вариант (строка 93), в котором (среди прочего) использован аргумент row.vars, принимающий номера переменных массива, которые будут размещены в виде комбинации в строках таблицы (в нашем случае первой переменной массива fort является gender, а третей - education).
Работа с таблицами больших размерностей, подчиняется тем же принципам, что и в случае таблицы с тремя переменными.
Индексация таблиц
Каждая ячейка одномерной, двумерной или многомерной таблицы имеет свой индекс. Содержанием ячейки будет соответствующая частота, пропорция или процентный показатель (в зависимости от того, какие преобразования с таблицей мы осуществили). В нашем случае таблица состоит из трех переменных, количество категорий которых равно 2, 2 и 3. Следовательно индесация может вестись от 1 до 2*2*3 (12):
Работа с таблицами больших размерностей, подчиняется тем же принципам, что и в случае таблицы с тремя переменными.
Индексация таблиц
Каждая ячейка одномерной, двумерной или многомерной таблицы имеет свой индекс. Содержанием ячейки будет соответствующая частота, пропорция или процентный показатель (в зависимости от того, какие преобразования с таблицей мы осуществили). В нашем случае таблица состоит из трех переменных, количество категорий которых равно 2, 2 и 3. Следовательно индесация может вестись от 1 до 2*2*3 (12):
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | > length(mini) [1] 12 > for (i in 1:12) print(mini[i]) [1] 6 [1] 16 [1] 7 [1] 6 [1] 4 [1] 11 [1] 15 [1] 5 [1] 5 [1] 18 [1] 8 [1] 4 |
Перечисленные с помощью цикла частоты можно легко соотнести з ячейками таблицы. Вместе с тем, в нашем случае удобней вести индексацию в системе координат трех размерностей:
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | > mini[1,,] education election среднее среднее специальное высшее да 6 4 5 нет 7 15 8 > mini[,1,] education gender среднее среднее специальное высшее женский 6 4 5 мужской 16 11 18 > mini[,,1] election gender да нет женский 6 7 мужской 16 6 |
Первая позиция между операторами квадратных скобок предназначена для одной из категорий пола, вторая - планов на выборы, третья - образования. Если какая-либо из позиций будет оставлена пустой, это подразумевает, что мы хотим увидеть все наблюдения по этой переменной, которые удовлетворяют другим условиям. Так, синтаксис в строке 117 говорит о том, что нам интересно совместное распределение по переменным готовности участвовать в выборах и образования для всех наблюдений первой категории переменной пол, а именно - женщин.
В завершении хотелось бы отметить, что извлекаемые с помощью индексации значения сохраняют своим математические свойства и могут быть использованы в вычислениях. Допустим, мы хотим узнать количество мужчин, которые не собираются идти на выборы независимо от образования, и сохранить это значение в виде скаляра:
В завершении хотелось бы отметить, что извлекаемые с помощью индексации значения сохраняют своим математические свойства и могут быть использованы в вычислениях. Допустим, мы хотим узнать количество мужчин, которые не собираются идти на выборы независимо от образования, и сохранить это значение в виде скаляра:
132 133 134 | > num <- sum(mini[2,2,]) # находим сумму наблюдений в соответствующих ячейках > num [1] 15 |
статью подготовил кандидат социологических наук Сергей Дембицкий
Data science (3)
Europe (2)
Geopolitics (2)
Infographics (1)
R (26)
Russia (2)
SPSS (2)
Ukraine (2)
Акционализм (1)
Анализ данных (27)
Аномия (1)
Выборка (1)
Выступления (3)
Геополитика (12)
Гражданское общество (2)
Демократизация (1)
Европа (4)
Интернет ресурсы (1)
Инфографика (8)
Исследовательские дизайны (1)
Историческая социология (10)
История социологии (5)
Киберспорт (1)
Книги (7)
Массивы (3)
Методология социальных исследований (1)
Методология социологических исследований (2)
Научная жизнь (3)
Новости (6)
Обратная связь (1)
Персоналии (3)
Православные конфессии в Украине (1)
Президентская власть (1)
Психологический дистресс (18)
Психология (5)
Публицистика (2)
Революция (1)
Результаты исследований (28)
Религия (3)
Россия (2)
Согласование концептов (4)
Социальная гетерогенность (1)
Социальная работа (1)
Социологическая теория (6)
Социологические тесты (1)
Социологическое образование (5)
Теория конфликта (2)
Теория социального измерения (8)
Украина (9)
Учебные планы (2)
Философия (1)
Шкалирование (36)
Экономика (1)
Эмпирическая социология (46)
Europe (2)
Geopolitics (2)
Infographics (1)
R (26)
Russia (2)
SPSS (2)
Ukraine (2)
Акционализм (1)
Анализ данных (27)
Аномия (1)
Выборка (1)
Выступления (3)
Геополитика (12)
Гражданское общество (2)
Демократизация (1)
Европа (4)
Интернет ресурсы (1)
Инфографика (8)
Исследовательские дизайны (1)
Историческая социология (10)
История социологии (5)
Киберспорт (1)
Книги (7)
Массивы (3)
Методология социальных исследований (1)
Методология социологических исследований (2)
Научная жизнь (3)
Новости (6)
Обратная связь (1)
Персоналии (3)
Православные конфессии в Украине (1)
Президентская власть (1)
Психологический дистресс (18)
Психология (5)
Публицистика (2)
Революция (1)
Результаты исследований (28)
Религия (3)
Россия (2)
Согласование концептов (4)
Социальная гетерогенность (1)
Социальная работа (1)
Социологическая теория (6)
Социологические тесты (1)
Социологическое образование (5)
Теория конфликта (2)
Теория социального измерения (8)
Украина (9)
Учебные планы (2)
Философия (1)
Шкалирование (36)
Экономика (1)
Эмпирическая социология (46)
January 2021
September 2020
March 2019
September 2018
August 2018
April 2018
March 2018
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013
October 2013
September 2013
December 2020
November 2020
October 2020September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
December 2019
November 2019
October 2019September 2019
August 2019
July 2019
June 2019May 2019
April 2019March 2019
February 2019
January 2019
December 2018
November 2018
October 2018September 2018
August 2018
July 2018
June 2018
May 2018April 2018
March 2018
February 2018
January 2018December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014November 2014
October 2014
September 2014August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013
October 2013
September 2013