
本文将介绍50个使用Python进行数据统计分析的实用方法,涵盖从基础描述性统计到高级统计度量的各种操作。每个方法都配有说明、使用场景和代码示例,帮助在实际数据分析工作中快速应用。
说明:算术平均数,衡量数据中心位置
场景:快速了解整体水平
import numpy as np
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
mean = np.mean(data)
print(mean)5.5说明:排序后位于中间的值
场景:存在极端值或偏态分布时,比均值更稳健
median = np.median(data)
print(median)5.5说明:出现频率最高的值
场景:识别最典型或最频繁的类别/数值
from scipy import stats
mode = stats.mode(data, keepdims=False)
print(mode.mode, mode.count)1 1说明:数据偏离均值的程度
场景:衡量总体波动大小
variance = np.var(data, ddof=0)
print(variance)8.25说明:方差的平方根,与原始数据同量纲
场景:评估风险、波动或离散度
std_dev = np.std(data, ddof=0)
print(std_dev)2.8722813232690143说明:将数据等分为四部分的三个切点
场景:快速刻画分布形态、检测离群
q1, q3 = np.percentile(data, [25, 75])
print(q1, q3)3.25 7.75说明:最大值 – 最小值
场景:一眼看出数据跨度
range_val = np.ptp(data)
print(range_val)9说明:自定义分位点
场景:精细化刻画分布,如 90% 阈值
p90 = np.percentile(data, 90)
print(p90)9.1说明:度量分布不对称性
场景:判断数据是否倾斜,指导后续变换
skew = stats.skew(data)
print(skew)0.0说明:度量分布尾部厚重程度
场景:识别尖峰或厚尾风险
kurt = stats.kurtosis(data)
print(kurt)-1.2242424242424244说明:两变量线性相关强度 (-1~1)
场景:探索特征间关系
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
corr = np.corrcoef(x, y)[0, 1]
print(corr)1.0说明:两变量联合波动程度
场景:多元风险分析、PCA 前奏
cov = np.cov(x, y)[0, 1]
print(cov)5.0说明:序列逐项累加
场景:累计增长、盈亏曲线
cumsum = np.cumsum(data)
print(cumsum)[ 1 3 6 10 15 21 28 36 45 55]说明:序列逐项累乘
场景:复利、累积收益率
cumprod = np.cumprod(data)
print(cumprod)[ 1 2 6 24 120 720 5040 40320 362880 3628800]说明:到当前位置的历史最高值
场景:跟踪峰值、回撤计算
cummax = np.maximum.accumulate(data)
print(cummax)[ 1 2 3 4 5 6 7 8 9 10]说明:到当前位置的历史最低值
场景:跟踪谷底、最大亏损
cummin = np.minimum.accumulate(data)
print(cummin)[1 1 1 1 1 1 1 1 1 1]说明:滑动窗口内均值
场景:平滑噪声、趋势识别
def moving_average(arr, w=3):
return np.convolve(arr, np.ones(w)/w, mode='valid')
print(moving_average(data))[ 2. 3. 4. 5. 6. 7. 8. 9.]说明:越近期权重越大
场景:对近期变化更敏感的趋势线
import pandas as pd
ewma = pd.Series(data).ewm(alpha=0.3, adjust=False).mean()
print(ewma.values)[1. 1.3 1.81 2.367 2.9569 3.56983
4.298881 5.1092167 6.07645169 7.15351618]说明:标准化为均值 0、方差 1
场景:异常检测、特征缩放
z = (np.array(data) -np.mean(data)) /np.std(data)
print(z)[-1.5666989 -1.21854359 -0.87038828 -0.52223297 -0.17407766 0.17407766
0.52223297 0.87038828 1.21854359 1.5666989 ]说明:压缩到 [0,1] 区间
场景:神经网络、KNN 等距离算法前处理
scaled = (np.array(data) -np.min(data)) / (np.max(data) -np.min(data))
print(scaled)[0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
0.66666667 0.77777778 0.88888889 1. ]说明:P(X ≤ x) 的样本估计
场景:分位数检验、概率图
sorted_data = np.sort(data)
ecdf = np.arange(1, len(data)+1) /len(data)
print(ecdf)[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]说明:直方图密度估计
场景:绘制分布曲线、形态检查
hist, bins = np.histogram(data, bins=5, density=True)
print("hist:", hist)
print("bins:", bins)hist: [0.02222222 0.04444444 0.04444444 0.04444444 0.02222222]
bins: [ 1. 2.8 4.6 6.4 8.2 10. ]说明:稳健离差度量
场景:异常值较多时替代标准差
mad = np.median(np.abs(np.array(data) -np.median(data)))
print(mad)2.5说明:度量随机变量不确定性
场景:特征选择、决策树、信息增益
from collections import Counter
importmath
defentropy(arr):
counts = Counter(arr)
probs = [c/len(arr) forcincounts.values()]
return-sum(p*math.log2(p) forpinprobs)
print(entropy(data))3.321928094887362说明:序列与自身平移后的相关
场景:时间序列建模、残差诊断
acf_1 = np.corrcoef(data[:-1], data[1:])[0, 1]
print(acf_1)0.9999999999999998说明:压缩大值,降低右偏
场景:收入、房价等右偏特征
log_data = np.log1p(data)
print(log_data)[0.69314718 1.09861229 1.38629436 1.60943791 1.79175947 1.94591015
2.07944154 2.19722458 2.30258509 2.39789527]说明:幂变换族,逼近正态
场景:回归/假设检验需正态前提
bc_data, _ = stats.boxcox(np.array(data) +1) # 需正值
print(bc_data)[1.38629436 2.19722458 2.77258872 3.21887582 3.58351894 3.8918203
4.15888308 4.39444915 4.60517019 4.79579055]说明:比较两组均值差异显著性
场景:A/B 测试、实验评估
a = [1, 2, 3, 4, 5]
b = [2, 3, 4, 5, 6]
t_stat, p = stats.ttest_ind(a, b)
print(t_stat, p)-1.0 0.355361050569611说明:观察频数 vs 期望频数
场景:类别分布检验、AB 人群均衡检查
obs = [30, 50, 20]
exp = [33, 33, 34]
chi2, p = stats.chisquare(obs, f_exp=exp)
print(chi2, p)9.696969696969697 0.007848011003890048说明:多组均值比较
场景:超过两组的实验效果评估
f_val, p = stats.f_oneway([1, 2, 3], [4, 5, 6], [7, 8, 9])
print(f_val, p)18.0 0.002508940265826718说明:拟合直线 y = kx + b
场景:预测、关系量化
x = [1, 2, 3, 4, 5]
y = [2, 4, 5, 4, 5]
k, b, _, _, _ = stats.linregress(x, y)
print(k, b)0.7 2.6说明:扩展线性模型,拟合曲线
场景:非线性关系建模
coeffs = np.polyfit(x, y, deg=2)
print(np.poly1d(coeffs)) 2
-0.2 x + 1.3 x + 0.9说明:拆成趋势、季节、残差
场景:销售预测、经济指标分析
from statsmodels.tsa.seasonal import seasonal_decompose
ts = pd.Series(data, index=pd.date_range('2023-01', periods=len(data), freq='M'))
decomp = seasonal_decompose(ts, model='additive', period=3)
print(decomp.trend.dropna().values)[2.33333333 3.33333333 4.33333333 5.33333333 6.33333333 7.33333333
8.33333333]说明:多期滞后相关
场景:ARIMA 定阶、周期识别
from statsmodels.tsa.stattools import acf
acf_vals = acf(data, nlags=3)
print(acf_vals)[1. 0.7 0.41212121 0.17575758]说明:配对样本非参数检验
场景:不满足正态假设的前后比较
before = [1, 2, 3]
after = [1.1, 2.1, 2.9]
w, p = stats.wilcoxon(before, after)
print(w, p)0.0 1.0说明:两独立样本非参数检验
场景:非正态、秩次比较
u, p = stats.mannwhitneyu([1, 2, 3], [4, 5, 6], alternative='two-sided')
print(u, p)0.0 0.2说明:基于箱线图规则
场景:通用、快速离群筛查
arr = [1, 2, 3, 4, 100]
q1, q3 = np.percentile(arr, [25, 75])
iqr = q3-q1
lower, upper = q1-1.5*iqr, q3+1.5*iqr
outliers = np.array(arr)[(arr<lower) | (arr>upper)]
print(outliers)[100]说明:超过 N 倍标准差视为异常
场景:近似正态分布数据
z = np.abs(stats.zscore(arr))
print(arr[z>2])[100]说明:无放回等概率抽取
场景:训练/测试划分
sample = np.random.choice(data, size=3, replace=False)
print(sample)[3 8 5]说明:保持类别比例抽样
场景:不均衡数据建模、交叉验证
from sklearn.model_selection import train_test_split
X = np.arange(10)
y = [0]*5+ [1]*5
X_train, _, y_train, _ = train_test_split(X, y, stratify=y, test_size=0.5, random_state=42)
print(y_train) # 类别保持 1:1[0, 1, 1, 0, 1]说明:按类别求平均
场景:多组 KPI 比较
import pandas as pd
df = pd.DataFrame({'group': ['A', 'A', 'B'], 'value': [10, 20, 30]})
print(df.groupby('group')['value'].mean())A 15
B 30说明:按类别衡量波动
场景:组内稳定性评估
print(df.groupby('group')['value'].std())A 7.071068
B NaN
dtype: float64说明:用列均值填补 NaN
场景:缺失比例低、随机缺失
s = pd.Series([1, 2, np.nan, 4])
s_filled = s.fillna(s.mean())
print(s_filled.values)[1. 2. 2.33333333 4. ]说明:用中位数填补,抗异常
场景:存在极端值
s_filled = s.fillna(s.median())
print(s_filled.values)[1. 2. 2. 4. ]说明:滑动窗口中位数
场景:去噪、保留突变
def moving_median(series, win=3):
returnpd.Series(series).rolling(win, center=True).median()
print(moving_median([1, 5, 3, 4, 6]).dropna().values)[3. 4. 4.]说明:多项式平滑同时保边
场景:光谱、股价平滑
from scipy.signal import savgol_filter
smooth = savgol_filter([1, 2, 3, 4, 5, 6, 7], 5, 2)
print(smooth)[0.88571429 1.94285714 3. 4. 5. 6.05714286
7.11428571]说明:类别转二进制向量
场景:机器学习输入
encoded = pd.get_dummies(['cat', 'dog', 'cat'])
print(encoded.values)[[1 0]
[0 1]
[1 0]]说明:连续值分段
场景:决策树、WOE 编码
bins = pd.cut(data, bins=3, labels=['low', 'mid', 'high'])
print(bins.codes)[0 0 0 0 1 1 1 2 2 2]说明:回归解释力指标
场景:模型评估
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
r2 = 1-np.sum((np.array(y_true) -y_pred)**2) /np.sum((np.array(y_true) -np.mean(y_true))**2)
print(r2)0.9486081370449679说明:分类模型性能表
场景:评估精准率、召回率
from sklearn.metrics import confusion_matrix
y_true = ['cat', 'dog', 'cat', 'dog']
y_pred = ['cat', 'cat', 'dog', 'dog']
cm = confusion_matrix(y_true, y_pred, labels=['cat', 'dog'])
print(cm)[[1 1]
[1 1]]以上50个Python统计分析的方法涵盖了从基础到高级的各种统计操作,适用于数据探索、预处理、分析和建模的各个阶段。根据您的具体需求选择合适的统计方法,可以大大提高数据分析的效率和质量。
“无他,惟手熟尔”!有需要的用起来。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!😊
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!