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 等第三方庫或者諸如 Minitab , SAS , Matlab 等針對專業(yè)統(tǒng)計(jì)學(xué)家的專有全功能統(tǒng)計(jì)軟件包的競品。此模塊針對圖形和科學(xué)計(jì)算器的水平。

除非明確注釋,這些函數(shù)支持 int , floatDecimalFraction 。當(dāng)前不支持同其他類型(是否在數(shù)字塔中)的行為。混合類型的集合也是未定義的,并且依賴于實(shí)現(xiàn)。如果你輸入的數(shù)據(jù)由混合類型組成,你應(yīng)該能夠使用 map() 來確保一個(gè)一致的結(jié)果,比如: map(float, input_data)

平均值以及對中心位置的評估?

這些函數(shù)用于計(jì)算一個(gè)總體或樣本的平均值或者典型值。

mean()

數(shù)據(jù)的算術(shù)平均數(shù)(“平均數(shù)”)。

fmean()

Fast, floating point arithmetic mean, with optional weighting.

geometric_mean()

數(shù)據(jù)的幾何平均數(shù)

harmonic_mean()

數(shù)據(jù)的調(diào)和均值

median()

數(shù)據(jù)的中位數(shù)(中間值)

median_low()

數(shù)據(jù)的低中位數(shù)

median_high()

數(shù)據(jù)的高中位數(shù)

median_grouped()

分組數(shù)據(jù)的中位數(shù),即第50個(gè)百分點(diǎn)。

mode()

離散的或標(biāo)稱的數(shù)據(jù)的單個(gè)眾數(shù)(出現(xiàn)最多的值)。

multimode()

離散的或標(biāo)稱的數(shù)據(jù)的眾數(shù)(出現(xiàn)最多的值)列表。

quantiles()

將數(shù)據(jù)以相等的概率分為多個(gè)間隔。

對分散程度的評估?

這些函數(shù)用于計(jì)算總體或樣本與典型值或平均值的偏離程度。

pstdev()

數(shù)據(jù)的總體標(biāo)準(zhǔn)差

pvariance()

數(shù)據(jù)的總體方差

stdev()

數(shù)據(jù)的樣本標(biāo)準(zhǔn)差

variance()

數(shù)據(jù)的樣本方差

對兩個(gè)輸入之間關(guān)系的統(tǒng)計(jì)?

這些函數(shù)計(jì)算兩個(gè)輸入之間關(guān)系的統(tǒng)計(jì)值。

covariance()

兩個(gè)變量的樣本協(xié)方差。

correlation()

兩個(gè)變量的皮爾遜相關(guān)系數(shù)。

linear_regression()

簡單線性回歸的斜率和截距。

函數(shù)細(xì)節(jié)?

注釋:這些函數(shù)不需要對提供給它們的數(shù)據(jù)進(jìn)行排序。但是,為了方便閱讀,大多數(shù)例子展示的是已排序的序列。

statistics.mean(data)?

返回 data 的樣本算術(shù)平均數(shù),形式為序列或迭代器。

算術(shù)平均數(shù)是數(shù)據(jù)之和與數(shù)據(jù)點(diǎn)個(gè)數(shù)的商。通常稱作“平均數(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è)無偏向的真實(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 可以為序列或可迭代對象。 如果輸入數(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 版更改: 添加了對 weights 的支持。

statistics.geometric_mean(data)?

data 轉(zhuǎn)換成浮點(diǎn)數(shù)并且計(jì)算幾何平均數(shù)。

幾何平均值使用值的乘積表示 數(shù)據(jù) 的中心趨勢或典型值(與使用它們的總和的算術(shù)平均值相反)。

如果輸入數(shù)據(jù)集為空、包含零或包含負(fù)值則將引發(fā) StatisticsError。 data 可以是序列或可迭代對象。

無需做出特殊努力即可獲得準(zhǔn)確的結(jié)果。(但是,將來或許會(huì)修改。)

>>>
>>> round(geometric_mean([54, 24, 36]), 1)
36.0

3.8 新版功能.

statistics.harmonic_mean(data, weights=None)?

返回包含實(shí)數(shù)值的序列或可迭代對象 data 的調(diào)和平均數(shù)。 如果 weights 被省略或?yàn)?None,則會(huì)假定權(quán)重相等。

調(diào)和平均數(shù)是數(shù)據(jù)的倒數(shù)的算術(shù)平均值 mean() 的倒數(shù)。 例如,三個(gè)數(shù)值 a, bc 的調(diào)和平均數(shù)將等于 3/(1/a + 1/b + 1/c)。 如果其中一個(gè)值為零,則結(jié)果也將為零。

調(diào)和平均數(shù)是均值的一種,是對數(shù)據(jù)的中心位置的度量。 它通常適用于求比率和比例(如速度)的均值。

假設(shè)一輛車在 40 km/hr 的速度下行駛了 10 km ,然后又以 60 km/hr 的速度行駛了 10 km 。車輛的平均速率是多少?

>>>
>>> harmonic_mean([40, 60])
48.0

假設(shè)一輛汽車以速度 40 公里/小時(shí)行駛了 5 公里,當(dāng)?shù)缆纷兊脮惩ê?,提速?60 公里/小時(shí)行駛了行程中剩余的 30 km。 請問其平均速度是多少?

>>>
>>> harmonic_mean([40, 60], weights=[5, 30])
56.0

如果 data 為空、任意元素小于零,或者加權(quán)匯總值不為正數(shù)則會(huì)引發(fā) StatisticsError。

當(dāng)前算法在輸入中遇到零時(shí)會(huì)提前退出。這意味著不會(huì)測試后續(xù)輸入的有效性。(此行為將來可能會(huì)更改。)

3.6 新版功能.

在 3.10 版更改: 添加了對 weights 的支持。

statistics.median(data)?

使用普通的“取中間兩數(shù)平均值”方法返回?cái)?shù)值數(shù)據(jù)的中位數(shù)(中間值)。 如果 data 為空,則將引發(fā) StatisticsError。 data 可以是序列或可迭代對象。

中位數(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ù)將通過對兩個(gè)中間值求平均進(jìn)行插值得出:

>>>
>>> median([1, 3, 5, 7])
4.0

這適用于當(dāng)你的數(shù)據(jù)是離散的,并且你不介意中位數(shù)不是實(shí)際數(shù)據(jù)點(diǎn)的情況。

如果數(shù)據(jù)是有序的(支持排序操作)但不是數(shù)字(不支持加法),請考慮改用 median_low()median_high()。

statistics.median_low(data)?

返回?cái)?shù)值數(shù)據(jù)的低中位數(shù)。 如果 data 為空則將引發(fā) StatisticsError。 data 可以是序列或可迭代對象。

低中位數(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 可以是序列或可迭代對象。

高中位數(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)的位置使用插值來計(jì)算。 如果 data 為空則將引發(fā) StatisticsErrordata 可以是序列或可迭代對象。

>>>
>>> median_grouped([52, 52, 53, 54])
52.5

在下面的示例中,數(shù)據(jù)已經(jīng)過舍入,這樣每個(gè)值都代表數(shù)據(jù)分類的中間點(diǎn),例如 1 是 0.5--1.5 分類的中間點(diǎn),2 是 1.5--2.5 分類的中間點(diǎn),3 是 2.5--3.5 的中間點(diǎn)等待。 根據(jù)給定的數(shù)據(jù),中間值應(yīng)落在 3.5--4.5 分類之內(nèi),并可使用插值法來進(jìn)行估算:

>>>
>>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5])
3.7

可選參數(shù) interval 表示分類間隔,默認(rèn)值為 1。 改變分類間隔自然會(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ù)。 此行為在未來有可能會(huì)發(fā)生改變。

參見

  • "Statistics for the Behavioral Sciences", Frederick J Gravetter and Larry B Wallnau (8th Edition).

  • Gnome Gnumeric 電子表格中的 SSMEDIAN 函數(shù),包括 這篇討論。

statistics.mode(data)?

從離散或標(biāo)稱的 data 返回單個(gè)出現(xiàn)最多的數(shù)據(jù)點(diǎn)。 此眾數(shù)(如果存在)是最典型的值,并可用來度量中心的位置。

如果存在具有相同頻率的多個(gè)眾數(shù),則返回在 data 中遇到的第一個(gè)。 如果想要其中最小或最大的一個(gè),請使用 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)稱(非數(shù)字)數(shù)據(jù)的統(tǒng)計(jì)信息:

>>>
>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])
'red'

在 3.8 版更改: 現(xiàn)在會(huì)通過返回所遇到的第一個(gè)眾數(shù)來處理多模數(shù)據(jù)集。 之前它會(huì)在遇到超過一個(gè)的眾數(shù)時(shí)引發(fā) StatisticsError。

statistics.multimode(data)?

返回最頻繁出現(xiàn)的值的列表,并按它們在 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)差(總體方差的平方根)。 請參閱 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ù)值的可迭代對象 data 的總體方差。 方差或稱相對于均值的二階距,是對數(shù)據(jù)變化幅度(延展度或分散度)的度量。 方差值較大表明數(shù)據(jù)的散布范圍較大;方差值較小表明它緊密聚集于均值附近。

如果給出了可選的第二個(gè)參數(shù) mu,它通常是 data 的均值。 它也可以被用來計(jì)算相對于一個(gè)非均值點(diǎn)的二階距。 如果該參數(shù)省略或?yàn)?None (默認(rèn)值),則會(huì)自動(dòng)進(jìn)行算術(shù)均值的計(jì)算。

使用此函數(shù)可根據(jù)所有數(shù)值來計(jì)算方差。 要根據(jù)一個(gè)樣本來估算方差,通常 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ì)算過數(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,也被稱為帶有 N 個(gè)自由度的方差。

如果你通過某種方式知道了真實(shí)的總體平均值 μ,則可以使用此函數(shù)來計(jì)算一個(gè)樣本的方差,并將已知的總體平均值作為第二個(gè)參數(shù)。 假設(shè)數(shù)據(jù)點(diǎn)是總體的一個(gè)隨機(jī)樣本,則結(jié)果將為總體方差的無偏估計(jì)值。

statistics.stdev(data, xbar=None)?

返回樣本標(biāo)準(zhǔn)差(樣本方差的平方根)。 請參閱 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ù)值的可迭代對象 data 的樣本方差。 方差或稱相對于均值的二階矩,是對數(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í)請使用此函數(shù)。 要根據(jù)整個(gè)總體數(shù)據(jù)來計(jì)算方差,請參見 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ì)算過數(shù)據(jù)的平均值,你可以將其作為可選的第二個(gè)參數(shù) xbar 傳入以避免重復(fù)計(jì)算:

>>>
>>> m = mean(data)
>>> variance(data, m)
1.3720238095238095

此函數(shù)不會(huì)試圖檢查你所傳入的 xbar 是否為真實(shí)的平均值。 使用任意值作為 xbar 可能導(dǎo)致無效或不可能的結(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,也稱為具有 N-1 自由度的方差。 假設(shè)數(shù)據(jù)點(diǎn)具有代表性(即為獨(dú)立且均勻的分布),則結(jié)果應(yīng)當(dāng)是對總體方差的無偏估計(jì)。

如果你通過某種方式知道了真實(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)來將 data 分隔為 100 個(gè)大小相等的組。 如果 n 小于 1 則將引發(fā) StatisticsError

data 可以是包含樣本數(shù)據(jù)的任意可迭代對象。 為了獲得有意義的結(jié)果,data 中數(shù)據(jù)點(diǎn)的數(shù)量應(yīng)當(dāng)大于 n。 如果數(shù)據(jù)點(diǎn)的數(shù)量小于兩個(gè)則將引發(fā) StatisticsError。

分隔點(diǎn)是通過對兩個(gè)最接近的數(shù)據(jù)點(diǎn)進(jìn)行線性插值得到的。 例如,如果一個(gè)分隔點(diǎn)落在兩個(gè)樣本值 100112 之間距離三分之一的位置,則分隔點(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) 來計(jì)算。 給定 11 個(gè)樣本值,該方法會(huì)對它們進(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è)輸入 xy 的樣本協(xié)方差。 樣本協(xié)方差是對兩個(gè)輸入的同步變化性的度量。

兩個(gè)輸入必須具有相同的長度(不少于兩個(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 表示無線性相關(guān)。

兩個(gè)輸入必須具有相同的長度(不少于兩個(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ì)得到的 簡單線性回歸 參數(shù)的斜率和截距。 簡單純屬回歸通過此線性函數(shù)來描述自變量 x 和因變量 y 之間的關(guān)系。

y = slope * x + intercept + noise

其中 slopeintercept 是估計(jì)得到的回歸參數(shù),而 noise 代表不可由線性回歸解釋的數(shù)據(jù)變異性(它等于因變量的預(yù)測值和實(shí)際值之間的差異)。

兩個(gè)輸入必須具有相同的長度(不少于兩個(gè)元素),并且自變量 x 不可為常量;否則會(huì)引發(fā) StatisticsError。

例如,我們可以使用 Monty Python 系列電影的發(fā)布日期 在假定出品方保持現(xiàn)有步調(diào)的情況下預(yù)測到 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 的子類,表示統(tǒng)計(jì)相關(guān)的異常。

NormalDist 對象?

NormalDist 工具可用于創(chuàng)建和操縱 隨機(jī)變量 的正態(tài)分布。 這個(gè)類將數(shù)據(jù)度量值的平均值和標(biāo)準(zhǔn)差作為單一實(shí)體來處理。

正態(tài)分布的概念來自于 中央極限定理 并且在統(tǒng)計(jì)學(xué)中有廣泛的應(yīng)用。

class statistics.NormalDist(mu=0.0, sigma=1.0)?

返回一個(gè)新的 NormalDist 對象,其中 mu 代表 算術(shù)平均值sigma 代表 標(biāo)準(zhǔn)差。

sigma 為負(fù)數(shù),將會(huì)引發(fā) StatisticsError。

mean?

一個(gè)只讀特征屬性,表示特定正態(tài)分布的 算術(shù)平均值

median?

一個(gè)只讀特征屬性,表示特定正態(tài)分布的 中位數(shù)

mode?

一個(gè)只讀特征屬性,表示特定正態(tài)分布的 眾數(shù)

stdev?

一個(gè)只讀特征屬性,表示特定正態(tài)分布的 標(biāo)準(zhǔn)差。

variance?

一個(gè)只讀特征屬性,表示特定正態(tài)分布的 方差。 等于標(biāo)準(zhǔn)差的平方。

classmethod from_samples(data)?

傳入使用 fmean()stdev() 基于 data 估算出的 musigma 形參創(chuàng)建一個(gè)正態(tài)分布實(shí)例。

data 可以是任何 iterable 并且應(yīng)當(dāng)包含能被轉(zhuǎn)換為 float 類型的值。 如果 data 不包含至少兩個(gè)元素,則會(huì)引發(fā) StatisticsError,因?yàn)楣浪阒行闹抵辽傩枰粋€(gè)點(diǎn)而估算分散度至少需要兩個(gè)點(diǎn)。

samples(n, *, seed=None)?

對于給定的平均值和標(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é)果,即使對于多線程上下文也有效。

pdf(x)?

使用 概率密度函數(shù) (pdf),計(jì)算一個(gè)隨機(jī)變量 X 趨向于給定值 x 的相對可能性。 在數(shù)學(xué)意義上,它是當(dāng) dx 趨向于零時(shí)比率 P(x <= X < x+dx) / dx 的極限。

相對可能性的計(jì)算方法是用一個(gè)狹窄區(qū)間內(nèi)某個(gè)樣本出現(xiàn)的概率除以區(qū)間的寬度(因此使用“密度”一詞)。 由于可能性是相對于其他點(diǎn)的,它的值可以大于 1.0。

cdf(x)?

使用 累積分布函數(shù) (cdf),計(jì)算一個(gè)隨機(jī)變量 X 小于等于 x 的概率。 在數(shù)學(xué)上,它表示為 P(X <= x)。

inv_cdf(p)?

計(jì)算反向累積分布函數(shù),也稱為 分位數(shù)函數(shù)百分點(diǎn) 函數(shù)。 在數(shù)學(xué)上,它表示為 x : P(X <= x) = p。

找出隨機(jī)變量 X 的值 x 使得該變量小于等于該值的概率等于給定的概率 p

overlap(other)?

測量兩個(gè)正態(tài)概率分布之間的一致性。 返回介于 0.0 和 1.0 之間的值,給出 兩個(gè)概率密度函數(shù)的重疊區(qū)域。

quantiles(n=4)?

將指定正態(tài)分布劃分為 n 個(gè)相等概率的連續(xù)分隔區(qū)。 返回這些分隔區(qū)對應(yīng)的 (n - 1) 個(gè)分隔點(diǎn)的列表。

n 設(shè)為 4 以使用四分位(默認(rèn)值)。 將 n 設(shè)為 10 以使用十分位。將 n 設(shè)為 100 以使用百分位,即給出 99 個(gè)分隔點(diǎn)來將正態(tài)分布分隔為 100 個(gè)大小相等的組。

zscore(x)?

計(jì)算 標(biāo)準(zhǔn)分 即以高于或低于正態(tài)分布的平均值的標(biāo)準(zhǔn)差數(shù)值的形式來描述 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 適合用來解決經(jīng)典概率問題。

舉例來說,如果 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

求 SAT 分?jǐn)?shù)的 四分位十分位

>>>
>>> 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)分布可以被用來模擬 二項(xiàng)分布。

例如,一次開源會(huì)議有 750 名與會(huì)者和兩個(gè)可分別容納 500 人的會(huì)議廳。 會(huì)上有一場關(guān)于 Python 的演講和一場關(guān)于 Ruby 的演講。 在往屆會(huì)議中,65% 的與會(huì)者更愿意去聽關(guān)于 Python 的演講。 假定人群的偏好沒有發(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í)問題中也經(jīng)常會(huì)出現(xiàn)正態(tài)分布。

Wikipedia 上有一個(gè) 樸素貝葉斯分類器的好例子。 挑戰(zhàn)的問題是根據(jù)對多個(gè)正態(tài)分布的特征測量值包括身高、體重和足部尺碼來預(yù)測一個(gè)人的性別。

我們得到了由八個(gè)人的測量值組成的訓(xùn)練數(shù)據(jù)集。 假定這些測量值是正態(tài)分布的,因此我們用 NormalDist 來總結(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])

接下來,我們遇到一個(gè)特征測量值已知但性別未知的新人:

>>>
>>> ht = 6.0        # height
>>> wt = 130        # weight
>>> fs = 8          # foot size

從是男是女各 50% 的 先驗(yàn)概率 出發(fā),我們通過將該先驗(yàn)概率乘以給定性別的特征度量值的可能性累積值來計(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ù)測值應(yīng)為最大后驗(yàn)概率值。 這種算法被稱為 maximum a posteriori 或 MAP:

>>>
>>> 'male' if posterior_male > posterior_female else 'female'
'female'