Описательные статистики: одномерные и многомерные частотные распределения

Magnetized-Float-Table-by-RPR-2
В отличии от SPSS, в R таблицы (частотные распределения) являются не просто способом представления числовых данных, результаты которого подлежат лишь ограниченному редактированию (как текстовый объект в MS Word или числовой в MS Excel), а полноценным программным объектом, в работе с которым доступны средства индексации, редактирования, включения в программные конструкции и прочее. Все это делает частотные распределения в R максимально гибкими и продуктивными в использовании.
Объект данных таблица создается с помощью функции 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":
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():
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.
Таблицы с размерностью три и более
Добавим к имеющемуся массиву третью переменную об образовании респондента и построим таблицу сопряженности:
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(). Рассмотрим соответствующий пример:
 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):
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