Практическое руководство
Как создать представление данных в социальной сети для чатов WhatsApp
Как создать и представить данные для анализа социальных сетей с помощью Python
В этом уроке мы поговорим об анализе взаимодействия пользователей внутри группы Whatsapp. Насколько активны участники группы WhatsApp? Или насколько они пассивны? Кто главный участник группы? Есть ли группировка?
Анализ социальных сетей
Анализ социальных сетей - SNA - это описательная аналитика, которая пытается изучать и собирать информацию о взаимодействиях между людьми в определенной группе (это могут быть социальные сети и т. Д.). СНС также становится мощным инструментом для распознавания и выявления изменений в структуре групп.
СНС широко используется и разрабатывается в социальных сетях для поиска закономерностей или аномалий, возникающих в соответствии с конкретной обсуждаемой темой. Например, в Индонезии Drone Emprit », разработанный Исмаил Фахми , становится популярным и мощным инструментом для анализа феномена, происходящего на социальные сети - политика, экономика, социальные сети и т. д.
Drone emprit помогает людям понять закономерности определенных групп в распространении информации (обычно ложной), чтобы сформировать общественное мнение.
Прежде чем говорить более подробно о том, как построить сеть, необходимо понять несколько терминов.
- Актер - широко известный как узел или вершина , лица, состоящие в отношениях с другим человеком
- Связь - известное как край или связь , отношения между двумя людьми или более. Связи делятся на два типа: направленные связи и ненаправленные связи.
- Сеть - известный как график, совокупность субъектов и связей (один тип связей).
- Мультиплексная сеть - сеть с несколькими типами связей.
- Взвешенные связи - сеть, в которой их края взвешены в зависимости от того, насколько сильна связь между двумя участниками.
Существует два типа представления данных для социальной сети, а именно sociomatrix и крайний список. У них есть свои преимущества и недостатки для анализа социальных сетей.
- Социоматрица - также известная как матрица смежности, представляет собой симметричную матрицу, используемую для представления направленных или ненаправленных связей, которые их строки и столбцы представляют как исходных, так и целевых субъектов, а значения в ячейках - это связи или взаимодействия. Значения по диагонали равны - потому что они представляют взаимодействие между одним действующим лицом (1-я строка и 2-й столбец равны нулю, что указывает на взаимодействие между действующим лицом A и действующим лицом A).
- Список границ - содержит исходных и целевых участников, которые предоставляют только информацию о существующих связях между участниками. По сравнению с sociomatrix список краев более эффективно хранит информацию. Но когда мы ошибаемся в именовании акторов, он будет генерировать большое количество строк. Например, субъект A имеет другое имя, это может быть
A
,a
,actor A
,actor a
, и т. Д. Названия факторов должны быть стандартизованы.
Узнайте больше об анализе социальных сетей и его приложениях!
Как представить данные социальной сети
Убедитесь, что мы установили все следующие модули, чтобы руководство было правильным и понятным без каких-либо проблем. Установите эти модули с помощью pip install [module name]
в Anaconda Prompt или Jupyter Notebook.
pandas
- используется для манипулирования данными, например для нарезки, агрегирования и т. Д.numpy
- используется для вычисления линейной алгебрыre
- используется для операций с регулярными выражениямиnetworkx
- используется для создания социальной сетиitertools
- используется для создания итераторов для эффективного циклаcollections
- используется для хранения коллекций данныхmatplotlib
- используется для визуализации данных
# Module for data manipulation import pandas as pd # Module for linear algebra import numpy as np # Module for regular expression import re # Module for network analysis import networkx as nx # Module for creating iterators for efficient looping import itertools # Module for storing collections of data import collections # Module for data viz import matplotlib.pyplot as plt
Мы будем использовать фиктивные данные Whatsapp chat, которые обрабатываются Python с помощью оболочки Whatsapp. Все чаты, имена пользователей, номера телефонов и названия групп кодируются с использованием рандомизатора. Данные получены с сентября 2020 года по январь 2021 года, в результате чего система получила 523 чата.
# Import the data df = pd.read_csv('WhatsApp_Chat - Final.csv', sep = ';') print('Dimension data: {} rows and {} columns'.format(len(df), len(df.columns))) df.head()
Данные имеют 10 столбцов. Это минимум полезной информации, которую можно собрать с помощью обертки WhatsApp из групповых чатов.
datetime
- отметка времени, когда чаты доставляются пользователями в группе WhatsappgroupName
- название группыvalidUID
- содержит логин и номер телефона пользователейUID
- номер телефона пользователя с суффиксом[at].us
.noMobile
- номер телефона пользователяuserName
- имена пользователей устанавливаются пользователями в их профиляхcontent
- содержание чата. Он был закодированtypeContent
- тип содержимого в столбце содержимого. Это может бытьchat
,document
,image
,revoked
,sticker
,video
, и Т. Д.fromMe
- есть две возможности:True
означает, что контент доставляется мной, иFalse
, когда контент поступает от другого пользователя в группе.isAdmin
- есть два варианта:True
означает, что пользователь выполняет роль администратора, аFalse
в противном случае
# Check the data type df.info()
Иногда мы встречаем данные, в которых отсутствуют значения. Содержимое может быть пустым или отсутствовать из-за его типа содержимого.
# Check the missing value in the data df.isna().sum()
Есть два чата, данные которых равны нулю, и они происходят из типа содержимого revoked
. 25 сентября 2020 г. г-жа C отозвала кого-то в группе, и так далее с г-ном I. 7 декабря 2020 г.
# Filter the missing value on column of content df[df['content'].isna()]
Только 8 из 10 столбцов классифицируются как категориальные данные, например, datetime
- он не будет использоваться для социальной сети, поэтому мы не будем переклассифицировать тип данных.
# Check the data type and scale measurement df.select_dtypes(include = ['object']).dtypes
Когда мы проверяем столбец noMobile
, не все значения имеют формат номера телефона. Наш номер телефона должен быть в формате You
, а для построения социальной сети он должен быть преобразован в формат номера телефона.
В результате рандомизатора 193360307006
будет нашим номером телефона.
# Replace You with the phone number df['noMobile'].replace('You', '193360307006', inplace = True)
В данных группы WhatsApp есть 22 уникальных телефонных номера или пользователей.
# Show the unique phone number df['noMobile'].unique()
Первым этапом создания социальной сети из необработанных данных чатов WhatsApp является извлечение упомянутого статуса и номера телефона. Чтобы увидеть взаимодействия пользователя в группе, мы можем извлечь пользователей, упомянутых другим пользователем, из содержимого.
Так, например, X и Y взаимодействуют, упоминая друг друга в своих чатах. Создает соединение или линию между X и Y. Итак, нам нужно создать список упомянутых пользователей в столбце mention
. Связь - один-ко-многим, что означает, что один пользователь может упомянуть несколько пользователей в одном чате.
# Function to extract mention from chat def extractMention(x): if isinstance(x, str): return re.findall(r'@(\d+)', x) return x # Extract the phone number by mentions df['mention'] = df['content'].apply(extractMention)
Данные, длина упоминания которых меньше 1, будут удалены. Они не используются, потому что нет взаимодействия между пользователями в чатах - путем упоминания других.
# Filter the data in which it has the mention wihtin content dfMentioned = df[df['mention'].str.len() > 0] dfMentioned.reset_index(drop = True, inplace = True) dfMentioned.head()
Поскольку существует связь «один ко многим», следующим этапом является создание данных, содержащих два столбца - source
и target
.
source
- список пользователей, которые упоминают другого пользователя в своих чатахtarget
- список пользователей, упомянутых другим пользователем в своих чатах
# Save the source and target phone number based on mentions source = [] target = [] for i in range(len(dfMentioned)): listMentioned = dfMentioned.loc[i]['mention'] for j in range(len(listMentioned)): source.append(dfMentioned.loc[i]['noMobile']) target.append(dfMentioned.loc[i]['mention'][j])
Список source
и target
будет иметь одинаковую длину, поскольку он преобразует предыдущие данные - формат один-ко-многим (один скаляр со списком скаляров) становится однозначным форматом (один скаляр с одним скаляром).
# Create a dataframe dfSA = pd.DataFrame( { 'source': source, 'target': target } )
В данных dfCombination
есть дополнительный столбец - count
, это количество взаимодействий между source
и target
. Это dfCombination
будет представлением данных, необходимым для построения социальной сети.
Источник и цель необратимы. Например, источник 123 с целью 456 полностью отличается от источника 456 с целью 123.
# Count the unique possibilities of two columns dfCombination = dfSA.groupby(['source','target']).size().reset_index().rename(columns = {0:'count'}) dfCombination.head()
Другое представление данных - это список смежности. Список смежности представляет собой граф социальных сетей в виде массива связанных списков. Индекс массива представляет вершину, и каждый элемент в его связанном списке представляет другие вершины, которые образуют ребро с вершиной.
# Graph representation to the adjacency list graph = collections.defaultdict(dict) for row in dfCombination.to_numpy(): graph[row[0]][row[1]] = row[2] graph[row[1]][row[0]] = row[2]
Как создать простой граф социальной сети
Модуль networkx
имеет множество методов для преобразования в другие форматы данных и обратно. Модуль networkx
module может обрабатывать несколько форматов данных.
- Словарь
- Список
- Numpy
- Scipy
- Панды
Когда мы создали представление данных в формате pandas
, мы можем легко использовать метод from_pandas_edgelist
, чтобы получить график социальной сети.
# 1. Determine the figure size plt.figure(figsize = (6, 6)) # 2. Create the graph g = nx.from_pandas_edgelist(dfCombination, source = 'source', target = 'target') # 3. Create a layout for our nodes layout = nx.spring_layout(g, iterations = 50) nx.draw(g)
Как создать продвинутый и красивый граф социальной сети
Пример текста
По данным dfCombination
, мы получим список пользователей, которые действуют как source
и target
. Кроме того, только 13 из 22 пользователей относятся к категории source
пользователей.
# Make a list of the source, we'll use it later sources = list(dfCombination['source'].unique()) sources
17 из 22 пользователей действуют как target
пользователей. Это означает, что 5 пользователей в группе WhatsApp пассивны и не взаимодействуют друг с другом. Эти 5 пользователей специально не упоминались в чатах. Это 440161492330 (Mrs. E)
, 438921854219 (Mrs. M)
, 290459901483 (Mr. N)
, 459930495254 (Mr. Q)
и 824966872668 (Mrs U)
.
# Make a list of the target, we'll use it later targets = list(dfCombination['target'].unique()) targets
Сколько соединений у 193360307006 (You)
выходит? Давайте ответим degree
методом!
# Connections 193360307006 (You) has g.degree('193360307006')
У пользователя с номером телефона 193360307006
пять подключений или взаимодействий. Это означает, что этот пользователь взаимодействует напрямую, упоминая 5 других пользователей в группе WhatsApp. Это 666461028713 (Mrs. C)
, 224853537173 (Mrs. B)
, 741193172177 (Mr. I)
, 440333782705 (Mrs. S)
, и 226238332943 (Mrs. L)
.
# Detailed interactions dfCombination[(dfCombination['source'] == '193360307006') | (dfCombination['target'] == '193360307006')]
Есть шесть улучшений для данных, а именно в графике социальной сети. Они добавят в график информацию о характеристиках взаимодействий пользователя. Это следующие.
- Края тонкие и серые
- Люди маленькие и серые
- Размер источника зависит от количества подключений.
- Источник синий
- Ярлыки ТОЛЬКО для источников
- Целевые люди с высокими связями выделены цветом
# 1. Determine the figure size plt.figure(figsize = (12, 12)) # 2. Create the graph g = nx.from_pandas_edgelist(dfCombination, source = 'source', target = 'target') # 3. Create a layout for our nodes layout = nx.spring_layout(g, iterations = 50) # 4. Draw the parts we want # - Edges thin and grey # - People small and grey # - Source sized according to their number of connections # - Source orange # - Labels for sources ONLY # - Target who are highly connected are a highlighted color # Go through every sources name, ask the graph how many # connections it has. Multiply that by 80 to get the circle size source_size = [g.degree(source) * 80 for source in sources] nx.draw_networkx_nodes(g, layout, nodelist = sources, # a list of sizes, based on g.degree node_size = source_size, node_color = 'orange') # Draw EVERYONE nx.draw_networkx_nodes(g, layout, nodelist = targets, node_color = '#cccccc', node_size = 100) # Draw POPULAR target popular_target = [target for target in targets if g.degree(target) > 1] nx.draw_networkx_nodes(g, layout, nodelist = popular_target, node_color = 'red', node_size = 100) nx.draw_networkx_edges(g, layout, width = 1, edge_color = '#cccccc') node_labels = dict(zip(sources, sources)) nx.draw_networkx_labels(g, layout, labels = node_labels) # 5. Turn off the axis because we don't want it plt.axis('off') plt.title('Group ABCDE') # 6. Tell matplotlib to show it plt.show()
Вывод
SNA может фиксировать взаимодействия между людьми внутри группы, например группы Whatsapp. Взаимодействие в этом руководстве просто представлено тегами имени пользователя. На основе созданной СНС мы можем определить коннекторы - они являются наиболее активными пользователями и в реальной жизни могут быть распространителями новостей или влиятельными лицами. Довольно интересно изучать и исследовать СНС, используя данные социальных сетей, таких как Twitter, Facebook и т. Д.
использованная литература
[1] М. Денни. Анализ социальных сетей (2014). Институт социальных исследований Массачусетского университета в Амхерсте.