1. 程式人生 > >資料科學和人工智慧技術筆記 二十一、統計學

資料科學和人工智慧技術筆記 二十一、統計學

二十一、統計學

作者:Chris Albon

譯者:飛龍

協議:CC BY-NC-SA 4.0

貝塞爾校正

貝塞爾的校正是我們在樣本方差和樣本標準差的計算中使用 n 1 n-1 而不是 n

n 的原因。

樣本方差:

$ s^2 = \frac {1}{n-1} \sum_{i=1}^n \left(x_i - \overline{x} \right)^ 2 $

當我們計算樣本方差時,我們試圖估計總體方差,這是一個未知值。 為了進行這種估計,我們從樣本與總體均值的平方差的平均值,來估計未知的總體方差。 這種估計技術的負面影響是,因為我們正在取樣,我們更有可能觀察到差較小的觀測,因為它們更常見(例如它們是分佈的中心)。 按照定義我們將低估總體方差。

弗里德里希貝塞爾發現,通過將有偏差(未校正)的樣本方差 s

n 2 = 1 n i =
1
n
( x i x ) 2 s_n^2 = \frac {1}{n} \sum_{i=1}^n \left(x_i - \overline{x} \right)^ 2 乘以 n n 1 \frac{n}{n-1} ,我們將能夠減少這種偏差,從而能夠準確估計總體方差和標準差。 乘法的最終結果是無偏樣本方差。

演示中心極限定律

# 匯入包
import pandas as pd
import numpy as np

# 將 matplotlib 設為內聯
%matplotlib inline 

# 建立空的資料幀
population = pd.DataFrame()

# 建立一列,它是來自均勻分佈的 10000 個隨機數 
population['numbers'] = np.random.uniform(0,10000,size=10000)

# 繪製得分資料的直方圖
# 這確認了資料不是正態分佈的
population['numbers'].hist(bins=100)

# <matplotlib.axes._subplots.AxesSubplot at 0x112c72710> 

png

# 檢視數值的均值
population['numbers'].mean()

# 4983.824612472138 

# 建立列表
sampled_means = []

# 執行 1000 次
for i in range(0,1000):
    # 從總體中隨機抽取 100 行
    # 計算它們的均值,附加到 sampled_means
    sampled_means.append(population.sample(n=100).mean().values[0])

# 繪製 sampled_means 的直方圖
# 它很明顯是正態分佈的,中心約為 5000
pd.Series(sampled_means).hist(bins=100)

# <matplotlib.axes._subplots.AxesSubplot at 0x11516e668> 

png

這是關鍵的圖表,記住總體分佈是均勻的,然而,這個分佈接近正態。 這是中心極限理論的關鍵點,也是我們可以假設樣本均值是無偏的原因。

# 檢視 sampled_means 的均值
pd.Series(sampled_means).mean()

# 4981.465310909289 

# 將樣本均值的均值減去真實的總體均值
error = population['numbers'].mean() - pd.Series(sampled_means).mean()

# 列印
print('The Mean Sample Mean is only %f different the True Population mean!' % error)

# The Mean Sample Mean is only 2.359302 different the True Population mean! 

皮爾遜相關係數

基於 cbare這個 StackOverflow 答案。

import statistics as stats

x = [1,2,3,4,5,6,7,8,9]
y = [2,1,2,4.5,7,6.5,6,9,9.5]

有許多等價的表達方式來計算皮爾遜相關係數(也稱為皮爾遜的 r)。這是一個。

r = 1 n 1 i = 1 n ( x i x ˉ s x ) ( y i y ˉ s y ) r={\frac {1}{n-1}}\sum_{i=1}^{n}\left({\frac {x_{i}-{\bar {x}}}{s_{x}}}\right)\left({\frac {y_{i}-{\bar {y}}}{s_{y}}}\right)

其中 s x s_{x} s y s_{y} x x 和 $y $ 的標準差, ( x i x ˉ s x ) \left({\frac {x_{i}-{\bar {x}}}{s_{x}}}\right) x x y y 標準得分

# 建立函式
def pearson(x,y):

    # 建立 n,資料中的觀測數量
    n = len(x)

    # 建立列表來儲存標準得分
    standard_score_x = []
    standard_score_y = []

    # 計算 x 的均值
    mean_x = stats.mean(x)

    # 計算 x 的標準差
    standard_deviation_x = stats.stdev(x)

    # 計算 y 的均值
    mean_y = stats.mean(y)

    # 計算 y 的標準差
    standard_deviation_y = stats.stdev(y)

    # 對於 x 中的每個觀測
    for observation in x: 

        # 計算 x 的標準得分
        standard_score_x.append((observation - mean_x)/standard_deviation_x) 

    # 對於 y 中的每個觀測
    for observation in y:

        # 計算 y 的標準得分
        standard_score_y.append((observation - mean_y)/standard_deviation_y)

    # 將標準得分加在一起,求和,然後除以 n-1,返回該值
    return (sum([i*j for i,j in zip(standard_score_x, standard_score_y)]))/(n-1)

# 展示皮爾遜相關係數
pearson(x,y)

# 0.9412443251336238 

概率質量函式(PMF)

# 載入庫
import matplotlib.pyplot as plt

# 建立一些隨機整數
data = [3,2,3,4,2,3,5,2,2,3,3,5,2,2,5,6,2,2,2,3,6,6,2,4,3,2,3]

# 建立字典來儲存計數
count = {}

# 對於資料中的每個值
for observation in data:
    # 鍵為觀測,值遞增
    count[observation] = count.get(observation, 0) + 1

# 計算觀測數量 observations
n = len(data)

# 建立字典
probability_mass_function = {}

# 對於每個唯一值
for unique_value, count in count.items():
    # 將計數歸一化,通過除以資料量,新增到 PMC 字典
    probability_mass_function[unique_value] = count / n

# 繪製概率質量函式
plt.bar(list(probability_mass_function.keys()), probability_mass_function.values(), color='g')
plt.show()

png

Spearman 排名相關度

import numpy as np
import pandas as pd
import scipy.stats

# 建立兩列隨機變數
x = [1,2,3,4,5,6,7,8,9]
y = [2,1,2,4.5,7,6.5,6,9,9.5]

Spearman 的排名相關度,是變數的排名版本的皮爾遜相關係數。

# 建立接受 x 和 y 的函式
def spearmans_rank_correlation(xs, ys):

    # 計算 x 的排名
    #(也就是排序後元素的位置)
    xranks = pd.Series(xs).rank()

    # 計算 y 的排名
    yranks = pd.Series(ys).rank()

    # 在資料的排名版本上,計算皮爾遜相關係數
    return scipy.stats.pearsonr(xranks, yranks)

# 執行函式
spearmans_rank_correlation(x, y)[0]

# 0.90377360145618091 

# 僅僅檢查我們的結果,使用 Scipy 的 Spearman
scipy.stats.spearmanr(x, y)[0]

# 0.90377360145618102 

T 檢驗

from scipy import stats
import numpy as np

# 建立 20 個觀測的列表,從均值為 1,
# 標準差為 1.5 的正態分佈中隨機抽取
x = np.random.normal(1, 1.5, 20)

# 建立 20 個觀測的列表,從均值為 0,
# 標準差為 1.5 的正態分佈中隨機抽取
y = np.random.normal(0, 1.5, 20)

單樣本雙邊 T 檢驗

想象一下單樣本 T 檢驗,並繪製一個“正態形狀的”山丘,以1為中心,並以1.5為標準差而“展開”,然後在0處放置一個標誌並檢視標誌在山丘上的位置。它靠近頂部嗎? 或者遠離山丘? 如果標誌靠近山丘的底部或更遠,則 t 檢驗的 p 值將低於0.05

# 執行 T 檢驗來檢驗 x 的均值和 0 相比,是否有統計學顯著的差異
pvalue = stats.ttest_1samp(x, 0)[1]

# 檢視 p 值
pvalue

# 0.00010976647757800537 

雙樣本非配對等方差雙邊 T 檢驗

想象一下單樣本 T 檢驗,並根據標準差繪製兩個(正態形狀的)山丘,以它們的均值為中心,並根據他們的標準差繪製它們的“平坦度”(個體延展度)。 T 檢驗考察了兩座山丘重疊的程度。 它們基本上是彼此覆蓋的嗎? 山丘的底部幾乎沒有碰到嗎? 如果山丘的尾部剛剛重疊或根本不重疊,則 t 檢驗的 p 值將低於 0.05。

stats.ttest_ind(x, y)[1]

# 0.00035082056802728071 

stats.ttest_ind(x, y, equal_var=False)[1]

# 0.00035089238660076095 

雙樣本配對雙邊 T 檢驗

當我們採集重複樣本,並且想要考慮我們正在測試的兩個分佈是成對的這一事實時,使用配對 T 檢驗。

stats.ttest_rel(x, y)[1]

# 0.00034222792790150386 

方差和標準差

# 匯入包
import math

# 建立值的列表
data = [3,2,3,4,2,3,5,2,2,33,3,5,2,2,5,6,62,2,2,3,6,6,2,23,3,2,3]

方差是衡量資料分佈延展度的指標。 方差越大,資料點越“分散”。 方差,通常表示為 $ S^{2}$,計算方式如下:

$ \text{Population Variance} = S_n^{2} = \frac{1}{n}\sum_{i=1}{n}(x_i-\bar{x}){2}$

$ \text{Sample Variance} = S_{n-1}^{2} = \frac{1}{n-1}\sum_{i=1}{n}(x_i-\bar{x}){2}$

其中 n n 是觀測數, x ˉ \bar{x} 是觀察值的平均值, x i x ˉ x_i-\bar{x} 是單個觀察值減去資料均值。 請注意,如果我們根據來自該總體的樣本估計總體的方差,我們應該使用第二個等式,將 n n 替換為 n 1 n-1