Простой способ анализа отношений с использованием известных аккаунтов в Твиттере.

Анализ социальных сетей - одна из актуальных тем в науке о данных. Людям нравятся эти анализы и они интересны, потому что все знакомы с этим миром. Большую часть времени мы уходим в Twitter, Instagram, Facebook и некоторые другие приложения для социальных сетей.

Как энтузиаста данных, эта тема не удивительно привлекла мое внимание. Однако получить доступ к официальному Twitter API очень сложно. Поэтому я поискал другое решение и обнаружил twint. Это библиотека Python, которая позволяет удалять данные Twitter без доступа к API.

В этой статье я кратко объясню, как очистить данные Twitter с помощью twint, и проанализирую некоторые отношения, основанные на подписках и упоминаниях среди группы пользователей Twitter.

Инициализация кода Python

Нам нужна библиотека twint для очистки данных, панды для создания фреймов данных и коллекции для получения сгруппированных значений счетчиков в списке.

import twint
import pandas as pd
from collections import Counter

Затем мы начинаем с создания списка пользователей, который состоит из учетных записей Twitter. Наш анализ будет включать отношения этих пользователей. Я не рекомендую добавлять в этот список пользователей с более чем 5K подписок из-за большого времени выполнения кода. Точно так же длинный список может столкнуться с той же проблемой.

Я выбрал нескольких популярных пользователей Твиттера, которых все знают, чтобы сделать наш анализ более интересным.

users = [
    'shakira',
    'KimKardashian',
    'rihanna',
    'jtimberlake',
    'KingJames',
    'neymarjr',
]

После анализа отношений

Давайте начнем с анализа отношений и для этой цели напишем функцию с именем get_followings, которая отправляет запрос в библиотеку twint с именем пользователя. Эта функция вернет список пользователей, за которыми следует наш входящий пользователь.

def get_followings(username):

    c = twint.Config()
    c.Username = username
    c.Pandas = True

    twint.run.Following(c)
    list_of_followings = twint.storage.panda.Follow_df

    return list_of_followings['following'][username]

Используя функцию get_followings, мы получим разные списки подписок для каждого человека в нашем списке пользователей и сохраним результаты в словаре (подписок) и списке (following_list ). following_list - это объединенная версия всех подписок, и мы будем использовать ее для расчета наиболее популярных учетных записей Twitter в следующем разделе.

Цикл for ниже создает эти две переменные. Иногда Twitter не отвечает на наш запрос, и в этом случае мы получаем ошибку индекса. Для таких случаев я добавил исключение в код, чтобы пропустить этих пользователей.

followings = {}
following_list = []
for person in users:
    print('#####\nStarting: ' + person + '\n#####')
    try:
        followings[person] = get_followings(person)
        following_list = following_list + followings[person]
    except KeyError:
        print('IndexError')

На кого больше всего следят наши пользователи?

Получив все следующие списки, мы можем просто вычислить наиболее распространенные значения в переменной following_list, чтобы получить самые популярные учетные записи среди наших пользователей. Чтобы получить самые популярные 10 аккаунтов, мы будем использовать функцию Счетчик из библиотеки коллекций.

Counter(following_list).most_common(10)

Результат этой функции показан ниже. За Рианной, похоже, следуют все остальные, и в нашей группе пользователей она определенно самая популярная.

[('rihanna', 5),
 ('RyanSeacrest', 3),
 ('BarackObama', 3),
 ('Oprah', 3),
 ('TheEllenShow', 3),
 ('kendricklamar', 3),
 ('KDTrey5', 3),
 ('Drake', 3),
 ('Nike', 3),
 ('NBA', 3)]

Слежение за отношениями между пользователями

Что, если мы хотим увидеть, кто за кем подписан в нашей группе пользователей? Чтобы исследовать это, я написал цикл for, который проверяет, есть ли кто-нибудь из пользователей в следующем списке другого человека. В результате он создает словарь списков, показывающий следующие статусы, представленные Истинно и Ложно.

follow_relations ={}
for following_user in followings.keys():
    follow_relation_list = []
    for followed_user in followings.keys():
        if followed_user in followings[following_user]:
            follow_relation_list.append(True)
        else:
            follow_relation_list.append(False)
    follow_relations[following_user] = follow_relation_list

В приведенном ниже коде словарь результатов преобразован в фрейм данных pandas для более удобной визуализации. Строки фрейма данных показывают пользователей, которые подписаны, тогда как столбцы указывают пользователей, на которых подписаны.

following_df = pd.DataFrame.from_dict(follow_relations, orient='index', columns=followings.keys())

Вы можете увидеть результат анализа ниже. Мы еще раз подтверждаем популярность Рианны в этой таблице. За ней следуют все остальные. Однако в отношении Ким Кардашьян мы не можем говорить подобным образом, согласно анализу, только Джастин Тимберлейк в нашей группе пользователей следует за ней.

Анализ количества упоминаний

Количество упоминаний - еще один надежный индикатор отношений между пользователями Twitter. Функция ниже (get_mention_count) написана для этой цели и возвращает количество упоминаний между двумя пользователями в одном направлении. Мы должны поместить упомянутое имя пользователя в упомянуть_слово, а в функции в его начало добавляется символ «@» для более точного разделения упоминаний.

def get_mention_count(user, mention_word):

    c = twint.Config()
    c.Username = user
    c.Search = '@' + mention_word
    c.Store_object = True

    twint.run.Search(c)
    tweets = twint.output.tweets_list
    mention_count = len(tweets)
    tweets.clear()

    return mention_count

В анализе мы будем использовать два вложенных цикла for, чтобы получить количество упоминаний каждого пользователя для всех остальных в нашей группе. В результате мы получим словарь упоминания_отношений.

mention_relations = {}
for mentioning_user in users:
    print('#####\nStarting: ' + mentioning_user + '\n#####')
    mention_count_list = []
    for mentioned_user in users:
        mention_count = get_mention_count(mentioning_user, mentioned_user)
        mention_count_list.append(mention_count)
    mention_relations[mentioning_user] = mention_count_list

Наконец, мы конвертируем этот словарь в фреймворк pandas, и он становится понятной и более легко интерпретируемой таблицей.

mention_df = pd.DataFrame.from_dict(mention_relations, orient='index', columns=mention_relations.keys())

И мы видим вывод таблицы количества упоминаний ниже. Опять же, строки показывают упомянутых пользователей, а столбцы - упомянутых. Значения по диагонали показывают, сколько раз пользователи упомянули себя, и это было вызвано ретвитами. Если проигнорировать эти значения, мы увидим, что Леброн Джеймс упоминается всеми в группе, а Рианна, похоже, упоминается всеми, кроме Неймара. С другой стороны, никто в группе никогда не упоминал Неймара в своих твитах. Другой интересный вывод может заключаться в том, что Шакира упомянула Рианну 52 раза в своих твитах, однако Рианна упомянула ее только 7 раз.

Заключение

Я попытался объяснить некоторые базовые анализы социальных сетей об известных пользователях Твиттера просто для развлечения, а тем временем стремился подготовить их с помощью несложных кодов Python. Надеюсь, они вам пригодятся. Наконец, несомненно, что эти анализы открыты для улучшения, и если у вас есть какие-либо советы или дополнения к статье, пожалуйста, не стесняйтесь поделиться ими.