如何在 Python 中查找均值、中值和眾數?
已發表: 2021-06-22均值、中位數和眾數是統計學的基本主題。 無論是否使用外部庫,您都可以在 Python 中輕鬆計算它們。
這三個是集中趨勢的主要措施。 集中趨勢讓我們知道數據集的“正常”或“平均”值。 如果您剛開始接觸數據科學,那麼這是適合您的教程。

在本教程結束時,您將:
- 理解均值、中位數和眾數的概念
- 能夠在 Python 中創建自己的均值、中值和眾數函數
- 利用 Python 的統計模塊快速開始使用這些測量
如果您需要以下練習的可下載版本,請隨時查看 GitHub 存儲庫。
讓我們進入計算均值、中位數和眾數的不同方法。
在 Python 中計算平均值
平均值或算術平均值是最常用的集中趨勢度量。
請記住,集中趨勢是一組數據的典型值。
數據集是數據的集合,因此 Python 中的數據集可以是以下任何內置數據結構:
- 列表、元組和集合:對象的集合
- 字符串:字符的集合
- 字典:鍵值對的集合
注意:雖然 Python 中還有其他數據結構,如隊列或堆棧,我們將只使用內置的。
我們可以通過將數據集的所有值相加並將結果除以值的數量來計算平均值。 例如,如果我們有以下數字列表:
[1, 2, 3, 4, 5, 6]平均值或平均值將為3.5,因為列表的總和為21且其長度為6 。 21 除以 6 是3.5 。 您可以使用以下計算來執行此計算:
(1 + 2 + 3 + 4 + 5 + 6) / 6 = 21在本教程中,我們將使用籃球隊的球員作為我們的樣本數據。
創建自定義均值函數
讓我們從計算籃球隊球員的平均(平均)年齡開始。 該團隊的名稱將是“Pythonic Machines”。
pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24] def mean(dataset): return sum(dataset) / len(dataset) print(mean(pythonic_machine_ages))分解此代碼:
- “pythonic_machine_ages”是一個籃球運動員年齡列表
- 我們定義了一個mean()函數,它返回給定數據集的總和除以它的長度
- sum()函數返回可迭代值的總和(具有諷刺意味的是),在這種情況下,是一個列表。 嘗試將數據集作為參數傳遞,它將返回211
- len()函數返回一個可迭代對象的長度,如果你將數據集傳遞給它,你會得到8
- 我們將籃球隊年齡傳遞給mean()函數並打印結果。
如果你檢查輸出,你會得到:
26.375 # Because 211 / 8 = 26.375此輸出代表籃球隊球員的平均年齡。 請注意該數字如何沒有出現在數據集中,而是準確描述了大多數玩家的年齡。
使用 Python 統計模塊中的 mean()
計算集中趨勢的度量是大多數開發人員的常見操作。 這是因為 Python 的統計模塊提供了各種函數來計算它們,以及其他基本的統計主題。
由於它是 Python 標準庫的一部分,因此您無需使用 PIP 安裝任何外部包。
以下是您如何使用此模塊:
from statistics import mean pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24] print(mean(pythonic_machine_ages))在上面的代碼中,您只需要從統計模塊中導入mean()函數並將數據集作為參數傳遞給它。 這將返回與我們在上一節中定義的自定義函數相同的結果:
26.375現在您已經清楚地了解了均值的概念,讓我們繼續進行中值測量。
在 Python 中查找中位數
中位數是排序數據集的中間值。 它再次用於提供確定人口的“典型”值。
在編程中,我們可以將中位數定義為將序列分成兩部分——下半部分和上半部分——的值。
要計算中位數,首先,我們需要對數據集進行排序。 我們可以使用排序算法或使用內置函數sorted()來做到這一點。 第二步是判斷數據集長度是奇數還是偶數。 基於此,執行以下一些過程:
- 奇數:中位數是數據集的中間值
- 偶數:中位數是兩個中間值的總和除以二
繼續我們的籃球隊數據集,讓我們以厘米為單位計算球員的平均身高:
[181, 187, 196, 196, 198, 203, 207, 211, 215] # Since the dataset is odd, we select the middle value median = 198可以看到,由於數據集長度是奇數,所以我們可以取中間值作為中位數。 但是,如果一名球員剛剛退役,會發生什麼?
我們需要使用數據集的兩個中間值來計算中位數
[181, 187, 196, 198, 203, 207, 211, 215] # We select the two middle values, and divide them by 2 median = (198 + 203) / 2 median = 200.5創建自定義中值函數
讓我們將上述概念實現到一個 Python 函數中。
記住我們需要遵循的三個步驟來獲得數據集的中值:
- 對數據集進行排序:我們可以使用sorted()函數來做到這一點
- 確定它是奇數還是偶數:我們可以通過獲取數據集的長度並使用模運算符 (%) 來做到這一點
- 根據每種情況返回中位數:
- 奇數:返回中間值
- Even:返回兩個中間值的平均值
這將導致以下功能:
pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215] after_retirement = [181, 187, 196, 198, 203, 207, 211, 215] def median(dataset): data = sorted(dataset) index = len(data) // 2 # If the dataset is odd if len(dataset) % 2 != 0: return data[index] # If the dataset is even return (data[index - 1] + data[index]) / 2打印我們數據集的結果:
print(median(pythonic_machines_heights)) print(median(after_retirement))輸出:
198 200.5請注意我們如何在函數開始時創建一個指向排序數據庫的數據變量。 雖然上面的列表是排序的,但我們想要創建一個可重用的函數,因此每次調用函數時都會對數據集進行排序。
索引使用整數除法運算符存儲數據集的中間值(或中上值)。 例如,如果我們傳遞“pythonic_machine_heights”列表,它的值為4 。
請記住,在 Python 中序列索引從零開始,那是因為我們能夠返回列表的中間索引,並使用整數除法。
然後我們通過將模運算的結果與任何不為零的值進行比較來檢查數據集的長度是否為奇數。 如果條件為真,我們返回中間元素,例如,帶有“pythonic_machine_heights”列表:

>>> pythonic_machine_heights[4] # 198另一方面,如果數據集是偶數,我們返回中間值的總和除以二。 請注意, data[index -1]為我們提供了數據集的下中點,而data[index]為我們提供了上中點。
使用 Python 統計模塊中的中值()
這種方式要簡單得多,因為我們使用的是統計模塊中已經存在的函數。
就我個人而言,如果已經為我定義了某些東西,我會使用它,因為 DRY —不要重複自己 — 原則(在這種情況下,不要重複其他人的代碼)。
您可以使用以下代碼計算先前數據集的中位數:
from statistics import median pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215] after_retirement = [181, 187, 196, 198, 203, 207, 211, 215] print(median(pythonic_machines_heights)) print(median(after_retirement))輸出:
198 200.5在 Python 中計算模式
眾數是數據集中出現頻率最高的值。 我們可以把它想像成一個學校的“人氣”群體,它可能代表了所有學生的標準。
模式的一個例子是科技商店的每日銷售額。 該數據集的模式將是特定日期最暢銷的產品。
['laptop', 'desktop', 'smartphone', 'laptop', 'laptop', 'headphones']如您所見,上述數據集的模式是“筆記本電腦”,因為它是列表中出現頻率最高的值。
mode 很酷的一點是數據集不能是數字。 例如,我們可以使用字符串。
再來分析下一天的銷量:
['mouse', 'camera', 'headphones', 'usb', 'headphones', 'mouse']上面的數據集有兩種模式:“鼠標”和“耳機”,因為兩者的頻率都是 2。 這意味著它是一個多模式數據集。
如果我們在數據集中找不到模式怎麼辦,如下所示?
['usb', 'camera', 'smartphone', 'laptop', 'TV']這稱為均勻分佈,基本上,這意味著數據集中沒有眾數。
現在您已經快速掌握了模式的概念,讓我們用 Python 計算它。
創建自定義模式函數
我們可以將一個值出現的頻率視為一個鍵值對,換句話說,就是一個 Python 字典。
回顧一下籃球的比喻,我們可以使用兩個數據集來處理:每場比賽的得分,以及一些球員的球鞋贊助。
要首先找到模式,我們需要使用數據集中存在的每個值創建一個頻率字典,然後獲取最大頻率,並返回具有該頻率的所有元素。
讓我們把它翻譯成代碼:
points_per_game = [3, 15, 23, 42, 30, 10, 10, 12] sponsorship = ['nike', 'adidas', 'nike', 'jordan', 'jordan', 'rebook', 'under-armour', 'adidas'] def mode(dataset): frequency = {} for value in dataset: frequency[value] = frequency.get(value, 0) + 1 most_frequent = max(frequency.values()) modes = [key for key, value in frequency.items() if value == most_frequent] return modes檢查將兩個列表作為參數傳遞的結果:
print(mode(points_per_game)) print(mode(sponsorship))輸出:
[10] ['nike', 'adidas', 'jordan']如您所見,第一個打印語句給了我們一個模式,而第二個返回多個模式。
更深入地解釋上面的代碼:
- 我們聲明一個頻率字典
- 我們迭代數據集以創建直方圖——一組計數器(或頻率)的統計術語——
- 如果在字典中找到鍵,則將值加一
- 如果沒有找到,我們會創建一個值為 1 的鍵值對
- most_frequent變量存儲——諷刺的是——頻率字典的最大值(不是鍵)
- 我們返回由頻率字典中頻率最高的所有鍵組成的模式變量。
請注意變量命名對於編寫可讀代碼的重要性。
使用 Python 統計模塊中的 mode() 和 multimode()
統計模塊再次為我們提供了一種快速進行基本統計操作的方法。
我們可以使用兩個函數:mode() 和 multimode()。
from statistics import mode, multimode points_per_game = [3, 15, 23, 42, 30, 10, 10, 12] sponsorship = ['nike', 'adidas', 'nike', 'jordan', 'jordan', 'rebook', 'under-armour', 'adidas']上面的代碼導入了兩個函數並定義了我們一直在使用的數據集。
這裡有一點不同: mode()函數返回它遇到的第一個模式,而multimode()返回一個列表,其中包含數據集中最頻繁的值。
print(mode(points_per_game)) print(mode(sponsorship))輸出:
10 nike注意:在 Python 3.8 或更高版本中, mode() 函數返回它找到的第一個模式。 如果你有一個舊版本,你會得到一個 StatisticsError。
使用multimode()函數:
print(multimode(points_per_game)) print(multimode(sponsorship))輸出:
[10] ['nike', 'adidas', 'jordan']總結
恭喜! 如果您遵循到目前為止,您就學會瞭如何計算均值、中位數和眾數,即主要的集中趨勢測量值。
儘管您可以定義自定義函數來查找均值、中位數和眾數,但建議使用統計模塊,因為它是標準庫的一部分,您無需安裝任何東西即可開始使用它。
接下來,閱讀 Python 中數據分析的友好介紹。
