開機時間排名——一個正態分佈的應用的案例

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

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

    這個肯定是很多人對《統計學》這一門課程的直觀感覺,如果這貨一點用處都沒有,那是不可能的,大學的老師又不傻,沒用的課程不會做爲基礎課程開設。但是你說它有用在哪裏,又沒有辦法舉例出來,所以就用不上了。

    坦白來講,我不想開設一門所謂的《傻瓜都能學懂統計學》的類似課程,因爲《統計學》是一門高投入,高回報的課程,也就是我們需要對它投入一定的熱情和時間去學習,去思考,它才能對你有所迴應,並且,非常強烈地迴應的一門科學。打個比喻,統計學就像一個高冷的美人,你想獲得美人的青睞,就必須絞盡腦汁,有所付出。

    在這裏,我給大家使用一個案例,一個大家在日常生活中經常看到,但是卻可能沒有深入去思考的案例,來講解一下統計學的應用場景,這個場景涉及到的一個理論就是正態分佈理論。

    下面兩個圖案你們肯定非常熟悉,對,就是360殺毒軟件的開機耗時頁面。

0.jpg

    大家腦洞大開,想象一下,這個功能軟件工程師是怎麼設計的呢?

    你可能會覺得它是這樣子實現的:

    

    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")

1.jpg

    從這個圖中,我們可以看到,開機時間貌似符合正態分佈,有戲!對吧,但是我只能用貌似,因爲我還沒有檢測數據的正態性,好,我們使用R來檢測一下開機時間是否符合正態分佈。

    檢測正態分佈的方法:

    一、繪畫QQ圖,QQ圖判斷法:查看我們的數據,是否絕大部分落在中間直線的附近。

 qqnorm(

   data[, 1],

   main="QQ圖",

   ylab="y", xlab="x"

 );

 qqline(data[, 1]);

2.jpg

    可以看到,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")

3.jpg

    有了z值,有了標準正態分佈,我們就可以進行方程組的建立了,剛剛我們知道了pnorm函數,是根據值進行排名的計算的,那麼知道排名佔比,如何計算原來對應的分數是什麼呢?也就是逆運算是啥?那就是qnorm了,我們可以使用qnorm函數,根據33秒,排名5%(比95%的用戶快,意思就是從小到大排名5%,對吧,自己想一下),43秒,排名23%,計算出他們對應的標準z值是多少。

4.jpg

    計算出它們的標準值後,我們就可以根據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的,如果做對了,純屬巧合,如果不對,你們可以批判我,請不要告我,謝謝周先生不殺之恩。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章