install.packages("vkR")# эта строчка нужна только тем, кто еще не установил пакет vkR
library(vkR)
#получить ключ
vkOAuth(11111111)# в скобках - id приложения в ВК, которое создавали на предыдущих занятиях, откроется браузер, скопировать ключ до знака &
#установить ключ
setAccessToken(access_token="vk1.a....ТУТ ВАШ КЛЮЧ")
# установить версию API
<-setAPIVersion("5.89")
v#Выгрузить информацию об ID пользователей группы (пример по группе кафедры)
<-getGroupsMembersExecute(group_id = 211524072) # это пример по кафедре у Вас свои группы
group_kaf#выгрузить информацию о пользователях
<-getUsersExecute(group_kaf, fields='sex, bdate, interests, city, home_town, education, occupation, relation, personal') kaf_info
Диагностика сетевых технологий. Социологический анализ молодежных сообществ
Краткое содержание предыдущих серий
Для тех, кто выходил - на прошлых занятиях мы учились делать выгрузку по молодежным сообществам через API VK
Анализ данных отдельно по группам
Следующий этап нашего анализа - представление результатов о пользователях по каждой группе отдельно. У Вас пять групп, значит будет подробный рассказ о каждой группе, по тем переменным, которые Вы указали при выгрузке:
- социально-демографические характеристики участников (пол, возраст, семейное положение, город проживания, родной город)
- социальный статус (учатся или работают, где учились, какой университет заканчивали, где работают)
- мировоззренческие позиции (интересы, политические и религиозные убеждения, ценности, что ценят в людях - по тем данным, что есть)
По каждой группе всю информацию свести в таблицу. Как ее сделать?
Простейший способ посмотреть информацию по отдельной переменной - функция table()
.
Например, давайте посмотрим, сколько участников группы имеют закрытый профиль:
table(kaf_info$is_closed)
FALSE TRUE
162 45
То же самое, но в процентах:
#В процентах
prop.table(table(kaf_info$is_closed))*100
FALSE TRUE
78.26087 21.73913
Однако, анализировать информацию по каждой переменной не очень удобно. Нам хотелось бы провести анализ сразу и сделать одну таблицу по всем переменным. К сожалению, так сделать не получится, хотя бы потому, что некоторые переменные, например, интересы - это поле со свободными ответами и делать по ним таблицу не очень целесообразно, нужно описывать в целом, проводя качественный анализ “вручную”.
Что касается остальных переменых, то прежде, чем сделать по ним таблицу, мы должны осуществить предобработку данных:
- вычислить возраст по дате рождения
- перекодировать переменные (там, где указаны числа, нужно заменить на метки)
- некоторые переменные являются вложенными (
city
,occupation
) то есть это не одна, а несколько переменных в одной группе (идентификатор и название города, тип занятий, название организации и др.) - соответственно, нам нужно эти переменные привести к общему табличному виду.
Этим мы и займемся сегодня, и для работы нам понадобится несколько дополнительных пакетов. Для их установки нужно запустить следующий код:
install.packages(c("readr", "lubridate", "dplyr", "tidyr", "gtsummary"))
Эти пакеты имеют следующее предназначение:
- readr - работа с прямоугольными таблицами (импорт из разных источников) и парсинг различных форматов
- lubridate - работа с временными данными
- dplyr - всевозможные трансформации данных, такие как отбор переменных, фильтрация наблюдений, перекодировка, группировка, вычисление новых переменных и пр.
- tidyr - помощь в трансформации данных в “чистый формат”, когда в каждой строке содержится одно наблюдение и в каждом столбце - только одна переменная
- gtsummary - создание красивых таблиц для научных исследований.
#Вычисление возраста
Начнем с вычисления возраста. Разобьем наш код на несколько этапов. Прежде всего, подключим нужные библиотеки:
library(lubridate)
library(readr)
Перекодируем переменную bdate
в формат даты (неизбежно, часть данных, где дата рождения была введена не полностью, потеряется), а затем вычислим дату рождения путем вычитания из сегодняшней даты даты рождения пользователя группы:
# 1. Конвертируем переменную bdate в дату
$bdate2<-readr::parse_datetime(kaf_info$bdate, "%d%.%m%.%Y") kaf_info
Warning: 92 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(), kaf_info$bdate2), "years") kaf_info
Посмотрим, что у нас получилось:
summary(kaf_info$age)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
17.75 20.13 23.66 27.22 30.07 66.02 121
Как видим, у нас довольно большой размах по возрасту - от 17 (почти 18) до 66 лет, средний возраст (mean
) - составил 27,2 года, медианный (median
)- 23,6 года. Велико и количество пропущенных значений - 121 случай из 207.
Анализ пропущенных значений
Мы видим, что в нашей таблице много пропусков. Давайте посмотрим, сколько у нас пропущенных значений по каждому столбцу:
#Посмотрим количество пропущенных значений по каждому столбцу
colMeans(is.na(kaf_info))*100
id bdate id title
0.00000 14.00966 36.23188 36.23188
interests id name type
43.96135 29.46860 24.63768 24.63768
country_id city_id graduate_year university
48.79227 48.79227 80.19324 43.96135
university_name faculty faculty_name graduation
43.96135 43.96135 43.96135 43.96135
education_form education_status home_town relation
77.77778 77.77778 43.96135 43.96135
id first_name last_name alcohol
91.30435 91.30435 91.30435 57.00483
inspired_by langs langs_full life_main
57.00483 0.00000 0.00000 57.00483
people_main religion religion_id smoking
57.00483 95.65217 95.65217 57.00483
political sex first_name last_name
92.27053 0.00000 0.00000 0.00000
can_access_closed is_closed deactivated bdate2
0.00000 0.00000 96.61836 58.45411
age
58.45411
Из смысловых переменных больше всего пропушенных - в отношении религии (95%) и политических взглядов (92,3%).
Очевидно, что вся таблица нам для анализа не понадобится - либо данных совсем мало, либо нам эти показатели не интересны.
Отбор переменных для анализа
Давайте отберем в отдельный набор переменные, которые мы будем реально анализировать (кроме интересов - их нужно анализировать отдельно).
library(dplyr)
#отберем в набор наиболее интересные показатели
<-kaf_info %>%
tableselect(age, sex, relation, city, occupation, university, faculty_name, personal)
Сделаем перекодировку переменных
Наиболее быстрый способ трансформировать данные (вычислить новые переменные, перекодировать и пр.) - воспользоваться возможностями пакета dplyr
из библиотеки tidyverse
.
Как понять, как перекодировать, и что означает код? Посмотреть документацию - (справочник по API ВК)[https://dev.vk.com/ru/reference/objects/user].
Сделаем перекодировку по полу:
<-table %>%
tablemutate(sex=case_when(
==1~"Женский",
sex==2~"Мужской"
sex ))
Перекодируем семейные отношения
<-table %>%
tablemutate(relation=case_when(
==1~"не женат/не замужем",
relation==2~"есть друг/есть подруга",
relation==3 ~ "помолвлен/помолвлена",
relation==4 ~ "женат/замужем",
relation==5 ~ "всё сложно",
relation==6 ~ "в активном поиске",
relation==7 ~ "влюблён/влюблена",
relation==8 ~ "в гражданском браке",
relation==0 ~ "не указано"
relation ))
Поскольку у нас в таблице есть вложенные переменные (например, по городу и по занятости), нам нужно их превратить в обычные переменные).
Сделать это можно с помощью функции unnest()
из пакета tidyr
:
library(tidyr)
<-table %>%
tableunnest(cols = c(city, occupation, personal),names_sep = "_" ) %>%
select(-contains(c("id", "langs", "inspired"))) #удалим кое-какие ненужные переменные
Теперь мы можем перекодировать другие переменные:
political — политические предпочтения. Возможные значения:
- 1 — коммунистические;
- 2 — социалистические;
- 3 — умеренные;
- 4 — либеральные;
- 5 — консервативные;
- 6 — монархические;
- 7 — ультраконсервативные;
- 8 — индифферентные;
- 9 — либертарианские.
people_main — главное в людях. Возможные значения:
- 1 — ум и креативность;
- 2 — доброта и честность;
- 3 — красота и здоровье;
- 4 — власть и богатство;
- 5 — смелость и упорство;
- 6 — юмор и жизнелюбие.
life_main — главное в жизни. Возможные значения:
- 1 — семья и дети;
- 2 — карьера и деньги;
- 3 — развлечения и отдых;
- 4 — наука и исследования;
- 5 — совершенствование мира;
- 6 — саморазвитие;
- 7 — красота и искусство;
- 8 — слава и влияние;
smoking — отношение к курению. Возможные значения: • 1 — резко негативное; • 2 — негативное; • 3 — компромиссное; • 4 — нейтральное; • 5 — положительное.
alcohol — отношение к алкоголю. Возможные значения:
- 1 — резко негативное;
- 2 — негативное;
- 3 — компромиссное;
- 4 — нейтральное;
- 5 — положительное.
Давайте это все перекодируем:
<-table %>%
tablemutate(alcohol=case_when(
==1~"резко негативное",
personal_alcohol==2~"негативное",
personal_alcohol==3 ~ "компромиссное",
personal_alcohol==4 ~ "нейтральное",
personal_alcohol==5 ~ "положительное"
personal_alcohol
),smoking=case_when(
==1~"резко негативное",
personal_smoking==2~"негативное",
personal_smoking==3 ~ "компромиссное",
personal_smoking==4 ~ "нейтральное",
personal_smoking==5 ~ "положительное"
personal_smoking
),political=case_when(
==1~"коммунистические",
personal_political==2~"социалистические",
personal_political==3 ~ "умеренные",
personal_political==4 ~ "либеральные",
personal_political==5 ~ "консервативные",
personal_political==6 ~"монархические",
personal_political==7 ~ "ультраконсервативные",
personal_political==8 ~ "индифферентные",
personal_political==9 ~ "либертарианские"
personal_political
),people_main=case_when(
==1~"ум и креативность",
personal_people_main==2~"доброта и честность",
personal_people_main==3 ~ "красота и здоровье",
personal_people_main==4 ~ "власть и богатство",
personal_people_main==5 ~ "смелость и упорство",
personal_people_main==6 ~"юмор и жизнелюбие"
personal_people_main
),life_main=case_when(
==1~"семья и дети",
personal_life_main==2~"карьера и деньги",
personal_life_main==3 ~ "красота и здоровье",
personal_life_main==4 ~ "наука и исследования",
personal_life_main==5 ~ "совершенствование мира",
personal_life_main==6 ~"саморазвитие",
personal_life_main==7 ~ "красота и искусство",
personal_life_main==8 ~"слава и влияние"
personal_life_main ) )
Создаем таблицу по группе
Чтобы сделать большую красивую таблицу, воспользуемся пакетом: gtsummary
:
library(gtsummary)
<-table %>%
table_alltbl_summary(missing="ifany")
table_all
Далее можно сохранить таблицу в Excel:
library(xlsx)
write.xlsx(table_all, "table_all.xlsx")