开机时间排名——一个正态分布的应用的案例

原文链接:http://www.datastudy.cc/to/38

觉得很有用,但是用不上。

这个肯定是很多人对《统计学》这一门课程的直观感觉,如果这货一点用处都没有,那是不可能的,大学的老师又不傻,没用的课程不会做为基础课程开设。但是你说它有用在哪里,又没有办法举例出来,所以就用不上了。

坦白来讲,我不想开设一门所谓的《傻瓜都能学懂统计学》的类似课程,因为《统计学》是一门高投入,高回报的课程,也就是我们需要对它投入一定的热情和时间去学习,去思考,它才能对你有所回应,并且,非常强烈地回应的一门科学。打个比喻,统计学就像一个高冷的美人,你想获得美人的青睐,就必须绞尽脑汁,有所付出。

在这里,我给大家使用一个案例,一个大家在日常生活中经常看到,但是却可能没有深入去思考的案例,来讲解一下统计学的应用场景,这个场景涉及到的一个理论就是正态分布理论。

下面两个图案你们肯定非常熟悉,对,就是360杀毒软件的开机耗时页面。

大家脑洞大开,想象一下,这个功能软件工程师是怎么设计的呢?

你可能会觉得它是这样子实现的:

1、收集所有用户的开机时间的数据,排好序放在一个数据库中;

2、然后根据你的开机时间,找出你的排名,除以总用户数,就是你击败电脑占比。

是的,这样子设计排名算法是非常合理,但是有以下几个问题:

1、你电脑开机的时候,没有连接网络怎么办呢?那就无法请求到所有的用户的数据了对吧。

2、就算所有的用户的数据,已经下载到你本地,根据不完全统计,360的用户数,估计也超过10亿了吧,上10亿行的数据进行比较统计,放在开机这个地方,恐怕不妥,而且做过软件开发的人都知道,这种同步数据的方式,非常蛋疼。

那么我觉得它是怎么设计的呢?

我会这样子设计,首先,收集尽量多的用户的开机时间,然后,查看时间的分布如何。(开机时间数据链接: http://pan.baidu.com/s/1jGu8ZXk 密码: epah)

data <- read.csv("D:\\data\\20150930\\startTime.csv")

mean(data[, 1])

sd(data[, 1])

hist(

data[, 1], prob=TRUE,

main="开机时间频率直方图",

ylab="频率", xlab="开机时间(秒)"

)

lines(density(data[, 1]), col="red")

从这个图中,我们可以看到,开机时间貌似符合正态分布,有戏!对吧,但是我只能用貌似,因为我还没有检测数据的正态性,好,我们使用R来检测一下开机时间是否符合正态分布。

检测正态分布的方法:

一、绘画QQ图,QQ图判断法:查看我们的数据,是否绝大部分落在中间直线的附近。

qqnorm(

data[, 1],

main="QQ图",

ylab="y", xlab="x"

);

qqline(data[, 1]);

可以看到,QQ图中,所有的点都落在了中间的直线上,直观上我们就可以判断这个数据的分布符合正态分布了。

二、夏皮罗–威克尔(Shapiro-Wilk)检验 法

三、K-S检验法

这两种方法我就不在这里演示了,详细请查看《R统计分析实战》(http://www.datastudy.cc/to/36)的课程。

验证了数据是正态分布的之后,事情就变得非常简单了,下面我们来看看如何进行建模。

一、建立正态分布的模型,只需要求出正态分布的均值和标准差即可,也就是:

data_mean <- mean(data[, 1])

data_sd <- sd(data[, 1])

> data_mean

[1] 50.7848

> data_sd

[1] 11.10776

二、然后保存这个数据在软件中,有一个用户开机时间为38秒,那么他的排名是多少呢?

> 1 - pnorm(38, mean=data_mean, sd=data_sd)

[1] 0.8751295

也就是说,我们使用pnorm函数,根据正态分布的性质,就可以求出这个用户的排名是87.5%了。

这样子设计这个功能,是否非常地简单,快捷呢?但是很多人可能想不到是这样子设计的,我自己根据自己的学习历程,思考了一下,为什么我们会想不到这个问题可以这样子解决呢?我觉得是大学教育的问题,大学里面,很多时候举例子,都是很传统的例子,大家在学习正态分布的时候,还记得教授给我们举例是用什么例子吗?对就是考试的平均分,以及学生成绩排名的例子,还记得吗?因为教授有很多这种学生的成绩数据嘛,刚好就拿来举例子,这没有什么不妥。

不妥的是,你们还记得这个排名是如何计算的吗?我估计你们已经忘记了,因为是一种非常笨重的方法,就是从一本标准正态分布表里面查的,艾玛,这么挫的方法,怎么可能让你觉得它是一个可以让计算机自动计算的问题呢?pnorm函数,完全可以替代那本所谓的标准正态分布表了,所以,如果大学里面大家都有pnorm这个函数,估计大家就可以想到这个方法了。

好了,本文是否到这里就结束了呢?当然不是,这个是毁大家对统计学三观的文章,还没有震撼到你呢,怎么能够随随便便就结束了呢!

如果我们要开发一个360的竞争产品,比如叫做361安全卫士,哈哈,那么我们一开始没有大量用户的开机数据,不知道用户平均开机时间是多少,我们如何实现这个功能呢?

这个就是一个线性规划的问题了,你不知道什么叫做线性规划?好吧,我装B了,解二元一次方程组你听过了吧,艾玛,就是这货,我们来看看如何进行正态分布模型的窃取。

虽然我们不知道360收集的用户的均值和标准差是多少,但是我们知道一个正态分布的均值和标准差。这个分布叫什么?对了,就是传说中的标准正态分布了。标准正态分布是什么?所谓的标准正态分布,是指一个正态分布,经过z值转换进行标准化后,转换后的z值的分布,就是标准正态分布,它有个很牛B的性质,就是均值为1,标准差为0!

别暗爽,我故意写错的,标准正态分布的均值为0,标准差为1!

hist(

scale(data[, 1]), prob=TRUE,

main="开机时间正态分布直方图",

ylab="频率", xlab="开机时间z值"

)

lines(density(scale(data[, 1])), col="red")

有了z值,有了标准正态分布,我们就可以进行方程组的建立了,刚刚我们知道了pnorm函数,是根据值进行排名的计算的,那么知道排名占比,如何计算原来对应的分数是什么呢?也就是逆运算是啥?那就是qnorm了,我们可以使用qnorm函数,根据33秒,排名5%(比95%的用户快,意思就是从小到大排名5%,对吧,自己想一下),43秒,排名23%,计算出他们对应的标准z值是多少。

计算出它们的标准值后,我们就可以根据z值的计算公式,也就是值减去均值除以标准差,建立二元一次方程,具体计算过程如下:

#一个是33秒,排名5%,一个是43秒,排名23%

#从标准正态分布中,求出5%,23%百分位对应的z值是什么

z05_100 <- qnorm(0.05, mean=0, sd=1)

z23_100 <- qnorm(0.23, mean=0, sd=1)

#求解线性方程组

#z05_100 = (33 - _mean)/_sd   =>  z05_100*_sd + _mean = 33

#z23_100 = (43 - _mean)/_sd   =>  z23_100*_sd + _mean = 43

#求解线性方程组

r <- solve(

matrix(

c(z05_100, 1, z23_100, 1),

nrow = 2, ncol = 2,

byrow=TRUE

),

matrix(

c(33, 43),

nrow = 2

)

);

#进行验证

pnorm(33, mean=r[2, 1], sd=r[1, 1])

pnorm(43, mean=r[2, 1], sd=r[1, 1])

> r

[,1]

[1,] 11.03745

[2,] 51.15498

> #进行验证

> pnorm(33, mean=r[2, 1], sd=r[1, 1])

[1] 0.05

> pnorm(43, mean=r[2, 1], sd=r[1, 1])

[1] 0.23

到这里,我们就知道了,在360的所有用户中,他们的开机时间的均值为51.15498秒,方差为11.03745,成功得到copy。

好了,到这里,真的就准备结束了,从我们这两个案例我们可以知道,如果我们可以掌握一门语言,那么,学习起统计学,肯定比我们在大学里面通过查表学习统计学更加有兴趣,毕竟,替代人工,就是我们学习人工智能的目标嘛,咦,我怎么提到了人工智能了?

很开心终于有同学问到正态分布这个问题,也就是统计学的问题,这证明大家开始脑洞大开了,数据分析的基础技能,也就是数据处理、数据分析、数据绘图的小技巧已经满足不了大家了,但是大家的脑洞也只是刚开,未来的路程还很长,而代表着人工智能的数据挖掘技术,正是以统计学为基础,进行综合拓展的一门学科,如果大家想往数据的更深层次发展,继续学习前进吧,数据科学是无止尽的,大家一起学习进步!

注:本文没有使用到奇虎360公司的任何数据,所有数据都是通过模拟出来的,方案也是我个人YY的,如果做对了,纯属巧合,如果不对,你们可以批判我,请不要告我,谢谢周先生不杀之恩。

时间: 2024-08-03 15:14:11

开机时间排名——一个正态分布的应用的案例的相关文章

MMI开机时间偏长

Mini版本开机时间长 Mini版本开机时间长1. Problem Description:2. Analysis:3. Solution:4. Summary: 1. Problem Description: Mini版本主要是用来测试手机硬件的一款软件, 2. Analysis: 开机较慢的原因是在开机过程中会的data分区进行加密操作,而这个操作对应内部测试并没有什么用,因此可以去掉.然后是在开机过程中会安装APK,这会占用很多的开机时间,安装的这些APK中有许多并不是必备的,所以去掉那些

windows中查看开机时间

windows中查看开机时间 在windows下可以使用systeminfo命令来查看. 下面是网站摘录的关于windows启动了多长时间的内容 1. windows系统可以查看从开机到现在共运行了多长时间,这个功能比较实用,比如我们为了测试系统的稳定性或者由于其他原因,想要知道自己的Windows 操作系统到底运行了多长时间,不必借助专门的工具软件进行查看,操作系统本身就可以做到,下面来看看具体的方法吧: 在Windows 98中:单击“开始→程序→附件→系统工具→系统信息”命令,在“系统信息

Linux查看系统开机时间

Linux查看系统开机时间 有时候需要查看Linux系统运行了多久时间,此时需要知道上次开机启动时间: 有时候由于断电或供电故障突然停机,需要查看Linux开机时间/重启时间:  下面总结一些查看Linux开机关机时间的方法(非常全面) 1: who 命令查看 who -b 查看最后一次系统启动的时间. who -r 查看当前系统运行时间 [[email protected] ~]# who -b system boot May 11 09:27 2: last  reboot 如下所示last

的十分快乐是福建科技开发手机开机时间飞快健康

http://www.pinterest.com/dgxdoylm/%E5%AE%A3%E5%9F%8E%E5%93%AA%E9%87%8C%E7%9A%84%E5%B0%8F%E5%A7%90%E6%9C%80%E6%BC%82%E4%BA%AE http://www.pinterest.com/dgxdoylm/%E8%8E%86%E7%94%B0%E6%89%BE%E5%B0%8F%E5%A7%90%E6%9C%8D%E5%8A%A1%E7%94%B5%E8%AF%9D http://ww

查看linux系统的开机时间/重启历史记录

查看linux系统的开机时间/重启历史记录1.who -b命令[[email protected] opt]# who -b ---查看最后一次(上次)系统启动的时间 system boot Dec 27 05:06 2.who -r命令[[email protected] opt]# who -r ---查看最后一次(上次)系统启动的时间,及运行级别 run-level 5 Dec 27 05:06 3.last reboot命令 [[email protected] opt]# last r

查询Linux 开机时间和运行时长

查询开机时间 cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}' 查询运行时长 date -d "$(awk -F. '{print $1}' /pr

根据指定的时间计算一个月的天数

<?php/* * @param $m 月份 * @param $y 年 * @date 格式化的时间 * 计算一个月的天数 */public function getCurrentMonthDays($date){ $year=date("Y",strtotime($date)); $month=date("m",strtotime($date)); return $month == 2?($year%4?28:($year%100?29:($year%40

性能测试之二----Android系统开机时间(转)

原文地址:http://blog.x6x8.com/?p=96 (1)在主屏幕上轻按“设置”按钮.或者,按下物理按钮菜单键“Menu”,选择“(系统)设置”. (2)在设置的列表下,选择最下面“关于本机”按钮. (3)然后,轻按“状态消息”按钮. (4)拉到最下面查看“开机时间”.

获取开机时间

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1.用当前时间减去从开机到现在经过了的时间:</span> <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"&