scipy在机器学习中的应用(3):统计
·
有关统计的函数在stats类中
(1)统计描述 describe函数
x = np.array([1,2,3,4,5,6,7,8,9,10])
print(stats.describe(x))
#输出很多量依次为:样本数、最大最小值、平均值、方差、偏度、峰度
这个函数的输出有很多,按顺序依次是:样本数、最大最小值、平均值、方差、偏度、峰度
(2)几何平均、中位数、众数、方差、标准差、协方差、相关系数
#几何平均数
print(stats.gmean(x))
#中位数
print(np.median(x))
#众数
print(stats.mode(x))
#方差
print(np.var(x))
#标准差
print(np.std(x))
#协方差
print(np.cov(x))
#相关系数
print(np.corrcoef(x))
(3)t检验
t检验主要有三个用法,1是用样本的检验总体的均值是不是用样本求出来的 2是检验两组数据是否有显著性差异 3是用来检验一组数据前后有没有显著差异,注意单独t检验样本要满足正态分布,数据间独立,如果是两组样本还要满足方差相同。
第一种用法:样本的检验总体的均值
np.random.seed(42)
data = np.random.normal(loc=5, scale=2, size=100)
# 均值为5、scale是标准差的正态分布数据
# 进行单样本t检验,检验均值是否等于5
t_stat, p_value = stats.ttest_1samp(data, 5)#数据+检验均值
print(f"单样本t检验结果:")
print(f"t统计量 = {t_stat:.4f}")
print(f"p值 = {p_value:.4f}")
# 解释结果
if p_value > 0.05:
print("不能拒绝原假设:样本均值可能等于5")
else:
print("拒绝原假设:样本均值显著不等于5")
输出有两个值 t_stat和p_value,其中t_stat的绝对值反应样本均值与假设均值的差异,越大说明样本均值与假设均值有差异,越大说明内部数据波动越明显。p是置信度,一般要大于0.05才能认为是能接受原假设。
第二种用法:检验两组数据是否有显著差异
#双样本t检验
# 生成两组示例数据
np.random.seed(42)
group1 = np.random.normal(loc=5, scale=2, size=100) # 第一组:均值为5
group2 = np.random.normal(loc=5.5, scale=2, size=100) # 第二组:均值为5.5
t_stat, p_value = stats.ttest_ind(group1, group2)
print(f"\n独立样本t检验结果:")
print(f"t统计量 = {t_stat:.4f}")
print(f"p值 = {p_value:.4f}")
# 解释结果
if p_value > 0.05:
print("不能拒绝原假设:两组均值可能相等")
else:
print("拒绝原假设:两组均值存在显著差异")
第三种用法:检验一组数据前后是否有显著差异
np.random.seed(42)
before = np.random.normal(loc=5, scale=2, size=100) # 处理前
after = before + np.random.normal(loc=0.5, scale=1, size=100) # 处理后
t_stat, p_value = stats.ttest_rel(before, after)
print(f"\n配对样本t检验结果:")
print(f"t统计量 = {t_stat:.4f}")
print(f"p值 = {p_value:.4f}")
# 解释结果
if p_value > 0.05:
print("不能拒绝原假设:处理前后没有显著差异")
else:
print("拒绝原假设:处理前后存在显著差异")
(4)K-S检验
KS检验能检验数据是否服从某种分布
检验数据是否服从正态分布
x = np.random.randn(1000)
print(stats.kstest(x,'norm'))
输出:KstestResult(statistic=0.019564968167023827, pvalue=0.8311892490632018,
statistic_location=-1.2235290568288415, statistic_sign=-1)
statistic 反映的是经验分布函数与理论分布函数之间最大绝对值之差,越小越好
pvalue 反映的是显著水平,一般大于0.05能被接受原假设
statistic_location x为它时,statistic最大,
statistic_sign统计量符号-1表示理论函数高于经验函数 +1表示理论函数低于经验函数
检验数据是否符合均匀分布
print(stats.kstest(x,'uniform'))
输出同上
检验数据是否符合卡方分布
print(stats.kstest(x,stats.chi2(df=1).cdf))#检验是否属于卡方分布
#要制定卡方维度,这里指定为1 主要看第二个参数,如果大于0.05则通常可以认为是
(5)卡方检验
卡方检验主要用于两种情况,其一是拟合度检验(检验观察频率和预期是否一致),其二是进行独立性检验
拟合度检验:
# 检验骰子是否公平
# 观测频数:掷骰子100次的结果
observed = np.array([15, 20, 18, 16, 17, 14]) # 6个面的观测次数
# 期望频数:如果是公平骰子,每个面应该出现100/6次
expected = np.array([100/6] * 6) # 6个面的期望次数
# 进行卡方拟合优度检验(参数:观察值,预期值)
chi2_stat, p_value = stats.chisquare(f_obs=observed, f_exp=expected)
print("卡方拟合优度检验结果:")
print(f"卡方统计量 = {chi2_stat:.4f}")
print(f"p值 = {p_value:.4f}")
if p_value > 0.05:
print("不能拒绝原假设:骰子可能是公平的")
else:
print("拒绝原假设:骰子可能不公平")
(2)独立性检验
# 示例:检验性别与偏好是否独立
# 创建列联表
# 行:性别(男、女)
# 列:偏好(A、B、C)
observed = np.array([
[50, 30, 20], # 男性
[40, 45, 15] # 女性
])
#observed=observed.T一样
# 进行卡方独立性检验
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print("\n卡方独立性检验结果:")
print(f"卡方统计量 = {chi2_stat:.4f}")
print(f"p值 = {p_value:.4f}")
print(f"自由度 = {dof}")
print("\n期望频数表:")
print(expected)
if p_value > 0.05:
print("\n不能拒绝原假设:性别与偏好可能独立")
else:
print("\n拒绝原假设:性别与偏好可能相关")
更多推荐
所有评论(0)