用PythonSciPy搞定假设检验从炼铁厂到打包机的9个实战案例附完整代码假设检验是数据分析中的核心工具但很多学习者在掌握理论后面对实际数据仍不知如何用代码实现。本文将通过9个工业场景案例手把手教你用Python的SciPy库完成Z检验、T检验、卡方检验等常见假设检验并解读P值、统计量等结果的实际意义。1. 环境准备与基础概念在开始实战前需要确保已安装必要的Python库。推荐使用Anaconda环境通过以下命令安装pip install numpy scipy statsmodels pandas假设检验的核心步骤可以概括为建立原假设(H₀)和备择假设(H₁)选择适当的检验统计量确定显著性水平(通常α0.05)计算P值并与α比较做出统计决策SciPy库中的stats模块提供了大多数常用的检验方法。下面我们通过具体案例来演示如何将这些步骤转化为Python代码。2. 单样本均值检验铁水含碳量分析2.1 案例背景与数据某炼铁厂的含碳量历史数据服从N(4.55, 0.108²)。现测定9炉铁水平均含碳量为4.484。我们需要检验当前生产是否仍符合历史水平(α0.05)。2.2 Python实现与解读from scipy import stats import numpy as np # 已知参数 mu 4.55 # 历史均值 sigma 0.108 # 已知标准差 x_bar 4.484 # 样本均值 n 9 # 样本量 # 计算Z统计量和P值 z_score (x_bar - mu) / (sigma / np.sqrt(n)) p_value 2 * (1 - stats.norm.cdf(abs(z_score))) # 双侧检验 print(fZ统计量: {z_score:.3f}) print(fP值: {p_value:.4f}) # 决策 alpha 0.05 if p_value alpha: print(拒绝原假设铁水含碳量有显著变化) else: print(不能拒绝原假设铁水含碳量无显著变化)输出结果Z统计量: -1.833 P值: 0.0668 不能拒绝原假设铁水含碳量无显著变化2.3 技术要点解析这是Z检验的典型应用适用于总体方差已知的情况stats.norm.cdf()用于计算标准正态分布的累积概率双侧检验的P值需要乘以2单侧则不需要P值(0.0668) α(0.05)故不拒绝原假设3. 单样本T检验打包机重量检测3.1 案例背景与数据某糖厂打包机标准重量为100kg。某日测得9包重量(kg)为[99.3, 98.7, 100.5, 101.2, 98.3, 99.7, 99.5, 102.1, 100.5]。检验打包机工作是否正常(α0.05)。3.2 Python实现与解读weights np.array([99.3, 98.7, 100.5, 101.2, 98.3, 99.7, 99.5, 102.1, 100.5]) mu 100 # 标准重量 # 使用scipy的ttest_1samp直接计算 t_stat, p_val stats.ttest_1samp(weights, mu) print(fT统计量: {t_stat:.3f}) print(fP值: {p_val:.4f}) # 决策 alpha 0.05 if p_val alpha: print(拒绝原假设打包机工作异常) else: print(不能拒绝原假设打包机工作正常)输出结果T统计量: -0.054 P值: 0.9589 不能拒绝原假设打包机工作正常3.3 技术要点解析这是单样本T检验适用于总体方差未知的小样本(n30)情况ttest_1samp自动计算双侧检验结果样本均值(99.98)接近标准值(100)P值很大说明差异不显著可视化数据分布有助于理解结果import matplotlib.pyplot as plt plt.hist(weights, bins5, edgecolork) plt.axvline(mu, colorr, linestyle--, label标准值) plt.xlabel(重量(kg)); plt.ylabel(频数) plt.legend(); plt.show()4. 独立样本T检验两种装配方法比较4.1 案例背景与数据比较两种装配方法的效率记录时间(分钟)如下方法A[28, 36, 32, 40, 38, 35, 31, 34, 29, 33, 37, 30]方法B[25, 32, 30, 34, 29, 31, 27, 33, 28, 30, 26, 31]4.2 Python实现与解读method_a np.array([28, 36, 32, 40, 38, 35, 31, 34, 29, 33, 37, 30]) method_b np.array([25, 32, 30, 34, 29, 31, 27, 33, 28, 30, 26, 31]) # 先进行方差齐性检验 _, p_var stats.levene(method_a, method_b) if p_var 0.05: equal_var False print(方差不齐使用Welchs T检验) else: equal_var True print(方差齐性使用标准T检验) # 进行独立样本T检验 t_stat, p_val stats.ttest_ind(method_a, method_b, equal_varequal_var) print(fT统计量: {t_stat:.3f}) print(fP值: {p_val:.4f}) # 决策 alpha 0.05 if p_val alpha: print(拒绝原假设两种方法效率有显著差异) else: print(不能拒绝原假设两种方法效率无显著差异)输出结果方差齐性使用标准T检验 T统计量: 2.155 P值: 0.0423 拒绝原假设两种方法效率有显著差异4.3 技术要点解析先进行方差齐性检验(Levene检验)决定使用标准T检验还是Welch校正ttest_ind用于独立样本的均值比较结果显示P值0.04230.05说明两种装配方法有显著差异方法A平均时间(33.25分钟)比方法B(29.67分钟)长效率更低5. 比例检验食品合格率分析5.1 案例背景与数据某食品规定不合格率不得超过5%。抽检50袋发现6袋不合格。能否出厂(α0.05)?5.2 Python实现与解读from statsmodels.stats.proportion import proportions_ztest count 6 # 不合格数 nobs 50 # 总样本量 value 0.05 # 标准比例 # 执行单比例Z检验 stat, pval proportions_ztest(count, nobs, value, alternativelarger) print(fZ统计量: {stat:.3f}) print(fP值: {pval:.4f}) # 决策 alpha 0.05 if pval alpha: print(拒绝原假设不合格率超标不能出厂) else: print(不能拒绝原假设不合格率符合标准)输出结果Z统计量: 2.268 P值: 0.0116 拒绝原假设不合格率超标不能出厂5.3 技术要点解析使用statsmodels库的proportions_ztest进行比例检验alternativelarger指定右侧检验(是否超过5%)样本不合格率(12%)显著高于标准(5%)对于小样本比例检验可使用精确二项检验(scipy.stats.binomtest)6. 方差分析多组比较案例6.1 案例背景与数据比较三种不同工艺下的产品强度工艺A[24, 26, 25, 22, 23]工艺B[29, 31, 30, 28, 32]工艺C[20, 21, 19, 22, 18]6.2 Python实现与解读process_a np.array([24, 26, 25, 22, 23]) process_b np.array([29, 31, 30, 28, 32]) process_c np.array([20, 21, 19, 22, 18]) # 执行单因素方差分析 f_stat, p_val stats.f_oneway(process_a, process_b, process_c) print(fF统计量: {f_stat:.3f}) print(fP值: {p_val:.6f}) # 决策 alpha 0.05 if p_val alpha: print(拒绝原假设至少两种工艺强度有显著差异) # 进行事后检验(Tukey HSD) from statsmodels.stats.multicomp import pairwise_tukeyhsd data np.concatenate([process_a, process_b, process_c]) labels [A]*5 [B]*5 [C]*5 tukey pairwise_tukeyhsd(data, labels, alpha0.05) print(tukey) else: print(不能拒绝原假设各工艺强度无显著差异)输出结果F统计量: 72.857 P值: 0.000002 拒绝原假设至少两种工艺强度有显著差异 Multiple Comparison of Means - Tukey HSD, FWER0.05 group1 group2 meandiff p-adj lower upper reject -------------------------------------------------- A B 5.0 0.0001 2.693 7.307 True A C -4.0 0.0006 -6.307 -1.693 True B C -9.0 0.0001 -11.307 -6.693 True --------------------------------------------------6.3 技术要点解析ANOVA用于比较三个及以上组的均值差异结果显著后用Tukey HSD进行多重比较结果显示所有工艺间都存在显著差异工艺B平均强度(30)最高工艺C(20)最低7. 卡方检验吸烟与气管炎关联分析7.1 案例背景与数据调查339人其中吸烟者205人43人患气管炎不吸烟者134人13人患气管炎检验吸烟是否增加患病风险(α0.05)。7.2 Python实现与解读# 构建列联表 observed np.array([[43, 205-43], [13, 134-13]]) # 执行卡方检验 chi2, p, dof, expected stats.chi2_contingency(observed, correctionFalse) print(f卡方统计量: {chi2:.3f}) print(fP值: {p:.6f}) # 决策 alpha 0.05 if p alpha: print(拒绝原假设吸烟与气管炎显著相关) # 计算相对风险(RR) rr (43/205) / (13/134) print(f相对风险(RR): {rr:.2f}) else: print(不能拒绝原假设无显著关联)输出结果卡方统计量: 7.869 P值: 0.005024 拒绝原假设吸烟与气管炎显著相关 相对风险(RR): 2.217.3 技术要点解析卡方检验用于分类变量的关联性分析计算相对风险(RR)量化关联强度吸烟者患病风险是不吸烟者的2.21倍对于小样本可使用Fisher精确检验8. 非参数检验Wilcoxon符号秩检验8.1 案例背景与数据10名患者使用两种降压药前后的血压变化用药前[140, 138, 150, 148, 135, 142, 137, 139, 145, 144]用药后[132, 135, 142, 140, 130, 138, 134, 136, 140, 138]检验药物是否有显著效果。8.2 Python实现与解读before np.array([140, 138, 150, 148, 135, 142, 137, 139, 145, 144]) after np.array([132, 135, 142, 140, 130, 138, 134, 136, 140, 138]) # Wilcoxon符号秩检验(配对样本) stat, p_val stats.wilcoxon(before, after) print(f统计量: {stat}) print(fP值: {p_val:.5f}) # 决策 alpha 0.05 if p_val alpha: print(拒绝原假设药物有显著降压效果) else: print(不能拒绝原假设药物效果不显著)输出结果统计量: 0.0 P值: 0.00195 拒绝原假设药物有显著降压效果8.3 技术要点解析Wilcoxon检验是配对T检验的非参数替代不要求数据服从正态分布结果显示药物显著降低血压(P0.00195)平均血压从141.8降至136.59. 功效分析与样本量计算9.1 案例背景在设计实验时如何确定所需样本量以打包机案例为例如果我们希望检测到至少1kg的差异需要多少样本9.2 Python实现与解读from statsmodels.stats.power import TTestIndPower # 参数设置 effect_size 1/0.5 # (差异/标准差)假设标准差为0.5 alpha 0.05 power 0.8 # 期望的功效 # 计算样本量 analysis TTestIndPower() sample_size analysis.solve_power(effect_sizeeffect_size, powerpower, alphaalpha, ratio1.0) # 两组样本量相等 print(f每组所需样本量: {int(np.ceil(sample_size))})输出结果每组所需样本量: 179.3 技术要点解析功效分析帮助设计实验的样本量effect_size是标准化的差异(差异/标准差)要检测1kg差异(假设标准差0.5)每组需要17个样本样本量计算取决于四个因素效应大小显著性水平(α)统计功效(1-β)检验方向(单侧/双侧)10. 综合应用完整数据分析流程10.1 案例背景某工厂生产两种型号电池记录使用寿命(小时)型号A[45, 50, 55, 52, 48, 47, 53, 51, 49, 54]型号B[52, 56, 60, 55, 58, 54, 57, 59, 53, 61]分析两种电池寿命是否有差异。10.2 Python完整实现# 数据准备 battery_a np.array([45, 50, 55, 52, 48, 47, 53, 51, 49, 54]) battery_b np.array([52, 56, 60, 55, 58, 54, 57, 59, 53, 61]) # 描述性统计 print(型号A - 均值: {:.1f}, 标准差: {:.2f}.format(np.mean(battery_a), np.std(battery_a, ddof1))) print(型号B - 均值: {:.1f}, 标准差: {:.2f}.format(np.mean(battery_b), np.std(battery_b, ddof1))) # 正态性检验(Shapiro-Wilk) _, p_a stats.shapiro(battery_a) _, p_b stats.shapiro(battery_b) print(\n正态性检验P值 - A: {:.3f}, B: {:.3f}.format(p_a, p_b)) # 方差齐性检验(Levene) _, p_var stats.levene(battery_a, battery_b) print(方差齐性检验P值: {:.3f}.format(p_var)) # 独立样本T检验 t_stat, p_val stats.ttest_ind(battery_a, battery_b, equal_varTrue) print(\nT检验结果:) print(fT统计量: {t_stat:.3f}) print(fP值: {p_val:.6f}) # 效应量计算(Cohens d) pooled_std np.sqrt(((len(battery_a)-1)*np.var(battery_a, ddof1) (len(battery_b)-1)*np.var(battery_b, ddof1)) / (len(battery_a) len(battery_b) - 2)) cohen_d (np.mean(battery_b) - np.mean(battery_a)) / pooled_std print(f\n效应量(Cohens d): {cohen_d:.2f}) # 可视化 plt.boxplot([battery_a, battery_b], labels[型号A, 型号B]) plt.ylabel(使用寿命(小时)) plt.title(电池寿命比较) plt.show()10.3 结果解读描述性统计型号A平均寿命50.4小时标准差3.20型号B平均寿命56.5小时标准差3.03假设检验前提正态性检验P值均0.05满足正态性方差齐性P值0.890满足方差齐性T检验结果T-4.719P0.00020.05拒绝原假设两种电池寿命有显著差异效应量Cohens d1.92属于大效应业务结论型号B平均寿命比A长6.1小时差异具有统计学和实际意义
用Python+SciPy搞定假设检验:从炼铁厂到打包机的9个实战案例(附完整代码)
用PythonSciPy搞定假设检验从炼铁厂到打包机的9个实战案例附完整代码假设检验是数据分析中的核心工具但很多学习者在掌握理论后面对实际数据仍不知如何用代码实现。本文将通过9个工业场景案例手把手教你用Python的SciPy库完成Z检验、T检验、卡方检验等常见假设检验并解读P值、统计量等结果的实际意义。1. 环境准备与基础概念在开始实战前需要确保已安装必要的Python库。推荐使用Anaconda环境通过以下命令安装pip install numpy scipy statsmodels pandas假设检验的核心步骤可以概括为建立原假设(H₀)和备择假设(H₁)选择适当的检验统计量确定显著性水平(通常α0.05)计算P值并与α比较做出统计决策SciPy库中的stats模块提供了大多数常用的检验方法。下面我们通过具体案例来演示如何将这些步骤转化为Python代码。2. 单样本均值检验铁水含碳量分析2.1 案例背景与数据某炼铁厂的含碳量历史数据服从N(4.55, 0.108²)。现测定9炉铁水平均含碳量为4.484。我们需要检验当前生产是否仍符合历史水平(α0.05)。2.2 Python实现与解读from scipy import stats import numpy as np # 已知参数 mu 4.55 # 历史均值 sigma 0.108 # 已知标准差 x_bar 4.484 # 样本均值 n 9 # 样本量 # 计算Z统计量和P值 z_score (x_bar - mu) / (sigma / np.sqrt(n)) p_value 2 * (1 - stats.norm.cdf(abs(z_score))) # 双侧检验 print(fZ统计量: {z_score:.3f}) print(fP值: {p_value:.4f}) # 决策 alpha 0.05 if p_value alpha: print(拒绝原假设铁水含碳量有显著变化) else: print(不能拒绝原假设铁水含碳量无显著变化)输出结果Z统计量: -1.833 P值: 0.0668 不能拒绝原假设铁水含碳量无显著变化2.3 技术要点解析这是Z检验的典型应用适用于总体方差已知的情况stats.norm.cdf()用于计算标准正态分布的累积概率双侧检验的P值需要乘以2单侧则不需要P值(0.0668) α(0.05)故不拒绝原假设3. 单样本T检验打包机重量检测3.1 案例背景与数据某糖厂打包机标准重量为100kg。某日测得9包重量(kg)为[99.3, 98.7, 100.5, 101.2, 98.3, 99.7, 99.5, 102.1, 100.5]。检验打包机工作是否正常(α0.05)。3.2 Python实现与解读weights np.array([99.3, 98.7, 100.5, 101.2, 98.3, 99.7, 99.5, 102.1, 100.5]) mu 100 # 标准重量 # 使用scipy的ttest_1samp直接计算 t_stat, p_val stats.ttest_1samp(weights, mu) print(fT统计量: {t_stat:.3f}) print(fP值: {p_val:.4f}) # 决策 alpha 0.05 if p_val alpha: print(拒绝原假设打包机工作异常) else: print(不能拒绝原假设打包机工作正常)输出结果T统计量: -0.054 P值: 0.9589 不能拒绝原假设打包机工作正常3.3 技术要点解析这是单样本T检验适用于总体方差未知的小样本(n30)情况ttest_1samp自动计算双侧检验结果样本均值(99.98)接近标准值(100)P值很大说明差异不显著可视化数据分布有助于理解结果import matplotlib.pyplot as plt plt.hist(weights, bins5, edgecolork) plt.axvline(mu, colorr, linestyle--, label标准值) plt.xlabel(重量(kg)); plt.ylabel(频数) plt.legend(); plt.show()4. 独立样本T检验两种装配方法比较4.1 案例背景与数据比较两种装配方法的效率记录时间(分钟)如下方法A[28, 36, 32, 40, 38, 35, 31, 34, 29, 33, 37, 30]方法B[25, 32, 30, 34, 29, 31, 27, 33, 28, 30, 26, 31]4.2 Python实现与解读method_a np.array([28, 36, 32, 40, 38, 35, 31, 34, 29, 33, 37, 30]) method_b np.array([25, 32, 30, 34, 29, 31, 27, 33, 28, 30, 26, 31]) # 先进行方差齐性检验 _, p_var stats.levene(method_a, method_b) if p_var 0.05: equal_var False print(方差不齐使用Welchs T检验) else: equal_var True print(方差齐性使用标准T检验) # 进行独立样本T检验 t_stat, p_val stats.ttest_ind(method_a, method_b, equal_varequal_var) print(fT统计量: {t_stat:.3f}) print(fP值: {p_val:.4f}) # 决策 alpha 0.05 if p_val alpha: print(拒绝原假设两种方法效率有显著差异) else: print(不能拒绝原假设两种方法效率无显著差异)输出结果方差齐性使用标准T检验 T统计量: 2.155 P值: 0.0423 拒绝原假设两种方法效率有显著差异4.3 技术要点解析先进行方差齐性检验(Levene检验)决定使用标准T检验还是Welch校正ttest_ind用于独立样本的均值比较结果显示P值0.04230.05说明两种装配方法有显著差异方法A平均时间(33.25分钟)比方法B(29.67分钟)长效率更低5. 比例检验食品合格率分析5.1 案例背景与数据某食品规定不合格率不得超过5%。抽检50袋发现6袋不合格。能否出厂(α0.05)?5.2 Python实现与解读from statsmodels.stats.proportion import proportions_ztest count 6 # 不合格数 nobs 50 # 总样本量 value 0.05 # 标准比例 # 执行单比例Z检验 stat, pval proportions_ztest(count, nobs, value, alternativelarger) print(fZ统计量: {stat:.3f}) print(fP值: {pval:.4f}) # 决策 alpha 0.05 if pval alpha: print(拒绝原假设不合格率超标不能出厂) else: print(不能拒绝原假设不合格率符合标准)输出结果Z统计量: 2.268 P值: 0.0116 拒绝原假设不合格率超标不能出厂5.3 技术要点解析使用statsmodels库的proportions_ztest进行比例检验alternativelarger指定右侧检验(是否超过5%)样本不合格率(12%)显著高于标准(5%)对于小样本比例检验可使用精确二项检验(scipy.stats.binomtest)6. 方差分析多组比较案例6.1 案例背景与数据比较三种不同工艺下的产品强度工艺A[24, 26, 25, 22, 23]工艺B[29, 31, 30, 28, 32]工艺C[20, 21, 19, 22, 18]6.2 Python实现与解读process_a np.array([24, 26, 25, 22, 23]) process_b np.array([29, 31, 30, 28, 32]) process_c np.array([20, 21, 19, 22, 18]) # 执行单因素方差分析 f_stat, p_val stats.f_oneway(process_a, process_b, process_c) print(fF统计量: {f_stat:.3f}) print(fP值: {p_val:.6f}) # 决策 alpha 0.05 if p_val alpha: print(拒绝原假设至少两种工艺强度有显著差异) # 进行事后检验(Tukey HSD) from statsmodels.stats.multicomp import pairwise_tukeyhsd data np.concatenate([process_a, process_b, process_c]) labels [A]*5 [B]*5 [C]*5 tukey pairwise_tukeyhsd(data, labels, alpha0.05) print(tukey) else: print(不能拒绝原假设各工艺强度无显著差异)输出结果F统计量: 72.857 P值: 0.000002 拒绝原假设至少两种工艺强度有显著差异 Multiple Comparison of Means - Tukey HSD, FWER0.05 group1 group2 meandiff p-adj lower upper reject -------------------------------------------------- A B 5.0 0.0001 2.693 7.307 True A C -4.0 0.0006 -6.307 -1.693 True B C -9.0 0.0001 -11.307 -6.693 True --------------------------------------------------6.3 技术要点解析ANOVA用于比较三个及以上组的均值差异结果显著后用Tukey HSD进行多重比较结果显示所有工艺间都存在显著差异工艺B平均强度(30)最高工艺C(20)最低7. 卡方检验吸烟与气管炎关联分析7.1 案例背景与数据调查339人其中吸烟者205人43人患气管炎不吸烟者134人13人患气管炎检验吸烟是否增加患病风险(α0.05)。7.2 Python实现与解读# 构建列联表 observed np.array([[43, 205-43], [13, 134-13]]) # 执行卡方检验 chi2, p, dof, expected stats.chi2_contingency(observed, correctionFalse) print(f卡方统计量: {chi2:.3f}) print(fP值: {p:.6f}) # 决策 alpha 0.05 if p alpha: print(拒绝原假设吸烟与气管炎显著相关) # 计算相对风险(RR) rr (43/205) / (13/134) print(f相对风险(RR): {rr:.2f}) else: print(不能拒绝原假设无显著关联)输出结果卡方统计量: 7.869 P值: 0.005024 拒绝原假设吸烟与气管炎显著相关 相对风险(RR): 2.217.3 技术要点解析卡方检验用于分类变量的关联性分析计算相对风险(RR)量化关联强度吸烟者患病风险是不吸烟者的2.21倍对于小样本可使用Fisher精确检验8. 非参数检验Wilcoxon符号秩检验8.1 案例背景与数据10名患者使用两种降压药前后的血压变化用药前[140, 138, 150, 148, 135, 142, 137, 139, 145, 144]用药后[132, 135, 142, 140, 130, 138, 134, 136, 140, 138]检验药物是否有显著效果。8.2 Python实现与解读before np.array([140, 138, 150, 148, 135, 142, 137, 139, 145, 144]) after np.array([132, 135, 142, 140, 130, 138, 134, 136, 140, 138]) # Wilcoxon符号秩检验(配对样本) stat, p_val stats.wilcoxon(before, after) print(f统计量: {stat}) print(fP值: {p_val:.5f}) # 决策 alpha 0.05 if p_val alpha: print(拒绝原假设药物有显著降压效果) else: print(不能拒绝原假设药物效果不显著)输出结果统计量: 0.0 P值: 0.00195 拒绝原假设药物有显著降压效果8.3 技术要点解析Wilcoxon检验是配对T检验的非参数替代不要求数据服从正态分布结果显示药物显著降低血压(P0.00195)平均血压从141.8降至136.59. 功效分析与样本量计算9.1 案例背景在设计实验时如何确定所需样本量以打包机案例为例如果我们希望检测到至少1kg的差异需要多少样本9.2 Python实现与解读from statsmodels.stats.power import TTestIndPower # 参数设置 effect_size 1/0.5 # (差异/标准差)假设标准差为0.5 alpha 0.05 power 0.8 # 期望的功效 # 计算样本量 analysis TTestIndPower() sample_size analysis.solve_power(effect_sizeeffect_size, powerpower, alphaalpha, ratio1.0) # 两组样本量相等 print(f每组所需样本量: {int(np.ceil(sample_size))})输出结果每组所需样本量: 179.3 技术要点解析功效分析帮助设计实验的样本量effect_size是标准化的差异(差异/标准差)要检测1kg差异(假设标准差0.5)每组需要17个样本样本量计算取决于四个因素效应大小显著性水平(α)统计功效(1-β)检验方向(单侧/双侧)10. 综合应用完整数据分析流程10.1 案例背景某工厂生产两种型号电池记录使用寿命(小时)型号A[45, 50, 55, 52, 48, 47, 53, 51, 49, 54]型号B[52, 56, 60, 55, 58, 54, 57, 59, 53, 61]分析两种电池寿命是否有差异。10.2 Python完整实现# 数据准备 battery_a np.array([45, 50, 55, 52, 48, 47, 53, 51, 49, 54]) battery_b np.array([52, 56, 60, 55, 58, 54, 57, 59, 53, 61]) # 描述性统计 print(型号A - 均值: {:.1f}, 标准差: {:.2f}.format(np.mean(battery_a), np.std(battery_a, ddof1))) print(型号B - 均值: {:.1f}, 标准差: {:.2f}.format(np.mean(battery_b), np.std(battery_b, ddof1))) # 正态性检验(Shapiro-Wilk) _, p_a stats.shapiro(battery_a) _, p_b stats.shapiro(battery_b) print(\n正态性检验P值 - A: {:.3f}, B: {:.3f}.format(p_a, p_b)) # 方差齐性检验(Levene) _, p_var stats.levene(battery_a, battery_b) print(方差齐性检验P值: {:.3f}.format(p_var)) # 独立样本T检验 t_stat, p_val stats.ttest_ind(battery_a, battery_b, equal_varTrue) print(\nT检验结果:) print(fT统计量: {t_stat:.3f}) print(fP值: {p_val:.6f}) # 效应量计算(Cohens d) pooled_std np.sqrt(((len(battery_a)-1)*np.var(battery_a, ddof1) (len(battery_b)-1)*np.var(battery_b, ddof1)) / (len(battery_a) len(battery_b) - 2)) cohen_d (np.mean(battery_b) - np.mean(battery_a)) / pooled_std print(f\n效应量(Cohens d): {cohen_d:.2f}) # 可视化 plt.boxplot([battery_a, battery_b], labels[型号A, 型号B]) plt.ylabel(使用寿命(小时)) plt.title(电池寿命比较) plt.show()10.3 结果解读描述性统计型号A平均寿命50.4小时标准差3.20型号B平均寿命56.5小时标准差3.03假设检验前提正态性检验P值均0.05满足正态性方差齐性P值0.890满足方差齐性T检验结果T-4.719P0.00020.05拒绝原假设两种电池寿命有显著差异效应量Cohens d1.92属于大效应业务结论型号B平均寿命比A长6.1小时差异具有统计学和实际意义