一. 分析目的
1. 物品交易价格可以反映当前游戏服务器的交易水平和经济水平, 同时从样本量也可以得出服务器的活跃程度
2. 对于此类型的研究可以延伸到服务器的健康状态判断
二. 分析使用工具
1. Python, 使用模块:
math: 数学操作模块, 附带开根等方法
numpy: 科学计算模块, 附带求标准差等等方法, 该模块需额外安装, 安装包见附件
numpy-1.7.1-win32-superpack-python2.7.exe.zip
(5.59 MB, 下载次数: 402)
三. 分析过程
从游戏中提取物品价格是比较容易的事情, 这里略过, 当我们取到游戏中一组数据后, 如何判断这组数据的有效性呢. 假设以下数据是从游戏中提取出来的一个月的物品交易价格记录:
- [1, 1, 1, 1, 1, 1, 1, 70000, 70000, 15000, 1, 1, 1, 30000, 30000, 55555, 30000, 30000, 1, 70000, 50000, 50000, 50000, 1000, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 50000, 50000, 50000, 50000, 45000, 45000, 45000, 45000, 45000, 45000, 100000, 30000, 30000, 1, 1, 1, 80000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 30000, 30000, 30000, 30000, 30000, 30000, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50000, 50000, 50000, 50000, 50000, 30000, 30000, 30000, 30000, 30000, 30000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 35000, 35000, 35000, 1, 1, 1, 30000, 35000, 35000, 35000, 35000, 35000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 1, 1, 1, 1, 1, 1, 50000, 50000, 50000, 50000, 50000, 50000, 100000, 100000, 100000, 100000, 75000, 30000, 30000, 30000, 30000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 30000, 30000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 55000, 55000, 55000, 45000, 50000, 50000, 50000, 80000, 50000, 80000, 20000, 20000, 20000, 20000, 20000, 20000, 80000, 80000, 50000, 50000, 50000, 50000, 50000, 40000, 35000, 35000, 35000, 35000, 35000, 35000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 25000, 25000, 25000, 25000, 25000, 25000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 30000, 1, 40000, 40000, 40000, 40000, 40000, 40000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 60000, 60000, 70000, 90000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 30000, 30000, 30000, 30000, 50000, 45000, 45000, 45000, 30000, 30000, 45000, 40000, 40000, 40000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 40000, 50000, 50000, 50000, 77777, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 35000, 35000, 30000, 30000, 30000, 55555, 50000, 50000, 50000, 55555, 40000, 40000, 40000, 40000, 40000, 40000, 35000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 45000, 45000, 45000, 60000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 49999, 50000, 50000, 40000, 40000, 40000, 60000, 70000, 100000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 66666, 30000, 30000, 30000, 50000, 50000, 50000, 35000, 30000, 30000, 30000, 30000, 30000, 30000, 30000, 55555, 30000, 30000, 30000, 30000, 15555, 50000, 50000, 50000, 50000, 35000, 35000, 1, 35000, 30000, 30000, 30000, 30000, 40000, 50000, 50000, 1, 40000, 40000, 40000, 40000, 40000, 50000, 50000, 50000, 50000, 50000, 20000, 50000, 1, 1, 1, 1, 1, 20000, 20000, 20000, 1, 1, 30000, 50000, 30000, 30000, 30000, 30000, 30000, 1000, 1, 1, 40000, 40000, 40000, 40000, 1, 1, 50000, 50000, 50000, 50000, 50000, 1, 1, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 45000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 45000, 45000, 45000, 45000, 45000, 45000, 50000, 50000, 50000, 100000, 50000, 20000, 20000, 20000, 20000, 50000, 10, 35000, 2, 35000, 35000, 35200, 50000, 100000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 40000, 40000, 40000, 40000, 40000, 40000, 50000, 50000, 40000, 40000, 40000, 40000, 40000, 40000, 100000, 40000, 30000, 30000, 40000, 40000, 40000, 50000, 50000, 50000, 40000, 40000, 40000, 40000, 40000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 30000, 50000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 40000, 40000, 40000, 30000, 30000, 30000, 30000, 30000, 30000, 1, 1, 25000, 25000, 25000, 85000, 85000, 30000, 30000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 70000, 50000, 70000, 70000, 70000, 70000, 70000, 70000, 50000, 50000, 65000, 65000, 65000, 1, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 30000, 30000, 30000, 30000, 30000, 30000, 30000, 30000, 30000, 30000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 85000, 85000, 85000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 35000, 35000, 35000, 35000, 35000, 35000, 50000, 50000, 30000, 30000, 25000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 65000, 65000, 1, 1, 1, 1, 1, 1, 80000, 80000, 80000, 80000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 30000, 30000, 1, 30000, 30000, 50000, 50000, 50000, 35000, 35000, 35000, 35000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 60000, 60000, 75000, 1, 1, 1, 1, 1, 1, 50000, 50000]
复制代码
由切比雪夫不等式不等式可知, 与平均数的距离超过K倍标准差的数据所占的比例之多是1/K**2;
这里使用数据集中与平均数距离超过2倍标准差的数据不超过25%作为我们判断数据有效性的标准;
这里我们定义平均数与2倍标准差的偏离不得大于25%
假设平均数为A, 标准差为V, 数据集的数据长度为S, 我们可以得到一个不等式
即 2V<=A*0.25 ==> V<=A/8==> V/A<=0.125
对于一个数据列表求标准差我们可以使用numpy模块中的求方差公式然后开根
- V=math.sqrt(numpy.var(moneylist))/numpy.mean(moneylist)
复制代码
其中方差= numpy.var(moneylist)
平均值=numpy.mean(moneylist)
可以做出一个函数来说明这段数据的相关属性
- import numpy,math
- def checknum(moneylist):
- print '数据集的标准差为%s'%math.sqrt(numpy.var(moneylist))
- print '数据集的平均值为%s'%numpy.mean(moneylist)
- if __name__=='__main__':
- checknum(moneylist)
复制代码
用以上数据我们可以得出结果
- 数据集的标准差为19077.2892529
- 数据集的平均值为39765.7303071
复制代码
此时V/A=0.479 大于我们所定的标准, 此时就需要对于数据做筛选 我们可以将里边偏离过大的数据清理掉
- def accurate(moneylist):
- moneylist.sort() #将数据集进行正序排序
- for each in moneylist:
- if abs(each-numpy.mean(moneylist))>math.sqrt(numpy.var(moneylist))*2: #检测数据集中每一个数据是否偏离平均值2倍标准差以上
- while each in moneylist:
- moneylist.remove(each) #将数据从数据集中去除
- return moneylist
复制代码
经过几次处理之后, 按照这个去除标准, 数据集中就再也去除不掉数据了, 此时可以认为该组数据为有效数据
- #coding: gbk
- import numpy,math
- def checknum(moneylist):
- if math.sqrt(numpy.var(moneylist))/numpy.mean(moneylist)<0.125:
- print math.sqrt(numpy.var(moneylist))
- print numpy.mean(moneylist)
- print '物品A的估价为%s'%numpy.mean(moneylist)
- else:
- moneylist=accurate(moneylist)
- firstlen=1
- secondlen=0
- while firstlen!=secondlen:
- firstlen=len(moneylist) #清理数据集前数据集长度
- moneylist=accurate(moneylist)
- secondlen=len(moneylist) #清理数据集后长度
- else:
- print '物品A的估价为%s'%numpy.mean(moneylist)
- def accurate(moneylist):
- moneylist.sort() #将数据集进行正序排序
- print len(moneylist)
- for each in moneylist:
- if abs(each-numpy.mean(moneylist))>math.sqrt(numpy.var(moneylist))*2: #检测数据集中每一个数据是否偏离平均值2倍方差以上
- while each in moneylist:
- moneylist.remove(each)
- return moneylist
- if __name__=='__main__':
- moneylist=[1, 1, 1, 1, 1, 1, 2150, 860, 1, 1, 1505, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,215,1,1,1,1] #可以替换成上述提供数据集来验证
- checknum(moneylist)
复制代码
如果需要将程序界面化, 这时候是需要涉及GUI程序相关, 所以暂时这里就不讨论了
最终的界面如下图
|