使用NumPy、SciPy和Matplotlib進行描述性統計

来源:http://www.cnblogs.com/jasonfreak/archive/2016/04/29/5441512.html
-Advertisement-
Play Games

目錄 1 描述性統計是什麼?2 使用NumPy和SciPy進行數值分析 2.1 基本概念 2.2 中心位置(均值、中位數、眾數) 2.3 發散程度(極差,方差、標準差、變異繫數) 2.4 偏差程度(z-分數) 2.5 相關程度(協方差,相關係數) 2.6 回顧3 使用Matplotlib進行圖分析 ...


目錄

1 描述性統計是什麼?
2 使用NumPy和SciPy進行數值分析
  2.1 基本概念
  2.2 中心位置(均值、中位數、眾數)
  2.3 發散程度(極差,方差、標準差、變異繫數)
  2.4 偏差程度(z-分數)
  2.5 相關程度(協方差,相關係數)
  2.6 回顧
3 使用Matplotlib進行圖分析
  3.1 基本概念
  3.2 頻數分析
    3.2.1 定性分析(柱狀圖、餅形圖)
    3.2.2 定量分析(直方圖、累積曲線)
  3.3 關係分析(散點圖)
  3.4 探索分析(箱形圖)
  3.5 回顧
4 總結
5 參考資料


1 描述性統計是什麼?

  描述性統計是藉助圖表或者總結性的數值來描述數據的統計手段。數據挖掘工作的數據分析階段,我們可藉助描述性統計來描繪或總結數據的基本情況,一來可以梳理自己的思維,二來可以更好地向他人展示數據分析結果。數值分析的過程中,我們往往要計算出數據的統計特征,用來做科學計算的NumPy和SciPy工具可以滿足我們的需求。Matpotlob工具可用來繪製圖,滿足圖分析的需求。


2 使用NumPy和SciPy進行數值分析

2.1 基本概念

  與Python中原生的List類型不同,Numpy中用ndarray類型來描述一組數據

 1 from numpy import array
 2 from numpy.random import normal, randint
 3 #使用List來創造一組數據
 4 data = [1, 2, 3]
 5 #使用ndarray來創造一組數據
 6 data = array([1, 2, 3])
 7 #創造一組服從正態分佈的定量數據
 8 data = normal(0, 10, size=10)
 9 #創造一組服從均勻分佈的定性數據
10 data = randint(0, 10, size=10)

2.2 中心位置(均值、中位數、眾數)

  數據的中心位置是我們最容易想到的數據特征。藉由中心位置,我們可以知道數據的一個平均情況,如果要對新數據進行預測,那麼平均情況是非常直觀地選擇。數據的中心位置可分為均值(Mean),中位數(Median),眾數(Mode)。其中均值和中位數用於定量的數據,眾數用於定性的數據。

  對於定量數據(Data)來說,均值是總和除以總量(N),中位數是數值大小位於中間(奇偶總量處理不同)的值:

  均值相對中位數來說,包含的信息量更大,但是容易受異常的影響。使用NumPy計算均值與中位數:

1 from numpy import mean, median
2 
3 #計算均值
4 mean(data)
5 #計算中位數
6 median(data)

  對於定性數據來說,眾數是出現次數最多的值,使用SciPy計算眾數:

1 from scipy.stats import mode
2 
3 #計算眾數
4 mode(data)

2.3 發散程度(極差、方差、標準差、變異繫數)

  對數據的中心位置有所瞭解以後,一般我們會想要知道數據以中心位置為標準有多發散。如果以中心位置來預測新數據,那麼發散程度決定了預測的準確性。數據的發散程度可用極差(PTP)、方差(Variance)、標準差(STD)、變異繫數(CV)來衡量,它們的計算方法如下:

  極差是只考慮了最大值和最小值的發散程度指標,相對來說,方差包含了更多的信息,標準差基於方差但是與原始數據同量級,變異繫數基於標準差但是進行了無量綱處理。使用NumPy計算極差、方差、標準差和變異繫數:

 1 from numpy import mean, ptp, var, std
 2 
 3 #極差
 4 ptp(data)
 5 #方差
 6 var(data)
 7 #標準差
 8 std(data)
 9 #變異繫數
10 mean(data) / std(data)

2.4 偏差程度(z-分數)

  之前提到均值容易受異常值影響,那麼如何衡量偏差,偏差到多少算異常是兩個必須要解決的問題。定義z-分數(Z-Score)為測量值距均值相差的標準差數目:

  當標準差不為0且不為較接近於0的數時,z-分數是有意義的,使用NumPy計算z-分數:

1 from numpy import mean, std
2 
3 #計算第一個值的z-分數
4 (data[0]-mean(data)) / std(data)

  通常來說,z-分數的絕對值大於3將視為異常。

2.5 相關程度

  有兩組數據時,我們關心這兩組數據是否相關,相關程度有多少。用協方差(COV)和相關係數(CORRCOEF)來衡量相關程度:

  協方差的絕對值越大表示相關程度越大,協方差為正值表示正相關,負值為負相關,0為不相關。相關係數是基於協方差但進行了無量綱處理。使用NumPy計算協方差和相關係數:

 1 from numpy import array, cov, corrcoef
 2 
 3 data = array([data1, data2])
 4 
 5 #計算兩組數的協方差
 6 #參數bias=1表示結果需要除以N,否則只計算了分子部分
 7 #返回結果為矩陣,第i行第j列的數據表示第i組數與第j組數的協方差。對角線為方差
 8 cov(data, bias=1)
 9 
10 #計算兩組數的相關係數
11 #返回結果為矩陣,第i行第j列的數據表示第i組數與第j組數的相關係數。對角線為1
12 corrcoef(data)

2.6 回顧

庫包 方法 說明
numpy array 創造一組數
numpy.random normal 創造一組服從正態分佈的定量數
numpy.random randint 創造一組服從均勻分佈的定性數
numpy mean 計算均值
numpy median 計算中位數
scipy.stats mode 計算眾數
numpy ptp 計算極差
numpy var 計算方差
numpy std 計算標準差
numpy cov 計算協方差
numpy corrcoef 計算相關係數

 


3 使用Matplotlib進行圖分析

3.1 基本概念

  使用圖分析可以更加直觀地展示數據的分佈(頻數分析)和關係(關係分析)。柱狀圖和餅形圖是對定性數據進行頻數分析的常用工具,使用前需將每一類的頻數計算出來。直方圖和累積曲線是對定量數據進行頻數分析的常用工具,直方圖對應密度函數而累積曲線對應分佈函數。散點圖可用來對兩組數據的關係進行描述。在沒有分析目標時,需要對數據進行探索性的分析,箱形圖將幫助我們完成這一任務。

  在此,我們使用一組容量為10000的男學生身高,體重,成績數據來講解如何使用Matplotlib繪製以上圖形,創建數據的代碼如下:

 1 from numpy import array
 2 from numpy.random import normal
 3 
 4 def genData():
 5     heights = []
 6     weights = []
 7     grades = []
 8     N = 10000
 9 
10     for i in range(N):
11         while True:
12             #身高服從均值172,標準差為6的正態分佈
13             height = normal(172, 6)
14             if 0 < height: break
15         while True:
16             #體重由身高作為自變數的線性回歸模型產生,誤差服從標準正態分佈
17             weight = (height - 80) * 0.7 + normal(0, 1)
18             if 0 < weight: break
19         while True:
20             #分數服從均值為70,標準差為15的正態分佈
21             score = normal(70, 15)
22             if 0 <= score and score <= 100:
23                 grade = 'E' if score < 60 else ('D' if score < 70 else ('C' if score < 80 else ('B' if score < 90 else 'A')))
24                 break
25         heights.append(height)
26         weights.append(weight)
27         grades.append(grade)
28     return array(heights), array(weights), array(grades)
29 
30 heights, weights, grades = genData()
View Code

3.2 頻數分析

3.2.1 定性分析(柱狀圖、餅形圖)

  柱狀圖是以柱的高度來指代某種類型的頻數,使用Matplotlib對成績這一定性變數繪製柱狀圖的代碼如下:

 1 from matplotlib import pyplot
 2 
 3 #繪製柱狀圖
 4 def drawBar(grades):
 5     xticks = ['A', 'B', 'C', 'D', 'E']
 6     gradeGroup = {}
 7     #對每一類成績進行頻數統計
 8     for grade in grades:
 9         gradeGroup[grade] = gradeGroup.get(grade, 0) + 1
10     #創建柱狀圖
11     #第一個參數為柱的橫坐標
12     #第二個參數為柱的高度
13     #參數align為柱的對齊方式,以第一個參數為參考標準
14     pyplot.bar(range(5), [gradeGroup.get(xtick, 0) for xtick in xticks], align='center')
15 
16     #設置柱的文字說明
17     #第一個參數為文字說明的橫坐標
18     #第二個參數為文字說明的內容
19     pyplot.xticks(range(5), xticks)
20 
21     #設置橫坐標的文字說明
22     pyplot.xlabel('Grade')
23     #設置縱坐標的文字說明
24     pyplot.ylabel('Frequency')
25     #設置標題
26     pyplot.title('Grades Of Male Students')
27     #繪圖
28     pyplot.show()
29 
30 drawBar(grades)

  繪製出來的柱狀圖的效果如下:

  而餅形圖是以扇形的面積來指代某種類型的頻率,使用Matplotlib對成績這一定性變數繪製餅形圖的代碼如下:

 1 from matplotlib import pyplot
 2 
 3 #繪製餅形圖
 4 def drawPie(grades):
 5     labels = ['A', 'B', 'C', 'D', 'E']
 6     gradeGroup = {}
 7     for grade in grades:
 8         gradeGroup[grade] = gradeGroup.get(grade, 0) + 1
 9     #創建餅形圖
10     #第一個參數為扇形的面積
11     #labels參數為扇形的說明文字
12     #autopct參數為扇形占比的顯示格式
13     pyplot.pie([gradeGroup.get(label, 0) for label in labels], labels=labels, autopct='%1.1f%%')
14     pyplot.title('Grades Of Male Students')
15     pyplot.show()
16 
17 drawPie(grades)

  繪製出來的餅形圖效果如下:

3.2.2 定量分析(直方圖、累積曲線)

  直方圖類似於柱狀圖,是用柱的高度來指代頻數,不同的是其將定量數據劃分為若幹連續的區間,在這些連續的區間上繪製柱。使用Matplotlib對身高這一定量變數繪製直方圖的代碼如下:

 1 from matplotlib import pyplot
 2 
 3 #繪製直方圖
 4 def drawHist(heights):
 5     #創建直方圖
 6     #第一個參數為待繪製的定量數據,不同於定性數據,這裡並沒有事先進行頻數統計
 7     #第二個參數為劃分的區間個數
 8     pyplot.hist(heights, 100)
 9     pyplot.xlabel('Heights')
10     pyplot.ylabel('Frequency')
11     pyplot.title('Heights Of Male Students')
12     pyplot.show()
13 
14 drawHist(heights)

  直方圖對應數據的密度函數,由於身高變數是屬於服從正態分佈的,從繪製出來的直方圖上也可以直觀地看出來:

  使用Matplotlib對身高這一定量變數繪製累積曲線的代碼如下:

 1 from matplotlib import pyplot
 2 
 3 #繪製累積曲線
 4 def drawCumulativeHist(heights):
 5     #創建累積曲線
 6     #第一個參數為待繪製的定量數據
 7     #第二個參數為劃分的區間個數
 8     #normed參數為是否無量綱化
 9     #histtype參數為'step',繪製階梯狀的曲線
10     #cumulative參數為是否累積
11     pyplot.hist(heights, 20, normed=True, histtype='step', cumulative=True)
12     pyplot.xlabel('Heights')
13     pyplot.ylabel('Frequency')
14     pyplot.title('Heights Of Male Students')
15     pyplot.show()
16 
17 drawCumulativeHist(heights)

  累積曲線對應數據的分佈函數,由於身高變數是屬於服從正態分佈的,從繪製出來的累積曲線圖上也可以直觀地看出來:

3.3 關係分析(散點圖)

  在散點圖中,分別以自變數和因變數作為橫縱坐標。當自變數與因變數線性相關時,在散點圖中,點近似分佈在一條直線上。我們以身高作為自變數,體重作為因變數,討論身高對體重的影響。使用Matplotlib繪製散點圖的代碼如下:

from matplotlib import pyplot

#繪製散點圖
def drawScatter(heights, weights):
    #創建散點圖
    #第一個參數為點的橫坐標
    #第二個參數為點的縱坐標
    pyplot.scatter(heights, weights)
    pyplot.xlabel('Heights')
    pyplot.ylabel('Weights')
    pyplot.title('Heights & Weights Of Male Students')
    pyplot.show()

drawScatter(heights, weights)

  我們在創建數據時,體重這一變數的確是由身高變數通過線性回歸產生,繪製出來的散點圖如下:

3.4 探索分析(箱形圖)

  在不明確數據分析的目標時,我們對數據進行一些探索性的分析,通過我們可以知道數據的中心位置,發散程度以及偏差程度。使用Matplotlib繪製關於身高的箱形圖的代碼如下:

 1 from matplotlib import pyplot
 2 
 3 #繪製箱形圖
 4 def drawBox(heights):
 5     #創建箱形圖
 6     #第一個參數為待繪製的定量數據
 7     #第二個參數為數據的文字說明
 8     pyplot.boxplot([heights], labels=['Heights'])
 9     pyplot.title('Heights Of Male Students')
10     pyplot.show()
11 
12 drawBox(heights)

  繪製出來的箱形圖中,包含3種信息:

  1. Q2所指的紅線為中位數
  2. Q1所指的藍框下側為下四分位數,Q3所指的藍框上側為上四分位數,Q3-Q1為四分為差。四分位差也是衡量數據的發散程度的指標之一。
  3. 上界線和下界線是距離中位數1.5倍四分位差的線,高於上界線或者低於下界線的數據為異常值。

3.5 回顧

方法 說明
bar 柱狀圖
pie 餅形圖
hist 直方圖&累積曲線
scatter 散點圖
boxplot 箱形圖
xticks 設置柱的文字說明
xlabel 橫坐標的文字說明
ylabel 縱坐標的文字說明
title 標題
show 繪圖

4 總結

  描述性統計是容易操作,直觀簡潔的數據分析手段。但是由於簡單,對多元變數的關係難以描述。現實生活中,自變數通常是多元的:決定體重不僅有身高,還有飲食習慣,肥胖基因等等因素。通過一些高級的數據處理手段,我們可以對多元變數進行處理,例如特征工程中,可以使用互信息方法來選擇多個對因變數有較強相關性的自變數作為特征,還可以使用主成分分析法來消除一些冗餘的自變數來降低運算複雜度。


5 參考資料

  1. 描述性統計
  2. 使用NumPy進行科學計算

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [re: Orchard CMS] This caused me scratching my head for days and now I can even feel it's bleeding. The answer however is the simplest. Because it's n ...
  • MVC中有一個處理異常的過濾器 HandleErrorAttribute 1.新建一個類繼承自 HandleErrorAttribute,然後重寫OnException這個方法 只要程式出錯就會執行這個方法。 2.註冊定義好的異常過慮器 打開App_Start文件夾中FilterConfig.cs修 ...
  • 最近在做一個項目時,客戶要求網站能夠集成QQ登錄的功能,以前沒做過這方面的開發,於是去QQ的開放平臺官網研究了一下相關資料,經過自己的艱苦探索,終於實現了集成QQ登錄的功能,現在把相關的開發經驗總結一下,希望對有這方面需求的朋友有所幫助。 一.前期準備 首先你需要登錄QQ的開發平臺註冊一個賬號,QQ ...
  • 1、Enable-Migrations 啟用遷移 2、Add-Migration 為掛起的Model更改創建遷移版本 2、Update-Database 更新資料庫命令 (1)預設更新到最新版本 (2)更新到特定版本 -TargetMigration(如下圖)。 此命令可當作回滾用,如我已經完成了所 ...
  • 獲取【下載地址】 【免費支持更新】三大資料庫 mysql oracle sqlsever 更專業、更強悍、適合不同用戶群體【新錄針對本系統的視頻教程,手把手教開發一個模塊,快速掌握本系統】 A集成代碼生成器 [正反雙向(單表、主表、明細表、樹形表,開發利器)+快速構建表單;freemaker模版技術 ...
  • 步驟一:在聲明的數據域中按Ctrl+1: 步驟二:點擊最後一個選項Create getter and setter,在彈出的對話框中點擊確定: 在介紹另外一個方法: 步驟一:聲明完類的數據域之後,輸入set,按住Alt+/: 步驟二:同步驟一,輸入get,再按住Alt+/: ...
  • 1.在C++ 程式中調用被C 編譯器編譯後的函數,為什麼要加extern “C”?答:首先,extern是C/C++語言中表明函數和全局變數作用範圍的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變數可以在本模塊或其它模塊中使用。通常,在模塊的頭文件中對本模塊提供給其它模塊引用的函數和全局變數以關鍵字e ...
  • 你應該知道介面是一種契約,它與實現方式無關 但是類,即使是抽象類,你都能自定義成員變數,而成員變數往往就與實現方式有關。 這一點的實際意義不大。 但是有一點,類會暴露太多不必要,甚至不能暴露的東西,你看一下java.util中,大部分的數據結構,都被設計成了介面-抽象類-最後實際類 例如Collec ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...