読者です 読者をやめる 読者になる 読者になる

唯物是真 @Scaled_Wurm

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

ツイート時間の分布をクラスタリングしてみた

python

前にツイート時間の分布の類似度を求めるというのをやりました

Twitterの投稿時間で類似度を計算してみた - 確率分布の類似度 - 唯物是真 @Scaled_Wurm

今回はツイート時間でユーザーをクラスタリングして、特徴的な投稿時間のパターンがあるのか調べてみます

データ収集

以前の記事と同様にTwilogの統計情報のところから時間ごとのツイート数を手動で取ってきた
Twilogの自分のアカウントのリプライやRTが多いユーザーの1ページ目で、統計情報が公開されているユーザーの時刻別ツイート数を収集
各ユーザーの時刻ごとのツイート数を相対頻度に変換した(24時間のツイート数の総和が1になるように)

以下に得られたデータを示す(それぞれの線がユーザーで縦軸が相対頻度、横軸が時刻)
大雑把に見ると、一部を除いて意外と似たような形をしている
f:id:sucrose:20141220223828p:plain

クラスタリング

得られたデータをK-means++法クラスタリングした
クラスタ数は適当に5と決めた

得られたクラスタ中心は以下のようになった(凡例のsizeの部分がそのクラスタに割り当てられたデータ数)
外れ値が多いのか大きさ1や2のクラスタができてしまっている
一番大きなクラスタ0は昼も夜もあまりツイート数が変わっていない
残りのクラスタは昼休みや夜中などの特定の時間だけツイートが増えるタイプが集まっているようにみえる
f:id:sucrose:20141220223845p:plain

クラスタに属するデータ

クラスタ中心(青い太線)と、そのクラスタに属するデータを描画してみました
f:id:sucrose:20141220223939p:plain
f:id:sucrose:20141220223951p:plain
f:id:sucrose:20141220224003p:plain
f:id:sucrose:20141220224016p:plain
f:id:sucrose:20141220224028p:plain

まとめ

ツイート時間でユーザーをクラスタリングしてみた
早朝少なくて昼や夜に増えるという似たようなパターンのユーザーが多かったので、結果としてはあまりおもしろくなかったかもしれない(サイズが小さなクラスタのユーザーは結構特徴的だったけど)

クラスタ数を変えたり、他のクラスタリング手法を試したりもしたのですが、クラスタリングの結果はよしあしがあまりわからなかったです……

ソースコード

import sklearn.cluster
import numpy as np
from pylab import *

data = np.loadtxt('data.csv', delimiter=',')
data = data / data.sum(axis=1)[:, np.newaxis]

cluster = sklearn.cluster.KMeans(5)
cluster.fit(data)

bincount = np.bincount(cluster.labels_)

lw = 1.0 * np.bincount(cluster.labels_) / np.min(np.bincount(cluster.labels_))

plot(data.T)
ylim(ymin = 0)
xlabel('hour')
xlim((0, 23))
show()
for i, p in enumerate(cluster.cluster_centers_):
    plot(p, linewidth = lw[i], label='cluster {}, size:{}'.format(i, bincount[i]))
ylim(ymin = 0)
xlim((0, 23))
xticks(range(data.shape[1]), range(data.shape[1]))
xlabel('hour')
legend(loc='best')
show()

for i in xrange(len(bincount)):
    plot(cluster.cluster_centers_[i], linewidth = 5, label='cluster {}, size:{}'.format(i, bincount[i]))
    plot(data[cluster.labels_ == i][:10, :].T)
    xticks(range(data.shape[1]), range(data.shape[1]))
    xlabel('hour')
    xlim((0, 23))
    ylim((np.min(data), np.max(data)))
    legend(loc='best')
    show()

収集したデータ

5864,2301,914,407,168,117,171,329,554,1218,1787,2608,3208,2836,3020,2664,2610,2733,3042,2988,3485,3230,4435,8275
130,28,20,50,13,23,68,489,369,236,96,152,460,217,117,164,168,165,186,427,583,520,336,262
8985,4243,1391,350,243,300,733,2486,5181,6164,5645,5122,4862,4919,4078,3559,3744,4311,4918,5585,5041,6080,8312,9093
1124,458,197,33,14,24,68,340,943,1342,788,893,1271,1034,888,863,871,923,906,1180,1574,1509,1668,1489
2435,1570,969,499,264,194,263,407,744,833,996,959,1556,1151,1004,1050,1320,1213,1279,1436,1900,1970,2578,2455
7481,3750,1201,500,348,344,610,1642,3366,5292,5469,5149,5263,4869,4023,3541,3618,3716,3944,4818,5028,6473,7594,8200
13,6,6,1,3,2,3,3,4,8,10,10,14,13,7,11,13,16,24,21,21,22,13,1
2422,1650,1217,521,371,377,340,498,1007,1297,1790,2080,2315,2122,1902,1827,1760,2014,2030,2216,2429,2732,2825,2702
3634,2909,2045,1305,914,889,1278,2150,2922,3229,3384,3259,4233,4479,3912,3574,3380,3505,3817,3934,3857,3788,3976,4020
1609,1452,840,657,375,319,341,259,483,769,1030,1274,1390,1507,1534,1776,1609,1723,1869,1719,1712,1887,1995,1794
6529,2669,718,402,389,330,549,2516,4679,4785,6327,7038,8251,7215,7301,6749,7324,7875,10822,10459,12206,15397,19041,14550
5053,2649,1700,818,538,309,2447,3998,2744,2363,2060,2221,5240,4028,2197,2093,1927,2837,3366,4899,6502,7124,6888,7139
2226,2037,1749,1324,852,473,568,845,1161,1456,1406,1466,1729,1885,1920,1997,1890,1794,1622,2190,2258,2079,2370,2403
2558,1859,694,72,15,12,21,254,874,721,1216,1579,1729,1147,1282,1449,1509,1730,1830,1737,1714,1859,2299,2484
399,220,121,66,57,80,117,185,219,281,319,338,363,362,426,412,460,489,546,454,506,578,602,528
16821,10211,4218,1141,360,148,235,1115,5128,2671,3668,5555,21317,7152,6832,7193,6833,7394,11123,15112,17374,19888,21715,22677
309,158,93,22,9,4,13,32,74,93,97,140,188,168,174,125,121,134,206,238,289,267,298,309
2043,1142,416,125,8,6,16,37,155,292,616,778,824,824,637,603,621,728,722,759,587,934,1566,1868
90,56,5,4,16,3,31,19,9,22,37,57,64,51,17,49,29,8,36,12,19,9,16,55
4115,3014,1624,549,205,158,165,347,795,768,1116,1413,1656,1769,1995,1834,2084,2007,1913,2295,1327,2295,2923,3670
670,413,210,120,92,74,72,21,44,121,161,256,302,309,264,244,305,312,271,267,371,423,559,658
533,443,812,192,139,191,151,208,285,278,340,370,403,359,400,395,418,473,446,421,450,532,563,624
292,179,44,8,1,2,5,33,57,71,82,116,128,127,103,94,79,129,95,94,84,108,153,222
1100,524,298,149,29,4,6,7,13,19,52,173,257,207,175,196,233,197,240,335,543,672,827,1047
2515,2129,1567,984,600,438,502,726,1040,1114,1349,1559,1675,1913,1584,1853,1729,2102,2236,2086,2412,2688,2490,2543
8530,7629,5860,3155,1384,811,546,593,1289,1753,2352,2950,3631,3815,4203,3623,3731,3590,3161,3153,3596,4495,5496,7026
409,219,127,147,119,175,191,235,505,898,712,593,713,588,567,511,447,554,598,723,822,689,715,643
4316,2578,1151,698,520,691,1462,2147,2681,5456,3395,3641,4450,3057,2637,2624,2563,3046,2735,2865,2957,3418,3974,4449
3731,2699,1667,1479,823,632,684,1171,1980,2907,2146,1195,1461,1465,1441,1307,1100,1121,1048,1212,1511,2193,2945,3751
66,5,3,0,2,0,10,484,860,31010,7489,4085,6999,8605,5032,5533,5465,6358,6123,12978,16446,4746,6087,27843
1400,403,387,579,1620,3548,3824,4562,6864,4085,4399,5052,6077,4282,4460,4997,5616,6398,7950,6761,7202,7071,5725,3606
524,323,90,30,4,3,15,26,39,38,47,41,67,34,68,35,43,61,94,94,53,133,238,411
3383,2664,1985,1273,724,492,313,311,280,427,314,476,724,973,1097,1242,1517,1145,970,968,957,1440,1810,2509
1269,717,463,113,26,49,184,215,549,387,580,750,1357,1644,1137,1046,1058,977,955,912,984,1197,1303,1380
915,258,35,1,3,10,32,258,425,331,203,202,307,491,459,504,569,722,517,662,1257,1724,1821,1343
1653,1527,1295,772,174,19,11,25,65,114,1734,2785,2618,3040,2686,2636,2198,2330,2082,1628,1168,1128,1223,1566
2099,2087,1882,1293,914,592,561,689,787,1213,1564,1965,1939,1864,1769,2275,2187,2159,1913,1894,1981,1933,2274,2029
37,13,9,4,0,2,1,6,7,9,7,13,25,47,42,38,49,77,92,122,256,158,175,169
229,193,127,119,120,61,73,86,102,117,105,117,148,145,161,180,188,170,208,233,237,257,252,260
7751,6923,4436,1657,664,369,318,266,564,966,1449,2056,3019,3693,3497,3815,3936,4107,4742,4517,4444,4806,6569,7707
2319,1880,1262,765,437,225,220,369,724,871,1017,1187,1292,1567,1447,1507,1614,1655,1724,1756,1814,1827,2094,2214
3032,2055,1029,517,296,182,183,323,1157,2966,4105,5689,6962,8049,6468,6763,6980,8362,8951,6635,4540,5277,4551,3968
-->