[Python] tweepyを使ってみる (2)

前回からの続きです。

Twitter APIs Twitter APIを通してTwitterを利用することができます。 APIを利用するためには、まず、以下で開発者として登録を行います。 その後、"create an app"を行い、以下の4つのキーを取得します。 A...

tweepy を使ってtweetの取得ができるようになったので、取得したtweetをpandasデータフレームとしてまとめ、matplotlibを用いて視覚化することを行ってみます。

pandas

pandasとは、pythonのエクセルのようなものです。

Python Data Analysis Library

以下は、大変良いとっかかりになりました。

データ分析で頻出のPandas基本操作

まずは、トランプ大統領のtweetを取得します。

>>> import tweepy
>>> import credentials_twitter
>>> auth = tweepy.OAuthHandler(credentials_twitter.API_KEY, credentials_twitter.API_SECRET_KEY)
>>> auth.set_access_token(credentials_twitter.ACCESS_TOKEN, credentials_twitter.ACCESS_TOKEN_SECRET)
>>> api = tweepy.API(auth)
>>> tweets  = api.user_timeline(screen_name='realDonaldTrump', count=20)

取得したtweetをデータフレームに変換してみます。

まずは空のデータフレームを作ります。

>>> import pandas as pd
>>> df = pd.DataFrame()
>>> df
Empty DataFrame
Columns: []
Index: []

次に、tweet本体を列としてデータフレームに追加します。列の名前は’tweets’にします。

>>> df['tweets'] = [tweet.text for tweet in tweets]
>>> df
                                               tweets
0   Thank you Jason Chaffetz! #MAGA https://t.co/s...
1   Today we announced vital new actions that we a...
2   ....She is a very special person with extraord...
3   After 3 1/2 years, our wonderful Sarah Huckabe...
4   "It is the assessment of the U.S. government t...
5   While I very much appreciate P.M. Abe going to...
6   They’ve been wrong all along! https://t.co/z5t...
7   ....and other really bad people, SPIED ON MY C...
8   ....which he is a member. When @RepAdamSchiff ...
9   When Senator @MarkWarnerVA spoke at length, an...
10  ....call the FBI about these calls and meeting...
11  I meet and talk to “foreign governments” every...
12  The Dems fight us at every turn - in the meant...
13  ....is not Constitutionally Permissable.” Alan...
14  “Congress cannot Impeach President Trump (did ...
15  ....can to embarrass the Trump Administration ...
16  .....much tougher game than the Republicans di...
17  Unrelated to Russia, Russia, Russia (although ...
18  General Michael Flynn, the 33 year war hero wh...

無事に追加できているので、他の項目も適当に追加します。

>>> df['id'] = [tweet.id for tweet in tweets]
>>> df['len'] = [len(tweet.text) for tweet in tweets]
>>> df['date'] = [tweet.created_at for tweet in tweets]
>>> df['likes'] = [tweet.favorite_count for tweet in tweets]
>>> df['retweets'] = [tweet.retweet_count for tweet in tweets]
>>> df
                                               tweets                   id  ...   likes retweets
0   Thank you Jason Chaffetz! #MAGA https://t.co/s...  1139330376009166851  ...   29109     8877
1   Today we announced vital new actions that we a...  1139277199180259328  ...   38464    10925
2   ....She is a very special person with extraord...  1139263782142787585  ...  102176    17684
3   After 3 1/2 years, our wonderful Sarah Huckabe...  1139263781144596486  ...   97872    19003
4   "It is the assessment of the U.S. government t...  1139246407267815430  ...   36315    14281
5   While I very much appreciate P.M. Abe going to...  1139236468365434880  ...   53407    13869
6   They’ve been wrong all along! https://t.co/z5t...  1139231431023046656  ...   53715    16166
7   ....and other really bad people, SPIED ON MY C...  1139164977271595010  ...   64148    17236
8   ....which he is a member. When @RepAdamSchiff ...  1139164973286985730  ...   56474    15309
9   When Senator @MarkWarnerVA spoke at length, an...  1139164968862015488  ...   63352    17930
10  ....call the FBI about these calls and meeting...  1139161443734106112  ...   79846    17114
11  I meet and talk to “foreign governments” every...  1139161442437992448  ...   84721    18244
12  The Dems fight us at every turn - in the meant...  1139143353445040129  ...   61301    15946
13  ....is not Constitutionally Permissable.” Alan...  1139126119440035842  ...   68311    14301
14  “Congress cannot Impeach President Trump (did ...  1139126117326045184  ...   84869    19213
15  ....can to embarrass the Trump Administration ...  1139123053219262466  ...   48460    10988
16  .....much tougher game than the Republicans di...  1139123051788980224  ...   43430     9681
17  Unrelated to Russia, Russia, Russia (although ...  1139123048748081153  ...   52015    12200
18  General Michael Flynn, the 33 year war hero wh...  1139115655532298240  ...   83285    20737
19  “It’s about peace and Prosperity, that’s how R...  1139017598744576001  ...   55174    13907

[20 rows x 6 columns]

トランプ大統領のtweetをデータフレームとしてまとめることができました。

describe()メソッドを使うことで、データフレームの平均、標準偏差、最小値、25%、50%、75%、最大値を簡単に取得できます。

>>> df.describe()
                 id         len          likes      retweets
count  2.000000e+01   20.000000      20.000000     20.000000
mean   1.139178e+18  128.100000   62822.200000  15180.550000
std    7.435411e+13   28.624428   20375.275431   3355.824073
min    1.139018e+18   53.000000   29109.000000   8877.000000
25%    1.139125e+18  139.000000   51126.250000  13451.750000
50%    1.139163e+18  140.000000   58887.500000  15627.500000
75%    1.139239e+18  140.000000   80705.750000  17745.500000
max    1.139330e+18  140.000000  102176.000000  20737.000000

matplotlib

matplotlibはpythonでグラフを描くライブラリです。

自分の思い通りのグラフを描くのは大変ですが、それっぽいグラフであれば非常に簡単に作成できます。公式のチュートリアルがお勧めです。

matplotlib

トランプ大統領のtweetを時系列で可視化してみます。

事前に200件取得して、データフレームに変換しておきます。

まずlikesの数を時系列に可視化してみます。

1次元の値を扱うので、pandasのseriesに変換して、日付をindexにした上で、可視化します。

>>> time_likes = pd.Series(data=df['likes'].values, index=df['date'])
>>> time_likes.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x00000261D06E1438>
>>> plt.show()

横に詰まっている感じがあるので、広げます。

>>> time_likes = pd.Series(data=df['likes'].values, index=df['date'])
>>> time_likes.plot(figsize=(9.6, 4.8))
<matplotlib.axes._subplots.AxesSubplot object at 0x00000261CFC4ECC0>
>>> plt.show()

それっぽいグラフができあがりあました。

このグラフにretweetの数を重ねてみます。

showメソッドの前に、プロットするためのメソッドを複数回呼び出すことで、一つの図に複数のグラフを描画できます。

>>> time_likes = pd.Series(data=df['likes'].values, index=df['date'])
>>> time_likes.plot(figsize=(9.6, 4.8), label='likes', legend=True)
<matplotlib.axes._subplots.AxesSubplot object at 0x00000261D054F048>
>>> time_retweets = pd.Series(data=df['retweets'].values, index=df['date'])
>>> time_retweets.plot(figsize=(9.6, 4.8), label='retweets', legend=True)
<matplotlib.axes._subplots.AxesSubplot object at 0x00000261D054F048>
>>> plt.show()

グラフを重ねることができました。