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

В этом посте мы извлечем мнение пациентов о некоторых из наиболее назначаемых лекарств в США. Мы рассмотрим 5 из 10 лучших лекарств, назначаемых в США:

  1. Викодин: препарат, применяемый для снятия умеренной и сильной боли.
  2. Симвастатин: ингибитор HMG-CoA редуктазы (статин), используемый для снижения риска инсульта и сердечного приступа.
  3. Лизиноприл: ингибитор ангиотензинпревращающего фермента (АПФ), используемый для снижения высокого кровяного давления и предотвращения почечной недостаточности, вызванной диабетом.
  4. Липитор: статин, используемый для предотвращения инсульта и сердечного приступа у людей с ишемической болезнью сердца.
  5. Метформин: препарат, используемый для лечения диабета 2 типа.

Для начала вам необходимо подать заявку на создание учетной записи разработчика Twitter:

После того, как ваша учетная запись разработчика будет одобрена, вам необходимо создать приложение Twitter:

Шаги для подачи заявки на учетную запись разработчика Twitter и создания приложения Twitter описаны здесь.

Мы будем использовать бесплатную библиотеку Python tweepy для доступа к Twitter API. Документацию по tweepy можно найти здесь.

  1. УСТАНОВКА

Во-первых, убедитесь, что у вас установлен tweepy. Откройте командную строку и введите:

pip install tweepy

2. ИМПОРТ БИБЛИОТЕК

Затем откройте свой любимый редактор и импортируйте библиотеки tweepy и pandas:

import tweepy
import pandas as pd

3. АУТЕНТИФИКАЦИЯ

Далее нам понадобится наш ключ потребителя и токен доступа:

Обратите внимание, что сайт предлагает вам хранить свой ключ и токен в секрете! Здесь мы определяем поддельный ключ и токен, но вы должны использовать свой настоящий ключ и токен при создании приложения Twitter, как показано выше:

consumer_key = '5GBi0dCerYpy2jJtkkU3UwqYtgJpRd' 
consumer_secret = 'Q88B4BDDAX0dCerYy2jJtkkU3UpwqY'
access_token = 'X0dCerYpwi0dCerYpwy2jJtkkU3U'
access_token_secret = 'kly2pwi0dCerYpjJtdCerYkkU3Um'

Следующим шагом является создание экземпляра OAuthHandler. Мы передаем наш ключ потребителя и токен доступа, которые мы определили выше:

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

Затем мы передаем экземпляр OAuthHandler в метод API:

api = tweepy.API(auth)

4. ЗАПРОСЫ TWITTER API

Затем мы инициализируем списки для полей, которые нам интересно анализировать. На данный момент мы можем посмотреть строки твита, пользователей и время твита. Затем мы пишем цикл for поверх тонкого объекта Cursor. В объекте «Курсор» мы передаем метод «api.search», устанавливаем строку запроса для того, что мы хотим найти, и устанавливаем «count» = 1000, чтобы мы не превышали лимит скорости твиттера. Здесь мы будем искать твиты о викодине, обезболивающем, используемом для лечения умеренной и сильной боли. Мы также используем метод «item ()» для преобразования объекта «Cursor» в итеративный.

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

twitter_users = []
tweet_time = []
tweet_string = []
for tweet in tweepy.Cursor(api.search,q='Vicodin', count=1000).items(1000):
            if (not tweet.retweeted) and ('RT @' not in tweet.text):
                if tweet.lang == "en":
                    twitter_users.append(tweet.user.name)
                    tweet_time.append(tweet.created_at)
                    tweet_string.append(tweet.text)
                    print([tweet.user.name,tweet.created_at,tweet.text])

Также можно посмотреть твиты по Симвастатину:

twitter_users = []
tweet_time = []
tweet_string = []
for tweet in tweepy.Cursor(api.search,q='Simvastatin', count=1000).items(1000):
            if (not tweet.retweeted) and ('RT @' not in tweet.text):
                if tweet.lang == "en":
                    twitter_users.append(tweet.user.name)
                    tweet_time.append(tweet.created_at)
                    tweet_string.append(tweet.text)
                    print([tweet.user.name,tweet.created_at,tweet.text])

Для повторного использования мы можем обернуть все это функцией, которая принимает ключевое слово лекарства в качестве входных данных. Мы также можем сохранить результаты в кадре данных и вернуть значение:

def get_related_tweets(key_word):
twitter_users = []
    tweet_time = []
    tweet_string = [] 
    for tweet in tweepy.Cursor(api.search,q=key_word, count=1000).items(1000):
            if (not tweet.retweeted) and ('RT @' not in tweet.text):
                if tweet.lang == "en":
                    twitter_users.append(tweet.user.name)
                    tweet_time.append(tweet.created_at)
                    tweet_string.append(tweet.text)
                    print([tweet.user.name,tweet.created_at,tweet.text])
    df = pd.DataFrame({'name':twitter_users, 'time': tweet_time, 'tweet': tweet_string})
    
    return df

Когда мы можем вызвать функцию с названием препарата «Лизиноприл», мы получим:

get_related_tweets('Lisinopril')

А для «Липитора»:

get_related_tweets('Lipitor')

Наконец, для «Метформина»:

get_related_tweets('Metformin')

Чтобы получить оценку настроения, нам нужно импортировать пакет Python под названием textblob. Документацию для textblob можно найти здесь. Чтобы установить textblob, откройте командную строку и введите:

pip install textblob

Следующий импорт текстового блока:

from textblob import TextBlob

Мы будем использовать показатель полярности в качестве меры для положительного или отрицательного воздействия. Оценка полярности представляет собой число с плавающей запятой со значениями от -1 до +1.

Например, если мы определяем объект textblob и передаем предложение «Мне нравится мой план медицинского страхования с Aetna», мы должны получить оценку полярности с положительным значением:

sentiment_score = TextBlob(“I love my health insurance plan with Aetna”).sentiment.polarity
print("Sentiment Polarity Score:", sentiment_score)

Давайте получим оценку полярности настроений для твитов о Викодине:

df = get_related_tweets("Vicodin")
df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
print(df.head()

Мы также можем подсчитать количество положительных и отрицательных настроений:

df_pos = df[df['sentiment'] > 0.0]
df_neg = df[df['sentiment'] < 0.0]
print("Number of Positive Tweets", len(df_pos))
print("Number of Positive Tweets", len(df_neg))

Опять же, для повторного использования кода мы можем обернуть все это в функцию:

def get_sentiment(key_word):
    df = get_related_tweets(key_word)
    df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
    df_pos = df[df['sentiment'] > 0.0]
    df_neg = df[df['sentiment'] < 0.0]
    print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
    print("Number of Negative Tweets about {}".format(key_word), len(df_neg))

Если мы вызовем эту функцию с помощью «Lipitor», мы получим:

get_sentiment(“Lipitor”)

Было бы удобно, если бы мы могли программно визуализировать эти результаты. Давайте импортируем seaborn и matplotlib и изменим нашу функцию get_sentiment:

import seaborn as sns
import matplotlib.pyplot as plt
def get_sentiment(key_word):
    df = get_related_tweets(key_word)
    df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
    df_pos = df[df['sentiment'] > 0.0]
    df_neg = df[df['sentiment'] < 0.0]
    print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
    print("Number of Negative Tweets about {}".format(key_word), len(df_neg))
    sns.set()
    labels = ['Postive', 'Negative']
    heights = [len(df_pos), len(df_neg)]
    plt.bar(labels, heights, color = 'navy')
    plt.title(key_word)
get_sentiment(“Lipitor”)

И результаты для остальных четырех препаратов:

Как видите, у Викодина, Симвастатина, Метформина и Липитора больше положительных эмоций, чем отрицательных, а у Лизиноприла немного больше отрицательных настроений, чем положительных. Я призываю читателя провести такой же анализ других наркотиков и посмотреть, каково общее мнение об этом препарате на основе твитов. Было бы интересно собрать данные за несколько лет, чтобы увидеть, есть ли временная зависимость (сезонность) в оценках настроений для определенных наркотиков. Возможно, я сохраню это для будущего поста!

Спасибо за чтение. Код из этого поста доступен на GitHub. Удачи и удачного машинного обучения!

Примечание редакторам Data Science. Хотя мы разрешаем независимым авторам публиковать статьи в соответствии с нашими правилами и рекомендациями, мы не поддерживаем вклад каждого автора. Не следует полагаться на работы автора без консультации с профессионалами. См. Подробности в наших Условиях для читателей.