Edited at

twitterで一番ツイートされる平仮名は何か


何をするか


  • tweepyでツイートを伝染的に取得

  • 二つの観点から集計

  • matplotlibでグラフ化


ツイートの取得方法


  1. 取得対象者の人数を決定する

  2. 予め用意していた複数のユーザIDからランダムに1人選出(Aとする)

  3. Aからツイートを200件取得

  4. Aのフォロワーの中からランダムに1人選出(Bとする)

  5. Bからツイートを200件取得




という感じに取得していきます.

個人的に伝染するような動作をしているように見えたのでスパムくんと呼んでいます.


集計方法


  1. ツイートを取得する際に平仮名の個数をカウントし, CSVファイルに逐次追加

  2. CSVファイルから平仮名の個数をそれぞれ合計し, 全取得ツイート中の出現した回数を得る

  3. 同時に各ツイートに出ているか出ていないかを算出, 出現したツイートの数を求める

そのため, 総出現回数出現したツイート数を今回はグラフ化していきたいと思います.

また, それぞれを全ツイート数で割った1ツイートあたりの平均出現個数どの割合でその平仮名を含むツイートが出現するかも一覧として出しておきたいと思います.


結果の予測

やっぱり母音あたりが強いんじゃないかと思います.

「あ」~「お」が上位を占めるかも??


結果

Figure_1.png

ちなみに一部をソートして抜粋すると

平仮名
総出現回数
個/ツイート

平仮名
総出現回数
個/ツイート


2207
0.8719
-

0
0


1606
0.6345
-

0
0


1562
0.6171
-

7
0.0027


1501
0.5930
-

7
0.0027


1304
0.5152
-

7
0.0027


1251
0.4942
-

8
0.0031


1225
0.4839
-

9
0.0035


1189
0.4697
-

10
0.0039

平仮名
出現したツイート数
出現ツイート/全ツイート

平仮名
出現したツイート数
出現ツイート/全ツイート


1128
0.4456
-

0
0


978
0.3864
-

0
0


938
0.3706
-

4
0.0015


889
0.3512
-

6
0.0023


797
0.3148
-

7
0.0027


796
0.3145
-

7
0.0027


754
0.2979
-

7
0.0027


740
0.2923
-

7
0.0027


コメント

「い」がぶっちぎりトップみたいですね.

この他にも色々わかったら追記していこうと思います.


ソースコード

テキトーですが一応置いておきます.


ツイートの伝染的取得.py

import tweepy

from twitter import *
import csv
import random

CONSUMER_KEY = '*****'
CONSUMER_SECRET_KEY = '*****'
ACCESS_TOKEN = '******'
ACCESS_TOKEN_SECRET = '*******'

def count_char(api, user_id, f, get_status_num):
# ひらがなのリスト
char_list = [chr(char_codepoint)
for char_codepoint in range(ord('ぁ'), ord('ん') + 1, 1)]

writer = csv.writer(f)

try:
# 自分のタイムラインの最新200件を取得
for status in tweepy.Cursor(api.user_timeline, user_id).items(get_status_num):
# 平仮名の個数の計算
char_num_list = []
for char in char_list:
char_num = status.text.count(char)
char_num_list.append(char_num)
writer.writerow(char_num_list)
except tweepy.error.TweepError:
print('認証がうまくできないアカウントにぶつかったので飛ばします.')
return False

return True

def choice_id_random(api, user_id, get_status_num):
id_list = tweepy.Cursor(api.followers_ids, user_id).items(30)
id_list = list(id_list)
id = random.choice(id_list)
user = api.get_user(id)
while(user.lang != 'ja' or user.statuses_count <= get_status_num or user.protected == True):
id = random.choice(id_list)
user = api.get_user(id)
return random.choice(id_list)

def count_char_infection(user_id, infection_num, f, get_status_num):
# 認証
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET_KEY)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

api = tweepy.API(auth, wait_on_rate_limit=True)

while(infection_num > 0):

try_user_id = choice_id_random(api, user_id, get_status_num)

if(count_char(api, try_user_id, f, get_status_num)):
print('=== 対象 -> id:{}'.format(try_user_id))
infection_num -= 1
print('=== 残り{}人'.format(infection_num))
user_id = try_user_id

if __name__ == '__main__':
# 感染元アカウントのリスト. ここからランダムに選ばれる.
id_list = ['*****', '*****', '*****']

f = open("file_name", "a", encoding="utf-8")

print('=== 感染する人数を入力してください.')
infection_num = int(input('> '))

count_char_infection(random.choice(id_list),
infection_num, f, get_status_num=200)



集計結果の表示とグラフ化.py

import pandas as pd

import numpy as np
import matplotlib.pyplot as plot
import matplotlib as mpl

if __name__ == "__main__":
char_list = [chr(char_num)
for char_num in range(ord('ぁ'), ord('ん') + 1, 1)]
org_df = pd.read_csv('file_name',
engine='python', names=char_list)
print(org_df)

# 各ひらがなの出現回数
sum_org_df = np.sum(org_df, axis=0)
sorted_sum_org_df = sum_org_df.sort_values(ascending=False)
print(sorted_sum_org_df)
print(sorted_sum_org_df / len(org_df))

# 各ひらがなの使用されていたツイート数
appear = np.array(org_df)
appear[appear > 0] = 1
appear_df = pd.DataFrame(appear, columns=char_list)
sum_appear_df = np.sum(appear_df, axis=0)
sorted_sum_appear_df = sum_appear_df.sort_values(ascending=False)
print(sorted_sum_appear_df)
print(sorted_sum_appear_df / len(org_df))

# 描画
font = {"family": "IPAexGothic"}
mpl.rc('font', **font)

fig = plot.figure()
ax = fig.add_subplot(111)

ax.scatter(sum_org_df, sum_appear_df)
for x, y, char in zip(sum_org_df, sum_appear_df, char_list):
ax.annotate(char, (x, y))

ax.set_xlabel('総出現回数')
ax.set_ylabel('その平仮名を含むツイート数')

ax.grid()

plot.show()