Python解釋數學系列 分位數Quantile

2022-03-02 13:06:19 字數 4817 閱讀 2196

跳轉到我的部落格

ex1: given a data = [6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36],求q1, q2, q3, iqr

solving:

步驟:1. 排序,從小到大排列data,data = [6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49]

2. 計算分位數的位置

3. 給出分位數

分位數計算法一

pos = (n+1)*p,n為資料的總個數,p為0-1之間的值

q1的pos = (11 + 1)*0.25 = 3 (p=0.25) q1=15

q2的pos = (11 + 1)*0.5 = 6 (p=0.5) q2=40

q3的pos = (11 + 1)*0.75 = 9 (p=0.75) q3=43

iqr = q3 - q1 = 28

import math

def quantile_p(data, p):

pos = (len(data) + 1)*p

#pos = 1 + (len(data)-1)*p

pos_integer = int(math.modf(pos)[1])

pos_decimal = pos - pos_integer

q = data[pos_integer - 1] + (data[pos_integer] - data[pos_integer - 1])*pos_decimal

return q

data = [6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49]

q1 = quantile_p(data, 0.25)

print("q1:", q1)

q2 = quantile_p(data, 0.5)

print("q2:", q2)

q3 = quantile_p(data, 0.75)

print("q3:", q3)

分位數計算法二

pos = 1+ (n-1)\*p,n為資料的總個數,p為0-1之間的值

q1的pos = 1 + (11 - 1)\*0.25 = 3.5 (p=0.25) q1=25.5

q2的pos = 1 + (11 - 1)\*0.5 = 6 (p=0.5) q2=40

q3的pos = 1 + (11 - 1)\*0.75 = 8.5 (p=0.75) q3=42.5

```import math

def quantile_p(data, p):

pos = 1 + (len(data)-1)*p

pos_integer = int(math.modf(pos)[1])

pos_decimal = pos - pos_integer

q = data[pos_integer - 1] + (data[pos_integer] - data[pos_integer - 1])*pos_decimal

return q

data = [6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49]

q1 = quantile_p(data, 0.25)

print("q1:", q1)

q2 = quantile_p(data, 0.5)

print("q2:", q2)

q3 = quantile_p(data, 0.75)

print("q3:", q3)

```## 案例2

給定資料集 data = [7, 15, 36, 39, 40, 41],求q1,q2,q3

分位數計算法一

import math

def quantile_p(data, p):

data.sort()

pos = (len(data) + 1)*p

pos_integer = int(math.modf(pos)[1])

pos_decimal = pos - pos_integer

q = data[pos_integer - 1] + (data[pos_integer] - data[pos_integer - 1])*pos_decimal

return q

data = [7, 15, 36, 39, 40, 41]

q1 = quantile_p(data, 0.25)

print("q1:", q1)

q2 = quantile_p(data, 0.5)

print("q2:", q2)

q3 = quantile_p(data, 0.75)

print("q3:", q3)

計算結果:

q1 = 7 +(15-7)×(1.75 - 1)= 13

q2 = 36 +(39-36)×(3.5 - 3)= 37.5

q3 = 40 +(41-40)×(5.25 - 5)= 40.25

分位數計算法二

結果:q1: 20.25

q2: 37.5

q3: 39.75

**四分位數**

**概念**:把給定的亂序數值由小到大排列並分成四等份,處於三個分割點位置的數值就是四分位數。

**第1四分位數 (q1)**,又稱「較小四分位數」,等於該樣本中所有數值由小到大排列後第25%的數字。

**第2四分位數 (q2)**,又稱「中位數」,等於該樣本中所有數值由小到大排列後第50%的數字。

**第3四分位數 (q3)**,又稱「較大四分位數」,等於該樣本中所有數值由小到大排列後第75%的數字。

**四分位距**(interquartile range, iqr)= 第3四分位數與第1四分位數的差距

確定p分位數字置的兩種方法

position = (n+1)*p

position = 1 + (n-1)*p

在python中計算分位數字置的方案採用position=1+(n-1)*p

import pandas as pd

import numpy as np

df = pd.dataframe(np.array([[1, 1], [2, 10], [3, 100], [4, 100]]), columns=['a', 'b'])

print("資料原始格式:")

print(df)

print("計算p=0.1時,a列和b列的分位數")

print(df.quantile(.1))

程式計算結果:序號a

b011

12102

310034

100計算p=0.1時,a列和b列的分位數

a 1.3

b 3.7

name: 0.1, dtype: float64

手算計算結果:

計算a列

pos = 1 + (4 - 1)*0.1 = 1.3

fraction = 0.3

ret = 1 + (2 - 1) * 0.3 = 1.3

計算b列

pos = 1.3

ret = 1 + (10 - 1)* 0.3 = 3.7

利用pandas庫計算data = [6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36]的分位數。

import pandas as pd

import numpy as np

dt = pd.series(np.array([6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36])

print("資料格式:")

print(dt)

print('q1:', df.quantile(.25))

print('q2:', df.quantile(.5))

print('q3:', df.quantile(.75))

計算結果

q1: 25.5

q2: 40.0

q3: 42.5

import math

def quantile_p(data, p, method=1):

data.sort()

if method == 2:

pos = 1 + (len(data)-1)*p

else:

pos = (len(data) + 1)*p

pos_integer = int(math.modf(pos)[1])

pos_decimal = pos - pos_integer

q = data[pos_integer - 1] + (data[pos_integer] - data[pos_integer - 1])*pos_decimal

q1 = quantile_p(data, 0.25)

q2 = quantile_p(data, 0.5)

q3 = quantile_p(data, 0.75)

iqr = q3 - q1

return q1, q2, q3, iqr

直接呼叫.quantile(p)方法,就可以計算出分位數,採用method=2方法。

1. 分位數概念

2. pandas中的quantile

數學系列目錄

初等數學 漫談傅利葉1 從無窮級數到傅利葉 漫談傅利葉2 公式推導 三角函式正交性 漫談傅利葉3 收斂性 非週期函式的推廣應用 漫談傅利葉4 全時傅利葉的缺點與短時傅利葉 漫談傅利葉5 卷積與短時傅利葉的缺點 漫談傅利葉6 取樣與1d初步實現 漫談傅利葉7 帶有相位與幅值的1d實現 漫談傅利葉8 傅...

學習數學系列《一》

內容摘自 微積分摘要 高等數學ppt 由於標題寫高數有圈粉嫌疑,所以還是寫一些比較樸素的名字。實際上這個算是高等數學的學習。前幾天被一位神犇虐數學虐到哭所以自己還是默默地拿起了書。進入正題 第一節 1.1集合的對映 如果有一種規律f使得a中每乙個元素 x 都能與b中的唯一確定的元素f x 對應,那麼...

演算法趣題(Java隨筆) 數學系列

目錄 一 判斷閏年 二 矩陣乘積 三 哥德 猜想 四 完全數 五 親密數 六 數轉陣列 七 分解質因數 八 待續.四年一閏,百年不閏,四百年再閏 1 判斷閏年 static boolean isleapyear int year return false 執行測試 1 判斷閏年 main方法中執行 ...