统计和分析直播数据

    直播数据下载路径: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日晚这场直播的全部弹幕数据。

    我们的统计任务包含以下内容

    1. 通过直播数据估计每场直播真实在线人数,总的停留时间,平均停留时间。

    假定一个粉丝在直播间第一次发弹幕是时刻X,最后一次发弹幕是时刻Y。那么他的在线时间就是Y-X。

    我们需要估计每场直播吸引人的程度,主要看主播抓人(吸引人)的能力。我们要计算出每个粉丝的停留时间,然后求出平均值,计算每场直播,发弹幕的总人数,所有用户总停留时间和平均停留时间。

    过滤脏数据,去除列数不为9,和第七列为 9151314442816847872 的数据

    1. chao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_clean a.log > a.log.clean
    2. chao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_clean b.log > b.log.clean
    3. chao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_clean c.log > c.log.clean
    4. chao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_clean d.log > d.log.clean
    5. chao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_clean e.log > e.log.clean
    6. chao@chao:~/myspace/home_work2$ cat awkfile_clean
    7. {
    8. if(NF == 9 && $7 != 9151314442816847872) {
    9. print $0
    10. }
    11. }

    统计每个粉丝的停留时间:

    1. 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 > temp
    2. chao@chao:~/myspace/home_work2$ cat awkfile_1_1
    3. BEGIN {last_user_id="";last_time=0;cur_time=0;}
    4. {
    5. if (last_time == 0) {
    6. last_user_id = $7;
    7. last_time = $6;
    8. cur_time = $6;
    9. }
    10. if($7 != last_user_id) {
    11. printf "%s\t%s\n", last_user_id, cur_time - last_time
    12. last_user_id = $7;
    13. last_time = $6;
    14. cur_time = $6;
    15. } else {
    16. cur_time = $6;
    17. }
    18. }
    19. END {printf "%s\t%s\n", last_user_id, cur_time - last_time}
    20. # 检查数据格式是否正确
    21. chao@chao:~/myspace/home_work2$ awk -F '\t' '$2<0' temp
    22. chao@chao:~/myspace/home_work2$ head temp
    23. 2702056137 61661000
    24. 765248765 56186000
    25. 796443315 55035000
    26. 1753420674 53175000
    27. 651129261 52360000
    28. 2366630168 50968000
    29. 788881861 50869000
    30. 631994858 49020000
    31. 644730287 48944000
    32. 4149828222 48650000

    所有用户总停留时间和用户总数和平均停留时间,在线时长为0的用户不参与平均值计算

    1. chao@chao:~/myspace/home_work2$ awk -F '\t' -f awkfile_1_2 temp
    2. total time: 27855741
    3. total users: 14861
    4. average time: 1874.42
    5. chao@chao:~/myspace/home_work2$ cat awkfile_1_2
    6. BEGIN {total_time = 0; total_user = 0;}
    7. {
    8. if ($2 == 0) {
    9. exit;
    10. }
    11. total_time += ($2 / 1000);
    12. total_user ++;
    13. }
    14. END {
    15. printf "total time: %s\n", total_time;
    16. printf "total users: %s\n", total_user;
    17. printf "average time: %s\n", total_time / total_user;
    18. }

    统计每个场次的所有用户总停留时间和用户总数和平均停留时间

    场次 总停留时间(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
    1. 我们要估计一个主播的铁粉人数多寡。来衡量这个主播在粉丝中的影响力。

    我们这边有一个主播抓了3次直播数据,分别时a,log,b.log和c.log。我们给铁粉的定义是:同时在这3场直播中发过弹幕。铁粉率的计算方法是用3场直播发过弹幕的用户人数/最小一场直播的用户总人数。利用这三个文件计算这个主播的铁粉率。
    注意:直播的用户总人数要去重。加入一场直播的弹幕数据如下:
    甲:弹幕a
    乙:弹幕b
    丁:弹幕c
    甲:弹幕d
    如果不去重,这场直播的总人次是4,如果按人头去重,总人数是3人。请注意总人数和总人次数的区别。

    1. # 计算每场直播的总人数
    2. chao@chao:~/myspace/home_work2$ cat a.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > a.temp
    3. chao@chao:~/myspace/home_work2$ cat b.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > b.temp
    4. chao@chao:~/myspace/home_work2$ cat c.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > c.temp
    5. chao@chao:~/myspace/home_work2$ wc -l a.temp
    6. 65107 a.temp
    7. chao@chao:~/myspace/home_work2$ wc -l b.temp
    8. 118121 b.temp
    9. chao@chao:~/myspace/home_work2$ wc -l c.temp
    10. 116466 c.temp
    11. # 计算铁粉的数量
    12. chao@chao:~/myspace/home_work2$ cat a.temp b.temp c.temp > temp
    13. chao@chao:~/myspace/home_work2$ sort temp | uniq -c | awk '{if($1==3){print $0;}}' | wc -l
    14. 3240

    铁粉率 = 3240/65107 = 4.97%

    1. 一个品牌商打算在直播的过程中投放商品,不同时段价格(坑位费)是有很大差距的,罗永浩一场直播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个文件都做上面的统计工作,你就可以看到每个主播什么时刻人数达到了平衡,即来的和走的大致相当,发弹幕的用户人数不再增长。什么时候开始显著减退,从而给后续数分析人员提供数据参考。

    1. 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.temp
    2. chao@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.temp
    3. chao@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.temp
    4. chao@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.temp
    5. chao@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
    6. # 计算每个时间段内的停留率,删除停留率小于1%的时间段
    7. chao@chao:~/myspace/home_work2$ cat awkfile_3_1
    8. BEGIN {start_time=0;last_user_id="";count=0;}
    9. {
    10. if (start_time == 0) {
    11. start_time = $6;
    12. last_user_id = $7;
    13. count = 1;
    14. next;
    15. }
    16. if (($6 - start_time) < 600000) {
    17. if (last_user_id == $7) {
    18. next;
    19. }
    20. count++;
    21. last_user_id = $7;
    22. } else {
    23. rate = count/total
    24. if (rate >= 0.01) {
    25. print strftime("%H:%M", start_time/1000), rate;
    26. }
    27. start_time += 600000
    28. while (($6 - start_time) > 600000) {
    29. start_time += 600000;
    30. }
    31. count = 1;
    32. last_user_id = $7;
    33. }
    34. }
    35. END {
    36. rate = count/total
    37. if (rate >= 0.01) {
    38. print strftime("%H:%M", start_time/1000), rate;
    39. }
    40. }

    计算结果

    1. chao@chao:~/myspace/home_work2$ cat a.temp
    2. 20:10 0.0471531
    3. 20:20 0.0471224
    4. 20:30 0.0468767
    5. 20:40 0.0471685
    6. 20:50 0.0471378
    7. 21:00 0.0471992
    8. 21:10 0.0479826
    9. 21:20 0.0463237
    10. 21:30 0.0474603
    11. 21:40 0.0481669
    12. 21:50 0.0468767
    13. 22:00 0.0477061
    14. 22:10 0.0466924
    15. 22:20 0.0471992
    16. 22:30 0.0468152
    17. 22:40 0.0668592
    18. 22:50 0.0824796
    19. 23:00 0.0867649
    20. 23:10 0.0830018
    21. 23:20 0.0836776
    22. 23:30 0.0851214
    23. 23:40 0.0878093
    24. 23:50 0.0874407
    25. 00:00 0.0773803
    26. 00:10 0.0162655
    27. chao@chao:~/myspace/home_work2$ cat b.temp
    28. 20:08 0.0923883
    29. 20:18 0.0962911
    30. 20:28 0.0972308
    31. 20:38 0.0969514
    32. 20:48 0.0882993
    33. 20:58 0.0877913
    34. 21:08 0.0966975
    35. 21:18 0.100194
    36. 21:28 0.099288
    37. 21:38 0.0913047
    38. 21:48 0.0900517
    39. 21:58 0.0923037
    40. 22:08 0.0870633
    41. 22:18 0.0980943
    42. 22:28 0.0909914
    43. 22:38 0.100897
    44. 22:48 0.0838293
    45. 22:58 0.0803075
    46. 23:08 0.0886887
    47. 23:18 0.0855987
    48. 23:28 0.0828896
    49. chao@chao:~/myspace/home_work2$ cat c.temp
    50. 20:06 0.0858877
    51. 20:16 0.0797057
    52. 20:26 0.0801006
    53. 20:36 0.0818951
    54. 20:46 0.0737211
    55. 20:56 0.0778425
    56. 21:06 0.0717377
    57. 21:16 0.0683891
    58. 21:26 0.0692648
    59. 21:36 0.103498
    60. 21:46 0.0808906
    61. 21:56 0.0780142
    62. 22:06 0.080839
    63. 22:16 0.0870125
    64. 22:26 0.0924132
    65. 22:36 0.0864029
    66. 22:46 0.0876307
    67. 22:56 0.0665516
    68. 23:06 0.0615802
    69. 23:16 0.0767091
    70. 23:26 0.0689386
    71. 23:36 0.0668693
    72. 23:46 0.0668865
    73. 23:56 0.0713942
    74. chao@chao:~/myspace/home_work2$ cat d.temp
    75. 19:52 0.0299775
    76. 20:02 0.215934
    77. 20:12 0.188024
    78. 20:22 0.177797
    79. 20:32 0.187839
    80. 20:42 0.154982
    81. 20:52 0.15609
    82. 21:02 0.160889
    83. 21:12 0.129841
    84. 21:22 0.154207
    85. 21:32 0.129509
    86. 21:42 0.160483
    87. 21:52 0.159449
    88. 22:02 0.204637
    89. 22:12 0.215786
    90. 22:22 0.141544
    91. 22:32 0.135231
    92. 22:42 0.13069
    93. 22:52 0.0982759
    94. 23:02 0.0918522
    95. 23:12 0.0856499
    96. 23:22 0.0896371
    97. 23:32 0.077971
    98. 23:42 0.0911507
    99. 23:52 0.118138
    100. 00:02 0.25156
    101. 00:12 0.125374
    102. chao@chao:~/myspace/home_work2$ cat e.temp
    103. 20:15 0.0817714
    104. 20:25 0.0843295
    105. 20:35 0.0871953
    106. 20:45 0.0732221
    107. 20:55 0.0708468
    108. 21:05 0.0725008
    109. 21:15 0.0727413
    110. 21:25 0.0703659
    111. 21:35 0.0870318
    112. 21:45 0.0709045
    113. 21:55 0.060076
    114. 22:05 0.0727797
    115. 22:15 0.0779343
    116. 22:25 0.0861567
    117. 22:35 0.0797327
    118. 22:45 0.0720104
    119. 22:55 0.0707891
    120. 23:05 0.0574121
    121. 23:15 0.0567197
    122. 23:25 0.0570082
    123. 23:35 0.0248882
    1. 找到最活跃的粉丝,我们一共有不同时间段的5场直播数据,我们想知道哪些用户看了多长直播成为活跃的粉丝。我们定义活跃粉丝如下:

    如果一个用户在5场直播中的任意4场或者5场都发布过弹幕就算是活跃粉丝。找到这些用户,并且计算这些用户的总人数,同时把5场直播的总人数计算出来(注意要去重)。用活跃粉丝总人数/用户总人数,得到一个数值,给数据分析人员提供分析参考。

    1. # 统计每场的人数
    2. chao@chao:~/myspace/home_work2$ cat a.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > a.temp
    3. chao@chao:~/myspace/home_work2$ cat b.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > b.temp
    4. chao@chao:~/myspace/home_work2$ cat c.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > c.temp
    5. chao@chao:~/myspace/home_work2$ cat d.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > d.temp
    6. chao@chao:~/myspace/home_work2$ cat e.log.clean | sort -t $'\t' -k7,7n | awk -F '\t' '{print $7}' | uniq > e.temp
    7. # 合并每场人数
    8. chao@chao:~/myspace/home_work2$ cat a.temp b.temp c.temp d.temp e.temp > temp
    9. # 计算活跃用户数
    10. chao@chao:~/myspace/home_work2$ cat temp | sort | uniq -c | awk -f awkfile_4_1
    11. active users: 887
    12. total users: 371612
    13. active rate: 0.0023869
    14. chao@chao:~/myspace/home_work2$ cat awkfile_4_1
    15. BEGIN {active=0;}
    16. {
    17. if ($1 > 3) {
    18. active++;
    19. }
    20. }
    21. END {
    22. print "active users: ", active;
    23. print "total users: ", NR;
    24. print "active rate: ", active / NR;
    25. }
    1. 我们选择b.log,d.log和e.log这三个主播的直播数据来做统计,计算出参与弹幕的粉丝中VIP用户的总人数占直播总人数的比例,三个明星进行一次PK,看谁的VIP用户比例最高。

      1. 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 -l
      2. 50865
      3. chao@chao:~/myspace/home_work2$ cat d.log.clean | sort -t $'\t' -k9,9nr -k7 | awk -F '\t' '{if($9==1)print $7}' | uniq | wc -l
      4. 11514
      5. chao@chao:~/myspace/home_work2$ cat e.log.clean | sort -t $'\t' -k9,9nr -k7 | awk -F '\t' '{if($9==1)print $7}' | uniq | wc -l
      6. 46829
    2. 弹幕内容的分析,找到哪些弹幕句子是被使用最多的。找到每个主播排名前100的句子。例如主播A的弹幕有如下句子:

    用户a 小龙虾上了
    用户b 助力湖北
    用户a 小龙虾粽子
    用户c 助力湖北
    用户d 小龙虾粽子还有吗
    用户f 小龙虾粽子
    用户b 小龙虾粽子
    用户g 助力湖北
    那么最终“小龙虾粽子”分别有bf(b提过两次这里需要去重)两个用户提到。“助力湖北”分别有bcg三个用户提到,所以助力湖北应该排第一。

    1. # 统计关键字数量
    2. chao@chao:~/myspace/home_work2$ export LC_ALL=C
    3. chao@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.temp
    4. chao@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.temp
    5. chao@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.temp
    6. chao@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.temp
    7. chao@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
    8. # 每场直播前10的弹幕句子
    9. chao@chao:~/myspace/home_work2$ head a.temp
    10. 6430 100326148 哆啦薇娅
    11. 5372 10046774 助力湖北
    12. 5134 10042563
    13. 3313 10024992 华为荣耀
    14. 2776 10023670 ⁂∰⏇follow
    15. 2089 100902634 欧惠
    16. 1855 100133689 玉米
    17. 1757 100068763
    18. 1573 10016886 后天晚上见
    19. 1314 1012975111 香奈儿
    20. chao@chao:~/myspace/home_work2$ head b.temp
    21. 13238 100002650
    22. 10708 10003964 读书日
    23. 6061 100281758 内衣
    24. 5777 100050181 美白四件套
    25. 5092 10003964 皮囊
    26. 4512 100571123
    27. 3020 100031664 我要去故宫
    28. 2891 100043431 ⁂∰⏇follow
    29. 2651 1009701924 大老师
    30. 2001 100554184 哆啦薇娅
    31. chao@chao:~/myspace/home_work2$ head c.temp
    32. 13276 100061875
    33. 6809 100921399 江江
    34. 4830 100061357 康巴赫
    35. 4674 100068763
    36. 4003 100250373 哆啦薇娅
    37. 3821 100291894 希思黎
    38. 3655 100201493 熬夜霜
    39. 3397 1001948296 电风扇
    40. 3362 100801581 3ce
    41. 3344 100532794 气垫
    42. chao@chao:~/myspace/home_work2$ head d.temp
    43. 3864 100043431 ⁂∰⏇follow
    44. 3657 100475312 回忆经典
    45. 2448 100235835
    46. 1069 100705026
    47. 973 1002918157 小城故事
    48. 436 100043431 好看
    49. 400 1028235658 烈爱小火苗
    50. 261 1025864830 没了
    51. 225 1022924336 .
    52. 222 1014100064 发夹
    53. chao@chao:~/myspace/home_work2$ head e.temp
    54. 8091 100061875
    55. 4491 100017400
    56. 3688 1000879019 ⁂∰⏇follow
    57. 2983 100025976 拖鞋
    58. 2166 100315498 小助理呢
    59. 1294 10115197 .
    60. 1280 101084132 没了
    61. 1222 1014273028 哈哈哈
    62. 1217 100171939 好看
    63. 1197 10012402