[Python]大樂透統計學--中位數、眾數、六分位數

本篇文章以大樂透號碼說明統計學的中位數、眾數、六分位。

準備工作:將108年大樂透號碼存成Lotto_108.csv,內容可參考[Python]大樂透統計學--平均數、變異數@ KOEI的旅行 - 痞客邦 。中位數在該篇文章也稍有提到。

用Python運算大樂透中獎號碼的中位數、眾數、六分位。

讀取中獎號碼(樣本):

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

#刪除 特別號
lotto_data108 = np.delete(lotto_data108,6,axis=1)
#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]]

 

計算每期的中位數,獎號共有6個,中位數為第3個與第4個獎號之平均。例如:

108000001期:18,23,24,25,39,42  => 中位數=24.5
108000002期:06,07,08,20,47,48  => 中位數=14
108000112期:10,14,26,38,39,47  => 中位數=32

#計算每期獎號的中位數
sample_median = np.median(lotto_data108,axis=1)
print('樣本中位數:',sample_median)
print('樣本中位數之平均:',np.mean(sample_median))

計算結果:

樣本中位數: [24.5 14.  24.5 26.5 34.  20.  36.5 14.5 27.  20.5 28.5 
...
 23.5 17.  27.  13.  22.5 18.5 28.5 29.  25.  38.  28.5 32. ]
樣本中位數之平均: 25.544642857142858

中位數之平均為25.55,表示第3個與第4個獎號之平均為25.55,也就是平均每期1到25號有3個獎號,26到49號有另外3個

 

另外一種中間號的統計方式,先列出第3個與第4個獎號間所有獎號,然後取眾數。中間獎號的眾數是中間獎號出現機率最高的號碼,即是最常出現的中間數字,所以它的左、右2邊通常各有3個獎號。

步驟1:列出每期第3個與第4個獎號間所有號碼,取包含第3個獎號,但不含第4個獎號。

108000001期:18,23,24,25,39,42  => 中間獎號:24
108000002期:06,07,08,20,47,48  => 中間獎號:08-19
108000112期:10,14,26,38,39,47  => 中間獎號:26-37

AllMiddleNo = []
for row in lotto_data108:
    sample_middle = list(range(row[2], row[3]))
    print(sample_middle)
    #串接樣本
    AllMiddleNo.extend(sample_middle)
    
print(AllMiddleNo)

執行結果,中間號碼清單:

中間號碼: [24]
中間號碼: [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
中間號碼: [21, 22, 23, 24, 25, 26, 27]
...
中間號碼: [31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44]
中間號碼: [25, 26, 27, 28, 29, 30, 31]
中間號碼: [26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37]
全部中間號碼: [24, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27,
...
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 25, 26, 27, 28, 29, 30, 31, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37]

 

步驟2:計算所有中間號碼出現的次數,找出眾數。

#計算出現次數
counts = np.bincount(AllMiddleNo)
#bincount:各個正整數出現的次數,從0開始算
print('每個中間號出現次數:' ,counts)
sample_mode = np.argmax(counts)
#argmax:(第一個)最大數的index,bincount的argmax就是眾數
print('中間號碼眾數:',sample_mode, '出現次數:',counts[sample_mode])

執行結果:

每個中間號出現次數: [ 0  0  0  0  1  1  1  1  3  4  4  7 13 13 19 20 20 23 29 31 29 25 33 36
 36 39 40 39 39 38 37 35 33 26 22 21 17 10  8  7  5  5  5  4  2  1]
中間號碼眾數: 26 出現次數: 40

表示最常出現的中間號是26,它的左、右2邊通常各有3個獎號也就是最常1到26號有3個獎號,27到49號有另外3個,這樣的機率是40/112 = 35.7% (出現次數40,共112期)。

 

六分位數將獎號分成6段,第1個六分位數取第1個與第2個獎號之平均;第2個六分位數取第2個與第3個獎號之平均;以此類推,第5個六分位數取第5個與第6個獎號之平均;而第3個六分位數即是中位數。例如:

108000001期:18,23,24,25,39,42  => 六分位數:20.5 23.5 24.5 32   40.5
108000002期:06,07,08,20,47,48  => 六分位數: 6.5  7.5  14   33.5 47.5
108000112期:10,14,26,38,39,47  => 六分位數:12   20    32   38.5 43

#六分位
np.set_printoptions(precision=1)  #陣列print到小數第1位’
sample_six= np.percentile(lotto_data108, [100/6, 200/6, 300/6, 400/6, 500/6],axis=1,interpolation = 'midpoint')
#interpolation='midpoint',取2數平均
print('全部六分位數:',sample_six)
print('六分位數之平均:',np.mean(sample_six,axis=1))

percentile之作法參考numpy.org的文件numpy.percentile

六分位數執行結果:

全部六分位數: [[20.5  6.5 11.5  ......    18.5 13.5 17.5 12. ]
 [23.5  7.5 20.  ......   21.5 24.5 21.5 20. ]
 [24.5 14.  24.5 ......   25.  38.  28.5 32. ]
 [32.  33.5 33.5 .......  30.  46.5 37.5 38.5]
 [40.5 47.5 41.  .......  43.5 39.  48.5 44.  43. ]]
六分位數之平均: [10.9 18.5 25.5 32.6 39.8]

六分位數之平均為10.9 18.5 25.5 32.6 39.8

號碼共49個,以六分位數之平均,分成6組的分法為:

1-10, 11-18, 19-25, 26-32, 33-39, 40-49

與平分成6等分的分法略有不同,平分的6分位為:

1-8,   9-16, 17-24, 24-32, 33-40, 41-49

分成6個區間,表示每個區間平均都有一個號碼,但與實際獎號比較,例如:

108000001期:18,23,24,25,39,42  
108000002期:06,07,08,20,47,48  
108000112期:10,14,26,38,39,47  

使用六分位分析獎號在六個區間的機率,結果每區平均分散的機率不高,每區平均0~2個數字,甚至也有到3個數字的。

 

 

 

arrow
arrow
    創作者介紹
    創作者 KOEI 的頭像
    KOEI

    KOEI的旅行

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