京公网安备 11010802034615号
经营许可证编号:京B2-20210330
十年前做统计分析,主流选择是 SPSS、SAS、Stata。现在越来越多的研究者、分析师转向 Python,原因有三:
但 Python 的统计库非常多,初学者容易搞不清该用哪个。本文按功能层次梳理主流库,说清每个库的定位和适用场景。
NumPy 是整个 Python 科学计算生态的地基,几乎所有统计库都建立在它之上。它提供多维数组对象 ndarray 和向量化运算能力。
import numpy as np
data = np.array([12, 15, 18, 20, 22, 25, 100])
np.mean(data) # 均值
np.median(data) # 中位数
np.std(data) # 标准差
np.var(data) # 方差
np.percentile(data, [25, 50, 75]) # 四分位数
np.corrcoef(x, y) # 相关系数矩阵
不适合:复杂统计检验、回归建模(这些交给上层库)。
SciPy 是 Python 的"科学计算标准库",其中 scipy.stats 子模块提供了最常用的统计分布、检验和描述统计函数。这是做统计分析最常用的一个库。
描述统计与分布:
from scipy import stats
# 正态性检验
stats.shapiro(data) # Shapiro-Wilk
stats.normaltest(data) # D'Agostino K²
# 分布拟合
stats.norm.fit(data) # 拟合正态分布的 μ 和 σ
stats.norm.pdf(x, mu, sigma) # 概率密度
常用假设检验:
# 单样本 t 检验
stats.ttest_1samp(data, popmean=20)
# 独立样本 t 检验(Welch)
stats.ttest_ind(group_a, group_b, equal_var=False)
# 配对 t 检验
stats.ttest_rel(before, after)
# 单因素方差分析
stats.f_oneway(g1, g2, g3)
# 卡方检验
stats.chi2_contingency(contingency_table)
# 非参数检验
stats.mannwhitneyu(a, b) # 曼-惠特尼 U
stats.kruskal(g1, g2, g3) # 克鲁斯卡尔-沃利斯
stats.wilcoxon(before, after) # 威尔科克森符号秩
相关分析:
stats.pearsonr(x, y) # 皮尔逊相关
stats.spearmanr(x, y) # 斯皮尔曼秩相关
stats.kendalltau(x, y) # 肯德尔相关
y ~ x1 + x2;复杂模型要换 statsmodels。statsmodels 是 Python 里最"像 R"的统计建模库,提供完整的统计模型、检验结果输出(含系数、标准误、t 值、p 值、R²、置信区间),是做计量经济学、社会科学的标配。
线性回归:
import statsmodels.api as sm
X = sm.add_constant(df[['x1', 'x2']])
model = sm.OLS(df['y'], X).fit()
print(model.summary()) # 完整统计输出表
summary() 会输出一张完整的回归结果表,包括:
这是 SciPy 给不了的——SciPy 只能算检验,statsmodels 能给出完整的模型诊断。
其他模型:
# 逻辑回归
sm.Logit(y, X).fit()
# 广义线性模型(泊松、伽马等)
sm.GLM(y, X, family=sm.families.Poisson()).fit()
# 时间序列
sm.tsa.ARIMA(y, order=(1,1,1)).fit()
sm.tsa.stattools.adfuller(y) # ADF 平稳性检验
# 混合效应模型(多层数据)
sm.MixedLM(y, X, groups=df['group']).fit()
方差分析:
from statsmodels.formula.api import ols
model = ols('score ~ C(group)', data=df).fit()
sm.stats.anova_lm(model, typ=2)
ols('y ~ x1 + x2', data=df))pandas 严格说不是"统计库",而是数据分析库。但统计分析的第一步永远是数据整理,pandas 承担了这部分工作,且内置了大量统计方法。
import pandas as pd
df.describe() # 一键输出描述统计
df.groupby('group')['score'].agg(['mean', 'std', 'count']) # 分组统计
df.corr() # 相关系数矩阵
df['x'].value_counts() # 频数统计
df.pivot_table(values='score', index='group', columns='gender', aggfunc='mean') # 交叉表
pandas 是统计分析的"数据中转站":从 Excel/CSV/数据库读进来 → 清洗分组 → 转成 numpy 数组或 DataFrame 交给 scipy/statsmodels 做检验 → 结果用 pandas 整理成表。
scikit-learn 是机器学习库,但它也包含大量统计相关的功能:回归、分类、聚类、降维、交叉验证、特征选择。
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score, roc_auc_score
这是最常被问的问题:
| 对比 | statsmodels | scikit-learn |
|---|---|---|
| 目的 | 解释变量关系、做统计推断 | 预测效果、泛化能力 |
| 输出 | 完整统计表(p值、置信区间) | 模型对象、预测值 |
| 关注点 | 系数显著吗、模型解释力如何 | 预测准不准 |
| 适用 | 学术研究、计量分析 | 工程落地、预测建模 |
一句话:要解释因果、看 p 值用 statsmodels;要预测新数据用 sklearn。
pingouin 是一个相对新的库,把 scipy 的统计检验封装成更友好的接口,直接返回 DataFrame 格式的结果,包含效应量、置信区间,省去自己拼装的麻烦。
import pingouin as pg
pg.ttest(group_a, group_b) # 直接返回含 Cohen's d 的表
pg.anova(data=df, dv='score', between='group') # 带回效应量
pg.corr(x, y, method='spearman') # 带置信区间
pg.pairwise_tests(data=df, dv='score', between='group') # 两两比较
优势:输出规范、带效应量、适合直接放进报告。
做贝叶斯推断需要专门的库:
import pymc as pm
with pm.Model() as model:
mu = pm.Normal('mu', 0, 10)
sigma = pm.HalfNormal('sigma', 5)
obs = pm.Normal('obs', mu=mu, sigma=sigma, observed=data)
trace = pm.sample(2000)
适用:小样本推断、先验信息利用、复杂层级模型、不确定性的完整刻画。
代价:需要 MCMC 采样,计算慢、学习曲线陡。
做 Kaplan-Meier 曲线、Cox 比例风险模型:
from lifelines import KaplanMeierFitter, CoxPHFitter
kmf = KaplanMeierFitter()
kmf.fit(durations, event_observed)
kmf.plot()
cph = CoxPHFitter()
cph.fit(df, duration_col='time', event_col='event')
cph.print_summary()
适用:医学随访数据、客户流失分析、设备寿命分析。
ARCH/GARCH 波动率模型、单位根检验、协整检验:
from arch import arch_model
am = arch_model(returns, vol='Garch', p=1, q=1)
res = am.fit()
seaborn 专门针对统计图表设计:
import seaborn as sns
sns.histplot(data, kde=True) # 直方图 + 密度曲线
sns.boxplot(x='group', y='score', data=df) # 箱线图
sns.regplot(x='x', y='y', data=df) # 散点 + 回归线 + 置信带
sns.heatmap(df.corr(), annot=True) # 相关性热力图
| 任务 | 推荐库 | 理由 |
|---|---|---|
| 基础描述统计 | NumPy / pandas | 最快最直接 |
| 单一假设检验 | SciPy.stats | 覆盖全,返回规范 |
| 回归建模 + 统计推断 | statsmodels | 完整统计表,p值、置信区间齐备 |
| 预测建模 | scikit-learn | 工程化、泛化能力优先 |
| 统计检验一站式报告 | pingouin | 自动带效应量、输出规范 |
| 贝叶斯推断 | PyMC | 生态成熟,文档好 |
| 生存分析 | lifelines | 接口友好,Kaplan-Meier/Cox 齐备 |
| 波动率、单位根检验 | arch | GARCH 系列标准库 |
| 统计图表 | seaborn | 内置统计绘图模板 |
实际做一次统计分析,通常是多个库配合:
import pandas as pd
import numpy as np
from scipy import stats
import statsmodels.api as sm
import seaborn as sns
# 1. 读取与整理(pandas)
df = pd.read_csv('data.csv')
df = df.dropna(subset=['score'])
# 2. 描述统计(pandas + numpy)
print(df.groupby('group')['score'].agg(['mean', 'std', 'count']))
# 3. 正态性检验(scipy)
for g in df['group'].unique():
print(g, stats.shapiro(df[df.group==g]['score']))
# 4. 组间差异检验(scipy)
groups = [df[df.group==g]['score'] for g in df['group'].unique()]
print(stats.f_oneway(*groups))
# 5. 回归建模(statsmodels)
X = sm.add_constant(df[['age', 'income']])
model = sm.OLS(df['score'], X).fit()
print(model.summary())
# 6. 可视化(seaborn)
sns.boxplot(x='group', y='score', data=df)
这就是标准的数据分析流水线:pandas 整理 → scipy 检验 → statsmodels 建模 → seaborn 呈现。
sklearn 的线性回归没有 p 值、没有标准误,因为它不是为推断设计的。要用回归系数解释变量影响,必须用 statsmodels。
scipy 的 ttest_ind 只返回 t 和 p。要报告效应量(Cohen's d),得自己算,或者直接用 pingouin。
t 检验需要正态性和方差齐性,卡方检验需要期望频数 ≥5。直接调函数不检查前提,结论可能不可靠。
同一份数据用 scipy 和 statsmodels 算出来的 p 值偶尔会有细微差异,原因是默认参数(如是否 Welch 校正、尾部设定)不同。报告时要写清用的哪个库、什么参数。
Python 的统计学库按层次划分非常清晰:
学习路径建议:先掌握 pandas + scipy 应付日常检验,需要写论文做回归就上 statsmodels,做机器学习预测用 sklearn,有特殊需求再按场景补 pingouin(便利性)、PyMC(贝叶斯)、lifelines(生存分析)。
不用一开始全学,按任务驱动选库,用熟了自然就形成自己的工具箱。

一、为什么数据要先标准化 拿到一份数据,各列的量纲往往完全不同:年龄单位是"岁"(约 20~60),收入单位是"元"(几千到几万) ...
2026-11-06一、为什么 Python 成了统计分析的主流工具 十年前做统计分析,主流选择是 SPSS、SAS、Stata。现在越来越多的研究者、分析师转向 ...
2026-11-06核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-11-06核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-11-06“大学生必备证书有哪些”最容易被答成一张越长越好的清单。但校招筛选的真实逻辑是:证书要对应你投的岗位任务,并且在校期间确 ...
2026-11-05大学期间能报的证书,先别急着看“含金量榜单”。更实用的第一步是问:我现在这个身份、这个学历,符合报考条件吗? 很多证书宣 ...
2026-11-05大学期间能考的证书很多,但真正需要先回答的是两个问题:当前有没有报考资格,以及这张证书对应什么岗位任务。 前者决定你能不 ...
2026-11-05先把结论说清楚:真正“只有在校大学生能考、毕业就彻底没资格”的证书数量不多,主要集中在语言类考试的部分专项、面向高校学生 ...
2026-11-05上班族问“考什么证书有用”,真正要解决的不是找一张“最值钱”的证,而是判断哪张证能嵌进你现有的岗位任务。同样一张证书,做 ...
2026-11-05职称证书不是统一的考试项目。同样“考职称”,经济、会计、统计、审计、软考走全国统一考试,工程、教师、卫生等系列多数走评审 ...
2026-11-0533岁选证书,最怕两件事:一是被“适合女生”的清单带着走,考完发现岗位用不上;二是投入大半年,报名时才发现学历、专业或工作 ...
2026-11-05“女生容易考的证书”这个问题,真正难的不是找一份名单,而是判断“容易”到底指什么。报名条件宽松、考试通过率高、拿证后能找 ...
2026-11-05“女生适合考什么证书”这类搜索,背后往往是同一个困惑:网上榜单太多,口径却说不清楚。有人把培训证书和职业资格混在一起排, ...
2026-11-05先把结论说清楚:没有一张证书对所有人都“又好考又实用”。同一个证,对在校生可能报名门槛都过不了,对有三年工作经验的人却只 ...
2026-11-05“考证书有哪些”这个问题,如果只想要一份名单,网上能搜到成百上千个。但真正有用的答案不是“有哪些”,而是“它们分别是什么 ...
2026-11-05“考什么证好一点”这句话,十个人问可能有十个意思。有人想问哪个证容易过,有人想知道哪个证找工作管用,还有人关心哪个证长期 ...
2026-11-05“考哪些证书最吃香”很难用一张榜单回答。同一张证书,在有的岗位是硬门槛,在另一些岗位只是加分项;对在校生和在职者的价值也 ...
2026-11-05家庭主妇能考的证书不少,但真正值得花时间的,不是“哪个证热门”,而是先确认你当前能不能报,再按每周可投入时间和未来出口缩 ...
2026-11-05“国家认证的职业技能证书”并不是某一本证书的正式名称,而是一句被大量使用的宣传口径。它可能指向人社部门的国家职业资格、备 ...
2026-11-05工程领域的证书名目确实多,但乱的不是证书本身,而是很多人把不同制度属性的证书放在一个篮子里比较。有人拿培训结业证去对标注 ...
2026-11-05