Pythonを使ってTwitter分析してみました!
この記事では、2019年5月17~18日間の丸一日で、”プログラミング”というキーワードで検索し収集したツイート約6100件を分析してみた結果を報告します。
分析した方法は、PythonとMeCabを使い、ツイートに含まれる単語を抽出し、頻出度(どのくらいその単語が使われているか)を調べる方法です。
結論から言いますと、バズツイートの影響が想像以上だったため、上位頻出単語が全てバズツイートに含まれる単語になってしまいました。
ですが、今回せっかくコードをつくったし、もう少しツイートの収集精度を高めれば使えそうなので、この記事で公開したいと思った次第です。
私は自由研究のレポートとして書いているので気軽に読んでいただければと思います。
なお、私がつくったコードも公開しております。(ここから飛べます)興味のある方はぜひ使ってみてくださいね。
■”プログラミング”に関するツイート約6100件を分析した結果【Python】
Pythonで”プログラミング”というキーワードに関するツイート約6100件を分析してみました。
まず初めに、今回やったことの概要をまとめておきます。
<今回やったことの概要>
<手順>
- “プログラミング”に関するツイートを丸一日検索
- エラーになるデータを人力で除外(コード公開項にて詳しく書きます。)
- MeCabで形態素解析、よく使われる単語をカウント
- 無意味な単語を人力で除外
<取得したツイートに関して>
・TwitterAPIにより、”プログラミング”で検索
・重複しないツイート:6107件(ツイート固有のidで判別)
・RT・引用ツイートも上記のツイート数に含まれる
・2019年5月17日~18日に収集
※以上を読んでいただければわかりますが、エラー、無意味な単語の除外は人力で行いました。なので、全自動というよりは半自動のコードとなっています。
・頻出度の高い単語は?
プログラミングというキーワードでヒットしたツイートを分析した結果、上位30位の最頻出単語は以下のようになりました。
順位 | キーワード | 使用回数(回) |
1 | プログラミング | 6576 |
2 | 流産 | 3953 |
3 | 初期 | 2641 |
4 | 責任 | 1349 |
5 | 原因 | 1331 |
6 | 残業 | 1320 |
7 | 排卵 | 1318 |
8 | ガチャガチャ | 1318 |
9 | 発育 | 1318 |
10 | ランダム | 1318 |
11 | 受精 | 1317 |
12(バズツイートを除くと実質1位) | 言語 | 602 |
13 | 勉強 | 509 |
14 | 学習 | 468 |
15 | エンジニア | 464 |
16 | 放送 | 380 |
17 | プロスタ | 378 |
18 | 日テレ | 366 |
19 | 今日 | 334 |
20 | BS | 299 |
21 | ブログ | 283 |
22 | 自分 | 282 |
23 | 経験 | 262 |
24 | IT | 252 |
25 | 仕事 | 248 |
26 | 情報 | 226 |
27 | 時間 | 223 |
28 | 初心者 | 217 |
29 | Progate | 216 |
30 | スクール | 207 |
※上位2位~11位のキーワードは、以下の宋美玄さんのバズツイートに含まれる単語です。
初期流産の原因が残業のせいじゃないかと周りに責められた人に「排卵はガチャガチャみたいなもので育つ卵と途中で発育が止まるようプログラミングされた卵がランダムに出てくる。流産を防ぐ方法はないから責任ないよ」というと泣くほどホッとしてた。初期流産は受精の時点でほぼ決まってるって広まれ!
— 宋美玄 (@mihyonsong) May 16, 2019
今回動かしたコードではRT・引用ツイートも1つのツイートとしてカウントするようにつくったので、バズった場合でも考慮しないでツイートを収集してみました。
たまたま、”プログラミング”というキーワードが含まれていたため、検索に引っかかったようです。
そのため、バズツイートを加味しない場合の実質もっともよく使われた単語は、”言語”(602回)ということになりました。
次いで”勉強”(509回)、”学習”(468回)となっています。
実は、この分析を行う前に同様の手順で100件のツイートを分析してました。
試しにTwitterで「プログラミング」と検索した際の最近の100ツイート分の最頻出単語を調べてみました
ゴミデータを自分で除外した結果ですプログラミング:122
学習:13
英語・勉強:12
記事・オブジェクト指向:10ご覧の通り、学習に関するツイートが多い
面白かったのは崩壊:4#プログラミング
— ゆあーさん@プログラモデリング (@yoursun3d) May 13, 2019
この100件の分析したときも、”勉強”や”学習”といったキーワードは上位に来ていたので、ほぼ予想通りの結果になりました。
・この分析からわかったこと
以下、今回分析してみてわかったことのまとめです。
・プログラミング学習者が積極的にツイートしている
バズツイートを除外すると、上にあった表の上位5つは以下のようになります。
1 | 言語 | 602 |
2 | 勉強 | 509 |
3 | 学習 | 468 |
4 | エンジニア | 464 |
5 | 放送 | 380 |
つまり、プログラミング学習のツイートが多い結果となりました。
プログラミングを学習していることに関するツイートはよく目にしていたのですが、データとして実際に多いことがわかりました。
いいねやRTがたくさん欲しい場合は、学習者へ向けてのメッセージを送るとニーズが満たせそうですね。
・バズツイートの与える影響は大きい!
今回やってみて得られたことの中で1番大きいのが、バズツイートの影響を実感したことです。
そもそもRT・引用ツイートを重複するツイートとして除外しなかったのは、たとえバズツイートが含まれていても、影響は少ないだろうと考えていたからでした。
結果としてみれば、今回収集したツイートの約30%以上がバズツイートに関するもので、予想をはるかに超えた結果となっています。
Twitter分析を行う際は、バズツイートに対する対処もしていく必要がありそうですね。それか長い期間でツイートを収集する必要がありそうです。
■今回つくったコードを公開!
今回つかったコードを以下にまとめます。
ツイート収集用と自動化用、頻出度カウント用の3つあります。
・ツイート収集用コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
import tweepy import csv def main(): #TwitterAPI認証 consumer_key="" consumer_secret = "" access_key= "" access_secret = "" auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_key, access_secret) api = tweepy.API(auth) tweet_list=[] tweet_id_list = [] read_tw_count = 0 #Tweetsdata.csvファイルを読み込み、ツイート固有idをリスト化 with open("Tweetsdata.csv", "r", newline='' , encoding = "utf-8") as rf: reader = csv.reader(rf) for tw in reader: read_tw_count += 1 try: tweet_id_list.append(tw[4]) print(tw[4]) except: print("tweet id not read") rf.close() #検索クエリ定義 q = "プログラミング" count=100 goukei_count = 0 #ツイートを取得し、listへ追加 tweet_count = 0 tweet_spoiled_count = 0 tweets = api.search(q=q, locale="ja", count=count,tweet_mode='extended') print("取得したツイート数: " + str(len(tweets))) for tweet in tweets: goukei_count += 1 if str(tweet.id) in tweet_id_list:tweet_spoiled_count += 1 else: tweet_id_list.append(tweet.id) tweet_list += ([[str(tweet.user.id), str(tweet.user.description), str(tweet.user.followers_count),str(tweet.user.friends_count),str(tweet.id), str(tweet.full_text), str(tweet.favorite_count),str(tweet.retweet_count)]]) tweet_count += 1 print(tweet_count) print(tweet_spoiled_count) print(goukei_count) #Tweetsdata.csvへ追記 with open("Tweetsdata.csv", "a", newline='' , encoding="utf-8") as af: writer = csv.writer(af, lineterminator="\n") writer.writerows(tweet_list) af.close() if __name__ == "__main__": main() |
ツイートを検索してTweetsdata.csvというCSVファイルに保存します。
検索にはTwitterAPIを使っています。まだアクセスキーを持っていない方は、以下の記事を参考に申請してみてください。
※無料で申請、取得できます。
ちなみにTweetsdata.csvというファイルを始めに読み込む必要があるので、あらかじめCSVファイルを作成しておく必要があります。
・自動化用コード
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import GetTweets import schedule,time,datetime def job(): now= datetime.datetime.now() GetTweets.main() print("<<DONE>>",now.strftime("%Y-%m-%d %H:%M:%S")) schedule.every(5).minutes.do(job) while True: schedule.run_pending() time.sleep(1) |
ツイート収集用コードを自動化するコードです。(5).minutesの部分を変更することで、検索する頻度を変更できます。
TwitterAPIを使う際は、15分180回のリクエスト制限があるので注意して下さい。
つまり、5秒に1回が最大のリクエスト上限です。
・頻出度カウント用コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# coding: utf-8 import MeCab import csv import GetMyTweetTimeline wordFreq_dic = {} wordcount_output = [] tweet_list=[] tweet_id_list = [] read_tw_count = 0 error_count = 0 text = "" with open("Tweetsdata.csv", "r", newline='' , encoding = "utf-8") as rf: reader = csv.reader(rf) for tw in reader: read_tw_count += 1 try: tweet_id_list.append(tw[4]) text += tw[5] except: #print("tweet id not read : " + str(read_tw_count)) pass #解析テキスト #単語頻出度カウント def WordFrequencyCount(word): if word in wordFreq_dic: wordFreq_dic[word] +=1 else: wordFreq_dic.setdefault(word, 1) return wordFreq_dic #特定の品詞の単語を抽出 mecab = MeCab.Tagger() mecab.parse('') node = mecab.parseToNode(text) while node: if node.feature.split(",")[0] == "名詞": word = node.surface WordFrequencyCount(word) else:pass node = node.next #辞書リストを取り出し、降順に並び替え for item in wordFreq_dic.items(): wordcount_output.append(item) wordcount_output = sorted(wordcount_output, key = lambda x:x[1], reverse=True) #CSV出力 with open("wordcount_dic_tweettext.csv", "w", encoding="utf-8") as wordcount_csv: writer = csv.writer(wordcount_csv, lineterminator="\n") writer.writerows(wordcount_output) |
読み込んだCSVファイル内のツイートテキストのみを抽出し、単語を辞書リストへ追加していきます。
辞書リストは、(”単語” : 頻出カウント数)のようになっており、最終的にwordcount_dic_tweettext.csvのCSVファイルに結果を出力します。
ここで紹介したコードはそのままでも動きますが、バズツイートへの対処などが別途必要になると思います。
■まとめ
今回プログラミングに関するツイートを調べてみたわけですが、丸一日では6000件ほどしか収集できないことがわかりました。
TwitterAPIを使えば最大1時間当たり72000件のツイートを取得できるので、データ収集の方法から考える必要がありそうです。
今回は以上になります。最後まで読んでいただきありがとうございました。
プログラミングやTwitter分析に興味のある方におすすめの記事です。
・Twitter APIの申請手順まとめ【2019年最新版】
Twitterのツイートをプログラミングで取得する際はTwittterAPI(Twitter公式かつ無料のAPI)が便利です。以下の記事を読みつつ申請すれば簡単に使うことができます。
PythonでDeepLearningしたいなら持っておきたい1冊。ニューラルネットワークのつくり方から学べます。