概率統計基礎(二): 數理統計與描述性統計

這次概率統計學習基於:Datawhale概率統計組隊學習文檔

1. 寫在前面

這次藉着在Datawhale組織的概率統計專題學習的機會再重新溫習一遍數學基礎,所謂機器學習和深度學習, 背後的邏輯都是數學, 所以數學基礎在這個領域非常關鍵, 而統計學又是重中之重, 機器學習從某種意義上來說就是一種統計學習, 所以這次依然是感謝組織的這次學習機會, 這一版塊是整理概率統計的相關內容, 具體知識點可以看上面的鏈接文檔, 基礎知識點整理的很全了,所以這次又是站在了大佬的肩膀上前行, 主要是其中的重點知識進行整理和補充, 然後補充一些代碼實現上的內容。

今天是概率統計基礎的第二篇文章, 基於第一篇隨機變量與隨機事件進行整理, 首先理一理這裏面的邏輯,第一篇的內容蘊涵了大部分概率論的知識(除了大數定律和中心極限定理這種理論性的支持, 後期有機會會補上), 而今天的這篇內容是在概率論的基礎上往前一步, 屬於數理統計的內容。 概率論中, 我們研究隨機現象, 隨機變量, 但是我們是假設它們的分佈已知, 比如已知某一隨機變量服從什麼分佈, 在這個基礎上研究性質, 特點和規律(數字特徵啊, 隨機變量分佈啊等), 而數理統計中, 我們研究隨機變量的分佈未知或者一部分未知, 要去做的就是通過從未知分佈中抽取多個樣本, 對這些數據進行統計分析, 從而研究隨機變量的分佈等。 首先介紹數理統計的基本概念,然後是常用的統計量, 有了統計量之後就可以對數據做描述性統計, 包括數據離散趨勢的度量, 分佈特徵等。

大綱如下

  • 數理統計的基礎(基礎概念, 統計量與抽樣分佈, 常用統計量)
  • 描述性統計(數據集中趨勢和離散趨勢, 分佈特徵, 偏度與峯度)

Ok, let’s go!

2. 數理統計基礎

前面已經分析了數理統計是基於是通過從未知分佈中抽取多個樣本, 對這些數據進行統計分析進而去分析隨機變量的規律和特點, 所以在這裏面依然會涉及到一些基本的概念。

2.1 基礎概念

這裏的基礎概念包括總體, 個體, 總體容量, 樣本, 簡單隨機樣本, 如果這些概念都知道, 就可以跳過了哈哈。

在數理統計中, 總體就是研究對象的全體, 通常用一個隨機變量表示, 組成總體的每個基本單元叫個體, 而總體中包含的個體總數就是總體容量

我們研究的就是這個未知分佈的總體的統計規律, 所以我們需要從這裏面隨機抽取一部分個體進行統計,利用概率論的知識去分析推斷。 所以從總體XX中隨機抽取一部分個體X1,X2,...,XnX_1, X_2, ...,X_n,稱X1,X2,..XnX_1, X_2, ..X_n爲取自XX的容量爲nn樣本。來個栗子吧:
在這裏插入圖片描述
簡單隨機樣本: 滿足一下兩個條件的隨機樣本(X1,X2,..Xn)(X_1, X_2, ..X_n)稱爲容量是nn的簡單隨機樣本:

  • 代表性: 每個XiX_iXX同分布
  • 獨立性: X1,X2,..XnX_1, X_2, ..X_n是相互獨立的隨機變量

樣本是具有兩重性,即當在一次具體地抽樣後它是一組確定的數值。但在一般敘述中樣本也是一組隨機變量,因爲抽樣是隨機的。一般地,用 X1,X2,...XnX_1,X_2,...,X_n , 表示隨機樣本,它們取到的值記爲 x1,x2,...xnx_1,x_2,...,x_n稱爲樣本觀測值。一般情形下, 兩次觀測, 樣本值是不同的。

樣本作爲隨機變量,有一定的概率分佈,這個概率分佈稱爲樣本分佈。顯然,樣本分佈取決於總體的性質和樣本的性質。

2.2 統計量與抽樣分佈

數理統計的任務是採集和處理帶有隨機影響的數據,或者說收集樣本並對之進行加工,以此對所研究的問題作出一定的結論,這一過程稱爲統計推斷。從樣本中提取有用的信息來研究總體的分佈及各種特徵數就是構造統計量的過程, 因此,統計量是樣本的某種函數。

在這裏插入圖片描述
比如10個燈泡的平均壽命(X1,X2,...Xn)/10(X_1, X_2, ...X_n)/10是統計量。

2.3 常用的統計量

  1. 樣本均值
    X1,X2,...,XnX_1,X_2,...,X_n 是總體 XX 的一個簡單隨機樣本,稱
    Xˉ=1ni=1nXi\bar{X}=\frac{1}{n} \sum_{i=1}^{n} X_{i}
    爲樣本均值。 通常用樣本均值來估計總體分佈的均值和對有關總體分佈均值的假設作檢驗。

    均值這個numpy實現就是np.mean()
  2. 樣本方差
    X1,X2,...,XnX_1,X_2,...,X_n 是總體 XX 的一個簡單隨機樣本,Xˉ\bar{X}爲樣本均值,稱
    S2=1n1i=1n(XiXˉ)2S^{2}=\frac{1}{n-1} \sum_{i=1}^{n}\left(X_{i}-\bar{X}\right)^{2}
    爲樣本方差。通常用樣本方差來估計總體分佈的方差和對有關總體分佈均值或方差的假設作檢驗。

    numpy的話就是np.var()
  3. kk階樣本原點矩
    X1,X2,...,XnX_1,X_2,...,X_n 是總體 XX 的一個簡單隨機樣本,稱
    Ak=1ni=1nXikA_{k}=\frac{1}{n} \sum_{i=1}^{n} X_{i}^{k}
    爲樣本的 kk 階原點矩(可以看到 k=1k=1 時,相當於樣本均值),通常用樣本的無階原點矩來估計總體分佈的 kk 階原點矩。
  4. kk 階樣本中心矩
    X1,X2,...,XnX_1,X_2,...,X_n 是總體 XX 的一個簡單隨機樣本,Xˉ\bar{X}爲樣本均值,稱
    Mk=1ni=1n(XiXˉ)kM_{k}=\frac{1}{n} \sum_{i=1}^{n}\left(X_{i}-\bar{X}\right)^{k}
    爲樣本的 kk 階中心矩,通常用樣本的 kk 階中心矩來估計總體分佈的 kk階中心矩。
  5. 順序統計量
    在這裏插入圖片描述
    這個numpy的話就是np.max(), np.min()

2.4 三種重要的抽樣分佈

在使用統計量進行統計推斷的時候常常需要知道它的分佈, 統計量的分佈稱爲抽樣分佈, 有三個非常重要的統計量的分佈我們需要知道, 因爲在參數估計和檢驗假設等其實都有這三個分佈的影子或者依賴於這三個分佈, 這三個分佈就是χ2\chi^2分佈、tt分佈和FF分佈。

  1. χ2\chi^2分佈
    X1,X2,...XnX_1, X_2, ...X_n是來自總體N(0,1)N(0,1)的樣本, 則稱統計量
    χ2=X12+X22++Xn2\chi^{2}=X_{1}^{2}+X_{2}^{2}+\cdots+X_{n}^{2}
    服從自由度爲nnχ2\chi^2分佈, 記爲χ2χ2(n)\chi^2\sim\chi^2(n)。 自由度指的獨立變量的個數。概率密度函數長這樣:
    fn(x)={12Γ(n/2)(x2)n21ex2,x>00,x0f_{n}(x)=\left\{\begin{array}{cc} \frac{1}{2 \Gamma(n / 2)}\left(\frac{x}{2}\right)^{\frac{n}{2}-1} e^{-\frac{x}{2}}, & x>0 \\ 0, & x \leq 0 \end{array}\right.
    其中Γ(α)=0+xα1exdx\Gamma(\alpha)=\int_{0}^{+\infty} x^{\alpha-1} e^{-x} d x
    在這裏插入圖片描述
  2. tt分佈
    XN(0,1),Yχ2(n)X\sim N(0,1), Y\sim \chi^2(n), 且X,YX, Y相互獨立, 則稱隨機變量
    t=XY/nt=\frac{X}{\sqrt{Y / n}}
    服從自由度爲nntt分佈。它的概率密度函數:
    f(x;n)=Γ(n+12)nπΓ(n2)(1+x2n)n+12,<x<+f(x ; n)=\frac{\Gamma\left(\frac{n+1}{2}\right)}{\sqrt{n \pi} \Gamma\left(\frac{n}{2}\right)}\left(1+\frac{x^{2}}{n}\right)^{\frac{n+1}{2}},-\infty<x<+\infty
    概率密度函數圖像如下:
    在這裏插入圖片描述
  3. FF分佈
    Xχ2(n1),Yχ2(n2)X\sim \chi^2(n_1), Y\sim \chi^2(n_2), 且X,YX, Y獨立, 則稱隨機變量
    F=X/n1Y/n2F=\frac{X / n_{1}}{Y / n_{2}}
    服從自由度爲(n1,n2)(n_1, n_2)FF分佈, 記FF(n1,n2)F\sim F(n_1, n_2)

上面這些分佈在參數估計的時候, 會用到。 當然分佈本身可能比較複雜, 尤其是概率密度函數, 到時候會有表可查。

3. 描述性統計

3.1 數據集中趨勢的度量

  1. 平均數
    是表示一組數據集中趨勢的量數,是指在一組數據中所有數據之和再除以這組數據的個數。
    Xˉ=1ni=1nXi\bar{X}=\frac{1}{n} \sum_{i=1}^{n} X_{i}

  2. 中位數
    是指在一組數據,按順序排列後,居於中間位置的數。中位數描述數據中心位置的數字特徵,對於對稱分佈的數據,均值與中位數比較接近;對於偏態分佈的數據,均值與中位數不同。中位數不受異常值的影響,具有穩健性。
    x0.5={x([n2]+1), 當 n 是奇數 12[x(n2)+x(n2+1)], 當 n 是偶數. x_{0.5}=\left\{\begin{array}{ll} x_{\left(\left[\frac{n}{2}\right]+1\right)}, & \text { 當 } n \text { 是奇數 } \\ \frac{1}{2}\left[x_{\left(\frac{n}{2}\right)}+x_{\left(\frac{n}{2}+1\right)}\right], & \text { 當 } n \text { 是偶數. } \end{array}\right.

  3. 頻數: 指同一觀測值在一組數據中出現的次數(擲骰子中,一共擲了20次,出現數字5的次數)

  4. 衆數(mode): 就是一組數據中,出現次數最多的那個數(幾個數)。

    均值 VS 中位數 VS 衆數在這裏插入圖片描述

  5. 百分位數
    百分位數是中位數的推廣,將數據按從小到大排列後,對於
    0<=p<10<=p<1
    它的pp分位點定義爲
    mp={x([np]+1), 當 np 不是整數時, 12(x(np)+x(np+1)), 當 np 是整數時 ,m_{p}=\left\{\begin{array}{ll} x_{([n p]+1)}, & \text { 當 } n p \text { 不是整數時, } \\ \frac{1}{2}\left(x_{(n p)}+x_{(n p+1)}\right), & \text { 當 } n p \text { 是整數時 }, \end{array}\right.
    其中,[np]表示np的整數部分。所以,0.5分位數(第50百分位數)就是中位數。0.25分位數稱爲第一四分位數, 記爲Q1Q_1, 0.75分位數稱爲第三四分位數, 記爲Q3Q_3, 這三個分位數在統計中很有用的。

    這個百分位數最常見的就是我們說的箱線圖了:
    在這裏插入圖片描述
    這個箱線圖可以看到數據的下面幾個性質:

    1. 中心位置: 中位數所在的位置是數據集的中心
    2. 散佈程度:全部數據落在[Min, Max]之內, 在區間[Min, Q1Q_1], [Q1,MQ_1, M], [M, Q3Q_3], [Q3Q_3, Max]的數據個數各佔1/4。 區間較短時表示落在該區間的點較爲集中, 反之較爲分散。
    3. 對稱性:若中位數位於箱子的中間位置, 則數據分佈較爲對稱。 若Min離M的距離較Max離M的距離大, 則表示數據分佈向左傾斜, 反之數據右傾斜, 且能看出分佈尾部的長短。

    箱線圖特別適用於比價兩個或者兩個以上數據集的性質。 當然箱線圖也可以幫助我們檢測是否存在異常值(不尋常的過大或者過小), 第一四分位數Q1Q_1和第三四分位數Q3Q_3之間的距離記爲IQR, 也就是四分位數間距, 若數據小於Q11.5IQRQ_1-1.5IQR或者數據大於Q3+1.5IQRQ_3+1.5IQR, 就疑似異常

在這裏插入圖片描述

好了, 關於上面的這些內容,下面看一波python實現了。

首先是列表的元素求均值, 中位數, 衆數, 頻數:由於衆數numpy中沒有直接實現的函數, 所以可以調用scipy包的stats或者自己實現:

# 實現衆數  但這個不能返回多個衆數, 如果有多個衆數的話, 需要得到一個衆數的次數, 然後根據頻數返回多個。
def mode(lst):
    if not lst:
        return 
    return max(lst, key=lambda v: lst.count(v))

a = [1,2,4,5,3,12,12,23,43,52,11,22,22,22]
a_mean = np.mean(a)  #均值
a_med = np.median(a)  #中位數
a_mode = stats.mode(a)[0][0]   # 衆數  也是隻能返回一個
a_mode1 = mode(a)
print("a的平均數:",a_mean)
print("a的中位數:",a_med)
print('a的衆數', a_mode, a_mode1)

# 頻數
b = {k: a.count(k) for k in set(a)}
b  # {1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 43: 1, 12: 2, 11: 1, 52: 1, 22: 3, 23: 1}

# 基於頻數這個, 再寫一個求衆數的, 這個可以返回多個
def mode_duo(d):
    if len(d) == 0:
        return 
    max_values = max(d.values())   # 找到了衆數對應的次數
    return [key for key in d if d[key]==max_values]
 
a = [1,2,4,5,3,12,12,23,43,52,11,22,22,22, 1, 1]
b = {k: a.count(k) for k in set(a)}
mode_duo(b)   # 1 22

## 當然還可以轉成Series然後求衆數, 有多個的話也可以都返回來, 這個是最簡單的方式
pd.Series(a).mode()    

下面看看分位點的情況, 把a轉成Series, 用describe()函數就可以看到分位點:

pd.Series(a).describe()

## 結果:
count    16.000000
mean     14.750000
std      15.316658
min       1.000000
25%       2.750000
50%      11.500000
75%      22.000000
max      52.000000
dtype: float64

## 還可以藉助plt畫出箱型圖
import matplotlib.pyplot as plt
plt.boxplot(pd.Series(a))

在這裏插入圖片描述
下面我們再看看如何根據IQRIQR去掉異常值: 異常值可以截尾, 也可以直接去掉:

"""這裏包裝了一個異常值處理的代碼,可以隨便調用"""
def outliers_proc(data, col_name, scale=1.5):
    """
        用於截尾異常值, 默認用box_plot(scale=1.5)進行清洗
        param:
            data: 接收pandas數據格式
            col_name: pandas列名
            scale: 尺度
    """
    data_col = data[col_name]
    Q1 = data_col.quantile(0.25) # 0.25分位數
    Q3 = data_col.quantile(0.75)  # 0,75分位數
    IQR = Q3 - Q1
    
    data_col[data_col < Q1 - (scale * IQR)] = Q1 - (scale * IQR)
    data_col[data_col > Q3 + (scale * IQR)] = Q3 + (scale * IQR)

    return data[col_name]
 
num_data['power'] = outliers_proc(num_data, 'power')

上面是截尾異常值, 接收的是pandas的一列, 因爲有時候異常值多了的話暴力刪除可能不太好。 當然下面的代碼直接刪除掉異常值, 接收的是一個DataFrame, 然後判斷有幾列都出現異常的時候才刪除這個樣本。

# 檢測異常值並將其捨棄,返回刪除的列
def detect_and_remove_outliers(df):
    """這個方法按列檢查異常值,並保存所在的行,如果某個行有兩個以上的異常值,就刪除該行"""
    outliers = []
    col = list(df)
    #checking interquartile range IQR for all columns
    for c in col:
        Q1 = df[c].quantile(0.25) # 0.25分位數
        Q3 = df[c].quantile(0.75)
        IQR = Q3 - Q1
        outliers.extend(df[(df[c] < Q1 - (1.5 * IQR)) | (df[c] > Q3 + (1.5 * IQR) )].index)
    #returning keys for count of occurrences in the list outlier key value pairs
    return  list(k for k,v in Counter(outliers).items() if v >2)
 
remove_list = detect_and_remove_outliers(data)
data_remove = data.drop(remove_list, axis=0) 

3.2 數據離散趨勢的度量

表示數據分散(離散,差異)程度的特徵量有方差,標準差,極差以及變異係數等。

  1. 方差
    用來計算每一個變量(觀察值)與總體均數之間的差異。實際工作中,總體均數難以得到時,應用樣本統計量代替總體參數,經校正後,樣本方差計算公式:
    s2=1n1i=1n(xixˉ)2s^{2}=\frac{1}{n-1} \sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2}
    樣本方差的開平方成爲樣本標準差。
    s=s2=1n1i=1n(xixˉ)2s=\sqrt{s^{2}}=\sqrt{\frac{1}{n-1} \sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2}}

  2. 極差
    數據越分散,極差越大。
    R=x(n)x(1)=max(x)min(x)R=x_{(n)}-x_{(1)}=\max (x)-\min (x)

  3. 變異係數
    CV=100×sxˉ(%)\mathrm{CV}=100 \times \frac{s}{\bar{x}}(\%)
    是刻畫數據相對分散性的一種度量。變異係數只在平均值不爲零時有定義,而且一般適用於平均值大於零的情況。變異係數也被稱爲標準離差率或單位風險。當需要比較兩組數據離散程度大小的時候,如果兩組數據的測量尺度相差太大,或者數據量綱的不同,變異係數可以消除測量尺度和量綱的影響。

  4. 四分位數差
    這個上面整理過了, 樣本上、下四分位數之差稱爲四分位差(或半極差)。
    R1=Q3Q1R_{1}=Q_{3}-Q_{1}
    它也是度量樣本分散性的重要數字特徵,特別對於具有異常值的數據,它作爲分散性具有穩健性。

    下面是方差, 標準差, 變異係數的numpy實現。

    a = [1,2,4,5,3,12,12,23,43,52,11,22,22,22]
    a_var = np.var(a)  #方差
    a_std1 = np.sqrt(a_var) #標準差
    a_std2 = np.std(a) #標準差
    a_mean = np.mean(a)  #均值
    a_cv =  a_std2 /a_mean #變異係數
    print("a的方差:",a_var)
    print("a的方差:",a_std1)
    print("a的方差:",a_std2)
    print("a的變異係數:",a_cv)
    
  5. 偏度與峯度
    偏度(skewness):也稱爲偏態,是統計數據分佈偏斜方向和程度的度量,是統計數據分佈非對稱程度的數字特徵。直觀看來就是密度函數曲線尾部的相對長度。偏度刻畫的是分佈函數(數據)的對稱性。關於均值對稱的數據其偏度係數爲0,右側更分散的數據偏度係數爲正,左側更分散的數據偏度係數爲負。樣本偏度係數如下:
    g1=n(n1)(n2)s3i=1n(xixˉ)3=n2μ3(n1)(n2)s3g_{1}=\frac{n}{(n-1)(n-2) s^{3}} \sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{3}=\frac{n^{2} \mu_{3}}{(n-1)(n-2) s^{3}}

    1. 正態分佈的偏度爲0, 兩側尾部長度對稱。
    2. 左偏
      在這裏插入圖片描述
    3. 右偏
      在這裏插入圖片描述


    峯度(peakedness;kurtosis): 說明的是分佈曲線在平均值處峯值高低的特徵數。直觀看來,峯度反映了峯部的尖度。樣本的峯度是和正態分佈相比較而言,如果峯度大於三,峯的形狀比較尖,比正態分佈峯要陡峭。反之亦然。峯度刻畫的是分佈函數的集中和分散程度
    在這裏插入圖片描述
    峯度係數如下:
    g2=n(n+1)(n1)(n2)(n3)s4i=1n(xixˉ)43(n1)2(n2)(n3)=n2(n+1)μ4(n1)(n2)(n3)s43(n1)2(n2)(n3)\begin{aligned} g_{2} &=\frac{n(n+1)}{(n-1)(n-2)(n-3) s^{4}} \sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{4}-3 \frac{(n-1)^{2}}{(n-2)(n-3)} \\ &=\frac{n^{2}(n+1) \mu_{4}}{(n-1)(n-2)(n-3) s^{4}}-3 \frac{(n-1)^{2}}{(n-2)(n-3)} \end{aligned}

下面是一波python實現:

data = list(np.random.randn(10000)) #⽣生成標準正態分佈的隨機數(10000個)

plt.hist(data, 1000, facecolor='g', alpha=0.5)   # alpha表示透明度
plt.show()

s = pd.Series(data) #將數組轉化爲序列列 
print('偏度係數',s.skew())   # 0.0024936359680932723
print('峯度係數',s.kurt())   # -0.05970174780792892

結果如下:
在這裏插入圖片描述

4. 總結

今天學習數理統計和描述性統計, 下面簡單總結一下, 數理統計是從抽樣統計的角度去估計樣本的總體分佈或未知的規律, 首先介紹了數理統計裏面的基本概念, 例如總體,個體, 樣本等, 然後是統計量與抽樣分佈, 介紹了常用的統計量像均值, 方差, 標準差,中心距,原點矩等。 然後介紹了三個非常重要的抽樣分佈卡方, T和F。 最後是描述性統計這塊,介紹了數據集中趨勢度量, 這裏麪包括平均數,中位數, 衆數, 頻數,百分位數等並給出了numpy實現, 然後是離散趨勢度量, 方差, 標準差, 極差,四分位點的內容, 然後是峯度和偏度的介紹。

依然是一張導圖把知識拎起來:
在這裏插入圖片描述

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