大家电脑上估计很多都有安装360的产品,每次开机看到自己的开机时间是多少秒,击败了全国多少电脑,心里是不是很爽?但是全国有那么多电脑,都安装了360了吗?开机时间是实时传到360的数据库的吗?那要多大的空间啊,还有就是并不是每台电脑都联网吧,但是他开机依然可以显示这个数据。他背后的原理又是什么呢?我来试试啊
一:假设360所收集的用户数据是符合正态分布的,但是不知道他的均值,标准差,尝试一下看看如何得到这个均值和标准差
1:我找了办公室的几台电脑,安装360开机助手,因为配置不同,开机时间不同,A电脑开机23秒,击败全国98%的电脑。B电脑开机40秒,击败全国66%的电脑.
2:根据标准正态分布,计算出排名1-98%,1-66%百分位对应的值,以z表示.
用R画个标准的正态分布
curve(dnorm(x, 0, 1), from = -4, to = 4,col="red")
> z002_100
> z002_100
[1] -2.053749
> z034_100
> z034_100
[1] -0.4124631r
根据公式z=(开机时间-均值)/标准差 来解方程组得到360用户开机的均值和标准差.
r
+ matrix(c(z002_100,1,z034_100,1),nrow=2,ncol=2,byrow=TRUE),
+ matrix(c(23,40),nrow=2)
+ )
[,1]
[1,] 10.35773
[2,] 44.27218
均值为44.27218,标准差为10.35773
验证一下推算
> pnorm(23,mean = r[2,1],sd=r[1,1])
[1] 0.02
> pnorm(40,mean = r[2,1],sd=r[1,1])
[1] 0.34
说明计算的均值和标准差没有问题
二:得到了360的均值和标准差,我们就可以演算测试其它电脑开机时间全国排名了
1:用excel 产生一个均值为44.27218,标准差为10.35773的表,根据你电脑的性能,不嫌弃慢的话几亿条数据都可以.因为我是测试,就产生了20000条数据.
打开excel 2016,选择数据-->数据分析-->随机数发生器
这样就得到了一个数据样本,保持为startTime.csv的文件,下面来测试吧
> getwd() #得到当前的工作目录
[1] "C:/BD"
> startTime
> head(startTime) #查看数据的前几条检查一下
Time
1 42.80020
2 21.39008
3 49.81327
4 32.37425
5 53.21671
6 34.06406
#画出数据样本的直方图
> hist(startTime[,1],prob=TRUE,main = "电脑开机时间统计", ylab="频率",xlab="开机时间(秒)")
> lines(density(startTime[,1]),col="red") #画出正态分布曲线
现在写个函数,只要填入开机时间,就会告诉你排名了
> time
+ y
+ return(y)
+ }
下面是测试的开机时间和排名,可以多测试几个
[1] 0.98
[1] 0.66
[1] 0.8146584
> time(20)
[1] 0.9904452
> time(37)
[1] 0.7586922
参考文献
领取专属 10元无门槛券
私享最新 技术干货