人気お笑いコンビ「たりないふたり」のTwitterを分析しました。
この記事のコードでは、次の4つを実施しています。
● TwitterAPIを使用し、指定したIDのツイートを取得する
● 取得したツイートの、ツイート主とツイート期間を分類する
● ツイートのいいね・リツイート数を集計し、グラフを表示する
● いいね数の多いツイートのリンクを表示する
コードの解説は基礎集計と自然言語処理の2つのパートに分かれており、自然言語処理はこちらになります。
また、結果を詳しく知りたい場合は、こちらのリンクから確認ください。
はじめに
たりないふたりとは、2人のお笑い芸人南海キャンディーズの山里亮太とオードリーの若林正恭による期間限定のお笑いコンビです。
2012年から不定期で活動し、2021年5月31日にコンビを解散しました。
コード
インポート
import tweepy
import numpy as np
import pandas as pd
import re
import datetime
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sb
from IPython.display import display
mpl.rcParams['font.family'] = "IPAexGothic"
plt.rcParams["font.size"] = 18
pd.set_option("display.max_colwidth", 280)
ツイートの取得
def get_api_value(consumer_key,consumer_secret,access_token,access_secret):
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
return api
def collect_tweet_data(tw_user_id, api):
'''
ツイッターAPIを使用してデータを収集し、リストを作成する関数
twitterのuser nameを指定することで、対象ユーザーの全てのつぶやきを取得する
'''
tweet_data = []
for tweet in tweepy.Cursor(api.user_timeline, screen_name = tw_user_id, exclude_replies = True).items():
tweet_data.append([tweet.id,
tweet.created_at+datetime.timedelta(hours=9),
tweet.text.replace('\n',''),
tweet.favorite_count,
tweet.retweet_count])
return tweet_data
def create_tweets_df(tw_user_id, api):
'''
collect_tweet_dataの関数で得たTwitterのデータを、dfに変換する。
'''
tweet_data = collect_tweet_data(tw_user_id=tw_user_id,api=api)
# 取得する列名を指定する
columns_name=["TW_NO","TW_TIME","TW_TEXT","FAV","RT"]
df=pd.DataFrame(tweet_data,columns=columns_name)
return df
def set_tweet_person(name_list, person_name, col_name='PERSON'):
'''
1つのアカウントで複数名がつぶやいているため、
キーワードからつぶやき主を類推する。
name_listに「文責カレーライス」のようなキーワードを含めたリストを代入し、
person_nameに「若林」のような、実際の呟き主の苗字を代入する。
'''
# リストを「○○|○○」という正規表現に変換するために、join関数を使用する
# contains関数で、リスト内の名称がテキスト内に含まれている場合に、値をperson_nameへ変更する
df.loc[df['TW_TEXT'].str.contains("|".join(name_list)), col_name] = person_name
def set_tweet_term(s_year, e_year, term_name, col_name='term'):
# ツイート日から、期間を区切る
df.loc[(df["TW_TIME"].dt.year >= s_year)&(df["TW_TIME"].dt.year <= e_year), col_name]=term_name
# Getting customer key and access token
# 自身で取得したkeyとtokenを記入ください
consumer_key = 'xxxxxxxxxxxxxxxx'
consumer_secret = 'xxxxxxxxxxxxxxxxxxx'
access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
access_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
api=get_api_value(consumer_key,consumer_secret,access_token,access_secret)
tw_user_name ='tarinaifutari'
df = create_tweets_df(tw_user_name, api)
# ツイートのテキストの中からスペースを削除
df['TW_TEXT'] = df['TW_TEXT'].apply(lambda x: re.sub('([あ-んア-ン一-龥ー])\s+((?=[あ-んア-ン一-龥ー]))',r'\1\2', x))
#一つのidで複数の人がつぶやいていているため、つぶやき主を類推できるキーワードを定義する
w_list = ['文責若林', '文責悪鼠', '歌責若林', 'MASA', '文責・若林', '文責若','文責カレーライス']
y_list = ['文責山里', '山里亮太', '文責福神漬け']
b_list = ['文責山里若林', '文責山里・若林']
for name_list, person_name in [[w_list, "若林"], [y_list, "山里"], [b_list, "双方"]]:
set_tweet_person(name_list, person_name)
term_list = [[2011, 2012, "1_たりないふたり"],
[2014, 2014, "2_もっとたりないふたり"],
[2019, 2019, "3_さよならたりないふたり"],
[2020, 2021, "4_たりないふたり2020"]]
for s_year, e_year, term_name in term_list:
set_tweet_term(s_year, e_year, term_name, col_name='term')
RT数やfav数のグラフ表示
def show_tweet_ave_graph(df, x_col, y_col, hue_col):
'''
1ツイートあたりの平均を期間ごとに表示するグラフを作成する
'''
plt.figure(figsize = [12, 8])
sb.barplot(data=df, x=x_col,y=y_col,hue=hue_col)
#文字数が多いので、10度回転して重ならないようにします
plt.xticks(rotation=10)
plt.xlabel("")
plt.ylabel("")
plt.title('各termでの1tweetあたりのretweet数')
plt.show()
# 1ツイートあたりのいいねとリツイートの平均するために、データフレームを作成する
df_rt_fav=df.groupby(['PERSON', 'term'])[['RT', 'FAV']].mean().reset_index()
# PERSON列が、NaNと双方になっている行を除外する
df_rt_fav =df_rt_fav[~((df_rt_fav['PERSON']=='不明')|(df_rt_fav['PERSON']=='双方'))]
show_tweet_ave_graph(df_rt_fav, 'term', 'FAV', 'PERSON')
show_tweet_ave_graph(df_rt_fav, 'term', 'RT', 'PERSON')
各termで人気のツイートを表示
term_list = ["1_たりないふたり", "2_もっとたりないふたり", "3_さよならたりないふたり", "4_たりないふたり2020"]
#あとでtwitterにアクセスしたいので、URLの形式に変換
df['TW_link'] = df['TW_NO'].apply(lambda x: 'https://twitter.com/tarinaifutari/status/' + str(x))
for term in term_list:
df_fav_text =df[df['term']==term].sort_values('FAV', ascending=False)[['TW_link','TW_TEXT', 'FAV']].head(10)
display(df_fav_text)
print("term:{}".format(term))
関連記事
コードの解説は基礎集計と自然言語処理の2つのパートに分かれており、自然言語処理はこちらになります。
また、結果を詳しく知りたい場合は、こちらのリンクから確認ください。
コメント