
statistics是 Python 3.4 版本開始加入的內置標準庫專門用來做基礎的統計計算不需要額外安裝導入就能用。它封裝了我們日常最常用的統計量均值、中位數、眾數、方差、標準差等不用自己寫循環、寫公式計算一行代碼就能得到準確結果非常適合新手處理簡單的數據分析場景。本文會按「集中趨勢 → 離散程度」的邏輯逐個講解每個函數每個函數都配可運行示例 逐行解釋 新手避坑指南零基礎也能完全吃透。一、模塊基礎說明1. 模塊定位內置模塊Python 安裝完就有不需要pip install適用場景簡單的基礎統計計算處理小規模數值數據優勢代碼簡潔、結果準確、不用自己實現統計公式2. 導入方式# 方式1導入整個模塊推薦新手用不容易混淆函數來源 import statistics # 方式2單獨導入需要的函數 from statistics import mean, stdev, median3. 前置約定所有統計函數的輸入基本都是「數值型可迭代對象」比如整數 / 浮點數組成的列表、元組。 ?? 新手坑不能傳入空列表、不能傳入字符串 / None 等非數值類型否則會直接報錯。二、第一類集中趨勢指標描述數據的中心水平集中趨勢就是找一組數據的「代表值 / 中心值」比如我們常說的平均分、中間分、出現最多的分數都屬于這類指標。1. mean ()算術平均數功能計算一組數據的算術平均值也就是我們最常用的「總和 ÷ 個數」是最基礎、最常用的平均指標。語法statistics.mean(數值序列)示例計算班級考試平均分import statistics # 班級8名同學的數學成績 scores [85, 92, 78, 90, 88, 76, 95, 82] # 計算算術平均分 avg statistics.mean(scores) print(f班級數學平均分{avg})運行結果plaintext班級數學平均分85.75代碼解釋先定義成績列表scores一共 8 個數值statistics.mean(scores)自動計算(8592789088769582) ÷ 8 686 ÷ 8 85.75結果是浮點數類型哪怕剛好整除也會返回 float注意事項序列不能為空否則報錯StatisticsError: mean requires at least one data point只能放數值int/float放字符串會報類型錯誤容易受極端值影響比如加一個 0 分平均分被大幅拉低2. median ()中位數功能把數據從小到大排序后位于正中間位置的數值。如果數據個數是偶數取中間兩個數的平均值。 中位數的優勢是不受極端值影響適合數據里有異常大 / 異常小值的場景。語法statistics.median(數值序列)示例 1奇數個數據import statistics # 9個同學的成績奇數個 scores [76, 78, 82, 85, 88, 90, 92, 95, 100] mid statistics.median(scores) print(f成績中位數{mid})運行結果成績中位數88解釋9 個數排序后第 5 個位置的數就是中位數也就是 88。示例 2偶數個數據import statistics # 8個同學的成績偶數個 scores [76, 78, 82, 85, 88, 90, 92, 95] mid statistics.median(scores) print(f成績中位數{mid})運行結果成績中位數86.5解釋8 個數排序后中間是第 4 個和第 5 個取兩者的平均值(8588) ÷ 2 86.5。拓展低中位數、高中位數還有兩個衍生函數適合需要取整數的場景median_low()偶數個時取中間偏小的那個數median_high()偶數個時取中間偏大的那個數scores [76, 78, 82, 85, 88, 90, 92, 95] print(statistics.median_low(scores)) # 85 print(statistics.median_high(scores)) # 883. mode ()眾數功能一組數據中出現次數最多的數值用來反映最普遍的情況。語法statistics.mode(數值序列)示例統計出現次數最多的分數import statistics scores [85, 92, 85, 90, 88, 92, 92, 82] most statistics.mode(scores) print(f出現次數最多的分數{most})運行結果出現次數最多的分數92解釋92 出現了 3 次是出現次數最多的所以眾數是 92。?? 新手頭號大坑多個眾數會報錯如果有兩個及以上的數值出現次數并列最多mode()會直接報錯StatisticsError。 解決方法用multimode()函數返回所有眾數組成的列表Python 3.8 支持。示例多個眾數的處理import statistics scores [85, 92, 85, 92, 88, 76] # 85和92都出現了2次并列最多 # 錯誤寫法mode會報錯 # print(statistics.mode(scores)) # 正確寫法multimode返回所有眾數 all_modes statistics.multimode(scores) print(f所有眾數{all_modes})運行結果所有眾數[85, 92]4. geometric_mean ()幾何平均數功能幾何平均數多用于計算平均增長率、平均比例比如連續多年的收益率、人口增長率比算術平均更適合描述增長類數據。 公式n 個數值相乘后開 n 次方。注意Python 3.8 才支持這個函數所有數據必須是正數。示例計算平均年收益率import statistics # 某基金連續3年的收益率第一年漲10%、第二年漲20%、第三年漲15% # 轉化為增長倍數1.1、1.2、1.15 growth_rates [1.1, 1.2, 1.15] avg_growth statistics.geometric_mean(growth_rates) print(f年均增長倍數{avg_growth:.4f}) print(f年均收益率{(avg_growth - 1)*100:.2f}%)運行結果年均增長倍數1.1487 年均收益率14.87%解釋三年的復利平均下來相當于每年穩定漲 14.87%。5. harmonic_mean ()調和平均數功能調和平均數多用于計算平均速度、平均單價等場景比如路程相同的情況下計算平均速度。示例計算往返平均速度import statistics # 去程速度60km/h返程速度40km/h路程相同求平均速度 speeds [60, 40] avg_speed statistics.harmonic_mean(speeds) print(f往返平均速度{avg_speed:.2f} km/h)運行結果往返平均速度48.00 km/h解釋調和平均計算的是「相同距離下的平均速度」結果 48 是正確的不是簡單的 (6040)/250。三、第二類離散程度指標描述數據的波動大小離散程度用來衡量一組數據「散不散、波動大不大」。比如兩個班平均分都是 85一個班分數都集中在 80-90另一個班有考 60 也有考 100 的后者波動更大離散程度更高。前置必懂總體 vs 樣本這是新手最容易混淆的點先通俗講清楚總體你手里的數據就是全部研究對象比如全班所有人的成績計算波動用「總體方差 / 總體標準差」函數名帶p前綴p population樣本你手里的數據只是從整體里抽出來的一部分比如從全年級抽 10 個學生的成績用來估計全年級的波動用「樣本方差 / 樣本標準差」分母是 n-1結果比總體的稍大更嚴謹。四個函數對應關系類型方差函數標準差函數總體pvariance()pstdev()樣本variance()stdev()方差和標準差的關系標準差 √方差 標準差的單位和原數據一致比方差更直觀日常描述波動更常用標準差。1. pvariance ()總體方差功能計算總體方差描述整組數據偏離均值的程度數值越大數據越分散。語法statistics.pvariance(數值序列, 均值可選)示例計算全班成績的總體方差import statistics # 全班8名同學的成績這就是全部總體 scores [85, 92, 78, 90, 88, 76, 95, 82] # 計算總體方差 p_var statistics.pvariance(scores) print(f成績總體方差{p_var:.2f})運行結果成績總體方差35.942. pstdev ()總體標準差功能總體方差開平方就是總體標準差單位和原數據一樣這里是「分」比方差更直觀好理解。示例import statistics scores [85, 92, 78, 90, 88, 76, 95, 82] p_std statistics.pstdev(scores) print(f成績總體標準差{p_std:.2f} 分)運行結果成績總體標準差5.99 分解釋可以簡單理解為班級里大部分同學的分數都在平均分上下浮動約 6 分左右。3. variance ()樣本方差功能計算樣本方差用于抽樣數據估計總體波動分母是 n-1n 是數據個數。示例抽樣估計年級成績波動import statistics # 從全年級抽了8個同學的成績樣本數據 sample_scores [85, 92, 78, 90, 88, 76, 95, 82] # 樣本方差 sample_var statistics.variance(sample_scores) print(f樣本方差{sample_var:.2f})運行結果樣本方差41.07可以看到同樣的數據樣本方差41.07比總體方差35.94大這是正常的因為樣本估計總體需要留有余量。4. stdev ()樣本標準差功能樣本方差開平方是最常用的波動描述指標。示例import statistics sample_scores [85, 92, 78, 90, 88, 76, 95, 82] sample_std statistics.stdev(sample_scores) print(f樣本標準差{sample_std:.2f} 分)運行結果樣本標準差6.41 分四、拓展quantiles () 分位數Python 3.8功能把數據按大小排序后分成 n 等份得到分割點的數值最常用的是四分位數分成 4 份可以快速了解數據的分布區間。示例計算成績的四分位數import statistics scores [76, 78, 82, 85, 88, 90, 92, 95, 100] # n4 表示分成4等份得到3個四分位點 q statistics.quantiles(scores, n4) print(f第一四分位數Q1{q[0]}) # 25%位置 print(f第二四分位數Q2{q[1]}) # 50%位置就是中位數 print(f第三四分位數Q3{q[2]}) # 75%位置運行結果第一四分位數Q180.0 第二四分位數Q288.0 第三四分位數Q393.5解釋25% 的同學分數低于 80 分75% 的同學低于 93.5 分。五、綜合實戰案例班級成績完整統計下面是一個完整的小例子用statistics模塊一次性算出所有常用統計量非常適合日常簡單分析。import statistics # 某班10名同學的期末數學成績 scores [72, 85, 91, 68, 95, 85, 79, 88, 91, 91] print( 班級成績統計 ) print(f平均分{statistics.mean(scores):.2f} 分) print(f中位數{statistics.median(scores)} 分) print(f眾數{statistics.mode(scores)} 分) print(f最高分{max(scores)} 分) print(f最低分{min(scores)} 分) print(f總體標準差{statistics.pstdev(scores):.2f} 分) print(f總體方差{statistics.pvariance(scores):.2f})運行結果 班級成績統計 平均分84.50 分 中位數86.5 分 眾數91 分 最高分95 分 最低分68 分 總體標準差8.52 分 總體方差72.65六、新手高頻易錯點總結傳入空列表報錯所有統計函數都要求序列至少有 1 個數據空列表會觸發StatisticsError。非數值類型報錯列表里不能有字符串、None、布爾值以外的非數值類型否則報類型錯誤。眾數多個時報錯并列最多的眾數有多個時mode()會報錯改用multimode()獲取所有眾數列表。總體和樣本搞混數據是全部研究對象 → 用pvariance/pstdev數據是抽樣樣本 → 用variance/stdev日常小數據、只是描述當前這組數據用總體的即可。低版本 Python 不支持新函數geometric_mean、harmonic_mean、multimode、quantiles都是 Python 3.8 才有的低版本會報錯。復雜統計場景不適用statistics只適合基礎統計復雜的數據分析、矩陣運算、回歸分析等建議用numpy、pandas第三方庫。