*Рассчитано по: Расходчиков А. Н. Информационно-коммуникационное взаимодействие власти и общества: в поиске эффективных технологий //Мониторинг общественного мнения: Экономические и социальные перемены. - 2017. - №. 2 (138).
Результаты кодирования сетевых онлайн групп показывают, что наибольшим потенциалом субъектности, помимо групп органов власти и МСУ, обладают обще районные сетевые СМИ, группы общественных объединений и активистов, а также группы политических партий и движений (100% групп в 2/4 индикаторов).
Данные сообщества чаще других публикуют информацию о происходящем в районе, новых постановлениях, инфраструктурных изменениях и проектах. Кроме того, здесь происходят обсуждения действий власти, а также организуются совместные акции/размещается информация об их проведении.
В практическом плане полученные результаты позволяют очертить круг сетевых онлайн-ресурсов, при помощи которых можно привлечь к обсуждению значительное число жителей района. Особенно, если это обсуждение будет организовано посредством привычных для пользователей социальных онлайн-сетей методов и технологий. Также, непосредственно этим же путем, можно привлечь внимание к официальным сообществам органов власти.
Наличие активных заинтересованных групп в сети «Вконтакте» открывает возможности для администрации района, и для более крупных органов власти в перспективе, в более информативной обратной связи на свои планы и проекты, решения и действия, а также наличие данных групп позволяет проводить обсуждение тех или иных инициатив, выстраивать более четкое взаимодействие с населением.
Как показывают результаты исследования, данная возможность не используется, что негативно сказывается на качестве принимаемых решений и на отношении жителей к их реализации.
Использованные методики поиска, типологизации и определения потенциала субъектности виртуальных объединений граждан в социальных онлайн-сетях позволяют выстраивать более адресное взаимодействие с населением с учетом интересов, связанности и активности различных социальных общностей.
Конечно, участники групп в социальных сетях не могут считаться полноценными представителями всего района и мнение активных пользователей Интернета может расходиться с позицией большинства жителей. Кроме того, стоит учитывать, что более возрастная группа населения почти не использует данный метод коммуникации.
Но, для более успешного взаимодействия в интернет среде, администрациям районов следует использовать данные заинтересованные группы, так как мнение их участников может помочь работе района в целом. Соответственно, своевременное выявление и организация диалога с участниками виртуальных групп в социальных сетях-- важная задача органов управления при реализации социально-значимых проектов.
2.4 Контент-анализ публикаций официальной страницы Администрации Василеостровского района на языке программирования Python
Проанализировав официальную страницу администрации Василеостровского района в социальной сети «Вконтакте» мы выявили проблему низкой вовлеченности подписчиков в выпускаемый контент. Лишь около 3% населения района подписаны на официальную страницу администрации.
Для того, чтобы повысить лояльность подписчиков к контенту, существует много SMM-инструменты, однако, они неоднозначны и их нужно проверять, так как в каждом кейсе они работают по-разному. В случае официальной страницы района все должно быть работать гарантированно и с успехом. Поэтому прибегнем к созданию модели на основании всех выпущенных публикациях официальной страницей. Данная модель в результате спрогнозирует важность компонентов поста, которые можно будет использовать для создания «идеального» поста, который будет иметь отличную статистику.
Для того, чтобы создать данную модель, необходимо выгрузить все публикации, сделанные официальной страницей Василеостровского района, то есть провести парсинг публикаций группы vk.com/vo_news. Далее, загружаем данные.
Мы выгрузили данные и получили 8139 наблюдений. Теперь необходимо обработать полученные данные. В тексте постов мы удалим эмодзи и сделаем каждый пост, как отдельное наблюдение. Для каждого поста будут вытащены количество символов, просмотров, лайков, комментариев, репостов, наличие каких-либо прикреплённых фото, аудио, видео, ссылок или опросов, час публикации и день публикации.
Далее, необходимо взять названия постов, для этого начала берем все слова для переноса, а затем, первые 80 символов. После, импортируем длину текста, дату в формате «ДД.ММ.ГГГГ» и час. Итоговый список типов вложений выглядит следующим образом: «фото», «видео», «аудио», «ссылка», «опрос». Создаем цикл для подсчета всех типов и количества вложений. Суммируем все активности, затем, создаем список и добавляем в него название, длину, количество фото, количество аудио, количество видео в постах, количество постов с опросами, просмотры, комментарии, лайки, репосты, сумму всех взаимодействий, дату и час. После этого создаем dataframe (таблицу) и задаем ей заголовки.
Посмотрим на получившийся датасет, в нем содержится вся полученная информация о постах на официальной странице администрации Василеостровского района.
Выше представлены лишь 5 последних публикаций из всех. Пустое название под номером 4 получилось таким, так как эта публикация являлась репостом и не содержала в себе текста от автора.
Перейдем к описательной статистике:
Переменная hour тут является объектом, однако в реальности она числовая, поэтому нам необходимо поменять ее тип.
Пропущенных значений не наблюдается. Далее, нужно исследовать полученные данные кроме текста, который добавится позже.
Размер датасета (строки, столбцы): (8157, 14)
Дескриптивная статистика числовых переменных
Таблица разбита на две части, так как имеет слишком широкий формат.
Мы можем рассматривать переменную total_action, как целевую переменную, которую и захотим предсказать, чтобы посмотреть влияние текста поста, его размера, прикреплённых материалов и времени публикации на количество лайков+репостов. Для этого попробуем посмотреть на корреляцию между переменными, чтобы точнее выбрать целевую переменную.
С некоторыми переменными сильнее корреляция у лайков, с некоторыми - у репостов, но, в общем, переменная всех действий показывает неплохие результаты во всех случаях. Однако, наилучшие результаты выдаёт переменная просмотров (views). При этом, прогнозировать просмотры на основании параметров поста довольно не логично, ведь действие пользователя заключается именно в выставлении лайка или репоста, тогда мы понимаем, что пользователь среагировал на публикацию на официальной странице. Поэтому будем использовать total_action, как целевую переменную и удалим переменные лайков, репостов, комментариев и просмотров, так как они не могут быть использованы для предсказания суммарных действий пользователей. Также, построим матрицу всех числовых взаимосвязей. (см. Рисунок 31)
Рисунок 31 - Матрица взаимосвязей числовых переменных
Источник: Составлено автором в Python
Попробуем создать новые переменные, например, количество слов в посте, день недели создания поста, дамми-переменную выходного дня, а также попробуем добавить переменную hour в квадрате, так как похоже, что зависимость часа публикации и количества просмотров близка к квадратичной, чем к линейной. Такая же зависимость и в количестве символов с количеством просмотров. Однако добавим только квадрат количества символов. Затем, снова построим матрицу числовых взаимосвязей. (см. Рисунок 32)
Рисунок 32 - Матрица взаимосвязей числовых переменных
Источник: Составлено автором в Python
Далее, построим боксплот, на котором посмотрим количество выбросов. (см. Рисунок 33)
Рисунок 33 - Диаграмма размаха
Источник: Составлено автором в Python
Теперь удалим выбросы по целевой переменной, которых здесь довольно много, судя по боксплоту. Эти выбросы являются публикациями, которые набрали лайков и репостов в несколько раз больше, чем другие. Это объясняется тем, что администрация некоторые публикации закрепляла на стене на долгое время, соответственно такие публикации всегда находились на первом месте и имели внушительную статистику по всем показателям. Также, выбросами могут быть разовые публикации, которые направлены на затрагивание эмоций подписчиков, например, поздравление с Новым годом или Днем матери. Такие публикации всегда набирают большое количество лайков и репостов на абсолютно любой странице вне зависимости от тематики сообщества. Если не удалить эти публикации, модель будет на них реагировать, соответственно завышать свой прогноз. Количество действий сделаем максимум 20. (см. Рисунок 34)
Рисунок 34 - Диаграмма размаха
Источник: Составлено автором в Python
Теперь, необходимо обработать текстовые переменные. Для обработки текстовых переменных мы удалим все символы (пунктуацию и тому подобное) и оставим только слова. При этом также применим лемматизацию, то есть приведение слов к начальной форме. Конечно, возможны пара ошибок ввиду того, что лемматизация не учитывает контекст и некоторые исключения могут встречаться, однако на общие выводы анализа это, как правило, не влияет.
Теперь снова посмотрим на изменённый датасет с новой текстовой переменной. Тексты стали более сложными для понимания человека, но это облегчит работу модели. Теперь текстовые переменные будут выглядеть следующим образом:
Теперь необходимо создать переменную количества слов в посте:
Теперь необходимо обработать числовые переменные. Для обработки числовых переменных отшкалируем числовые переменные (len_text и её квадрат, hour, photo, audio, video, link, poll, words), так, чтобы все они были, можно сказать, по одной шкале. Для этого используем стандартную процедуру: вычтем у каждой переменной среднее и разделим на стандартное отклонение.
После конвертации данных, переменные будут выглядеть следующим образом:
Далее, необходимо изменить текстовые переменные на числовые. Нам, в целом, не так важны сами тексты, как важны наборы из слов, которые в этих текстах присутствуют. Для этого используем кодировку частоты встречаемости слов, то есть по строкам документы (посты), по столбцам слова, в ячейках - сколько раз слово было в посте.
Получилось слишком большое количество параметров (30579), это количество различных слов в постах. Для того, чтобы модель адекватно работала, количество параметров должно быть значительно меньше, чем количество наблюдений. Чтобы это осуществить с минимальной потерей информации, воспользуемся методом главных компонент, для понижения размерности, то есть спроектируем выборку на новую гиперплоскость в исходном пространстве.
Подберём количество параметров в новой размерности, согласно сохранённой дисперсии данных (чем больше дисперсия, тем больше информации из исходных данных сохраняется).
Все это выведем на графике. (см. Рисунок 35)
Рисунок 35 - График количества параметров
Источник: Составлено автором в Python
Оптимальным количеством параметров оказалось 200. Однако, конечно, еще больше переменных сохранили бы больше дисперсий данных, но при этом большее количество переменных может сильно сказаться на качестве предсказания. В связи с этим оптимальным количеством будем считать 200. Если качество будет неудовлетворительным, то можно будет снизить еще.
Теперь наш датафрейм будет выглядеть так:
Теперь добавим наши данные в первоначальный датасет и удалим переменную с текстом постов, а также посты с выбросным количеством действий, которые нам не понадобятся.
Датасет:
Теперь отделим целевую переменную и оставшийся датасет на Y и X. Предполагаем, что это регрессия и будем решать данную задачу. За метрику возьмем RMSE (где, +inf - неудовлетворительно, 0 - отлично). Интепретируется как среднее отклонение прогноза.
Разделим нашу выборку на обучающую и тестовую. На обучающей выборке будем обучать нашу модель, а на тестовой будем предсказывать. Внутри деления перемешаем данные.
Теперь необходимо обучить модель. Так как мы имеем дело не только с числовыми, но и категориальными признаками, для того, чтобы избежать искажения при переводе признаков в числовые и лучшей работы модели будем обучать модель при помощи градиентного бустинга catboost.
RMSE - 4.22, неплохой результат для такого небольшого количества данных, особенно для сообщества в этой сфере.
Теперь посмотрим на влиятельность переменных, по убыванию:
Feature Id Importances
0 photo 6.426415
1 hour 5.467498
2 len_text_sq 3.377249
3 12 3.063443
4 video 2.846449
5 len_text 2.375284
6 weekday 1.761286
7 77 1.558596
8 158 1.530390
9 39 1.408600
10 138 1.273325
11 words 1.238658
12 holiday 1.078074
13 135 0.962312
14 10 0.958693
15 18 0.953937
16 50 0.893027
17 118 0.877049
18 13 0.874121
19 52 0.853780
20 30 0.711901
21 192 0.710585
22 139 0.709669
23 43 0.699636
24 14 0.697229
25 148 0.684591
26 58 0.675317
27 45 0.649746
28 79 0.647454
29 169 0.643333
181 25 0.170045
182 160 0.166209
183 24 0.165004
184 84 0.162987
185 157 0.162339
186 37 0.151497
187 133 0.150670
188 199 0.149021
189 81 0.138762
190 178 0.134652
191 151 0.134436
192 78 0.133886
193 97 0.128222
194 152 0.124540
195 134 0.121603
196 179 0.116273
197 181 0.114397
198 35 0.108394
199 184 0.105491
200 128 0.105429
201 100 0.104772
202 114 0.096684
203 88 0.091167
204 189 0.090061
205 7 0.083349
206 audio 0.069281
207 93 0.062101
208 4 0.060740
209 95 0.054888
210 poll 0.002467
Мы видим, что единственным незначимым параметром является количество опросов в посте. Удалим этот параметр и снова запустим модель.
Посмотрим на результаты:
Feature Id Importances
0 photo 5.429041
1 hour 4.350013
2 len_text_sq 2.973052
3 12 2.555829
4 len_text 2.359345
5 video 2.333168
6 weekday 1.871099
7 39 1.432875
8 158 1.396935
9 77 1.343561
10 words 1.234146
11 135 1.022966
12 138 0.992112
13 10 0.987116
14 50 0.899494
15 45 0.884462
16 99 0.881010
17 23 0.835443
18 13 0.829878
19 holiday 0.827091
20 118 0.823652
21 192 0.808225
22 58 0.797851
23 18 0.776743
24 52 0.765239
25 79 0.734433
26 43 0.732437
27 30 0.724523
28 139 0.718813
29 119 0.703617
180 26 0.164510
181 136 0.164070
182 124 0.163555