Описательные статистики: одномерные и многомерные частотные распределения
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 |
статью подготовил кандидат социологических наук Сергей Дембицкий
Вверх
blog comments powered by Disqus