NumPy-統計函數詳解
- 一、基礎統計函數:均值、方差、標準差
- 1. 全局統計:忽略維度的整體計算
- 2. 按軸統計:指定維度方向的計算
- 二、位置統計:中位數、分位數、百分位數
- 1. 中位數計算
- 2. 分位數與百分位數
- 三、離散程度:極差、四分位距、變異系數
- 1. 極差(Range)
- 2. 四分位距(IQR)
- 3. 變異系數(Coefficient of Variation)
- 四、相關分析:協方差與相關系數
- 1. 協方差矩陣
- 2. 相關系數矩陣
- 五、高級應用:加權統計與掩碼處理
- 1. 加權統計
- 2. 掩碼數組:處理缺失值
- 六、性能優化與注意事項
- 1. 內存高效的分塊計算
- 2. 統計函數的精度問題
- 七、實戰案例:數據分布分析
- 1. 數據標準化
- 2. 異常值檢測
- 3. 數據分布可視化(配合matplotlib)
統計函數是提取數據特征、洞察數據分布的核心工具,NumPy作為Python數值計算的基石,提供了豐富的統計函數庫,涵蓋均值、方差、中位數、相關系數等多種統計指標。
一、基礎統計函數:均值、方差、標準差
1. 全局統計:忽略維度的整體計算
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])print(np.mean(arr)) # 均值:3.5
print(np.var(arr)) # 方差:2.9166666666666665
print(np.std(arr)) # 標準差:1.707825127659933
print(np.sum(arr)) # 總和:21
print(np.min(arr)) # 最小值:1
print(np.max(arr)) # 最大值:6
2. 按軸統計:指定維度方向的計算
通過axis
參數指定統計方向:
axis=0
:按列方向(跨行統計)axis=1
:按行方向(跨列統計)
print(np.mean(arr, axis=0)) # 按列求均值:[2.5 3.5 4.5]
print(np.mean(arr, axis=1)) # 按行求均值:[2. 5.]
print(np.sum(arr, axis=1)) # 按行求和:[ 6 15]
二、位置統計:中位數、分位數、百分位數
1. 中位數計算
中位數是將數據分為上下兩部分的數值,對異常值不敏感:
data = np.array([1, 3, 2, 4, 5])
print(np.median(data)) # 輸出:3.0(排序后中間的數)# 偶數個元素時取中間兩個數的平均值
data = np.array([1, 2, 3, 4])
print(np.median(data)) # 輸出:2.5((2+3)/2)
2. 分位數與百分位數
- 分位數:將數據分為k等份的數值(如四分位數k=4)
- 百分位數:分位數的特殊情況(k=100)
data = np.array([1, 2, 3, 4, 5])
print(np.percentile(data, 25)) # 第25百分位數:2.0
print(np.percentile(data, 50)) # 第50百分位數(中位數):3.0
print(np.percentile(data, 75)) # 第75百分位數:4.0
三、離散程度:極差、四分位距、變異系數
1. 極差(Range)
最大值與最小值的差值:
data = np.array([1, 3, 2, 4, 5])
print(np.ptp(data)) # 輸出:4(5-1)
2. 四分位距(IQR)
第75百分位數與第25百分位數的差值,衡量數據中間50%的離散程度:
q75, q25 = np.percentile(data, [75, 25])
print(q75 - q25) # 輸出:2.0(4-2)
3. 變異系數(Coefficient of Variation)
標準差與均值的比值,用于比較不同數據集的相對離散程度:
def coefficient_of_variation(x):return np.std(x) / np.mean(x)data = np.array([1, 2, 3, 4, 5])
print(coefficient_of_variation(data)) # 輸出:0.5270462766947299
四、相關分析:協方差與相關系數
1. 協方差矩陣
衡量兩個變量的總體誤差,反映變量間的線性關系方向:
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
print(np.cov(x, y))
# 輸出:
# [[ 1. 1.]
# [ 1. 1.]]
# 對角線為各自的方差,非對角線為協方差
2. 相關系數矩陣
將協方差標準化到[-1,1]區間,更直觀地反映相關性強度:
print(np.corrcoef(x, y))
# 輸出:
# [[1. 1.]
# [1. 1.]]
# 完全正相關(相關系數為1)
五、高級應用:加權統計與掩碼處理
1. 加權統計
對不同數據點賦予不同權重,計算加權均值、方差等:
data = np.array([1, 2, 3])
weights = np.array([0.1, 0.3, 0.6])
print(np.average(data, weights=weights)) # 加權均值:2.5
2. 掩碼數組:處理缺失值
使用np.ma
模塊創建掩碼數組,忽略特定值進行統計:
data = np.array([1, np.nan, 3])
masked_data = np.ma.masked_invalid(data) # 屏蔽NaN值
print(np.ma.mean(masked_data)) # 輸出:2.0(忽略NaN后計算均值)
六、性能優化與注意事項
1. 內存高效的分塊計算
處理超大規模數據時,可使用np.nanmean
等函數自動處理NaN值,并通過out
參數指定輸出數組:
# 假設data是一個非常大的數組
result = np.empty(shape=data.shape[1:])
np.mean(data, axis=0, out=result) # 直接將結果寫入預分配內存
2. 統計函數的精度問題
不同數據類型可能導致統計結果精度差異:
arr_float = np.array([1.1, 2.2, 3.3], dtype=np.float64)
arr_float32 = arr_float.astype(np.float32)print(np.sum(arr_float)) # 輸出:6.6(高精度)
print(np.sum(arr_float32)) # 輸出:6.600000381469727(低精度)
七、實戰案例:數據分布分析
1. 數據標準化
將數據轉換為均值為0、標準差為1的標準正態分布:
data = np.array([1, 2, 3, 4, 5])
standardized = (data - np.mean(data)) / np.std(data)
print(standardized) # 輸出:[-1.26491106 -0.63245553 0. 0.63245553 1.26491106]
2. 異常值檢測
使用四分位距識別異常值:
q1, q3 = np.percentile(data, [25, 75])
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
outliers = data[(data < lower_bound) | (data > upper_bound)]
print(outliers) # 輸出異常值
3. 數據分布可視化(配合matplotlib)
import matplotlib.pyplot as plt
data = np.random.normal(0, 1, 1000) # 生成正態分布數據
plt.hist(data, bins=30)
plt.axvline(np.mean(data), color='r', linestyle='dashed', linewidth=2) # 均值線
plt.axvline(np.median(data), color='g', linestyle='dashed', linewidth=2) # 中位數線
plt.show()
總結:NumPy統計函數的核心優勢:
- 高效性:底層用C實現,避免Python循環,處理大規模數據時性能優異
- 靈活性:通過
axis
參數支持多維數組的任意方向統計- 魯棒性:內置對NaN、Inf等特殊值的處理機制
That’s all, thanks for reading~~
覺得有用就點個贊
、收進收藏
夾吧!關注
我,獲取更多干貨~