python數據分析NumPy的擴展:SciPy

SciPy是世界著名的Python開源科學計算庫,建立在NumPy之上。它增加

的功能包括數值積分、最優化、統計和一些專用函數。


MATLAB 和 Octave

MATLAB以及其開源替代品Octave都是流行的數學工具。scipy.io包的函數可以在Python

中加載或保存MATLAB和Octave的矩陣和數組。loadmat函數可以加載.mat文件。savemat函

數可以將數組和指定的變量名字典保存為.mat文件。


python數據分析NumPy的擴展:SciPy

動手實踐:保存和加載.mat 文件

如果我們一開始使用了NumPy數組,隨後希望在MATLAB或Octave環境中使用這些數組,那

麼最簡單的辦法就是創建一個.mat文件,然後在MATLAB或Octave中加載這個文件。請完成如

下步驟。

(1) 創建NumPy數組並調用savemat創建一個.mat文件。該函數有兩個參數——一個文件名

和一個包含變量名和取值的字典。

a = np.arange(7)

io.savemat("a.mat", {"array": a})

(2) 在MATLAB或Octave環境中加載.mat文件,並檢查數組中存儲的元素。

octave-3.4.0:7> load a.mat

octave-3.4.0:8> a

octave-3.4.0:8> array

array =

0

1

2

3

4

5

6

我們使用NumPy代碼創建了一個.mat文件並在Octave中成功加載。我們檢查了之前創建的

NumPy數組的元素。示例代碼見scipyio.py文件。

import numpy as np

from scipy import io

a = np.arange(7)

io.savemat("a.mat", {"array": a})

統計

SciPy的統計模塊是scipy.stats,其中有一個類是連續分佈的實現,一個類是離散分佈的

實現。此外,該模塊中還有很多用於統計檢驗的函數。

分析隨機數

我們將按正態分佈生成隨機數,並使用scipy.stats包中的統計函數分析生成的數據。請

完成如下步驟。

(1) 使用scipy.stats包按正態分佈生成隨機數。

generated = stats.norm.rvs(size=900)

(2) 用正態分佈去擬合生成的數據,得到其均值和標準差:

print "Mean", "Std", stats.norm.fit(generated)

均值和標準差如下所示:

Mean Std (0.0071293257063200707, 0.95537708218972528)

(3) 偏度(skewness)描述的是概率分佈的偏斜(非對稱)程度。我們來做一個偏度檢驗。

該檢驗有兩個返回值,其中第二個返回值為p-value,即觀察到的數據集服從正態分佈的概率,取

值範圍為0~1。

print "Skewtest", "pvalue", stats.skewtest(generated)

偏度檢驗返回的結果如下:

Skewtest pvalue (-0.62120640688766893, 0.5344638245033837)

因此,該數據集有53%的概率服從正態分佈。

(4) 峰度(kurtosis)描述的是概率分佈曲線的陡峭程度。我們來做一個峰度檢驗。該檢驗與

偏度檢驗類似,當然這裡是針對峰度。

print "Kurtosistest", "pvalue", stats.kurtosistest(generated)

峰度檢驗返回的結果如下:

Kurtosistest pvalue (1.306538101953 6981, 0.19136963054975586)

(5) 正態性檢驗(normality test)可以檢查數據集服從正態分佈的程度。我們來做一個正態性

檢驗。該檢驗同樣有兩個返回值,其中第二個返回值為p-value。

print "Normaltest", "pvalue", stats.normaltest(generated)

正態性檢驗返回的結果如下:

Normaltest pvalue (2.09293921181506, 0.35117535059841687)

(6) 使用SciPy我們可以很方便地得到數據所在的區段中某一百分比處的數值:

print "95 percentile", stats.scoreatpercentile(generated, 95)

得到95%處的數值如下:

95 percentile 1.54048860252

(7) 將前一步反過來,我們也可以從數值1出發找到對應的百分比:

print "Percentile at 1", stats.percentileofscore(generated, 1)

得到對應的百分比如下:

Percentile at 1 85.5555555556

(8) 使用Matplotlib繪製生成數據的分佈直方圖。有關Matplotlib的詳細介紹可以在前一章中

找到。

plt.hist(generated)

plt.show()

我們按正態分佈生成了一個隨機數據集,並使用scipy.stats模塊分析了該數據集。示例

代碼見statistics.py文件。

from scipy import stats

import matplotlib.pyplot as plt

generated = stats.norm.rvs(size=900)

print "Mean", "Std", stats.norm.fit(generated)

print "Skewtest", "pvalue", stats.skewtest(generated)

print "Kurtosistest", "pvalue", stats.kurtosistest(generated)

print "Normaltest", "pvalue", stats.normaltest(generated)

print "95 percentile", stats.scoreatpercentile(generated, 95)

print "Percentile at 1", stats.percentileofscore(generated, 1)

plt.hist(generated)

plt.show()


分享到:


相關文章: