最近Twitterで流行っていた日本語の語彙力診断の結果のツイートの分布が変という話がありました
qiita.com
たまにTwitterでみかけるWeblioの英単語の語彙力診断だとどんな分布なのか気になったので調べてみました
uwl.weblio.jp
以下のような形式のツイートを検索して、スコアと回答時間を収集しました
今回のweblio語彙力診断結果はレベル「level 26」推定語彙数「20001~22000語」称号「賢者」Grade「sage」回答時間「1分13秒」スコア「208.4」 #vocab_test https://t.co/0vESswT6RG
— 無限猿(id:sucrose)@33月病 (@Scaled_Wurm) August 21, 2016
ちなみに同じユーザーが複数回ツイートしている場合があるので平均を取りました
ツイートのスコアのユーザーごとの平均をヒストグラムにしたのが以下です
スコアが増えるとユーザー数は減っているように見えます(個人的には英語の勉強が好きな人のほうが診断を受けたがるので、上の人のほうが多いかと思っていました)
次に回答時間(秒)の分布を調べてみました
こちらは正規分布に近い形になっているように見えます
Weblio語彙力診断の説明に「約2分半で完了します」と書いてありますがグラフを見ると半分強ぐらいがこの時間で終わっていそうです
スコアと回答時間に関係があるのかどうか、ということで散布図も出してみました
スコアが高いほど回答時間が短そう、という関係が見て取れます
ソースコード
検索APIの一回に取ってくる件数のオプションがTweepyのドキュメント(古い?)だとrppになっていますが公式APIの方だとcountになっているので注意
API Reference — tweepy 3.5.0 documentation
dev.twitter.com
# -*- coding: utf-8 -*- import tweepy import time import collections import datetime import pandas as pd import seaborn as sns import matplotlib.font_manager import re #APIキーなどの設定 consumer_key = '' consumer_secret = '' access_token = '' access_token_secret = '' auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) #検索結果を取ってくる statuses = tweepy.Cursor(api.search, u'語彙力診断結果 スコア 推定語彙数', count=100).items(200) data = collections.defaultdict(list) #データを整形 for status in statuses: match = re.search(ur'スコア「(.+?)」', status.text) if match: data['screen_name'].append(status.user.screen_name) data['score'].append(float(match.group(1))) match = re.search(ur'回答時間「(?:(.+?)分)?(.+?)秒」', status.text) if match: seconds = 0 groups = match.groups() if len(groups) == 2: seconds += int(groups[0]) * 60 seconds += int(groups[1]) data['seconds'].append(seconds) df = pd.DataFrame(data) from pylab import * import numpy as np #フォント指定をしているので注意 prop = matplotlib.font_manager.FontProperties(fname=r'C:\Windows\Fonts\meiryo.ttc', size=15) title(u'Weblio語彙力診断のスコア別ツイート数', fontproperties=prop) xlabel(u'score') ylabel(u'count') hist(df.groupby('screen_name').mean().score, bins=np.arange(0, 325, 25), histtype='stepfilled') show() title(u'Weblio語彙力診断の回答時間別ツイート数', fontproperties=prop) xlabel(u'seconds') ylabel(u'count') hist(df.groupby('screen_name').mean().seconds, histtype='stepfilled') show() title(u'Weblio語彙力診断のスコアと回答時間', fontproperties=prop) xlabel(u'score') ylabel(u'seconds') scatter(df.groupby('screen_name').mean().score, df.groupby('screen_name').mean().seconds) show()