检验均值和方差是否显著改变——Python

一、思想:

将数据集依据时间段划分成两部分:

  1. 前期数据,用作计算前期的均值和方差;
  2. 近期数据,用作计算近期的均值和方差。

二、检验的步骤:

01-判断整体是否服从正态分布
02-服从:均值——t分布;方差检验——F分布
03-不服从:均值——曼惠特尼检验;方差检验——Kruskal-Wallis H检验

三、判定方法:

在n次判别的n个结果中,老化/非老化的一方判别要达到设定的次数,才能判断均值或者方差发生了显著改变。

四、实例演示:

# 导入库
import psycopg2
import pandas as pd
import numpy as np
import datetime
import random

from scipy.stats import normaltest
from scipy.stats import stats
from scipy.stats import bartlett
from scipy.stats import wilcoxon
from scipy.stats import kruskal
from scipy.stats import mannwhitneyu

'''
变量解释:
car:car_number
pre_new:从当前日期往前截取的较短时间段,用来分析a_new
pre_old:从pre_new起点再往前截取的时间段,用来分析a_old(t2-t1-ds, t1=ds-pre_new, t2=t1-pre_old)
ds:当前日期
alpha:α值
n:判别的次数
prop_k:在n次判别的n个结果中,老化/非老化的一方判别要达到n*prop_k次,才能作最终输出
porp_sample:每次判别所抽取时间段内的样本比例
'''

def brake(df,device_id,ds,preold,prenew,alpha,n,prop_k,prop_sample):
#以t1为节点,分别记为a_old,a_new
    a_new = df_today[df_today['ds']>=t1]['a']
    a_old = df_today[(df_today['ds']>=t2)&(df_today['ds']<t1)]['a']
    judge = pd.DataFrame({'n':range(1,n+1),'degrade':0,'stable':0}) #存储判定结果,用字典来构造新的数据集
    
    #n次判定中,若判定老化的次数大于k,则输出老化判定
    for i in range(n):
        a_new_sample = random.sample(list(a_new),round(len(a_new)*prop_sample))
        a_old_sample = random.sample(list(a_old),round(len(a_old)*prop_sample))
        
        #检验正态分布
        normtest_new = normaltest(a_new_sample) 
        normtest_old = normaltest(a_old_sample)
        #01-正态分布检验通过,使用T检验和F检验
        if normtest_new.pvalue > alpha and normtest_old.pvalue > alpha: 
            #print("第"+str(i+1)+"次:正态分布检验通过,使用T检验和F检验")
            
            #检验t分布,用于度量是否退化
            ttest = ttest_ind(a_new_sample,a_old_sample)
            if (ttest.pvalue)/2 < alpha:  # 拒绝
                judge.iloc[i,1] = 1   # 退化
            else:
                judge.iloc[i,1] = 0
                
            #检验F分布,用于度量是否稳定
            f_test = f_oneway(a_new_sample,a_old_sample)
            if f_test.pvalue/2 < alpha:
                judge.iloc[i,2] = 1   # 稳定
            else:
                judge.iloc[i,2] = 0   # 不稳定
                
        else:  #02-正态分布检验未通过,使用曼惠特尼检验和Kruskal-Wallis H检验
            #print("第"+str(i+1)+"次:正态分布检验未通过,使用曼惠特尼检验和Kruskal-Wallis H检验")
            mann_test = mannwhitneyu(a_new_sample,a_old_sample)
            if (mann_test.pvalue)/2 < alpha:
                judge.iloc[i,1] = 1
            else:
                judge.iloc[i,1] = 0
                
            kruskal_kest =kruskal(a_new,a_old)
            if(kruskal_kest.pvalue)/2 < alpha:
                judge.iloc[i,2] = 1
            else:
                judge.iloc[i,2] = 0
                
    #最终输出degrade
    if judge[judge['degrade']==1]['degrade'].sum()>= round(n*prop_k):
        print("制动性能老化")
    else:
        print("制动性能未显著老化")
    if judge[judge['stable']==1]['stable'].sum()>= round(n*prop_k):
        print("制动性能不稳定")
    else:
        print("制动性能未显著不稳定")
    
    return
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值