Практическое руководство

Как создать представление данных в социальной сети для чатов 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 - отметка времени, когда чаты доставляются пользователями в группе Whatsapp
  • groupName - название группы
  • 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). Институт социальных исследований Массачусетского университета в Амхерсте.