唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

ツイートの時間帯をヒートマップで可視化

Pythonでヒートマップを描く方法の記事を書こうかと思ったけど、細かく説明するといろいろとめんどくさそうだったのでとりあえず実際にやってみた可視化だけ書いておく

Twitter APIで自分のツイートを適当に3000件ぐらい取ってきてツイートした時刻と曜日を抽出してカウント、それを可視化用のライブラリseabornのheatmap関数でグラフにした
heatmap関数にはnumpyのarrayやpandasのDataFrameを渡せばよい

ちなみにseabornではなくmatplotlibを使うならhist2d関数やimshow関数などを使えばよさそう

結果

というわけで月から金の平日は昼と夜にツイートが多くて、土日は午後にまんべんなくツイートしているグラフが得られた
ところで、日曜日は23時頃にツイートが急に増えているのは休日最後の悪あがきなのでしょうか……

f:id:sucrose:20160508185425p:plain:w600

ソースコード

日本語を使うためにフォントを指定しているので注意

やってからよく考えると、全部のカウントを単純に合計したものを出すのではなくて、一日あたりの平均に直せばよかったかも

# -*- coding: utf-8 -*-

import tweepy
import time
import collections
import datetime
import pandas as pd
import seaborn as sns
import matplotlib.font_manager

#APIのキーなどを設定
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''

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

#自分のアカウントのツイートを取ってくる
statuses = tweepy.Cursor(api.user_timeline, 'Scaled_Wurm', count=200).items(3000)

data = collections.defaultdict(list)

#データを整形
for status in statuses:
    t = status.created_at + datetime.timedelta(hours=9)
    data['hour'].append(t.hour)
    data['weekday'].append('Mon Tue Wed Thu Fri Sat Sun'.split()[t.weekday()]
)

#一度もツイートしていない時刻がpandas.crosstabでカウントされなかったのでとりあえずすべての時刻に値を入れておく
data['hour'].extend(range(24))
data['weekday'].extend(['filler'] * 24)

df = pd.DataFrame(data)

#時刻と曜日ごとにカウント
tab = pd.crosstab(df.hour, df.weekday)
#indexとcolumnの順番を直す
tab = tab['Mon Tue Wed Thu Fri Sat Sun'.split()]
tab = tab.sort_index(ascending=False)

sns.heatmap(tab, annot=True, fmt='d', cbar=False, cmap=sns.light_palette("navy", as_cmap=True))
prop = matplotlib.font_manager.FontProperties(fname=r'C:\Windows\Fonts\meiryo.ttc', size=12)
sns.plt.title(u'最近の時間帯ごとのツイート数', fontproperties=prop)
sns.plt.xlabel(u'曜日', fontproperties=prop)
sns.plt.show()