Описательные статистики: одномерные и многомерные частотные распределения
06/04/14 18:47 Относится к категории: Анализ данных | R
В отличии от SPSS, в R таблицы (частотные распределения) являются не просто способом представления числовых данных, результаты которого подлежат лишь ограниченному редактированию (как текстовый объект в MS Word или числовой в MS Excel), а полноценным программным объектом, в работе с которым доступны средства индексации, редактирования, включения в программные конструкции и прочее. Все это делает частотные распределения в R максимально гибкими и продуктивными в использовании.
Объект данных таблица создается с помощью функции table(), которая может принимать в качестве аргумента различные массивы данных (например, векторы, множества, фреймы). Эта функция является базовой при построении как одномерных, так и многомерных таблиц сопряженности. К полученному в результате ее использования объекту применяются другие функции, позволяющие строить таблицы модифицированные под потребности исследователя.
Объект данных таблица создается с помощью функции 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