您好,登錄后才能下訂單哦!
原文鏈接: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的,如果做對了,純屬巧合,如果不對,你們可以批判我,請不要告我,謝謝周先生不殺之恩。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。