在下方单元格中回答问题并执行相关代码,你可以 参考项目指导 并在正式提交前查看 项目要求。提交时请将 Jupyter notebook 导出成 HTML 或者 PDF 进行提交(File -> Download As)。
背景信息
在一个Stroop (斯特鲁普)任务中,参与者得到了一列文字,每个文字都用一种油墨颜色展示。参与者的任务是将文字的打印颜色大声说出来。这项任务有两个条件:一致文字条件,和不一致文字条件。在一致文字条件中,显示的文字是与它们的打印颜色匹配的颜色词,如“红色”、“蓝色”。在不一致文字条件中,显示的文字是与它们的打印颜色不匹配的颜色词,如“紫色”、“橙色”。在每个情况中,我们将计量说出同等大小的列表中的墨色名称的时间。每位参与者必须全部完成并记录每种条件下使用的时间。
调查问题
作为一般说明,请确保记录你在创建项目时使用或参考的任何资源。作为项目提交的一部分,你将需要报告信息来源。
(1) 我们的自变量是什么?因变量是什么?
答:自变量是条件(一致文字条件,不一致文字条件),因变量是时间(读出墨色名的时间)
(2) 此任务的适当假设集是什么?你需要以文字和数学符号方式对假设集中的零假设和对立假设加以说明,并对数学符号进行定义。你想执行什么类型的统计检验?为你的选择提供正当理由(比如,为何该实验满足你所选统计检验的前置条件)。
答:因为一般认为颜色不一致导致大脑思考所以时间会增加,因此,假设集如下:
μ相同:在文字与颜色一致时,读出颜色词所花费时间的总体均值。
μ不同:在文字与颜色不一致时,读出颜色词所花费时间的总体均值。
H0:颜色不一致时,读出墨色的时间不会比一致时更多(即μ相同 ≥ μ不同)
H1:颜色不一致时,读出墨色的时间比一致时更多(即μ相同 < μ不同)
因为本实验是同一样本,在不同条件下进行测试所得数据的检验,且样本总体呈正态分布,样本容量较小(n<30),总体方差未知,所以选用配对T检验。
假设中只研究单边关系,故而选择单尾检验
选用α=0.05的统计显著水平
若p≤0.05,则接受H1;若p>0.05,则接受H0
现在轮到你自行尝试 Stroop 任务了。前往此链接,其中包含一个基于 Java 的小程序,专门用于执行 Stroop 任务。记录你收到的任务时间(你无需将时间提交到网站)。现在下载此数据集,其中包含一些任务参与者的结果。数据集的每行包含一名参与者的表现,第一个数字代表他们的一致任务结果,第二个数字代表不一致任务结果。
(3) 报告关于此数据集的一些描述性统计。包含至少一个集中趋势测量和至少一个变异测量。
# 数据集的描述性分析
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats
get_ipython().run_line_magic('matplotlib', 'inline')
dfStroop = pd.read_csv('stroopdata.csv')
dfStroop.describe()
# 异常值测量
Percentile1 = np.percentile(dfStroop['Congruent'], [0, 25, 50, 75, 100])
Percentile2 = np.percentile(dfStroop['Incongruent'], [0, 25, 50, 75, 100])
IQR = lambda p: p[3] - p[1]
IQR1 = IQR(Percentile1)
IQR2 = IQR(Percentile2)
up = lambda p,IQR: p[3] + IQR*1.5
down = lambda p,IQR: p[1] - IQR*1.5
def check(p, up, down):
count = 0
for x in p:
if (x > up) or (x < down):
count += 1
return str(count)
print('颜色一致的IQR:' + str(IQR1))
print('颜色不一致的IQR:' + str(IQR2))
up1 = float(up(Percentile1, IQR1))
up2 = float(up(Percentile2, IQR2))
down1 = float(down(Percentile1, IQR1))
down2 = float(down(Percentile2, IQR2))
print('Congruent的异常值:'+check(dfStroop['Congruent'], up1, down1)+'个')
print('Incongruent的异常值:'+check(dfStroop['Incongruent'], up2, down2)+'个')
dfStroop.boxplot();
答:每组数据中均包含24条数据
平均数:14.05(颜色一致),22.01(颜色不一致)
中位数:14.35(颜色一致),21.01(颜色不一致)
从平均数看起来颜色一致花费的时间要比不一致花费的时间要少。
标准差:3.55(颜色一致),4.79(颜色不一致)
IQR:4.30(颜色一致),5.33(颜色不一致)
第二组数据中含有2个异常值。
(4) 提供显示样本数据分布的一个或两个可视化。用一两句话说明你从图中观察到的结果。
# 在这里创建可视化图表
# 清洗异常值
dfCongruent = dfStroop.loc[(dfStroop.Congruent>=down1) & (dfStroop.Congruent<=up1),'Congruent']
dfIncongruent = dfStroop.loc[(dfStroop.Incongruent>=down2) & (dfStroop.Incongruent<=up2),'Incongruent']
#绘制直方图
plt.figure()
plt.hist(dfCongruent, bins = 8,facecolor='g',edgecolor='g',alpha=0.5,label='Congruent')
plt.hist(dfIncongruent,bins = 8, facecolor='r',edgecolor='r',alpha=0.5,label='Incongruent')
plt.title('Histogram of reading time under different conditions')
plt.xlabel('Reading time')
plt.ylabel('Count')
plt.legend(loc=1)
plt.show()
答:两组数据均可看作正态分布。从图中可以看出,颜色一致时所花时间较少,而不一致则较多。
(5) 现在,执行统计测试并报告你的结果。你的置信水平和关键统计值是多少?你是否成功拒绝零假设?对试验任务得出一个结论。结果是否与你的期望一致?
# 在这里执行统计检验
meanC, meanI = np.mean(dfStroop.Congruent), np.mean(dfStroop.Incongruent)
std = np.std(dfStroop.Congruent-dfStroop.Incongruent,ddof=1)
t = (meanC - meanI)/(std/np.sqrt(24))
print(t)
# P值计算
p = scipy.stats.t.sf(np.abs(t), 23)
print(p)
#置信区间计算
mean_bar = meanC - meanI
ci = std / np.sqrt(24) * 2.069
low_limit = mean_bar - ci
high_limit = mean_bar + ci
print("95%%置信区间:[%.3f , %.3f]" % (low_limit,high_limit))
答:关键统计值为-8.02,p值为2.05e-09。
那么95%的置信区间为 [-10.019 , -5.910] 。
因为p值≤0.05,成功拒绝零假设。因此,在颜色不一致的情况下,读出墨色的时间要比一致情况下所花的时间更多,与期望一致。
# 参考资源
#【如何计算IQR】https://segmentfault.com/a/1190000015926584
#【scipy.stats的ttest_rel方法】https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.stats.ttest_rel.html
#【独立变量相依变量的区别?】https://github.com/ShiChJ/DAND-Basic-Materials/blob/master/P1/%E7%8B%AC%E7%AB%8B%E5%92%8C%E7%9B%B8%E4%BE%9D%E6%A0%B7%E6%9C%AC%E5%8C%BA%E5%88%AB.pdf