【自然言語処理】PythonとTwitter APIでデータ分析

こんばんは。今日はTwitter APIを使ったスクレイピングに挑戦したいと思います。Twitterのデータを自由に取得できるようになったら今後色々なデータ分析で幅が広がりそうです。

この記事では、Twitterのデータを取得して簡単な分析を行えるようにするまでのステップを解説してまいります。最後には、お試しで少し分析をしてみていますので、そちらもご参考にしていただければと思います。

Contents

Twitter 開発者アカウントの登録

Twitterのデータを効率的に取得するためには、Twitter APIの利用が欠かせません。

このTwitter APIを利用するには、Twitterの開発者申請が必要になります。申請は記載しないといけないことがそれなりにあるため、ちょっと面倒ですが、2020年4月時点では、15分ほどで完了し、申請後すぐにAPIが利用可能になっています。

1,Twitter Developerサイトに行きます

https://developer.twitter.com/ja

Twitter Developerサイト

2, 右上のApplyから、開発者申請を進めていきます。

3, Twitterデータの利用用途について書きます。(ここが一番手間がかかるところ)

4, 申請後、E-Mailアドレスの認証が行われます。

*通常のTwitterアカウント側の設定でe-mailアドレスの設定が必要です。

5, メールの認証が終わると登録完了です。続けて、API利用に必要な認証キーの取得を進めます。

Welcome画面


Twitter APIの認証キーの取得

1,Get StartedのCreate an Appから新規アプリの登録をします。

2,必要情報を入力していきます。

アプリのURL等の入力が求められますが、ローカルでAPIをコールするような場合は、どうすればいいのだ??結論、適当なURLで大丈夫でした。

3, 以下の認証キー情報が表示されますので、メモします。

'consumer_key',
'consumer_secret',
'access_token',
'access_secret',

少し長かったですが、以上でTwitter APIを利用する準備は整いました!

次からは、実際にTwitter APIを利用してTweet情報を取得しきます。

Twitterデータをスクレイピング

はじめに、以下が、Twitter APIを使うための前準備です。

Twitter APIを利用してデータを取得する際に、Twitter側がアクセス元の認証を行います。その際に使うキー情報が下のKEYSで設定した情報であり、その認証の仕組みがOAuth(オーオース)と呼ばれています。

OAuthによる認証を行うためのライブラリとして、OAuth1Sessionをimportしておきます。

from requests_oauthlib import OAuth1Session

KEYS = {
    'consumer_key':'メモした値',
    'consumer_secret':'メモした値',
    'access_token':'メモした値',
    'access_secret':'メモした値',
}

twitter = OAuth1Session(KEYS['consumer_key'],KEYS['consumer_secret'],KEYS['access_token'],KEYS['access_secret'])

次にTwitter APIをコールします。今回は、Tweetを取得するsearchのAPIを使ってみます。

paramsにAPIに渡すオプションを色々と指定できます。詳しい仕様は開発者サイトに書かれています(英語)。

下のコードは、‘q’で指定したキーワードを含む日本語の(‘lang’=’ja’)ツイートのうち、最新(‘result_type’=’recent’)の100件(‘count’=100)取得するように引数を与えています。

url = "https://api.twitter.com/1.1/search/tweets.json"
params ={'q': key_word, 'count':'100','lang':'ja', 'result_type':'recent'}
res = twitter.get(url, params = params)

実際のデータ分析で100件のツイートでは少ないことが多いでしょう。

これを100件以上取得できるように改良したものが以下です。

こちらは、以下のサイトを参考にさせていただきました。

https://qiita.com/pocket_kyoto/items/0f43c9fdce87bddd31cf

def getTwitterData(key_word, repeat):
    url = "https://api.twitter.com/1.1/search/tweets.json"
    params ={'q': key_word, 'count':'100','lang':'ja', 'result_type':'recent'}
    tweets = []
    mid = -1
    break_flag = 0
    
    for i in range(repeat):
        params['max_id'] = mid
        res = twitter.get(url, params = params)
        if res.status_code == 200:
            sub_tweets = json.loads(res.text)['statuses']
            limit = res.headers['x-rate-limit-remaining'] if 'x-rate-limit-remaining' in res.headers else 0
#            print("API残接続可能回数:%s" % len(limit))            
            tweet_ids = []
            for tweet in sub_tweets:
                tweet_ids.append(int(tweet['id']))
                tweets.append(tweet)
            if len(tweet_ids) > 0:
                min_tweet_id = min(tweet_ids)
                mid = min_tweet_id - 1
            else:
                break_flag = 1
                break;
                
            ## 終了判定
            if break_flag == 1:
                break;
                
        else:
            print("Failed: %d" % res.status_code)
            break_flag = 1
    
    print("ツイート取得数:%s" % len(tweets))
        
    return tweets

ただし、こちらは無料のStandard APIの制約で、15分間に発行可能なクエリは180回となっているため、一回の実行で取得可能な最大件数は18000件(Sleepを噛ませれば無限ですが・・)で、かつ取得できるのは直近1週間分となっているので注意です。

それでは、こちらで”機械学習”を含むツイートを取得してみます。

tweets = getTwitterData("機械学習", 180)
これで、7183件が取得できました。取得したデータを覗いてみます。
df_tweet = pd.DataFrame(tweets)
display(df_tweets.info())

この中で、分析によく使いそうな項目を上げておくと、

  • created_at:ツイートした時刻。UTC+0(グリニッジ標準時)であるため、日本時間が必要な場合は変換が必要なことに注意です。
  • text:ツイート本文が含まれています。
  • user:ツイートしたユーザ情報が含まれています。この中がさらにjson形式になっており、フォロワー数やユーザ登録日など、複数の情報を含んでいます。

そのほかにもリツイート数など、様々な情報を引き出すことが可能です。

Tweetデータの可視化・分析

それでは、取得したデータを可視化・分析してみようと思います。(お試し分析)

非効率なコードも多々あるかと思いますが、気になる点があればぜひアドバイスいただけますと幸いです!

ツイート数の推移(直近1週間)

直近1週間の時間毎のツイート数推移を見てみます。見にくいですが、左から右に時系列が進みます。

plt.figure(figsize=(20,5))
g = sns.barplot(x="created_at", y="id", data=df_tweet.set_index("created_at").resample("H")["id"].count().reset_index())
labels = g.get_xticklabels()
g.set_xticklabels(labels, rotation=90)
plt.show()

日別で見るとこんな感じ。

2020/3/29までは毎日600〜800件程度のツイートでしたが、2020/3/30以降ツイート数がおよそ倍増しています。何があったのでしょう?

その時間周辺のツイートを確認すると、ひときわリツイート数の多いツイートを発見したので、これが原因かもしれない。その特定のツイートを控除した上で再度プロットしてみる。

うん、やっぱりその特定のツイートが原因でした。それを除けば、日々のツイート数に大きな変化はなさそうです。(もう少し細かくみると、4/2の夜にも突然増えているので、確認の余地がありそうです)

ツイートしたユニークユーザ数

過去1週間のツイート数7183件に対して、ユニークユーザ数は5301件でした。残り2000件程度については、同一ユーザが複数回ツイートしているようです。

というわけで、ユーザ毎のツイート回数の分布についても見てみます。

ユーザのツイート回数分布(直近1週間)

ユーザ毎にツイート数を集計してみると、ほとんどのユーザは1度だけ呟いているようです。

5回以上呟いている人は非常に少ないですが、中には80回以上ツイートしているユーザもいるようです。

ユニークユーザのフォロワー数分布

こちらはご参考までに。対数スケールで表示すると・・・こ・・・これはなんと美しい正規分布!笑

頻出ワードの可視化

最後は、少しテキスト解析を行ってみようと思います。

詳しい説明はここでは省略しますが、ツイートのテキストに対して、形態素解析を行った上で出現頻度をカウントしていきます。

WordCloudによる可視化

頻出単語(Bag-Of-Words)

まずはもっとも単純なBag-Of-Wordsによるカウント。

重要単語(TF-IDF)

続けて、TF-IDFにより重要単語を抽出した場合。

今回はBOWとTF-IDFであまり大きな違いはみられませんでしたが、”機械学習”と一緒に上記のような単語が使われているようした。生パスタ・・・?笑

そろそろ今日は力尽きてきたので、ここで終わろうと思います。最後までご覧いただきありがとうございました。参考になれば幸いです。

自分もこれからTwitter APIでもっと色々な分析をしてみたい。特にテキストの解析。ソーシャルデータの分析、楽しい。。

以上、Twitter APIを使ってデータ分析をしてみる導入部分の解説でした!

また、自分のブログではこの続きとして、感情分析といったことも試してみたりしていますので、気になる方はこちらもご覧いただければ幸いです。

もしこの記事がお役に立ちましたら、下の「いいね」ボタンをポチってもらえると励みになります!おしまい

関連記事

方向性:分析の幅を広げる

以下は、そのAzure利用版。Azureを使うと、Azureで事前構築済の日本語の感情分析エンジンが使えてとても簡単で便利です!

方向性:データベースやクラウドとの連携

(おまけ)自然言語処理をもっと学ぶなら・・・

Udemyを見てみると、自然言語処理系の講座も結構あるようだったので、もしもっと勉強されたい方がいれば、気になるものを受講してみてはいかがでしょうか。Udemyは自分もよく使うのですが、ボリュームの割に値段も安く、また万が一コンテンツが自分に合わなかった場合は30日の返金保証がある点が魅力で、お勧めです!

自然言語処理とチャットボット: AIによる文章生成と会話エンジン開発
今からでも基礎から学べるPythonによる自然言語処理(NLP):現役データサイエンティストが教える「日本語」文書分類

BERTによる自然言語処理を学ぼう! -Attention、TransformerからBERTへとつながるNLP技術-

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。