close

[Python]大樂透統計學--平均數、變異數

本篇文章以大樂透號碼說明統計學的平均數、變異數、標準差,以實例說明樣本變異數為什麼是除以n-1。(Python程式碼不懂也沒關係,看執行結果就可以)

準備工作:上網收集或爬網得到108年大樂透號碼,存成Lotto_108.csv,內容如下:

108000001,18,23,24,25,39,42,48
108000002,06,07,08,20,47,48,30
108000003,04,19,21,28,39,43,18

.......

108000110,09,18,31,45,48,49,22
108000111,17,18,25,32,43,45,05
108000112,10,14,26,38,39,47,08

第1個欄位是期別,第2個~第7個欄位是依大小順序排序的6個獎號,第8個欄位是特別號。

平均數、變異數、標準差的公式如下:

stat_01.png

 

一、計算母體平均數、變異數:

將1,2,3,.......,49個號碼當作母體,母體數為49,N=49;將每次開獎的6個號碼(不含特別號)當為樣本,n=6。

用Python來運算,設定母體,並計算母體中位數、平均數、變異數、標準差:

import numpy as np

#設定母體
popu_data = np.arange(1, 50, 1)
popu_median = np.median(popu_data)
popu_mean = np.mean(popu_data)
popu_var = np.var(popu_data)
popu_std = np.std(popu_data)
print ('母體:',popu_data)
print ('母體中位數:',popu_median)
print ('母體平均數:',popu_mean)
print ('母體變異數:',popu_var)
print ('母體標準差:',popu_std)

執行結果如下:

母體: [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24  25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48  49]
母體中位數: 25.0
母體平均數: 25.0
母體變異數: 200.0
母體標準差: 14.142135623730951

 

二、計算樣本平均數、變異數:

讀取中獎號(樣本)

lotto_data108=np.loadtxt("Lotto_108.csv",dtype=np.int,delimiter=',')
#刪除期別
lotto_data108 = np.delete(lotto_data108,0,axis=1)
#0表示要刪除索引0(第1個資料),axis=0表示刪除行,axis=1表示刪除列。

#刪除 特別號
lotto_data108 = np.delete(lotto_data108,6,axis=1)
#6表示要刪除索引6(第7個資料),axis=0表示刪除行,axis=1表示刪除列。

print (lotto_data108)

執行結果,得到108年各期號碼:

[[18 23 24 25 39 42]
 [ 6  7  8 20 47 48]
 [ 4 19 21 28 39 43]
 [13 20 22 31 34 42]

......

 [ 9 18 31 45 48 49]
 [17 18 25 32 43 45]
 [10 14 26 38 39 47]]

 

計算每期的中位數、平均數、變異數、標準差,樣本變異數先使用除以n計算,後續再與除以n-1比較。

#計算每期獎號的中位數、平均數、變異數、標準差,變異數除以n計算
np.set_printoptions(precision=2)  #陣列print到小數第2位
sample_size = len(lotto_data108)
sample_median = np.arange(sample_size,dtype=float)
sample_mean = np.arange(sample_size,dtype=float)
sample_var = np.arange(sample_size,dtype=float)
sample_std = np.arange(sample_size,dtype=float)

i=0 
for row in lotto_data108:
    sample_median[i] = np.median(row)
    sample_mean[i] = np.mean(row)
    sample_var[i] = np.var(row)
    sample_std[i] = np.std(row)
    i=i+1

print('每期獎號中位數:',sample_median)
print('每期獎號平均數:',sample_mean)
print('每期獎號變異數:',sample_var)
print('每期獎號標準差:',sample_std)

每期的中位數、平均數、變異數、標準差計算結果:

每期獎號中位數: [24.5 14.  24.5  26.5  34.  20.  36.5 14.5 27. 
....
 27.  13.  22.5 18.5  28.5 29.  25.  38.  28.5 32. ]
每期獎號平均數: [28.5  22.67 25.67 27.  30.17 22.17 30.5  17.83 
....   
 27.5  20.17 24.  22.83 27.   29.17 27.5  33.33 30.   29. ]
每期獎號變異數: [ 77.58 329.89 169.89  93.33 118.14 273.14 227.92 
....
 222.14  65.67 269.14 204.33 158.81  94.58 238.22 122.67 183.33]
每期獎號標準差: [ 8.81 18.16 13.03  9.66 10.87 16.53 15.1  13.21 
....
 11.03 14.9   8.1  16.41 14.29 12.6  9.73 15.43 11.08 13.54]

計算每期的中位數、平均數、變異數、標準差之平均(樣本變異數使用除以n計算):

print ('每期中位數之平均:',np.mean(sample_median))
print ('每期平均數之平均:',np.mean(sample_mean))
print ('每期變異數之平均:',np.mean(sample_var))
print ('每期標準差之平均:',np.mean(sample_std))

每期的中位數、平均數、變異數、標準差之平均執行結果:(樣本變異數使用除以n計算)

每期中位數之平均: 25.544642857142858
每期平均數之平均: 25.403273809523814
每期變異數之平均: 173.66443452380955
每期標準差之平均: 12.89643727107358

 

計算每期樣本的中位數、平均數、變異數、標準差(樣本變異數使用除以n-1計算,自由度減1)。

#計算每期的中位數、平均數、變異數、標準差,變異數除以n-1計算
i=0 
for row in lotto_data108:
    sample_median[i] = np.median(row)
    sample_mean[i] = np.mean(row)
    sample_var[i] = np.var(row,ddof = 1)
    sample_std[i] = np.std(row,ddof = 1)
    i=i+1

print ('樣本中位數之平均:',np.mean(sample_median))
print ('樣本平均數之平均:',np.mean(sample_mean))
print ('樣本期變異數之平均:',np.mean(sample_var))
print ('樣本標準差之平均:',np.mean(sample_std))

#ddof:Delta Degrees of Freedom,the divisor used in the calculation is (N- ddof). By default ddof is zero.

每期樣本的中位數、平均數、變異數、標準差之平均執行結果(樣本變異數使用除以n-1計算):

樣本中位數之平均: 25.544642857142858
樣本平均數之平均: 25.403273809523814
樣本期變異數之平均: 208.39732142857142
樣本標準差之平均: 14.12733920963473

 

母體平均數是25;樣本平均數是25.4。

母體變異數是200,第1次除以n計算樣本變異數約為174;第2次除以n-1得約為208,樣本變異數稱為母體變異數不偏估計值(unbiased estimate),所以樣本變異數應接近母體變異數,比較2種計算方式,明顯看出除以n-1者較接近,所以樣本變異數公式才會修正為除以n-1者,此公式可從自由度或期望值等證明,但我認為實際算最能實證。較直接的想法是樣本抽到極值的機率小,例如樣本抽到1,2或48,49等變異數值較大的機率相對小,所以使用原來樣本變異數除以n的算法結果會比母體變異數小,算法必須調整,而數學家找出修正為除以n-1是較佳的公式,並最後以理論證明。

希望您對樣本變異數除以n-1不要再感到疑惑,實算是如此算法較接近母體變異數。

 

arrow
arrow

    KOEI 發表在 痞客邦 留言(0) 人氣()