statistics
--- 數(shù)學(xué)統(tǒng)計(jì)函數(shù)?
3.4 新版功能.
源代碼: Lib/statistics.py
該模塊提供了用于計(jì)算數(shù)字 (Real
-valued) 數(shù)據(jù)的數(shù)理統(tǒng)計(jì)量的函數(shù)。
此模塊并不是諸如 NumPy , SciPy 等第三方庫(kù)或者諸如 Minitab , SAS , Matlab 等針對(duì)專(zhuān)業(yè)統(tǒng)計(jì)學(xué)家的專(zhuān)有全功能統(tǒng)計(jì)軟件包的競(jìng)品。此模塊針對(duì)圖形和科學(xué)計(jì)算器的水平。
除非明確注釋?zhuān)@些函數(shù)支持 int
, float
, Decimal
和 Fraction
。當(dāng)前不支持同其他類(lèi)型(是否在數(shù)字塔中)的行為。混合類(lèi)型的集合也是未定義的,并且依賴(lài)于實(shí)現(xiàn)。如果你輸入的數(shù)據(jù)由混合類(lèi)型組成,你應(yīng)該能夠使用 map()
來(lái)確保一個(gè)一致的結(jié)果,比如: map(float, input_data)
。
平均值以及對(duì)中心位置的評(píng)估?
這些函數(shù)用于計(jì)算一個(gè)總體或樣本的平均值或者典型值。
數(shù)據(jù)的算術(shù)平均數(shù)(“平均數(shù)”)。 |
|
Fast, floating point arithmetic mean, with optional weighting. |
|
數(shù)據(jù)的幾何平均數(shù) |
|
數(shù)據(jù)的調(diào)和均值 |
|
數(shù)據(jù)的中位數(shù)(中間值) |
|
數(shù)據(jù)的低中位數(shù) |
|
數(shù)據(jù)的高中位數(shù) |
|
分組數(shù)據(jù)的中位數(shù),即第50個(gè)百分點(diǎn)。 |
|
離散的或標(biāo)稱(chēng)的數(shù)據(jù)的單個(gè)眾數(shù)(出現(xiàn)最多的值)。 |
|
離散的或標(biāo)稱(chēng)的數(shù)據(jù)的眾數(shù)(出現(xiàn)最多的值)列表。 |
|
將數(shù)據(jù)以相等的概率分為多個(gè)間隔。 |
對(duì)分散程度的評(píng)估?
這些函數(shù)用于計(jì)算總體或樣本與典型值或平均值的偏離程度。
數(shù)據(jù)的總體標(biāo)準(zhǔn)差 |
|
數(shù)據(jù)的總體方差 |
|
數(shù)據(jù)的樣本標(biāo)準(zhǔn)差 |
|
數(shù)據(jù)的樣本方差 |
對(duì)兩個(gè)輸入之間關(guān)系的統(tǒng)計(jì)?
這些函數(shù)計(jì)算兩個(gè)輸入之間關(guān)系的統(tǒng)計(jì)值。
兩個(gè)變量的樣本協(xié)方差。 |
|
兩個(gè)變量的皮爾遜相關(guān)系數(shù)。 |
|
簡(jiǎn)單線性回歸的斜率和截距。 |
函數(shù)細(xì)節(jié)?
注釋?zhuān)哼@些函數(shù)不需要對(duì)提供給它們的數(shù)據(jù)進(jìn)行排序。但是,為了方便閱讀,大多數(shù)例子展示的是已排序的序列。
- statistics.mean(data)?
返回 data 的樣本算術(shù)平均數(shù),形式為序列或迭代器。
算術(shù)平均數(shù)是數(shù)據(jù)之和與數(shù)據(jù)點(diǎn)個(gè)數(shù)的商。通常稱(chēng)作“平均數(shù)”,盡管它指示諸多數(shù)學(xué)平均數(shù)之一。它是數(shù)據(jù)的中心位置的度量。
若 data 為空,將會(huì)引發(fā)
StatisticsError
。一些用法示例:
>>> mean([1, 2, 3, 4, 4]) 2.8 >>> mean([-1.0, 2.5, 3.25, 5.75]) 2.625 >>> from fractions import Fraction as F >>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)]) Fraction(13, 21) >>> from decimal import Decimal as D >>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")]) Decimal('0.5625')
備注
The mean is strongly affected by outliers and is not necessarily a typical example of the data points. For a more robust, although less efficient, measure of central tendency, see
median()
.樣本均值給出了一個(gè)無(wú)偏向的真實(shí)總體均值的估計(jì),因此當(dāng)平均抽取所有可能的樣本,
mean(sample)
收斂于整個(gè)總體的真實(shí)均值。如果 data 代表整個(gè)總體而不是樣本,那么mean(data)
等同于計(jì)算真實(shí)整體均值 μ 。
- statistics.fmean(data, weights=None)?
將 data 轉(zhuǎn)換成浮點(diǎn)數(shù)并且計(jì)算算術(shù)平均數(shù)。
此函數(shù)的運(yùn)行速度比
mean()
函數(shù)快并且它總是返回一個(gè)float
。 data 可以為序列或可迭代對(duì)象。 如果輸入數(shù)據(jù)集為空,則會(huì)引發(fā)StatisticsError
。>>> fmean([3.5, 4.0, 5.25]) 4.25
Optional weighting is supported. For example, a professor assigns a grade for a course by weighting quizzes at 20%, homework at 20%, a midterm exam at 30%, and a final exam at 30%:
>>> grades = [85, 92, 83, 91] >>> weights = [0.20, 0.20, 0.30, 0.30] >>> fmean(grades, weights) 87.6
If weights is supplied, it must be the same length as the data or a
ValueError
will be raised.3.8 新版功能.
在 3.11 版更改: 添加了對(duì) weights 的支持。
- statistics.geometric_mean(data)?
將 data 轉(zhuǎn)換成浮點(diǎn)數(shù)并且計(jì)算幾何平均數(shù)。
幾何平均值使用值的乘積表示 數(shù)據(jù) 的中心趨勢(shì)或典型值(與使用它們的總和的算術(shù)平均值相反)。
如果輸入數(shù)據(jù)集為空、包含零或包含負(fù)值則將引發(fā)
StatisticsError
。 data 可以是序列或可迭代對(duì)象。無(wú)需做出特殊努力即可獲得準(zhǔn)確的結(jié)果。(但是,將來(lái)或許會(huì)修改。)
>>> round(geometric_mean([54, 24, 36]), 1) 36.0
3.8 新版功能.
- statistics.harmonic_mean(data, weights=None)?
返回包含實(shí)數(shù)值的序列或可迭代對(duì)象 data 的調(diào)和平均數(shù)。 如果 weights 被省略或?yàn)?None,則會(huì)假定權(quán)重相等。
調(diào)和平均數(shù)是數(shù)據(jù)的倒數(shù)的算術(shù)平均值
mean()
的倒數(shù)。 例如,三個(gè)數(shù)值 a, b 和 c 的調(diào)和平均數(shù)將等于3/(1/a + 1/b + 1/c)
。 如果其中一個(gè)值為零,則結(jié)果也將為零。調(diào)和平均數(shù)是均值的一種,是對(duì)數(shù)據(jù)的中心位置的度量。 它通常適用于求比率和比例(如速度)的均值。
假設(shè)一輛車(chē)在 40 km/hr 的速度下行駛了 10 km ,然后又以 60 km/hr 的速度行駛了 10 km 。車(chē)輛的平均速率是多少?
>>> harmonic_mean([40, 60]) 48.0
假設(shè)一輛汽車(chē)以速度 40 公里/小時(shí)行駛了 5 公里,當(dāng)?shù)缆纷兊脮惩ê?,提速?60 公里/小時(shí)行駛了行程中剩余的 30 km。 請(qǐng)問(wèn)其平均速度是多少?
>>> harmonic_mean([40, 60], weights=[5, 30]) 56.0
如果 data 為空、任意元素小于零,或者加權(quán)匯總值不為正數(shù)則會(huì)引發(fā)
StatisticsError
。當(dāng)前算法在輸入中遇到零時(shí)會(huì)提前退出。這意味著不會(huì)測(cè)試后續(xù)輸入的有效性。(此行為將來(lái)可能會(huì)更改。)
3.6 新版功能.
在 3.10 版更改: 添加了對(duì) weights 的支持。
- statistics.median(data)?
使用普通的“取中間兩數(shù)平均值”方法返回?cái)?shù)值數(shù)據(jù)的中位數(shù)(中間值)。 如果 data 為空,則將引發(fā)
StatisticsError
。 data 可以是序列或可迭代對(duì)象。中位數(shù)是衡量中間位置的可靠方式,并且較少受到極端值的影響。 當(dāng)數(shù)據(jù)點(diǎn)的總數(shù)為奇數(shù)時(shí),將返回中間數(shù)據(jù)點(diǎn):
>>> median([1, 3, 5]) 3
當(dāng)數(shù)據(jù)點(diǎn)的總數(shù)為偶數(shù)時(shí),中位數(shù)將通過(guò)對(duì)兩個(gè)中間值求平均進(jìn)行插值得出:
>>> median([1, 3, 5, 7]) 4.0
這適用于當(dāng)你的數(shù)據(jù)是離散的,并且你不介意中位數(shù)不是實(shí)際數(shù)據(jù)點(diǎn)的情況。
如果數(shù)據(jù)是有序的(支持排序操作)但不是數(shù)字(不支持加法),請(qǐng)考慮改用
median_low()
或median_high()
。
- statistics.median_low(data)?
返回?cái)?shù)值數(shù)據(jù)的低中位數(shù)。 如果 data 為空則將引發(fā)
StatisticsError
。 data 可以是序列或可迭代對(duì)象。低中位數(shù)一定是數(shù)據(jù)集的成員。 當(dāng)數(shù)據(jù)點(diǎn)總數(shù)為奇數(shù)時(shí),將返回中間值。 當(dāng)其為偶數(shù)時(shí),將返回兩個(gè)中間值中較小的那個(gè)。
>>> median_low([1, 3, 5]) 3 >>> median_low([1, 3, 5, 7]) 3
當(dāng)你的數(shù)據(jù)是離散的,并且你希望中位數(shù)是一個(gè)實(shí)際數(shù)據(jù)點(diǎn)而非插值結(jié)果時(shí)可以使用低中位數(shù)。
- statistics.median_high(data)?
返回?cái)?shù)據(jù)的高中位數(shù)。 如果 data 為空則將引發(fā)
StatisticsError
。 data 可以是序列或可迭代對(duì)象。高中位數(shù)一定是數(shù)據(jù)集的成員。 當(dāng)數(shù)據(jù)點(diǎn)總數(shù)為奇數(shù)時(shí),將返回中間值。 當(dāng)其為偶數(shù)時(shí),將返回兩個(gè)中間值中較大的那個(gè)。
>>> median_high([1, 3, 5]) 3 >>> median_high([1, 3, 5, 7]) 5
當(dāng)你的數(shù)據(jù)是離散的,并且你希望中位數(shù)是一個(gè)實(shí)際數(shù)據(jù)點(diǎn)而非插值結(jié)果時(shí)可以使用高中位數(shù)。
- statistics.median_grouped(data, interval=1)?
返回分組的連續(xù)數(shù)據(jù)的中位數(shù),根據(jù)第 50 個(gè)百分點(diǎn)的位置使用插值來(lái)計(jì)算。 如果 data 為空則將引發(fā)
StatisticsError
。 data 可以是序列或可迭代對(duì)象。>>> median_grouped([52, 52, 53, 54]) 52.5
在下面的示例中,數(shù)據(jù)已經(jīng)過(guò)舍入,這樣每個(gè)值都代表數(shù)據(jù)分類(lèi)的中間點(diǎn),例如 1 是 0.5--1.5 分類(lèi)的中間點(diǎn),2 是 1.5--2.5 分類(lèi)的中間點(diǎn),3 是 2.5--3.5 的中間點(diǎn)等待。 根據(jù)給定的數(shù)據(jù),中間值應(yīng)落在 3.5--4.5 分類(lèi)之內(nèi),并可使用插值法來(lái)進(jìn)行估算:
>>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5]) 3.7
可選參數(shù) interval 表示分類(lèi)間隔,默認(rèn)值為 1。 改變分類(lèi)間隔自然會(huì)改變插件結(jié)果:
>>> median_grouped([1, 3, 3, 5, 7], interval=1) 3.25 >>> median_grouped([1, 3, 3, 5, 7], interval=2) 3.5
此函數(shù)不會(huì)檢查數(shù)據(jù)點(diǎn)之間是否至少相隔 interval 的距離。
CPython implementation detail: 在某些情況下,
median_grouped()
可以會(huì)將數(shù)據(jù)點(diǎn)強(qiáng)制轉(zhuǎn)換為浮點(diǎn)數(shù)。 此行為在未來(lái)有可能會(huì)發(fā)生改變。
- statistics.mode(data)?
從離散或標(biāo)稱(chēng)的 data 返回單個(gè)出現(xiàn)最多的數(shù)據(jù)點(diǎn)。 此眾數(shù)(如果存在)是最典型的值,并可用來(lái)度量中心的位置。
如果存在具有相同頻率的多個(gè)眾數(shù),則返回在 data 中遇到的第一個(gè)。 如果想要其中最小或最大的一個(gè),請(qǐng)使用
min(multimode(data))
或max(multimode(data))
。 如果輸入的 data 為空,則會(huì)引發(fā)StatisticsError
。mode
將假定是離散數(shù)據(jù)并返回一個(gè)單一的值。 這是通常的學(xué)校教學(xué)中標(biāo)準(zhǔn)的處理方式:>>> mode([1, 1, 2, 3, 3, 3, 3, 4]) 3
此眾數(shù)的獨(dú)特之處在于它是這個(gè)包中唯一還可應(yīng)用于標(biāo)稱(chēng)(非數(shù)字)數(shù)據(jù)的統(tǒng)計(jì)信息:
>>> mode(["red", "blue", "blue", "red", "green", "red", "red"]) 'red'
在 3.8 版更改: 現(xiàn)在會(huì)通過(guò)返回所遇到的第一個(gè)眾數(shù)來(lái)處理多模數(shù)據(jù)集。 之前它會(huì)在遇到超過(guò)一個(gè)的眾數(shù)時(shí)引發(fā)
StatisticsError
。
- statistics.multimode(data)?
返回最頻繁出現(xiàn)的值的列表,并按它們?cè)?data 中首次出現(xiàn)的位置排序。 如果存在多個(gè)眾數(shù)則將返回一個(gè)以上的眾數(shù),或者如果 data 為空則將返回空列表:
>>> multimode('aabbbbccddddeeffffgg') ['b', 'd', 'f'] >>> multimode('') []
3.8 新版功能.
- statistics.pstdev(data, mu=None)?
返回總體標(biāo)準(zhǔn)差(總體方差的平方根)。 請(qǐng)參閱
pvariance()
了解參數(shù)和其他細(xì)節(jié)。>>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) 0.986893273527251
- statistics.pvariance(data, mu=None)?
返回非空序列或包含實(shí)數(shù)值的可迭代對(duì)象 data 的總體方差。 方差或稱(chēng)相對(duì)于均值的二階距,是對(duì)數(shù)據(jù)變化幅度(延展度或分散度)的度量。 方差值較大表明數(shù)據(jù)的散布范圍較大;方差值較小表明它緊密聚集于均值附近。
如果給出了可選的第二個(gè)參數(shù) mu,它通常是 data 的均值。 它也可以被用來(lái)計(jì)算相對(duì)于一個(gè)非均值點(diǎn)的二階距。 如果該參數(shù)省略或?yàn)?
None
(默認(rèn)值),則會(huì)自動(dòng)進(jìn)行算術(shù)均值的計(jì)算。使用此函數(shù)可根據(jù)所有數(shù)值來(lái)計(jì)算方差。 要根據(jù)一個(gè)樣本來(lái)估算方差,通常
variance()
函數(shù)是更好的選擇。如果 data 為空則會(huì)引發(fā)
StatisticsError
。示例:
>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25] >>> pvariance(data) 1.25
如果你已經(jīng)計(jì)算過(guò)數(shù)據(jù)的平均值,你可以將其作為可選的第二個(gè)參數(shù) mu 傳入以避免重復(fù)計(jì)算:
>>> mu = mean(data) >>> pvariance(data, mu) 1.25
同樣也支持使用 Decimal 和 Fraction 值:
>>> from decimal import Decimal as D >>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")]) Decimal('24.815') >>> from fractions import Fraction as F >>> pvariance([F(1, 4), F(5, 4), F(1, 2)]) Fraction(13, 72)
備注
當(dāng)調(diào)用時(shí)附帶完整的總體數(shù)據(jù)時(shí),這將給出總體方差 σ2。 而當(dāng)調(diào)用時(shí)只附帶一個(gè)樣本時(shí),這將給出偏置樣本方差 s2,也被稱(chēng)為帶有 N 個(gè)自由度的方差。
如果你通過(guò)某種方式知道了真實(shí)的總體平均值 μ,則可以使用此函數(shù)來(lái)計(jì)算一個(gè)樣本的方差,并將已知的總體平均值作為第二個(gè)參數(shù)。 假設(shè)數(shù)據(jù)點(diǎn)是總體的一個(gè)隨機(jī)樣本,則結(jié)果將為總體方差的無(wú)偏估計(jì)值。
- statistics.stdev(data, xbar=None)?
返回樣本標(biāo)準(zhǔn)差(樣本方差的平方根)。 請(qǐng)參閱
variance()
了解參數(shù)和其他細(xì)節(jié)。>>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) 1.0810874155219827
- statistics.variance(data, xbar=None)?
返回包含至少兩個(gè)實(shí)數(shù)值的可迭代對(duì)象 data 的樣本方差。 方差或稱(chēng)相對(duì)于均值的二階矩,是對(duì)數(shù)據(jù)變化幅度(延展度或分散度)的度量。 方差值較大表明數(shù)據(jù)的散布范圍較大;方差值較小表明它緊密聚集于均值附近。
如果給出了可選的第二個(gè)參數(shù) xbar,它應(yīng)當(dāng)是 data 的均值。 如果該參數(shù)省略或?yàn)?
None
(默認(rèn)值),則會(huì)自動(dòng)進(jìn)行均值的計(jì)算。當(dāng)你的數(shù)據(jù)是總體數(shù)據(jù)的樣本時(shí)請(qǐng)使用此函數(shù)。 要根據(jù)整個(gè)總體數(shù)據(jù)來(lái)計(jì)算方差,請(qǐng)參見(jiàn)
pvariance()
。如果 data 包含的值少于兩個(gè)則會(huì)引發(fā)
StatisticsError
。示例:
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5] >>> variance(data) 1.3720238095238095
如果你已經(jīng)計(jì)算過(guò)數(shù)據(jù)的平均值,你可以將其作為可選的第二個(gè)參數(shù) xbar 傳入以避免重復(fù)計(jì)算:
>>> m = mean(data) >>> variance(data, m) 1.3720238095238095
此函數(shù)不會(huì)試圖檢查你所傳入的 xbar 是否為真實(shí)的平均值。 使用任意值作為 xbar 可能導(dǎo)致無(wú)效或不可能的結(jié)果。
同樣也支持使用 Decimal 和 Fraction 值:
>>> from decimal import Decimal as D >>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")]) Decimal('31.01875') >>> from fractions import Fraction as F >>> variance([F(1, 6), F(1, 2), F(5, 3)]) Fraction(67, 108)
備注
這是附帶貝塞爾校正的樣本方差 s2,也稱(chēng)為具有 N-1 自由度的方差。 假設(shè)數(shù)據(jù)點(diǎn)具有代表性(即為獨(dú)立且均勻的分布),則結(jié)果應(yīng)當(dāng)是對(duì)總體方差的無(wú)偏估計(jì)。
如果你通過(guò)某種方式知道了真實(shí)的總體平均值 μ 則應(yīng)當(dāng)調(diào)用
pvariance()
函數(shù)并將該值作為 mu 形參傳入以得到一個(gè)樣本的方差。
- statistics.quantiles(data, *, n=4, method='exclusive')?
將 data 分隔為具有相等概率的 n 個(gè)連續(xù)區(qū)間。 返回分隔這些區(qū)間的
n - 1
個(gè)分隔點(diǎn)的列表。將 n 設(shè)為 4 以使用四分位(默認(rèn)值)。 將 n 設(shè)為 10 以使用十分位。 將 n 設(shè)為 100 以使用百分位,即給出 99 個(gè)分隔點(diǎn)來(lái)將 data 分隔為 100 個(gè)大小相等的組。 如果 n 小于 1 則將引發(fā)
StatisticsError
。data 可以是包含樣本數(shù)據(jù)的任意可迭代對(duì)象。 為了獲得有意義的結(jié)果,data 中數(shù)據(jù)點(diǎn)的數(shù)量應(yīng)當(dāng)大于 n。 如果數(shù)據(jù)點(diǎn)的數(shù)量小于兩個(gè)則將引發(fā)
StatisticsError
。分隔點(diǎn)是通過(guò)對(duì)兩個(gè)最接近的數(shù)據(jù)點(diǎn)進(jìn)行線性插值得到的。 例如,如果一個(gè)分隔點(diǎn)落在兩個(gè)樣本值
100
和112
之間距離三分之一的位置,則分隔點(diǎn)的取值將為104
。method 用于計(jì)算分位值,它會(huì)由于 data 是包含還是排除總體的最低和最高可能值而有所不同。
默認(rèn) method 是 “唯一的” 并且被用于在總體中數(shù)據(jù)采樣這樣可以有比樣本中找到的更多的極端值。落在 m 個(gè)排序數(shù)據(jù)點(diǎn)的第 i-th 個(gè)以下的總體部分被計(jì)算為
i / (m + 1)
。給定九個(gè)樣本值,方法排序它們并且分配一下的百分位: 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% 。將 method 設(shè)為 "inclusive" 可用于描述總體數(shù)據(jù)或已明確知道包含有總體數(shù)據(jù)中最極端值的樣本。 data 中的最小值會(huì)被作為第 0 個(gè)百分位而最大值會(huì)被作為第 100 個(gè)百分位。 總體數(shù)據(jù)里處于 m 個(gè)已排序數(shù)據(jù)點(diǎn)中 第 i 個(gè) 以下的部分會(huì)以
(i - 1) / (m - 1)
來(lái)計(jì)算。 給定 11 個(gè)樣本值,該方法會(huì)對(duì)它們進(jìn)行排序并賦予以下百分位: 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100%。# Decile cut points for empirically sampled data >>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110, ... 100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129, ... 106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86, ... 111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95, ... 103, 107, 101, 81, 109, 104] >>> [round(q, 1) for q in quantiles(data, n=10)] [81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]
3.8 新版功能.
- statistics.covariance(x, y, /)?
返回兩個(gè)輸入 x 和 y 的樣本協(xié)方差。 樣本協(xié)方差是對(duì)兩個(gè)輸入的同步變化性的度量。
兩個(gè)輸入必須具有相同的長(zhǎng)度(不少于兩個(gè)元素),否則會(huì)引發(fā)
StatisticsError
。示例:
>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3] >>> covariance(x, y) 0.75 >>> z = [9, 8, 7, 6, 5, 4, 3, 2, 1] >>> covariance(x, z) -7.5 >>> covariance(z, x) -7.5
3.10 新版功能.
- statistics.correlation(x, y, /)?
返回兩個(gè)輸入的 皮爾遜相關(guān)系數(shù)。 皮爾遜相關(guān)系數(shù) r 的取值在 -1 到 +1 之間。 它衡量線性相關(guān)的強(qiáng)度和方向,其中 +1 表示非常強(qiáng)的正線性相關(guān),-1 表示非常強(qiáng)的負(fù)線性相關(guān),0 表示無(wú)線性相關(guān)。
兩個(gè)輸入必須具有相同的長(zhǎng)度(不少于兩個(gè)元素),并且不必為常量,否則會(huì)引發(fā)
StatisticsError
。示例:
>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> y = [9, 8, 7, 6, 5, 4, 3, 2, 1] >>> correlation(x, x) 1.0 >>> correlation(x, y) -1.0
3.10 新版功能.
- statistics.linear_regression(x, y, /, *, proportional=False)?
返回使用普通最小二乘法估計(jì)得到的 簡(jiǎn)單線性回歸 參數(shù)的斜率和截距。 簡(jiǎn)單純屬回歸通過(guò)此線性函數(shù)來(lái)描述自變量 x 和因變量 y 之間的關(guān)系。
y = slope * x + intercept + noise
其中
slope
和intercept
是估計(jì)得到的回歸參數(shù),而noise
代表不可由線性回歸解釋的數(shù)據(jù)變異性(它等于因變量的預(yù)測(cè)值和實(shí)際值之間的差異)。兩個(gè)輸入必須具有相同的長(zhǎng)度(不少于兩個(gè)元素),并且自變量 x 不可為常量;否則會(huì)引發(fā)
StatisticsError
。例如,我們可以使用 Monty Python 系列電影的發(fā)布日期 在假定出品方保持現(xiàn)有步調(diào)的情況下預(yù)測(cè)到 2019 年時(shí)產(chǎn)出的 Monty Python 電影的累計(jì)數(shù)量。
>>> year = [1971, 1975, 1979, 1982, 1983] >>> films_total = [1, 2, 3, 4, 5] >>> slope, intercept = linear_regression(year, films_total) >>> round(slope * 2019 + intercept) 16
If proportional is true, the independent variable x and the dependent variable y are assumed to be directly proportional. The data is fit to a line passing through the origin. Since the intercept will always be 0.0, the underlying linear function simplifies to:
y = slope * x + noise
3.10 新版功能.
在 3.11 版更改: Added support for proportional.
異常?
只定義了一個(gè)異常:
- exception statistics.StatisticsError?
ValueError
的子類(lèi),表示統(tǒng)計(jì)相關(guān)的異常。
NormalDist
對(duì)象?
NormalDist
工具可用于創(chuàng)建和操縱 隨機(jī)變量 的正態(tài)分布。 這個(gè)類(lèi)將數(shù)據(jù)度量值的平均值和標(biāo)準(zhǔn)差作為單一實(shí)體來(lái)處理。
正態(tài)分布的概念來(lái)自于 中央極限定理 并且在統(tǒng)計(jì)學(xué)中有廣泛的應(yīng)用。
- class statistics.NormalDist(mu=0.0, sigma=1.0)?
返回一個(gè)新的 NormalDist 對(duì)象,其中 mu 代表 算術(shù)平均值 而 sigma 代表 標(biāo)準(zhǔn)差。
若 sigma 為負(fù)數(shù),將會(huì)引發(fā)
StatisticsError
。- mean?
一個(gè)只讀特征屬性,表示特定正態(tài)分布的 算術(shù)平均值。
- stdev?
一個(gè)只讀特征屬性,表示特定正態(tài)分布的 標(biāo)準(zhǔn)差。
- classmethod from_samples(data)?
傳入使用
fmean()
和stdev()
基于 data 估算出的 mu 和 sigma 形參創(chuàng)建一個(gè)正態(tài)分布實(shí)例。data 可以是任何 iterable 并且應(yīng)當(dāng)包含能被轉(zhuǎn)換為
float
類(lèi)型的值。 如果 data 不包含至少兩個(gè)元素,則會(huì)引發(fā)StatisticsError
,因?yàn)楣浪阒行闹抵辽傩枰粋€(gè)點(diǎn)而估算分散度至少需要兩個(gè)點(diǎn)。
- samples(n, *, seed=None)?
對(duì)于給定的平均值和標(biāo)準(zhǔn)差生成 n 個(gè)隨機(jī)樣本。 返回一個(gè)由
float
值組成的list
。當(dāng)給定 seed 時(shí),創(chuàng)建一個(gè)新的底層隨機(jī)數(shù)生成器實(shí)例。 這適用于創(chuàng)建可重現(xiàn)的結(jié)果,即使對(duì)于多線程上下文也有效。
- pdf(x)?
使用 概率密度函數(shù) (pdf),計(jì)算一個(gè)隨機(jī)變量 X 趨向于給定值 x 的相對(duì)可能性。 在數(shù)學(xué)意義上,它是當(dāng) dx 趨向于零時(shí)比率
P(x <= X < x+dx) / dx
的極限。相對(duì)可能性的計(jì)算方法是用一個(gè)狹窄區(qū)間內(nèi)某個(gè)樣本出現(xiàn)的概率除以區(qū)間的寬度(因此使用“密度”一詞)。 由于可能性是相對(duì)于其他點(diǎn)的,它的值可以大于 1.0。
- cdf(x)?
使用 累積分布函數(shù) (cdf),計(jì)算一個(gè)隨機(jī)變量 X 小于等于 x 的概率。 在數(shù)學(xué)上,它表示為
P(X <= x)
。
- inv_cdf(p)?
計(jì)算反向累積分布函數(shù),也稱(chēng)為 分位數(shù)函數(shù) 或 百分點(diǎn) 函數(shù)。 在數(shù)學(xué)上,它表示為
x : P(X <= x) = p
。找出隨機(jī)變量 X 的值 x 使得該變量小于等于該值的概率等于給定的概率 p。
- overlap(other)?
測(cè)量?jī)蓚€(gè)正態(tài)概率分布之間的一致性。 返回介于 0.0 和 1.0 之間的值,給出 兩個(gè)概率密度函數(shù)的重疊區(qū)域。
- quantiles(n=4)?
將指定正態(tài)分布劃分為 n 個(gè)相等概率的連續(xù)分隔區(qū)。 返回這些分隔區(qū)對(duì)應(yīng)的 (n - 1) 個(gè)分隔點(diǎn)的列表。
將 n 設(shè)為 4 以使用四分位(默認(rèn)值)。 將 n 設(shè)為 10 以使用十分位。將 n 設(shè)為 100 以使用百分位,即給出 99 個(gè)分隔點(diǎn)來(lái)將正態(tài)分布分隔為 100 個(gè)大小相等的組。
- zscore(x)?
計(jì)算 標(biāo)準(zhǔn)分 即以高于或低于正態(tài)分布的平均值的標(biāo)準(zhǔn)差數(shù)值的形式來(lái)描述 x:
(x - mean) / stdev
.3.9 新版功能.
NormalDist
的實(shí)例支持加上、減去、乘以或除以一個(gè)常量。 這些運(yùn)算被用于轉(zhuǎn)換和縮放。 例如:>>> temperature_february = NormalDist(5, 2.5) # Celsius >>> temperature_february * (9/5) + 32 # Fahrenheit NormalDist(mu=41.0, sigma=4.5)
不允許一個(gè)常量除以
NormalDist
的實(shí)例,因?yàn)榻Y(jié)果將不是正態(tài)分布。由于正態(tài)分布是由獨(dú)立變量的累加效應(yīng)產(chǎn)生的,因此允許表示為
NormalDist
實(shí)例的 兩組獨(dú)立正態(tài)分布的隨機(jī)變量相加和相減。 例如:>>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5]) >>> drug_effects = NormalDist(0.4, 0.15) >>> combined = birth_weights + drug_effects >>> round(combined.mean, 1) 3.1 >>> round(combined.stdev, 1) 0.5
3.8 新版功能.
NormalDist
示例和用法?
NormalDist
適合用來(lái)解決經(jīng)典概率問(wèn)題。
舉例來(lái)說(shuō),如果 SAT 考試的歷史數(shù)據(jù) 顯示分?jǐn)?shù)呈平均值為 1060 且標(biāo)準(zhǔn)差為 195 的正態(tài)分布,則可以確定考試分?jǐn)?shù)處于 1100 和 1200 之間的學(xué)生的百分比舍入到最接近的整數(shù)應(yīng)為:
>>> sat = NormalDist(1060, 195)
>>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5)
>>> round(fraction * 100.0, 1)
18.4
>>> list(map(round, sat.quantiles()))
[928, 1060, 1192]
>>> list(map(round, sat.quantiles(n=10)))
[810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]
為了估算一個(gè)不易解析的模型分布,NormalDist
可以生成用于 蒙特卡洛模擬 的輸入樣本:
>>> def model(x, y, z):
... return (3*x + 7*x*y - 5*y) / (11 * z)
...
>>> n = 100_000
>>> X = NormalDist(10, 2.5).samples(n, seed=3652260728)
>>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471)
>>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453)
>>> quantiles(map(model, X, Y, Z))
[1.4591308524824727, 1.8035946855390597, 2.175091447274739]
當(dāng)樣本量較大并且成功試驗(yàn)的可能性接近 50% 時(shí),正態(tài)分布可以被用來(lái)模擬 二項(xiàng)分布。
例如,一次開(kāi)源會(huì)議有 750 名與會(huì)者和兩個(gè)可分別容納 500 人的會(huì)議廳。 會(huì)上有一場(chǎng)關(guān)于 Python 的演講和一場(chǎng)關(guān)于 Ruby 的演講。 在往屆會(huì)議中,65% 的與會(huì)者更愿意去聽(tīng)關(guān)于 Python 的演講。 假定人群的偏好沒(méi)有發(fā)生改變,那么 Python 演講的會(huì)議廳不超出其容量上限的可能性是多少?
>>> n = 750 # Sample size
>>> p = 0.65 # Preference for Python
>>> q = 1.0 - p # Preference for Ruby
>>> k = 500 # Room capacity
>>> # Approximation using the cumulative normal distribution
>>> from math import sqrt
>>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)
0.8402
>>> # Solution using the cumulative binomial distribution
>>> from math import comb, fsum
>>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)
0.8402
>>> # Approximation using a simulation
>>> from random import seed, choices
>>> seed(8675309)
>>> def trial():
... return choices(('Python', 'Ruby'), (p, q), k=n).count('Python')
>>> mean(trial() <= k for i in range(10_000))
0.8398
在機(jī)器學(xué)習(xí)問(wèn)題中也經(jīng)常會(huì)出現(xiàn)正態(tài)分布。
Wikipedia 上有一個(gè) 樸素貝葉斯分類(lèi)器的好例子。 挑戰(zhàn)的問(wèn)題是根據(jù)對(duì)多個(gè)正態(tài)分布的特征測(cè)量值包括身高、體重和足部尺碼來(lái)預(yù)測(cè)一個(gè)人的性別。
我們得到了由八個(gè)人的測(cè)量值組成的訓(xùn)練數(shù)據(jù)集。 假定這些測(cè)量值是正態(tài)分布的,因此我們用 NormalDist
來(lái)總結(jié)數(shù)據(jù):
>>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92])
>>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75])
>>> weight_male = NormalDist.from_samples([180, 190, 170, 165])
>>> weight_female = NormalDist.from_samples([100, 150, 130, 150])
>>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10])
>>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])
接下來(lái),我們遇到一個(gè)特征測(cè)量值已知但性別未知的新人:
>>> ht = 6.0 # height
>>> wt = 130 # weight
>>> fs = 8 # foot size
從是男是女各 50% 的 先驗(yàn)概率 出發(fā),我們通過(guò)將該先驗(yàn)概率乘以給定性別的特征度量值的可能性累積值來(lái)計(jì)算后驗(yàn)概率:
>>> prior_male = 0.5
>>> prior_female = 0.5
>>> posterior_male = (prior_male * height_male.pdf(ht) *
... weight_male.pdf(wt) * foot_size_male.pdf(fs))
>>> posterior_female = (prior_female * height_female.pdf(ht) *
... weight_female.pdf(wt) * foot_size_female.pdf(fs))
最終預(yù)測(cè)值應(yīng)為最大后驗(yàn)概率值。 這種算法被稱(chēng)為 maximum a posteriori 或 MAP:
>>> 'male' if posterior_male > posterior_female else 'female'
'female'