文号
t79947
阅读
5771
回复
6
收藏
2
利用ArangoDB做科创论坛学术分统计
2016/05/15
IP:广东
最近在做数据库迁移,从MySQL到ArangoDB.
PHPWind的schema简直跟垃圾堆一样,如果PW开发组的在天之灵能听见,希望他们把这段话录下来,每天放30遍。
以下是用户数据(局部)……

QQ截图20160515142711.jpg



以下是一个user对象的新貌:
QQ截图20160515142546.jpg


既然现在手上有所有人的学术分数据(截止到14年12月),不妨做个小统计吧。我们希望知道,在过去的n年中,每年注册的用户数量,以及这些用户中至少有1个学术分的用户的数量。


下面是我用的ArangoDB查询语句(AQL)


QQ截图20160515143942.jpg



我们按照yearsback分组,通过timestamp筛选,最后统计结果。


以下是输出:
[
  {
    "y": 9,
    "oldusers": 2240,
    "oldusers_xsf": 74,
    "ratio": 0.033035714285714286
  },
  {
    "y": 8,
    "oldusers": 2983,
    "oldusers_xsf": 62,
    "ratio": 0.02078444518940664
  },
  {
    "y": 7,
    "oldusers": 5522,
    "oldusers_xsf": 58,
    "ratio": 0.010503440782325244
  },
  {
    "y": 6,
    "oldusers": 5927,
    "oldusers_xsf": 70,
    "ratio": 0.011810359372363759
  },
  {
    "y": 5,
    "oldusers": 11182,
    "oldusers_xsf": 52,
    "ratio": 0.004650330888928635
  },
  {
    "y": 4,
    "oldusers": 7064,
    "oldusers_xsf": 24,
    "ratio": 0.0033975084937712344
  },
  {
    "y": 3,
    "oldusers": 7031,
    "oldusers_xsf": 15,
    "ratio": 0.002133409187882236
  },
  {
    "y": 2,
    "oldusers": 5685,
    "oldusers_xsf": 2,
    "ratio": 0.00035180299032541777
  },
  {
    "y": 1,
    "oldusers": 0,
    "oldusers_xsf": 0,
    "ratio": null
  }
]
novakon作者
10年7个月前IP:广东
819334
1楼
可见,9年前注册的用户,至少有一个学术分的比例是3.3%
6年前是1.1%
3年前是0.2%

其中,5年前有一次注册用户数量剧增(伴随着质量的直接滑坡)。这是为什么呢?

令人印象深刻的是,我重新统计了一次
{
  "y": 12,
  "oldusers": 0,
  "oldusers_xsf": 0,
  "ratio": null
},
{
  "y": 11,
  "oldusers": 1121,
  "oldusers_xsf": 97,
  "ratio": 0.08652988403211419
},
{
  "y": 10,
  "oldusers": 1769,
  "oldusers_xsf": 58,
  "ratio": 0.03278688524590164
},
{
  "y": 9,
  "oldusers": 2240,
  "oldusers_xsf": 74,
  "ratio": 0.033035714285714286
},
最早的1000个用户中,学术分比例高达8.6%
引用
评论
novakon作者
10年7个月前IP:广东
819339
2楼
这是论坛学术分分布:


[
  {
    "xsf": null,
    "num": 49993
  },
  {
    "xsf": -3,
    "num": 2
  },
  {
    "xsf": -2,
    "num": 6
  },
  {
    "xsf": -1,
    "num": 11
  },
  {
    "xsf": 1,
    "num": 248
  },
  {
    "xsf": 2,
    "num": 68
  },
  {
    "xsf": 3,
    "num": 39
  },
  {
    "xsf": 4,
    "num": 28
  },
  {
    "xsf": 5,
    "num": 16
  },
  {
    "xsf": 6,
    "num": 15
  },
  {
    "xsf": 7,
    "num": 12
  },
  {
    "xsf": 8,
    "num": 18
  },
  {
    "xsf": 9,
    "num": 10
  },
  {
    "xsf": 10,
    "num": 14
  },
  {
    "xsf": 11,
    "num": 6
  },
  {
    "xsf": 12,
    "num": 5
  },
  {
    "xsf": 13,
    "num": 4
  },
  {
    "xsf": 15,
    "num": 3
  },
  {
    "xsf": 16,
    "num": 2
  },
  {
    "xsf": 17,
    "num": 2
  },
  {
    "xsf": 18,
    "num": 2
  },
  {
    "xsf": 19,
    "num": 3
  },
  {
    "xsf": 21,
    "num": 1
  },
  {
    "xsf": 22,
    "num": 2
  },
  {
    "xsf": 23,
    "num": 1
  },
  {
    "xsf": 24,
    "num": 2
  },
  {
    "xsf": 27,
    "num": 1
  },
  {
    "xsf": 29,
    "num": 1
  },
  {
    "xsf": 30,
    "num": 1
  },
  {
    "xsf": 33,
    "num": 1
  },
  {
    "xsf": 34,
    "num": 1
  },
  {
    "xsf": 35,
    "num": 1
  },
  {
    "xsf": 39,
    "num": 1
  },
  {
    "xsf": 40,
    "num": 3
  },
  {
    "xsf": 44,
    "num": 1
  },
  {
    "xsf": 47,
    "num": 2
  }
]
引用
评论
novakon作者
10年7个月前IP:广东
819342
3楼
我做了更为详细的统计:

for u in users
collect time = left(date_iso8601(u.toc),7) into groups = u.xsf
let num_of_register_with_xsf = length(for u in groups filter u>0 return u)
let total_xsf = sum(groups)
let num_of_register = length(groups)
return {time, num_of_register_with_xsf, num_of_register,
ratio:num_of_register_with_xsf/num_of_register, xsf_per_user_that_have_xsf:total_xsf/num_of_register_with_xsf }
结果:



attachment icon xsf_details.zip 2.21KB ZIP 23次下载
引用
评论
novakon作者
10年7个月前IP:广东
819344
4楼
对上述数据转csv用excel作图,得到以下结果
图例按月分别为:
注册数量
其中有至少一个学术分的用户的百分比
有至少一个学术分的用户的数量
平均每个有学术分的用户的学术分数量 QQ截图20160515161151.jpg


通俗的来讲
蓝色:涌入人头数
橙色:牛人占人头的比例(平均用户质量)
紫色:牛人的牛逼程度(高质量用户平均水平)
绿色:牛人数
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的