唯物是真 @Scaled_Wurm

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

ニコニコ動画のコメントの投稿日時の分布

下の論文が最近はてなとかTwitterとかで話題になりました

「そういえば昔ニコニコ動画のコメントの投稿時間を調べて下書きに放り込んでおいたなー」と思い出したので公開

例のごとくニコニコ動画のデータセットを利用して調べます

動画ごとに以下のような1行1コメント(JSON)の形式になっています

{"date":1218555948,"no":1,"vpos":1507,"comment":"\u30d2\u30e3\u30c3\u30cf\u30a1\uff01","command":""}

dateの部分が投稿時間(UNIX時間)になっています
Pythonなら以下のようなコードでdatetime形式に変換できるので、あとは簡単に日時の情報を取り出せます

import datetime
print datetime.datetime.fromtimestamp(1218555948)
2008-08-13 00:45:48

全部のコメントからいつ投稿してるかというのを調べてグラフ化しました

何時に投稿してるか

19時と20時の間で急に投稿数が増えて、21, 22時頃がピークになっています(縦軸は割合
20時ぐらいに増えるのは社会人が帰宅するからとかなんですかね?
f:id:sucrose:20131215185331p:plain

import numpy as np
from pylab import *

result = [149396384, 119911446, 87416923, 61651870, 40577116, 32612478, 30800874, 34898650, 42762938, 57737470, 73247679, 86091973, 92368653, 103987339, 111587925, 116223601, 125439579, 135231038, 138783493, 140571692, 164181201, 178592920, 180494165, 169821103]
result_norm = np.array(result) / sum(map(float, result))
bar(xrange(len(result_norm)), result_norm, 0.8, align='center', color=cm.rainbow(np.linspace(0, 1, len(result_norm))))
xlim(-1, 24)
xticks(xrange(len(result)))
show()

何曜日に投稿してるか

やっぱり土日が多くて平日は似たり寄ったりな投稿数みたいです(縦軸は割合
f:id:sucrose:20131215185350p:plain

import numpy as np
from pylab import *

result = [351670892, 337636093, 330888396, 323426440, 321965746, 392786349, 416014594]
result_norm = np.array(result) / sum(map(float, result))
bar(xrange(len(result_norm)), result_norm, 0.8, align='center', color=cm.rainbow(np.linspace(0, 1, len(result_norm))))
xticks(xrange(len(result)), 'Mon Tue Wed Thu Fri Sat Sun'.split())
show()

月ごとの違い

各月の合計が1になるように正規化しています

月ごとに多少違うのですが、あまり季節変動とかそういうのはなさそう……?
8月の昼間がちょっと多いのは長期休暇だからなんですかね
f:id:sucrose:20140103020040p:plain

import numpy as np
from pylab import *

result = [[11329623, 9184135, 6827198, 4792937, 3161817, 2483874, 2175598, 2202695, 2628885, 3634674, 4854132, 5919251, 6502233, 7403097, 7974498, 8466446, 9252578, 10037097, 10237395, 10240260, 11848159, 13068610, 13254543, 12627244], [10510399, 8441834, 6246733, 4418743, 2934708, 2342969, 2103202, 2279260, 2711880, 3733678, 4845222, 5780394, 6232303, 7061305, 7646667, 8110016, 8872940, 9503944, 9722996, 9830459, 11286414, 12352087, 12544761, 11815524], [13096999, 10759965, 7964556, 5627594, 3799549, 3060677, 2757665, 3117230, 3954206, 5553834, 7171648, 8490070, 9008512, 10364033, 11164159, 11462785, 11927574, 12145498, 12169468, 12290734, 14256353, 15655098, 15809168, 15012382], [11821731, 9281576, 6675724, 4626721, 3037871, 2391266, 2295892, 2705281, 3354070, 4520308, 5780390, 6747844, 7258013, 8069464, 8689884, 9090584, 9923375, 10760068, 11034559, 11316756, 13342977, 14525658, 14581175, 13629162], [13155865, 10598431, 7534846, 5208889, 3396269, 2714824, 2753947, 3251091, 3869905, 5056489, 6242281, 7208822, 7686175, 8654873, 9239647, 9608284, 10580146, 11674843, 12273735, 12731346, 14881365, 16088795, 16135001, 15062441], [12696321, 10135195, 7328874, 5155628, 3343693, 2820319, 2881088, 3284099, 3734015, 4733173, 5718974, 6507805, 7007798, 7784065, 8299034, 8768897, 9889839, 11091561, 11752510, 12155843, 14300164, 15524169, 15527872, 14355522], [13402009, 10699128, 7743766, 5507107, 3579029, 2874785, 2871607, 3389723, 4198972, 5622256, 7000250, 8193921, 8722146, 9867472, 10612313, 10998833, 11552122, 12187429, 12482922, 12588444, 14575802, 15959834, 15991418, 15121150], [14550394, 12018899, 8862813, 6396219, 4211994, 3339452, 3108090, 3626783, 5033223, 7178612, 9229006, 10785866, 11352424, 12595304, 13326104, 13368052, 13472075, 13500553, 13077065, 12781044, 15102646, 16757563, 17130739, 16452390], [12766908, 10153693, 7425004, 5332573, 3510616, 2849544, 2784770, 3139041, 3762376, 5021814, 6300931, 7377568, 7894223, 8747388, 9294640, 9690476, 10509169, 11503185, 11864690, 12282391, 14573369, 15776230, 15888205, 14617541], [13033940, 10235227, 7289360, 5142421, 3367633, 2758512, 2626004, 3054728, 3610536, 4760091, 5968465, 6937537, 7398518, 8377731, 8890529, 9237840, 10347876, 11634884, 12396119, 12747799, 14887259, 15875895, 16024738, 14928944], [11556694, 9146523, 6677951, 4667273, 3004854, 2412187, 2187006, 2425299, 2939883, 3926800, 4992381, 5913020, 6349653, 7125301, 7678882, 8227559, 9320458, 10612164, 11125955, 11191633, 13071726, 13982962, 14065816, 13316321], [11475501, 9256840, 6840098, 4775765, 3229083, 2564069, 2256005, 2423420, 2964987, 3995741, 5143999, 6229875, 6956655, 7937306, 8771568, 9193829, 9791427, 10579812, 10646079, 10414983, 12054967, 13026019, 13540729, 12882482]]

x = np.array([np.array(r) / sum(map(float, r)) for r in result])

for i, data in enumerate(x):
    plot(x[i], linewidth=3, color=cm.rainbow(i / float(len(x))))

xlim((0, 23))
legend(xrange(1, 13), loc='best', prop={'size' : 10})
show()


曜日の方を見ると、他の月は土日が多いですが、8月だけははっきりと平日も多いのがわかります(おそらく長期休暇の影響
f:id:sucrose:20140103015239p:plain

import numpy as np
from pylab import *

result = [[25913247, 24873150, 23165690, 23503550, 23314049, 28688496, 30648797], [23193982, 22902997, 23802756, 22583585, 23501770, 26977950, 28365398], [35259413, 31224212, 29152605, 29058429, 29074783, 35519639, 37330676], [27397250, 26021370, 26985776, 26011591, 25901748, 30759505, 32383109], [28342189, 28453943, 26721356, 27850256, 27288413, 37862513, 39089640], [28126341, 27731956, 27455454, 25654755, 25655464, 33787808, 36384680], [31397058, 31461272, 30114326, 30935833, 29905175, 34612772, 37316002], [37832814, 36621738, 36525735, 35517065, 36300541, 35803122, 38656295], [30113230, 29722984, 28970457, 27781082, 26566432, 33833722, 36078438], [30703187, 27033712, 27339950, 25795756, 27103945, 36130090, 37425946], [26968751, 25869403, 24042247, 23983202, 23617037, 29066871, 32370790], [26423430, 25719356, 26612044, 24751336, 23736389, 29743861, 29964823]]

x = np.array([np.array(r) / sum(map(float, r)) for r in result])

for i, data in enumerate(x):
    plot(x[i], linewidth=3, color=cm.rainbow(i / float(len(x))))

xlim((0, 6))
xticks(xrange(7), 'Mon Tue Wed Thu Fri Sat Sun'.split())
legend(xrange(1, 13), loc='best', prop={'size' : 10})
show()

年ごとの違い

あまり違いはないみたいです
f:id:sucrose:20140104130812p:plain

import numpy as np
from pylab import *

result = [[15819621, 13229395, 10920317, 8404360, 5784682, 4462525, 3832727, 4082451, 4866304, 6358960, 7783495, 9125407, 9953652, 11128619, 11932989, 12369940, 13430181, 14828852, 15289881, 13636534, 15503053, 16898734, 17575510, 17188947], [33423327, 27177437, 19860757, 14209590, 9841403, 7567703, 7004330, 7801254, 9303765, 12299942, 15385043, 18316071, 19183888, 21453333, 23007200, 24114431, 26348430, 28404533, 29204683, 29964997, 35336132, 38662111, 39696881, 37469297], [27025190, 21766710, 15440329, 10784097, 7320716, 5584254, 5117424, 5654898, 7083541, 9640745, 12386304, 14522834, 15796555, 17791960, 19007960, 19690972, 21120347, 22531487, 23047080, 23876722, 28150028, 30925987, 31966300, 30245296], [29002835, 22934361, 16847579, 11225427, 7128984, 5746227, 5400888, 6165134, 7643318, 10487759, 13713840, 16287589, 17498164, 19777593, 21315842, 22286372, 23913897, 25747906, 26384730, 26869918, 31713603, 35181605, 35923435, 33994214], [25296375, 19723735, 13776415, 9663572, 5962548, 5134306, 5254599, 6278219, 7722535, 10453342, 13352686, 15575993, 16673290, 18878142, 20310040, 21083193, 22679472, 24423210, 25022467, 25703779, 30131339, 32812324, 32115099, 29512548], [18829036, 15079808, 10571526, 7364824, 4538783, 4117463, 4190906, 4916694, 6143475, 8496722, 10626311, 12264079, 13263104, 14957692, 16013894, 16678693, 17947252, 19295050, 19834652, 20519742, 23347046, 24112159, 23216940, 21410801]]

x = np.array([np.array(r) / sum(map(float, r)) for r in result]).T

plot(x, linewidth=3)
xlim((0, 23))
legend(xrange(2007, 2013), loc='best')
show()

どの年も土日が多いみたいです
f:id:sucrose:20140104131023p:plain

import numpy as np
from pylab import *

result = [[38062043, 35684467, 34943098, 34049899, 34486218, 42943303, 44238108], [75453366, 73123130, 69916139, 67163333, 67894862, 87437873, 94047835], [60059450, 58548934, 58367857, 57433435, 55444200, 66466463, 70157397], [67103813, 65898296, 64374611, 63148325, 61887723, 72672485, 78105967], [61594343, 59268241, 59124693, 57701775, 57490732, 69602749, 72756695], [49397877, 45113025, 44161998, 43929673, 44762011, 53663476, 56708592]]


x = np.array([np.array(r) / sum(map(float, r)) for r in result]).T

plot(x, linewidth=3)
xlim((0, 6))
xticks(xrange(7), 'Mon Tue Wed Thu Fri Sat Sun'.split())
legend(xrange(2007, 2013), loc='best')
show()

まとめ

ニコニコ動画の全部の動画とかをまとめてコメントの投稿時間の分布を調べました

月や年ごとに調べてみたら8月だけが大きく違った傾向でした
学生の夏休みの影響かと思うんですが、意外とはっきりした傾向がでました

今回はやっていませんが、動画のジャンルによって試聴する層が違うと思うので、コメントの投稿時間もジャンルによって違ったりするのがわかったら面白いですね