今天,我們要分享一個numpy模組中相當實用的功能,抽樣。我們可以給定不同的分配,以不同的方式來進行抽樣,可以模擬投擲硬幣、骰骰子,甚至是尾牙抽獎都可以用python來達成唷! 在金融領域裡,商品的評價也時常會用到這些抽樣方式,包含製造隨機過程到蒙地卡羅評價,都不離抽樣的身影唷!現在,就讓我們一起來看看numpy模組裡面的抽樣該如何使用吧!
(一)引入numpy模組裡面的隨機抽樣
numpy模組裡面的隨機抽樣叫做random,我們可以像以前一樣直接引入numpy模組,之後要呼叫隨機抽樣時輸入np.random.分配,就可以模擬從該分配的抽樣了。另外一種方法,則先從numpy.random裡面引入各種需要的分配,等到要做抽樣時直接呼叫分配就可以了。
在這裡我們可以看到,我們從模組中引入常態分配(normal)、均勻分配(uniform)、指數分配(exponential)以及隨機整數抽樣(randint)。
而圖中所顯示的x,就是我們從標準常態分配N(0,1)中隨機抽出來的一個值。我們也可以看到,每次抽取,都會產生不同的值。
(二)固定隨機抽樣的種子
在隨機抽樣中,我們每次重新執行時,所抽取的值也都會不一樣,沒有任何順序或規則。然而,我們在進行某些實驗時,會希望每次重新執行時,可以同一順序抽出一樣的值,能夠辦到嗎?Yes,給定隨機抽樣的種子(seed(種子號碼))就可以了!給定隨機抽樣種子後,python就會依照內部的規則去進行抽樣,所以每次重新執行時都能夠依照一樣的順序抽值。舉例如下:
(三) 一次抽取多個樣本
前面,我們已經學會了如何抽取樣本。然而,我們真的在做模擬時,往往很多的樣本。那麼,究竟該如何一次抽取多個樣本呢?除了我們之前學過的迴圈,也可以直接採用function內建的size.
舉例來說,如果我們要從標準常態分配一次抽出10個樣本,只要輸入normal(size=10)就可以了! 有些時候,我們會需要更多維度的抽樣,比方說如果我們一次要模擬三支股票的股價。除了用迴圈,這個function很貼心設計了這樣的功能,我們只要輸入normal(size=(3,10)),就可以直接製造出三支股票報酬的模擬了。
(四) 非標準常態分配的抽取
前面我們介紹的,都是標準常態分配N(0,1)的抽取。如果我們今天也是要重常態分配抽取,但是平均數為a,標準差b,該怎麼做呢? 很簡單,就在我們的normal()裡面加入這些參數就可以了!舉例如下:
(五) 抽樣後畫分布圖
在我們抽樣完成後,往往會想要看看抽樣的分配究竟長什麼樣子,可以繪製直方圖(histogram)來一探究竟。
(六) 簡單統計
在這邊,我們可以間單的用np.mean(抽樣資料變數名稱)以及np.var(抽樣資料變數名稱)來看我們抽出來資料的平均數以及變異數。
細心的讀者可能會發現,我們從標準常態分配抽取1000次的結果,平均數竟然不為0,變異數也不為1。沒錯!這就是抽樣的結果!理論上,樣本愈大,會愈趨近母體,也就是標準常態分配,平均數為0,變異數為1。
另外,要特別跟大家分享的是,在使用numpy模組裡面的計算功能時,如果有缺值就會整個算出來都是缺值唷,詳見下例:
但如果改使用”np.nanmean()”,就可以忽略缺值直接計算唷!
(七) 抽取整數
如果,我們今天要模擬骰一個骰子20次,該怎麼抽取呢? 很簡單,用randint(起始值(含),終值(不含),投擲次數)就可以囉!
小試身手: 模擬投擲30次硬幣的結果吧!(提示:正面顯示1,反面顯示0)
今天,我們學會了運用numpy模組來做抽樣,並做簡單的統計分析。希望大家都學會了這個實用的功能,並且常常練習唷!
最後,附上上個單元的參考答案,你做對了嗎? 😀