install.packages("vkR")# эта строчка нужна только тем, кто еще не установил пакет vkR
library(vkR)
#получить ключ
vkOAuth(11111111)# в скобках - id приложения в ВК, которое создавали на предыдущих занятиях, откроется браузер, скопировать ключ до знака &
#установить ключ
setAccessToken(access_token="vk1.a....ТУТ ВАШ КЛЮЧ до - скопировать ДО знака & перед &expires_in=86400&user_id")
# установить версию API
<-setAPIVersion("5.89")
v#Выгрузить информацию об ID пользователей группы (пример по группам кафедры, ИГН и Дома народов Алтайского края) - у вас будут свои группы
<-getGroupsMembersExecute(group_id = 211524072)
kaf<-getGroupsMembersExecute(group_id = "ign21")
ign<-getGroupsMembersExecute("rndaltai")
rnd#выгрузить информацию о пользователях (примеры по кафедре, ИГН и Дому народов Алтайского края)
<-getUsersExecute(kaf, fields='sex, bdate, country, city, occupation')
kaf_info<-getUsersExecute(ign, fields='sex, bdate, country, city, occupation')
ign_info<-getUsersExecute(rnd, fields='sex, bdate, country, city, occupation') rnd_info
Анализ виртуальных сообществ (часть 2 - анализ групп по составу)
Краткое содержание предыдущих серий
На прошлых занятиях мы учились делать выгрузку по сообществам через API VK
Нам нужно сделать обобщающую таблицу с основными сведениями.
Допустим, у нас есть таблицы по трем группам - кафедры, ИГН и Дома народов Алтайского края. Они называются kaf_info, ign_info, rnd_info
Чтобы не делать одну и ту же работу несколько раз, соединим все таблицы в одну большую таблицу, которую назовем info
.
Прежде чем это сделать, создадим в каждой таблице переменную принадлежности к группе, чтобы наши данные по разным группам не перепутались:
$group<-"Кафедра"
kaf_info$group<-"ИГН"
ign_info$group<-"РНД" rnd_info
Теперь соединим все таблицы в одну:
<-rbind(kaf_info,ign_info, rnd_info ) info
Самый простой анализ заключается в создании одномерных таблиц с частотами с помощью функции table()
. Давайте, например, посмотрим, сколько участников в каждой группе.
Для того, чтобы проанализировать какую-либо переменную, мы должны написать название таблицы, которую мы анализируем, а потом, через знак $, - нужный показатель.
table(info$group)
ИГН Кафедра РНД
3377 206 677
Чтобы сделать аналогичный анализ в процентах, можно воспользоваться функцией prop.table()
, которой мы как бы оборачиваем нашу исходную таблицу. Чтобы код выглядел лучше, можно таблицу сохранить в качестве отдельного объекта, а уже по нему сделать таблицу с пропорциями:
<-table(info$group)
t#В процентах
prop.table(t)*100
ИГН Кафедра РНД
79.272300 4.835681 15.892019
Что, если мы хотим получить двумерную таблицу? Например, посмотреть распределение не только по группе, но и по количеству закрытых профилей?
Функции останутся прежними, только в функцию prop.table()
добавим аргумент margin = 2
, чтобы проценты рассчитывались по столбцу.
Заметьте, на первом месте у нас целевая переменная info$is_closed
, на втором - группирующая info$group
:
<-table(info$is_closed, info$group)
t2prop.table(t2, margin = 2)*100
ИГН Кафедра РНД
FALSE 80.54486 77.18447 79.61595
TRUE 19.45514 22.81553 20.38405
Видим, что количество закрытых профилей примерно одинаково в разных группах - от 19,5% до 22,8%.
Однако, анализировать информацию по каждой переменной не очень удобно. Нам хотелось бы провести комплексный анализ и сделать сводную таблицу по всем переменным. К сожалению, так сделать не получится, хотя бы потому, что некоторые переменные, например, интересы - это поле со свободными ответами и делать по ним таблицу не очень целесообразно, нужно описывать в целом, проводя качественный анализ “вручную”.
Что касается остальных переменных, то прежде, чем сделать по ним таблицу, мы должны осуществить обработку данных:
- вычислить возраст по дате рождения
- перекодировать переменные (заменить коды на метки)
- некоторые переменные являются вложенными (
city
,occupation, personal, country
) то есть это не одна, а несколько переменных в одной группе (идентификатор и название города, тип занятий, название организации и др.) - соответственно, нам нужно эти переменные привести к общему табличному виду.
Этим мы и займемся сегодня, и для работы нам понадобится несколько дополнительных пакетов. Для их установки нужно запустить следующий код:
install.packages(c("readr", "lubridate", "dplyr", "tidyr", "forcats", "gtsummary"))
Эти пакеты имеют следующее предназначение:
readr
- работа с прямоугольными таблицами (импорт из разных источников) и парсинг различных форматовlubridate
- работа с временными даннымиdplyr
- всевозможные трансформации данных, такие как отбор переменных, фильтрация наблюдений, перекодировка, группировка, вычисление новых переменных и пр.tidyr
- помощь в трансформации данных в “чистый формат”, когда в каждой строке содержится одно наблюдение и в каждом столбце - только одна переменная,forcats
- обработка категориальных (факторных) переменныхgtsummary
- создание красивых таблиц для научных исследований.
Вычисление возраста
Начнем с вычисления возраста. Разобьем наш код на несколько этапов. Прежде всего, подключим нужные библиотеки:
library(lubridate)
library(readr)
Перекодируем переменную bdate
в формат даты (неизбежно, часть данных, где дата рождения была введена не полностью, потеряется), а затем вычислим дату рождения путем вычитания из сегодняшней даты даты рождения пользователя группы.
Чтобы не потерять исходные данные, результаты перекодировки сохраним в новую переменную - bdate2
:
# 1. Конвертируем переменную bdate в дату и сохраняем результаты в новую переменную bdate2
$bdate2<-readr::parse_datetime(info$bdate, "%d%.%m%.%Y") info
Warning: 1786 parsing failures.
row col expected actual
2 -- date like %d%.%m%.%Y 15.12
5 -- date like %d%.%m%.%Y 19.5
10 -- date like %d%.%m%.%Y 10.7
11 -- date like %d%.%m%.%Y 22.4
12 -- date like %d%.%m%.%Y 2.12
... ... .................... ......
See problems(...) for more details.
# 2.Создадим переменную возраста с помощью функций time_length() и difftime().
$age<-time_length(difftime(today(), info$bdate2), "years") info
То, что появилось предупреждение, ничего страшного, это означает, что программа не смогла правильно распознать все даты.
Посмотрим, что у нас получилось:
summary(info$age)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
14.05 19.70 21.72 26.89 27.79 122.90 2391
Как видим, у нас довольно большой размах по возрасту - от 17 (почти 18) до 66 лет, средний возраст (mean
) - составил 26,8 года, медианный (median
)- 21,7 года. Велико и количество пропущенных значений - 2391 случай из 4260. Кроме того, мы видим, что максимальный возраст очень велик - 122,89 года, вряд ли кто-то дожил до 100 лет))).
Давайте заменим на пропущенные все значения возраста, превышающие 100 лет:
$age[info$age >100] <- NA info
Проверим. что у нас получилось:
summary(info$age)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
14.05 19.67 21.67 26.26 27.45 99.20 2404
Видим, что теперь есть те, кому 99))) Давайте посмотрим на гистограмму:
hist(info$age, col = "steelblue")
Видим, что есть разные единичные ответы больше 70 лет, поэтому при описании лучше ориентироваться на медианный возраст.
Какие это наблюдения:
which(info$age>70)
[1] 734 1669 2124 2507 3077 3866 4140 4154 4260
Анализ пропущенных значений
Мы видим, что в нашей таблице много пропусков. Давайте посмотрим, сколько у нас пропущенных значений по каждому столбцу в общей таблице:
#Посмотрим количество пропущенных значений по каждому столбцу
colMeans(is.na(info))*100
id bdate id title
0.00000 14.20188 40.11737 40.11737
id title id name
28.38028 28.38028 35.63380 33.14554
type country_id city_id graduate_year
33.14554 87.48826 53.75587 55.25822
sex first_name last_name can_access_closed
0.00000 0.00000 0.00000 0.00000
is_closed deactivated group bdate2
0.00000 97.86385 0.00000 56.12676
age
56.43192
Видим, что даже по основным переменным данных сильно не хватает: даже такие переменные, как город проживания, пропущены у 40% пользователей.
Отбор переменных для анализа
Давайте отберем в отдельный набор переменные, которые мы будем представлять в виде отдельной таблицы.
Поскольку при выгрузке создается объект класса vk.users
, некоторые функции трансформации, которые мы будем применять (отбор, сортировка, перекодировка), будут недоступны, и нам нужно перевести его в более приемлемый вид.
Наиболее эффективным будет являться формат tibble
.
library(tibble)
<-as_tibble(info) info
Теперь уберем вложенность некоторых переменных, так как пока наша таблица представляет собой «матрешку», в которую вложены другие таблицы (это можно увидеть, нажав на голубой кружок с белым треугольником в блоке Environment
:
Чтобы убрать, по крайней мере частично, иерархичность таблицы, воспользуемся функцией unnest()
из библиотеки tidyr
:
library(tidyr)
<-info %>%
infounnest(cols = c(country, city, occupation),names_sep = "_" ) # cols - столбцы, которые нам необходимо «развернуть».
Сделаем окончательный отбор переменных в таблицу (оставлены только самые важные):
- группа
(group)
, - возраст
(age)
- тип занятости
(occupation_type)
- название страны
(country_title)
- название города
(city_title)
library(dplyr)
#отберем в набор самые главные показатели
<-info %>%
infoselect(group, age, sex, occupation_type, country_title, city_title)
Перекодировка переменных
Наиболее быстрый способ трансформировать данные (вычислить новые переменные, перекодировать и пр.) - воспользоваться возможностями пакета dplyr
из библиотеки tidyverse
.
Как понять, как перекодировать, и что означает код? Посмотреть документацию - справочник по API ВК.
Сделаем перекодировку по полу, типу занятости, и переименуем наши переменные на русский язык:
<-info %>%
infomutate(sex=case_when(
==1~"Женский",
sex==2~"Мужской"
sex
),occupation_type=case_when(
=="work"~"Работа",
occupation_type=="university"~"Высшее образование",
occupation_type=="school"~"Среднее образование",
occupation_type%>%
)) rename(Пол=sex, Занятость=occupation_type, Возраст=age, Город=city_title, Страна=country_title)
Создаем таблицу в разрезе групп
Чтобы сделать общую таблицу, воспользуемся пакетом: gtsummary
:
library(gtsummary)
<-info %>%
tabletbl_summary(missing="no", by=group) # missing="no" - мы не будем отображать пропущенные значения, by=group - будем делать анализ по группам
table
Characteristic | ИГН, N = 3,3771 | Кафедра, N = 2061 | РНД, N = 6771 |
---|---|---|---|
Возраст | 21 (19, 24) | 24 (20, 31) | 37 (27, 48) |
Пол | |||
Женский | 2,584 (77%) | 174 (84%) | 518 (77%) |
Мужской | 792 (23%) | 32 (16%) | 159 (23%) |
Занятость | |||
Высшее образование | 1,579 (69%) | 103 (66%) | 215 (54%) |
Работа | 650 (28%) | 50 (32%) | 178 (44%) |
Среднее образование | 63 (2.7%) | 2 (1.3%) | 8 (2.0%) |
Страна | |||
Австралия | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Австрия | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Алжир | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Ангилья | 1 (<0.1%) | 1 (0.6%) | 0 (0%) |
Беларусь | 2 (<0.1%) | 0 (0%) | 0 (0%) |
Великобритания | 2 (<0.1%) | 0 (0%) | 0 (0%) |
Венесуэла | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Германия | 6 (0.3%) | 0 (0%) | 19 (3.4%) |
Гондурас | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Грузия | 2 (<0.1%) | 0 (0%) | 0 (0%) |
Израиль | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Испания | 2 (<0.1%) | 0 (0%) | 0 (0%) |
Италия | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Казахстан | 69 (3.0%) | 2 (1.2%) | 3 (0.5%) |
Канада | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Китай | 5 (0.2%) | 0 (0%) | 1 (0.2%) |
Кыргызстан | 3 (0.1%) | 2 (1.2%) | 1 (0.2%) |
Латвия | 2 (<0.1%) | 0 (0%) | 0 (0%) |
Микронезия, федеративные штаты | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Объединенные Арабские Эмираты | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Польша | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Россия | 2,185 (94%) | 153 (95%) | 526 (94%) |
Словения | 1 (<0.1%) | 0 (0%) | 0 (0%) |
США | 15 (0.6%) | 0 (0%) | 0 (0%) |
Таджикистан | 3 (0.1%) | 0 (0%) | 0 (0%) |
Танзания | 0 (0%) | 1 (0.6%) | 0 (0%) |
Турция | 0 (0%) | 1 (0.6%) | 0 (0%) |
Узбекистан | 3 (0.1%) | 0 (0%) | 0 (0%) |
Украина | 4 (0.2%) | 1 (0.6%) | 2 (0.4%) |
Франция | 3 (0.1%) | 0 (0%) | 0 (0%) |
Швейцария | 0 (0%) | 0 (0%) | 2 (0.4%) |
Швеция | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Южная Корея | 2 (<0.1%) | 0 (0%) | 0 (0%) |
Япония | 11 (0.5%) | 0 (0%) | 0 (0%) |
Город | |||
Abu Dhabi | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Albuquerque | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Atlanta | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Barkow | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Batman | 0 (0%) | 1 (0.8%) | 0 (0%) |
Bebra | 2 (0.1%) | 0 (0%) | 0 (0%) |
Beijing | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Berlin | 0 (0%) | 0 (0%) | 6 (1.1%) |
Bielefeld | 0 (0%) | 0 (0%) | 1 (0.2%) |
Boston | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Busan | 1 (<0.1%) | 0 (0%) | 0 (0%) |
California | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Capri | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Chiba | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Dortmund | 0 (0%) | 0 (0%) | 1 (0.2%) |
Dresden | 0 (0%) | 0 (0%) | 1 (0.2%) |
Florida City | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Frankfurt am Main | 0 (0%) | 0 (0%) | 1 (0.2%) |
Hamburg | 0 (0%) | 0 (0%) | 1 (0.2%) |
Hannover | 0 (0%) | 0 (0%) | 1 (0.2%) |
Hattingen | 0 (0%) | 0 (0%) | 1 (0.2%) |
Honolulu | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Kanavayén | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Kawasaki | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Kyōto | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Lanzhou | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Lenzburg | 0 (0%) | 0 (0%) | 1 (0.2%) |
Lichtenfels | 0 (0%) | 0 (0%) | 1 (0.2%) |
Linz | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Liverpool | 1 (<0.1%) | 0 (0%) | 0 (0%) |
London | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Lörrach | 0 (0%) | 0 (0%) | 1 (0.2%) |
Los Angeles | 2 (0.1%) | 0 (0%) | 0 (0%) |
Lübeck | 0 (0%) | 0 (0%) | 1 (0.2%) |
Madrid | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Malibu | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Moscow | 1 (<0.1%) | 0 (0%) | 0 (0%) |
München | 1 (<0.1%) | 0 (0%) | 0 (0%) |
New York City | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Nitzana | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Ōsaka | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Palermo | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Paris | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Philadelphia | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Portorož | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Québec | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Salzburg | 0 (0%) | 0 (0%) | 1 (0.2%) |
Sanya | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Seoul | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Siegburg | 0 (0%) | 0 (0%) | 1 (0.2%) |
Stockholm | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Taiyuan | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Tokyo | 3 (0.2%) | 0 (0%) | 0 (0%) |
Weiden in der Oberpfalz | 0 (0%) | 0 (0%) | 1 (0.2%) |
Witten | 0 (0%) | 0 (0%) | 1 (0.2%) |
Wrocław | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Xingtai | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Yamatotakada | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Yokohama | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Zug | 0 (0%) | 0 (0%) | 1 (0.2%) |
Абакан | 3 (0.2%) | 1 (0.8%) | 0 (0%) |
Алейск | 4 (0.2%) | 0 (0%) | 1 (0.2%) |
Алейский | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Александровское | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Алматы | 6 (0.3%) | 0 (0%) | 0 (0%) |
Алтайское | 2 (0.1%) | 0 (0%) | 0 (0%) |
Анжеро-Судженск | 2 (0.1%) | 1 (0.8%) | 0 (0%) |
Астана | 2 (0.1%) | 0 (0%) | 0 (0%) |
Ачинск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Баево | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Балашиха | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Барнаул | 1,359 (72%) | 89 (67%) | 314 (60%) |
Барнаул (деревня) | 3 (0.2%) | 0 (0%) | 4 (0.8%) |
Белгород | 0 (0%) | 1 (0.8%) | 0 (0%) |
Белокуриха | 4 (0.2%) | 0 (0%) | 1 (0.2%) |
Белояровка | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Бердск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Бийск | 31 (1.6%) | 5 (3.8%) | 6 (1.1%) |
Бишкек | 3 (0.2%) | 2 (1.5%) | 1 (0.2%) |
Борзя | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Борисов | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Братск | 2 (0.1%) | 0 (0%) | 0 (0%) |
Брянск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Бурла | 2 (0.1%) | 0 (0%) | 1 (0.2%) |
Валдай | 0 (0%) | 0 (0%) | 1 (0.2%) |
Верх-Уймон | 0 (0%) | 0 (0%) | 2 (0.4%) |
Витим | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Вичуга | 0 (0%) | 1 (0.8%) | 0 (0%) |
Владимир | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Вологда | 0 (0%) | 0 (0%) | 1 (0.2%) |
Волосово | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Воронеж | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Вострово | 0 (0%) | 0 (0%) | 1 (0.2%) |
Воткинск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Выдриха | 1 (<0.1%) | 1 (0.8%) | 0 (0%) |
Горно-Алтайск | 18 (0.9%) | 0 (0%) | 3 (0.6%) |
Горняк | 2 (0.1%) | 0 (0%) | 0 (0%) |
Гурзуф | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Дербент | 0 (0%) | 0 (0%) | 1 (0.2%) |
Дмитриевка | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Днепр (Днепропетровск) | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Донецк | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Дудинка | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Душанбе | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Екатеринбург | 4 (0.2%) | 0 (0%) | 1 (0.2%) |
Енисейск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Енисейское | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Завьялово | 4 (0.2%) | 1 (0.8%) | 0 (0%) |
Закаменск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Заринск | 12 (0.6%) | 1 (0.8%) | 2 (0.4%) |
Зеленоградск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Змеиногорск | 1 (<0.1%) | 1 (0.8%) | 3 (0.6%) |
Зудилово | 3 (0.2%) | 0 (0%) | 0 (0%) |
Зура | 0 (0%) | 0 (0%) | 1 (0.2%) |
Игра | 0 (0%) | 0 (0%) | 1 (0.2%) |
Иркутск | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Искитим | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Истиклол (Табошар) | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Ичня | 0 (0%) | 0 (0%) | 1 (0.2%) |
Казань | 2 (0.1%) | 0 (0%) | 1 (0.2%) |
Калининград | 2 (0.1%) | 0 (0%) | 2 (0.4%) |
Калуга | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Камень-на-Оби | 6 (0.3%) | 0 (0%) | 0 (0%) |
Канск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Караганда | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Касансай | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Кемерово | 2 (0.1%) | 0 (0%) | 0 (0%) |
Киров | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Кладовка | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Комсомольск-на-Амуре | 0 (0%) | 0 (0%) | 1 (0.2%) |
Кострома | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Кош-Агач | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Краснодар | 2 (0.1%) | 0 (0%) | 0 (0%) |
Красноярск | 2 (0.1%) | 0 (0%) | 1 (0.2%) |
Красный Партизан | 0 (0%) | 0 (0%) | 1 (0.2%) |
Кубанка | 0 (0%) | 0 (0%) | 1 (0.2%) |
Кулунда | 3 (0.2%) | 0 (0%) | 0 (0%) |
Курган | 0 (0%) | 0 (0%) | 1 (0.2%) |
Куюс | 0 (0%) | 0 (0%) | 1 (0.2%) |
Кызыл | 4 (0.2%) | 2 (1.5%) | 0 (0%) |
Кытманово | 2 (0.1%) | 0 (0%) | 0 (0%) |
Ленинск-Кузнецкий | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Липецк | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Магадан | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Магнитогорск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Мамонтово | 1 (<0.1%) | 1 (0.8%) | 3 (0.6%) |
Манжерок | 0 (0%) | 0 (0%) | 1 (0.2%) |
Маслянино | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Междуреченск | 3 (0.2%) | 0 (0%) | 0 (0%) |
Мир | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Могилёв | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Москва | 39 (2.1%) | 5 (3.8%) | 19 (3.6%) |
Набережные Челны | 0 (0%) | 0 (0%) | 1 (0.2%) |
Надым | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Нижнеангарск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Нижневартовск | 2 (0.1%) | 0 (0%) | 0 (0%) |
Николаев | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Новичиха | 0 (0%) | 0 (0%) | 1 (0.2%) |
Новоалтайск | 22 (1.2%) | 4 (3.0%) | 16 (3.1%) |
Новодвинск | 0 (0%) | 0 (0%) | 2 (0.4%) |
Новоегорьевское | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Новокузнецк | 5 (0.3%) | 0 (0%) | 1 (0.2%) |
Новомосковск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Новоперуново | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Новороссийск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Новосибирск | 43 (2.3%) | 1 (0.8%) | 20 (3.8%) |
Новоуткинск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Норильск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Омск | 3 (0.2%) | 0 (0%) | 4 (0.8%) |
Орлеан | 0 (0%) | 0 (0%) | 1 (0.2%) |
Отрадное | 0 (0%) | 0 (0%) | 1 (0.2%) |
Павловск | 4 (0.2%) | 1 (0.8%) | 1 (0.2%) |
Павловский Посад | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Павлодар | 10 (0.5%) | 1 (0.8%) | 0 (0%) |
Партизанск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Пенза | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Пермь | 4 (0.2%) | 0 (0%) | 1 (0.2%) |
Петрозаводск | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Петропавловское | 0 (0%) | 0 (0%) | 1 (0.2%) |
Победим | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Подольск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Подсосново | 0 (0%) | 0 (0%) | 1 (0.2%) |
Покровка | 0 (0%) | 1 (0.8%) | 0 (0%) |
Полковниково | 0 (0%) | 0 (0%) | 1 (0.2%) |
Полысаево | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Порожнее | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Поспелиха | 2 (0.1%) | 0 (0%) | 0 (0%) |
Поспелихинский | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Прокопьевск | 4 (0.2%) | 0 (0%) | 0 (0%) |
Простоквашино | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Прутской | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Пушкино | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Развилка | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Рассыпное | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Ребриха | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Рига | 2 (0.1%) | 0 (0%) | 0 (0%) |
Риддер | 7 (0.4%) | 0 (0%) | 2 (0.4%) |
Родино | 2 (0.1%) | 0 (0%) | 0 (0%) |
Романово | 0 (0%) | 0 (0%) | 1 (0.2%) |
Ростов-на-Дону | 0 (0%) | 0 (0%) | 1 (0.2%) |
Рубцовск | 22 (1.2%) | 2 (1.5%) | 2 (0.4%) |
Рязань | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Самара | 2 (0.1%) | 0 (0%) | 2 (0.4%) |
Санкт-Петербург | 19 (1.0%) | 2 (1.5%) | 16 (3.1%) |
Севастополь | 2 (0.1%) | 0 (0%) | 0 (0%) |
Северск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Семей | 15 (0.8%) | 0 (0%) | 0 (0%) |
Сибирский | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Симферополь | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Славгород | 8 (0.4%) | 1 (0.8%) | 3 (0.6%) |
Смоленск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Советское | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Сочи | 1 (<0.1%) | 0 (0%) | 2 (0.4%) |
Ставрополь | 0 (0%) | 0 (0%) | 1 (0.2%) |
Староалейское | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Старобелокуриха | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Степное Озеро | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Сузун | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Сулея | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Сургут | 4 (0.2%) | 0 (0%) | 1 (0.2%) |
Сухая Чемровка | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Талгар | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Тальменка | 4 (0.2%) | 1 (0.8%) | 0 (0%) |
Ташкент | 2 (0.1%) | 0 (0%) | 0 (0%) |
Тбилиси | 2 (0.1%) | 0 (0%) | 0 (0%) |
Тверь | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Темиртау | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Тобольск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Томск | 9 (0.5%) | 0 (0%) | 3 (0.6%) |
Топольное | 0 (0%) | 0 (0%) | 1 (0.2%) |
Топчиха | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Троицк | 2 (0.1%) | 0 (0%) | 0 (0%) |
Троицкое | 3 (0.2%) | 1 (0.8%) | 1 (0.2%) |
Турочак | 0 (0%) | 0 (0%) | 1 (0.2%) |
Тюмень | 3 (0.2%) | 0 (0%) | 1 (0.2%) |
Тяжинский | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Улан-Удэ | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Ульяновск | 0 (0%) | 0 (0%) | 1 (0.2%) |
Усть-Илимск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Усть-Каменогорск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Усть-Кокса | 0 (0%) | 0 (0%) | 1 (0.2%) |
Усть-Мосиха | 0 (0%) | 0 (0%) | 1 (0.2%) |
Усть-Таловка | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Усть-Чарышская Пристань | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Уфа | 2 (0.1%) | 1 (0.8%) | 0 (0%) |
Ухта | 0 (0%) | 0 (0%) | 1 (0.2%) |
Уштобе | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Хабаровск | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Ханты-Мансийск | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Харьков | 0 (0%) | 1 (0.8%) | 0 (0%) |
Хреново | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Худжанд | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Чарышское | 0 (0%) | 0 (0%) | 1 (0.2%) |
Чебоксары | 0 (0%) | 0 (0%) | 1 (0.2%) |
Челябинск | 1 (<0.1%) | 1 (0.8%) | 1 (0.2%) |
Черепаново | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Черногорск | 2 (0.1%) | 0 (0%) | 0 (0%) |
Чистоозерка | 0 (0%) | 0 (0%) | 1 (0.2%) |
Чоя | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Шахты | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Шебалино | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Шемонаиха | 3 (0.2%) | 0 (0%) | 0 (0%) |
Шипуново | 0 (0%) | 0 (0%) | 3 (0.6%) |
Шушенское | 1 (<0.1%) | 0 (0%) | 1 (0.2%) |
Южно-Сахалинск | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Яконур | 1 (<0.1%) | 0 (0%) | 0 (0%) |
Яровое | 7 (0.4%) | 1 (0.8%) | 0 (0%) |
Ярославцев Лог | 0 (0%) | 0 (0%) | 1 (0.2%) |
1 Median (IQR); n (%) |
Таблица получилась красивая, но слишком длинная. В завершении давайте «свернем» страны и города, оставив в качестве основной категории для страны - Россию, а для населенного пункта - Барнаул. Если у Вас группы по разным регионам (по Алтайскому краю, Республике Алтай), то лучше делать отдельный анализ по каждому региону.
library(forcats)
<-info %>%
infomutate(
=fct_collapse(info$Страна,
Страна="Россия",
Россияother_level = "Другие"
),=fct_collapse(Город,
Город="Барнаул",
Барнаулother_level = "Другие"
))
Сделаем окончательную таблицу:
<-info %>%
table2tbl_summary(missing="no", by=group) %>%
modify_header(#функция, позволяющая изменить заголовок
update = list(
~ "Характеристика" # Заменим слово Characteristic
label
)
) table2
Характеристика | ИГН, N = 3,3771 | Кафедра, N = 2061 | РНД, N = 6771 |
---|---|---|---|
Возраст | 21 (19, 24) | 24 (20, 31) | 37 (27, 48) |
Пол | |||
Женский | 2,584 (77%) | 174 (84%) | 518 (77%) |
Мужской | 792 (23%) | 32 (16%) | 159 (23%) |
Занятость | |||
Высшее образование | 1,579 (69%) | 103 (66%) | 215 (54%) |
Работа | 650 (28%) | 50 (32%) | 178 (44%) |
Среднее образование | 63 (2.7%) | 2 (1.3%) | 8 (2.0%) |
Страна | |||
Россия | 2,185 (94%) | 153 (95%) | 526 (94%) |
Другие | 148 (6.3%) | 8 (5.0%) | 31 (5.6%) |
Город | |||
Барнаул | 1,359 (72%) | 89 (67%) | 314 (60%) |
Другие | 538 (28%) | 43 (33%) | 208 (40%) |
1 Median (IQR); n (%) |
Самостоятельная работа
- Сделать сводную таблицу по своим группам
- Описать полученные результаты
- Кроме данных из таблицы добавить в описание другую интересную информацию, там, где данных достаточно (для этого создать отдельные таблички самостоятельно)