唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Weblio語彙力診断のスコア分布を調べてみた

最近Twitterで流行っていた日本語の語彙力診断の結果のツイートの分布が変という話がありました
qiita.com

たまにTwitterでみかけるWeblioの英単語の語彙力診断だとどんな分布なのか気になったので調べてみました
uwl.weblio.jp

以下のような形式のツイートを検索して、スコアと回答時間を収集しました


ちなみに同じユーザーが複数回ツイートしている場合があるので平均を取りました

ツイートのスコアのユーザーごとの平均をヒストグラムにしたのが以下です
スコアが増えるとユーザー数は減っているように見えます(個人的には英語の勉強が好きな人のほうが診断を受けたがるので、上の人のほうが多いかと思っていました)

f:id:sucrose:20160821205408p:plain

次に回答時間(秒)の分布を調べてみました
こちらは正規分布に近い形になっているように見えます
Weblio語彙力診断の説明に「約2分半で完了します」と書いてありますがグラフを見ると半分強ぐらいがこの時間で終わっていそうです
f:id:sucrose:20160821204550p:plain

スコアと回答時間に関係があるのかどうか、ということで散布図も出してみました
スコアが高いほど回答時間が短そう、という関係が見て取れます
f:id:sucrose:20160821204710p:plain

ソースコード

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