统计和分析直播数据
直播数据下载路径:http://106.75.8.220/zhibo/
数据格式:
第一列:liveid
(直播间id号)
第二列:commentid
(每个弹幕有一个对的id号)
第三列:username
(发弹幕的人名)
第四列:content
(发弹幕内容)
第五列:refreshTime
(抓取弹幕的时间)
第六列:timestamp
(弹幕发布时间)
第七列:publisherId
(弹幕发布人id)
第八列:fanLevel
(弹幕发布人的等级)
第九列:VIP_USER
(弹幕发布人是否是VIP用户)
数据简介:
例如这样一条记录的含义是:
260165944888 260621122730 lia阿蕾
助力湖北 1587471012763 1587471011000
2762218778 11 0
这条记录用中文来说就是:有一个用户叫lia阿蕾 在 时间1587471011000 发布了一条内容为“助力湖北”的弹幕到ID号为260165944888的直播间内。被我们在时间1587471012763抓到。此外这个叫lia阿蕾的用户id是2762218778,等级是11,非VIP用户(如果是VIP用户这里是1)。
我们一共提供3个主播的数据。其中有一个主播提供3场直播弹幕数据。分别是a.log.7z b.log.7z,c.log.7z 另外两个主播的弹幕数据存放在d.log.7z和4.log.7z内。每一个文件是一个完整直播场次这个主播的全部弹幕。比如a.log存放了主播甲在4月20日晚这场直播的全部弹幕数据。
我们的统计任务包含以下内容
- 通过直播数据估计每场直播真实在线人数,总的停留时间,平均停留时间。
假定一个粉丝在直播间第一次发弹幕是时刻X,最后一次发弹幕是时刻Y。那么他的在线时间就是Y-X。
我们需要估计每场直播吸引人的程度,主要看主播抓人(吸引人)的能力。我们要计算出每个粉丝的停留时间,然后求出平均值,计算每场直播,发弹幕的总人数,所有用户总停留时间和平均停留时间。
过滤脏数据,去除列数不为9,和第七列为 9151314442816847872 的数据
chao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_clean a.log > a.log.cleanchao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_clean b.log > b.log.cleanchao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_clean c.log > c.log.cleanchao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_clean d.log > d.log.cleanchao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_clean e.log > e.log.cleanchao@chao:~/myspace/home_work2$ cat awkfile_clean{if(NF == 9 && $7 != 9151314442816847872) {print $0}}
统计每个粉丝的停留时间:
chao@chao:~/myspace/home_work2$ cat a.log.clean | sort -t $'\t' -k7,7n -k6,6n | awk -F '\t' -f awkfile_1_1 | sort -k2,2nr > tempchao@chao:~/myspace/home_work2$ cat awkfile_1_1BEGIN {last_user_id="";last_time=0;cur_time=0;}{if (last_time == 0) {last_user_id = $7;last_time = $6;cur_time = $6;}if($7 != last_user_id) {printf "%s\t%s\n", last_user_id, cur_time - last_timelast_user_id = $7;last_time = $6;cur_time = $6;} else {cur_time = $6;}}END {printf "%s\t%s\n", last_user_id, cur_time - last_time}# 检查数据格式是否正确chao@chao:~/myspace/home_work2$ awk -F '\t' '$2<0' tempchao@chao:~/myspace/home_work2$ head temp2702056137 61661000765248765 56186000796443315 550350001753420674 53175000651129261 523600002366630168 50968000788881861 50869000631994858 49020000644730287 489440004149828222 48650000
所有用户总停留时间和用户总数和平均停留时间,在线时长为0的用户不参与平均值计算
chao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_1_2 temptotal time: 27855741total users: 14861average time: 1874.42chao@chao:~/myspace/home_work2$ cat awkfile_1_2BEGIN {total_time = 0; total_user = 0;}{if ($2 == 0) {exit;}total_time += ($2 / 1000);total_user ++;}END {printf "total time: %s\n", total_time;printf "total users: %s\n", total_user;printf "average time: %s\n", total_time / total_user;}
统计每个场次的所有用户总停留时间和用户总数和平均停留时间
| 场次 | 总停留时间(s) | 用户总数 | 平均停留时间(s) |
|---|---|---|---|
| a | 27855741 | 14861 | 1874.42 |
| b | 63039333 | 40824 | 1544.17 |
| c | 65343045 | 35946 | 1817.81 |
| d | 19610590 | 14560 | 1346.88 |
| e | 39207048 | 28855 | 1358.76 |
- 我们要估计一个主播的铁粉人数多寡。来衡量这个主播在粉丝中的影响力。
我们这边有一个主播抓了3次直播数据,分别时a,log,b.log和c.log。我们给铁粉的定义是:同时在这3场直播中发过弹幕。铁粉率的计算方法是用3场直播发过弹幕的用户人数/最小一场直播的用户总人数。利用这三个文件计算这个主播的铁粉率。
注意:直播的用户总人数要去重。加入一场直播的弹幕数据如下:
甲:弹幕a
乙:弹幕b
丁:弹幕c
甲:弹幕d
如果不去重,这场直播的总人次是4,如果按人头去重,总人数是3人。请注意总人数和总人次数的区别。
# 计算每场直播的总人数chao@chao:~/myspace/home_work2$ cat a.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > a.tempchao@chao:~/myspace/home_work2$ cat b.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > b.tempchao@chao:~/myspace/home_work2$ cat c.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > c.tempchao@chao:~/myspace/home_work2$ wc -l a.temp65107 a.tempchao@chao:~/myspace/home_work2$ wc -l b.temp118121 b.tempchao@chao:~/myspace/home_work2$ wc -l c.temp116466 c.temp# 计算铁粉的数量chao@chao:~/myspace/home_work2$ cat a.temp b.temp c.temp > tempchao@chao:~/myspace/home_work2$ sort temp | uniq -c | awk '{if($1==3){print $0;}}' | wc -l3240
铁粉率 = 3240/65107 = 4.97%
- 一个品牌商打算在直播的过程中投放商品,不同时段价格(坑位费)是有很大差距的,罗永浩一场直播2个小时,前人数多,后面人数少,坑位费价格一样是不合理的。那么我们通过计算每10分钟发出弹幕的总人数来计算判断坑位费的大小。
假定一场直播从9:00开始到12:00结束。那么我们用发布时间(第六列)来将发弹幕的用户投射到这每10分钟的通内,然后计算总人数。例如弹幕文件数如下:
9:00 用户a,弹幕xx
9:01 用户b,弹幕yy
9:01 用户c,弹幕zz
9:05 用户c,弹幕aa
9:09 用户a,弹幕bb
9:10 用户f,弹幕kk
那么9:00-9:09分这个时间段(10分钟内)发弹幕的总人数是3人。
我们用每个时间段的起始作为起点,输出类似如下文件:
9:00 3人
(这个表示9:00-9:09分这个时间段有3人发弹幕)
9:10 5人
(这个表示9:10-9:19分这个时间段有5人发弹幕)
…
由于每场直播总人数差别很大,这样的统计场次和场次之间没法比较,我们将这个数值/总人数。那么这个物理含义是在每个10分钟,今天来访的客人中多少人在这个时间段是停留的。假定总人数是100人,那么上面文件应该如下:
9:00 0.03 (这个表示9:00-9:09分这个时间段有当天3%的人进行了停留)
9:10 0.05 (这个表示9:10-9:19分这个时间段有当天5%的人进行了停留)
…
对5个文件都做上面的统计工作,你就可以看到每个主播什么时刻人数达到了平衡,即来的和走的大致相当,发弹幕的用户人数不再增长。什么时候开始显著减退,从而给后续数分析人员提供数据参考。
chao@chao:~/myspace/home_work2$ cat a.log.clean | sort -t $'\t' -k6,6n -k7 | gawk -F '\t' -v total=65107 -f awkfile_3_1 > a.tempchao@chao:~/myspace/home_work2$ cat b.log.clean | sort -t $'\t' -k6,6n -k7 | gawk -F '\t' -v total=118121 -f awkfile_3_1 > b.tempchao@chao:~/myspace/home_work2$ cat c.log.clean | sort -t $'\t' -k6,6n -k7 | gawk -F '\t' -v total=116466 -f awkfile_3_1 > c.tempchao@chao:~/myspace/home_work2$ cat d.log.clean | sort -t $'\t' -k6,6n -k7 | gawk -F '\t' -v total=27087 -f awkfile_3_1 > d.tempchao@chao:~/myspace/home_work2$ cat e.log.clean | sort -t $'\t' -k6,6n -k7 | gawk -F '\t' -v total=103985 -f awkfile_3_1 > e.temp# 计算每个时间段内的停留率,删除停留率小于1%的时间段chao@chao:~/myspace/home_work2$ cat awkfile_3_1BEGIN {start_time=0;last_user_id="";count=0;}{if (start_time == 0) {start_time = $6;last_user_id = $7;count = 1;next;}if (($6 - start_time) < 600000) {if (last_user_id == $7) {next;}count++;last_user_id = $7;} else {rate = count/totalif (rate >= 0.01) {print strftime("%H:%M", start_time/1000), rate;}start_time += 600000while (($6 - start_time) > 600000) {start_time += 600000;}count = 1;last_user_id = $7;}}END {rate = count/totalif (rate >= 0.01) {print strftime("%H:%M", start_time/1000), rate;}}
计算结果
chao@chao:~/myspace/home_work2$ cat a.temp20:10 0.047153120:20 0.047122420:30 0.046876720:40 0.047168520:50 0.047137821:00 0.047199221:10 0.047982621:20 0.046323721:30 0.047460321:40 0.048166921:50 0.046876722:00 0.047706122:10 0.046692422:20 0.047199222:30 0.046815222:40 0.066859222:50 0.082479623:00 0.086764923:10 0.083001823:20 0.083677623:30 0.085121423:40 0.087809323:50 0.087440700:00 0.077380300:10 0.0162655chao@chao:~/myspace/home_work2$ cat b.temp20:08 0.092388320:18 0.096291120:28 0.097230820:38 0.096951420:48 0.088299320:58 0.087791321:08 0.096697521:18 0.10019421:28 0.09928821:38 0.091304721:48 0.090051721:58 0.092303722:08 0.087063322:18 0.098094322:28 0.090991422:38 0.10089722:48 0.083829322:58 0.080307523:08 0.088688723:18 0.085598723:28 0.0828896chao@chao:~/myspace/home_work2$ cat c.temp20:06 0.085887720:16 0.079705720:26 0.080100620:36 0.081895120:46 0.073721120:56 0.077842521:06 0.071737721:16 0.068389121:26 0.069264821:36 0.10349821:46 0.080890621:56 0.078014222:06 0.08083922:16 0.087012522:26 0.092413222:36 0.086402922:46 0.087630722:56 0.066551623:06 0.061580223:16 0.076709123:26 0.068938623:36 0.066869323:46 0.066886523:56 0.0713942chao@chao:~/myspace/home_work2$ cat d.temp19:52 0.029977520:02 0.21593420:12 0.18802420:22 0.17779720:32 0.18783920:42 0.15498220:52 0.1560921:02 0.16088921:12 0.12984121:22 0.15420721:32 0.12950921:42 0.16048321:52 0.15944922:02 0.20463722:12 0.21578622:22 0.14154422:32 0.13523122:42 0.1306922:52 0.098275923:02 0.091852223:12 0.085649923:22 0.089637123:32 0.07797123:42 0.091150723:52 0.11813800:02 0.2515600:12 0.125374chao@chao:~/myspace/home_work2$ cat e.temp20:15 0.081771420:25 0.084329520:35 0.087195320:45 0.073222120:55 0.070846821:05 0.072500821:15 0.072741321:25 0.070365921:35 0.087031821:45 0.070904521:55 0.06007622:05 0.072779722:15 0.077934322:25 0.086156722:35 0.079732722:45 0.072010422:55 0.070789123:05 0.057412123:15 0.056719723:25 0.057008223:35 0.0248882
- 找到最活跃的粉丝,我们一共有不同时间段的5场直播数据,我们想知道哪些用户看了多长直播成为活跃的粉丝。我们定义活跃粉丝如下:
如果一个用户在5场直播中的任意4场或者5场都发布过弹幕就算是活跃粉丝。找到这些用户,并且计算这些用户的总人数,同时把5场直播的总人数计算出来(注意要去重)。用活跃粉丝总人数/用户总人数,得到一个数值,给数据分析人员提供分析参考。
# 统计每场的人数chao@chao:~/myspace/home_work2$ cat a.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > a.tempchao@chao:~/myspace/home_work2$ cat b.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > b.tempchao@chao:~/myspace/home_work2$ cat c.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > c.tempchao@chao:~/myspace/home_work2$ cat d.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > d.tempchao@chao:~/myspace/home_work2$ cat e.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > e.temp# 合并每场人数chao@chao:~/myspace/home_work2$ cat a.temp b.temp c.temp d.temp e.temp > temp# 计算活跃用户数chao@chao:~/myspace/home_work2$ cat temp | sort | uniq -c | awk -f awkfile_4_1active users: 887total users: 371612active rate: 0.0023869chao@chao:~/myspace/home_work2$ cat awkfile_4_1BEGIN {active=0;}{if ($1 > 3) {active++;}}END {print "active users: ", active;print "total users: ", NR;print "active rate: ", active / NR;}
我们选择b.log,d.log和e.log这三个主播的直播数据来做统计,计算出参与弹幕的粉丝中VIP用户的总人数占直播总人数的比例,三个明星进行一次PK,看谁的VIP用户比例最高。
chao@chao:~/myspace/home_work2$ cat b.log.clean | sort -t $'\t' -k9,9nr -k7 | awk -F '\t' '{if($9==1)print $7}' | uniq | wc -l50865chao@chao:~/myspace/home_work2$ cat d.log.clean | sort -t $'\t' -k9,9nr -k7 | awk -F '\t' '{if($9==1)print $7}' | uniq | wc -l11514chao@chao:~/myspace/home_work2$ cat e.log.clean | sort -t $'\t' -k9,9nr -k7 | awk -F '\t' '{if($9==1)print $7}' | uniq | wc -l46829
弹幕内容的分析,找到哪些弹幕句子是被使用最多的。找到每个主播排名前100的句子。例如主播A的弹幕有如下句子:
用户a 小龙虾上了
用户b 助力湖北
用户a 小龙虾粽子
用户c 助力湖北
用户d 小龙虾粽子还有吗
用户f 小龙虾粽子
用户b 小龙虾粽子
用户g 助力湖北
那么最终“小龙虾粽子”分别有bf(b提过两次这里需要去重)两个用户提到。“助力湖北”分别有bcg三个用户提到,所以助力湖北应该排第一。
# 统计关键字数量chao@chao:~/myspace/home_work2$ export LC_ALL=Cchao@chao:~/myspace/home_work2$ cat a.log.clean | sort -t $'\t' -k4,4 -k7,7 | awk -F '\t' '{print $7, $4}' | uniq | uniq -f 1 -c | sort -k1,1nr > a.tempchao@chao:~/myspace/home_work2$ cat b.log.clean | sort -t $'\t' -k4,4 -k7,7 | awk -F '\t' '{print $7, $4}' | uniq | uniq -f 1 -c | sort -k1,1nr > b.tempchao@chao:~/myspace/home_work2$ cat c.log.clean | sort -t $'\t' -k4,4 -k7,7 | awk -F '\t' '{print $7, $4}' | uniq | uniq -f 1 -c | sort -k1,1nr > c.tempchao@chao:~/myspace/home_work2$ cat d.log.clean | sort -t $'\t' -k4,4 -k7,7 | awk -F '\t' '{print $7, $4}' | uniq | uniq -f 1 -c | sort -k1,1nr > d.tempchao@chao:~/myspace/home_work2$ cat e.log.clean | sort -t $'\t' -k4,4 -k7,7 | awk -F '\t' '{print $7, $4}' | uniq | uniq -f 1 -c | sort -k1,1nr > e.temp# 每场直播前10的弹幕句子chao@chao:~/myspace/home_work2$ head a.temp6430 100326148 哆啦薇娅5372 10046774 助力湖北5134 10042563 ,3313 10024992 华为荣耀2776 10023670 ⁂∰⏇follow2089 100902634 欧惠1855 100133689 玉米1757 100068763 。1573 10016886 后天晚上见1314 1012975111 香奈儿chao@chao:~/myspace/home_work2$ head b.temp13238 100002650 ,10708 10003964 读书日6061 100281758 内衣5777 100050181 美白四件套5092 10003964 皮囊4512 100571123 。3020 100031664 我要去故宫2891 100043431 ⁂∰⏇follow2651 1009701924 大老师2001 100554184 哆啦薇娅chao@chao:~/myspace/home_work2$ head c.temp13276 100061875 ,6809 100921399 江江4830 100061357 康巴赫4674 100068763 。4003 100250373 哆啦薇娅3821 100291894 希思黎3655 100201493 熬夜霜3397 1001948296 电风扇3362 100801581 3ce3344 100532794 气垫chao@chao:~/myspace/home_work2$ head d.temp3864 100043431 ⁂∰⏇follow3657 100475312 回忆经典2448 100235835 ,1069 100705026 。973 1002918157 小城故事436 100043431 好看400 1028235658 烈爱小火苗261 1025864830 没了225 1022924336 .222 1014100064 发夹chao@chao:~/myspace/home_work2$ head e.temp8091 100061875 ,4491 100017400 。3688 1000879019 ⁂∰⏇follow2983 100025976 拖鞋2166 100315498 小助理呢1294 10115197 .1280 101084132 没了1222 1014273028 哈哈哈1217 100171939 好看1197 10012402 买
