Диагностика сетевых технологий. Социологический анализ молодежных сообществ

Author

Омельченко Д.А.

Краткое содержание предыдущих серий

Для тех, кто выходил - на прошлых занятиях мы учились делать выгрузку по молодежным сообществам через API VK

install.packages("vkR")# эта строчка нужна только тем, кто еще не установил пакет vkR
library(vkR)
#получить ключ
vkOAuth(11111111)# в скобках - id приложения в ВК, которое создавали на предыдущих занятиях, откроется браузер, скопировать ключ до знака &
#установить ключ
setAccessToken(access_token="vk1.a....ТУТ ВАШ КЛЮЧ")
# установить версию API
v<-setAPIVersion("5.89")
#Выгрузить информацию об ID пользователей группы (пример по группе кафедры)
group_kaf<-getGroupsMembersExecute(group_id = 211524072) # это пример по кафедре у Вас свои группы
#выгрузить информацию о пользователях
kaf_info<-getUsersExecute(group_kaf, fields='sex, bdate, interests, city, home_town, education, occupation, relation, personal')

Анализ данных отдельно по группам

Следующий этап нашего анализа - представление результатов о пользователях по каждой группе отдельно. У Вас пять групп, значит будет подробный рассказ о каждой группе, по тем переменным, которые Вы указали при выгрузке:

  • социально-демографические характеристики участников (пол, возраст, семейное положение, город проживания, родной город)
  • социальный статус (учатся или работают, где учились, какой университет заканчивали, где работают)
  • мировоззренческие позиции (интересы, политические и религиозные убеждения, ценности, что ценят в людях - по тем данным, что есть)

По каждой группе всю информацию свести в таблицу. Как ее сделать?

Простейший способ посмотреть информацию по отдельной переменной - функция 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 в дату
kaf_info$bdate2<-readr::parse_datetime(kaf_info$bdate, "%d%.%m%.%Y")
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().
kaf_info$age<-time_length(difftime(today(), kaf_info$bdate2), "years")

Посмотрим, что у нас получилось:

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)
#отберем в набор наиболее интересные показатели
table<-kaf_info %>%
  select(age, sex, relation, city, occupation, university, faculty_name, personal)

Сделаем перекодировку переменных

Наиболее быстрый способ трансформировать данные (вычислить новые переменные, перекодировать и пр.) - воспользоваться возможностями пакета dplyr из библиотеки tidyverse.

Как понять, как перекодировать, и что означает код? Посмотреть документацию - (справочник по API ВК)[https://dev.vk.com/ru/reference/objects/user].

Сделаем перекодировку по полу:

table<-table %>%
  mutate(sex=case_when(
   sex==1~"Женский",
   sex==2~"Мужской"
  ))

Перекодируем семейные отношения

table<-table %>%
  mutate(relation=case_when(
    relation==1~"не женат/не замужем",
    relation==2~"есть друг/есть подруга",
    relation==3 ~ "помолвлен/помолвлена",
    relation==4 ~ "женат/замужем",
    relation==5 ~ "всё сложно",
    relation==6 ~ "в активном поиске",
    relation==7 ~ "влюблён/влюблена",
    relation==8 ~ "в гражданском браке",
    relation==0 ~ "не указано"
  ))

Поскольку у нас в таблице есть вложенные переменные (например, по городу и по занятости), нам нужно их превратить в обычные переменные).

Сделать это можно с помощью функции unnest() из пакета tidyr:

library(tidyr)
table<-table %>%
  unnest(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<-table %>%
  mutate(alcohol=case_when(
    personal_alcohol==1~"резко негативное",
    personal_alcohol==2~"негативное",
    personal_alcohol==3 ~ "компромиссное",
    personal_alcohol==4 ~ "нейтральное",
    personal_alcohol==5 ~ "положительное"
  ),
  smoking=case_when(
    personal_smoking==1~"резко негативное",
    personal_smoking==2~"негативное",
    personal_smoking==3 ~ "компромиссное",
    personal_smoking==4 ~ "нейтральное",
    personal_smoking==5 ~ "положительное"
  ),
  political=case_when(
    personal_political==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 ~ "либертарианские"
  ),
  people_main=case_when(
    personal_people_main==1~"ум и креативность",
    personal_people_main==2~"доброта и честность",
    personal_people_main==3 ~ "красота и здоровье",
    personal_people_main==4 ~ "власть и богатство",
    personal_people_main==5 ~ "смелость и упорство",
    personal_people_main==6 ~"юмор и жизнелюбие"
  ),
life_main=case_when(
    personal_life_main==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 ~"слава и влияние"
  ) )

Создаем таблицу по группе

Чтобы сделать большую красивую таблицу, воспользуемся пакетом: gtsummary:

library(gtsummary)
table_all<-table %>%
  tbl_summary(missing="ifany")
table_all

Далее можно сохранить таблицу в Excel:

library(xlsx)
write.xlsx(table_all, "table_all.xlsx")