利用Python进行滑动t检验
文末附完整代码
作者:第八星系 - 石头人
邮箱:2205455617@qq.com
获取数据
df = pd.read_excel('E:/data.xlsx')
x = df['时间']
y = df['平均']
n = len(y)
滑动t检验
step = 3
n1 = 3 # 设置子序列步长
n2 = 3
v = step+step-2 # 自由度
ttest=2.78 # alpha=0.05,自由度=4时,检验值t=2.78
t = []
for i in range(0, n-step-step+1):
x1 = y.iloc[i:i+step]
x2 = y.iloc[i+step:i+step+step]
meanx1 = np.mean(x1)
meanx2 = np.mean(x2)
a = meanx1-meanx2
b = (n1+n2)/(n1*n2)
varx1 = np.var(x1) # 方差
varx2 = np.var(x2)
c = (n1*varx1+n2*varx2)/(n1+n2-2)
t1 = a/np.sqrt(c*b)
t = np.append(t,t1)
print(t)
画图
plt.figure(figsize=(8, 6), dpi=600)
plt.plot(range(27), t, label='t 统计量(step=3)', color='blue', marker='o')
ax1 = plt.gca()
ax1.set_ylabel('统计量',fontname='MicroSoft YaHei', fontsize=10)
ax1.set_xlabel('年份',fontname='MicroSoft YaHei', fontsize=10)
plt.xlim(-1,27) # 设置x轴、y轴范围
plt.ylim(-7,3.5)
# 添加辅助线
x_lim = plt.xlim()
# 添加显著水平线和y=0
plt.plot(x_lim,[-ttest,-ttest],':',color='red',label='0.05显著性水平')
plt.plot(x_lim, [0,0],'-',color='black')
plt.plot(x_lim,[ttest,ttest],':',color='red')
plt.xticks([0, 5, 10, 15, 20, 25],labels=[1993, 1998, 2003, 2008, 2013, 2018])
legend = plt.legend(bbox_to_anchor=(0.7, 0.2))
legend.get_frame().set_facecolor('white') # 设置背景颜色为白色
legend.get_frame().set_edgecolor('black') # 设置边框颜色为黑色
for text in legend.get_texts():
text.set_fontsize(12) # 设置字体大小
text.set_fontfamily('MicroSoft YaHei') # 设置字体名称
plt.savefig("E:/图.png", dpi=600, bbox_inches='tight')
图像
完整代码
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
# 获取数据
df = pd.read_excel('E:/data.xlsx')
x = df['时间']
y = df['平均']
n = len(y)
# 滑动t检验
step = 3
n1 = 3 # 设置子序列步长
n2 = 3
v = step+step-2 # 自由度
ttest=2.78 # alpha=0.05,自由度=4时,检验值t=2.78
t = []
for i in range(0, n-step-step+1):
x1 = y.iloc[i:i+step]
x2 = y.iloc[i+step:i+step+step]
meanx1 = np.mean(x1)
meanx2 = np.mean(x2)
a = meanx1-meanx2
b = (n1+n2)/(n1*n2)
varx1 = np.var(x1) # 方差
varx2 = np.var(x2)
c = (n1*varx1+n2*varx2)/(n1+n2-2)
t1 = a/np.sqrt(c*b)
t = np.append(t,t1)
print(t)
# 画图
plt.figure(figsize=(8, 6), dpi=600)
plt.plot(range(27), t, label='t 统计量(step=3)', color='blue', marker='o')
ax1 = plt.gca()
ax1.set_ylabel('统计量',fontname='MicroSoft YaHei', fontsize=10)
ax1.set_xlabel('年份',fontname='MicroSoft YaHei', fontsize=10)
plt.xlim(-1,27) # 设置x轴、y轴范围
plt.ylim(-7,3.5)
# 添加辅助线
x_lim = plt.xlim()
# 添加显著水平线和y=0
plt.plot(x_lim,[-ttest,-ttest],':',color='red',label='0.05显著性水平')
plt.plot(x_lim, [0,0],'-',color='black')
plt.plot(x_lim,[ttest,ttest],':',color='red')
plt.xticks([0, 5, 10, 15, 20, 25],labels=[1993, 1998, 2003, 2008, 2013, 2018])
legend = plt.legend(bbox_to_anchor=(0.7, 0.2))
legend.get_frame().set_facecolor('white') # 设置背景颜色为白色
legend.get_frame().set_edgecolor('black') # 设置边框颜色为黑色
for text in legend.get_texts():
text.set_fontsize(12) # 设置字体大小
text.set_fontfamily('MicroSoft YaHei') # 设置字体名称
plt.savefig("E:/图.png", dpi=600, bbox_inches='tight')
END
数据:时间序列数据
加入交流群,获取本文数据
公众号后台回复“群聊二维码”
欢迎加入我们 进群交流
微信公众号|第八星系人造大气理论爱好者
本文编辑|枫阁