Twitter
TwitterAPI
Python3

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()