多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

人机交互实验报告与GOMS、Fitts、可用性量表完整复现指南

人机交互实验报告与GOMS、Fitts、可用性量表完整复现指南 简介面向高校计算机相关专业学生的“人机交互”课程配套资料内容涵盖从基础实验到综合大作业的完整过程。资源包含实验报告、讲义演示文档、源码工程以及三维虚拟现实场景等覆盖二维交互画板、语音交互程序、订单管理系统界面设计、虚拟现实交互实验和最后的大实验有助于理解用户研究方法、界面设计原则、交互模式及可用性评估等关键知识点。压缩包共86个文件以位图截图、Office文档、C源码及编译工程文件为主另有三维场景、可执行程序和若干设计资源文件各实验均配有报告、演示与可运行工程便于对照复盘。整体约25MB目录按实验划分结构清晰。已有2481人浏览学习适合需要预习、复习或借鉴完整人机交互项目流程的在校生与入门开发者也可作为期末综合实验的参考资料。1. 人机交互实验报告以及最后大实验从模板到能讲清原理的完整复现人机交互课最难的不是理论是最后那个大实验。GOMS、Fitts 定律、可用性量表背得再熟落到自己设计实验时照样不知道从哪下手——任务怎么定、变量怎么设、数据记哪些字段、报告按什么结构写每一步都有默认口径没人告诉你做出来的东西就像个黑匣子。这份资源把「人机交互实验报告以及最后大实验」的完整路径拆开了从实验框架、三大经典实验的落地做法、完整报告结构到按键间隔统计这种细节技巧全部按可复现的方式整理好。适合正在做人机交互课程设计的学生也适合要带实验课的助教照着做能少走不少弯路。2. 先搭实验框架人因数据从哪来三个要素一个都不能少2.1 任务、界面、用户三要素实验最容易被忽略的起点设计一次人机交互实验第一件事不是打开问卷而是把任务、界面、用户三个要素写清楚。我见过太多实验报告题目写着「鼠标点击效率研究」正文里既不说明任务是什么也不交代界面是桌面应用还是 Web 页面连被试数量都含糊其辞。这样的实验就算跑完数据也没有可解释的空间。任务要素要回答被试做什么、做几步、有没有时间限制、有没有错误判定。常见做法是把任务拆成「主任务 子任务」两级主任务是完整的操作流程子任务是可计时的最小操作单元。比如研究「表单填写效率」子任务就是「输入姓名」「选择省份」「点击提交」三个动作每个动作独立计时最后合并成总时间。界面要素要回答界面长什么样、控件尺寸多大、间距多少、交互方式是鼠标还是键盘还是触屏。这里有个容易被忽略的点——界面参数会直接影响 Fitts 定律的计算结果所以控件宽高、目标间距必须记录到像素级不能只写「较大的按钮」。用户要素要回答被试年龄范围、性别分布、使用经验新手/熟练、惯用手必要时还要测色觉和视力。人机交互实验的用户差异非常大熟练用户和新人完成任务的时间能差出 3 到 4 倍如果不做分层统计结论很容易被极端值带偏。2.2 问卷与日志两套数据源各司其职别混在一起用人机交互实验通常同时采集主观问卷和客观日志两类数据。问卷走的是感知层面日志走的是行为层面两者互相验证但不能互相替代。问卷建议用标准化的可用性量表而不是自己随便编问题。经典选项有 SUSSystem Usability Scale、NASA-TLX任务负荷、ASQAfter Scenario Questionnaire。SUS 一共 10 题奇数题正向计分偶数题反向计分换算公式是 SUS Score (sum of odd items - 5 5 - sum of even items) × 2.5最终得分范围 0 到 100。这份资源里附了三份完整量表的中英文对照和计分规则可以直接放进报告附录。日志数据则来自实验软件自动记录的操作轨迹包括按键时间戳、鼠标移动轨迹、点击坐标、页面停留时长、错误次数。两套数据的时间线要对齐这就要求实验软件在记录日志时同时打上一个节点标记——比如「第 3 个任务开始」写进日志文件问卷里对应题号标注「第 3 个任务完成后的感受」这样后续分析才能做「操作慢但主观觉得快」这类交叉验证。2.3 日志字段设计先把字段定死再开始写实验代码日志采集不是打开一个记录工具就行字段设计决定了后期能不能做统计。我一般会先定好一个最小字段集再用 CSV 格式输出每个字段一个列每行一条事件记录首行是表头。以下是一份可以直接套用的字段模板import csv import time import uuid # 会话基本信息 session_id str(uuid.uuid4()) user_id P01 task_id T03 condition A # A横排菜单, B竖排菜单 # 事件日志字段: # event_id: 当前事件唯一编号 # event_type: click / keydown / keyup / mouse_move / page_load / task_start / task_end # target_control: 被操作控件的 ID # start_ts: 事件开始时间戳(毫秒) # end_ts: 事件结束时间戳(毫秒) # duration: 结束减开始单位毫秒 # bonus_field: 预留扩展字段比如输入值长度 with open(interaction_log.csv, a, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([session_id, int(time.time() * 1000), click, btn_submit, 0])这份字段模板的核心是把「时间戳」统一成毫秒。很多新手用秒做单位任务一长就被舍入误差吃掉了精度做按键间隔统计时尤其吃亏。预留的 bonus_field 字段也要保留实验做到一半想追加记录输入法状态或者页面焦点变化时不用改表结构。3. 三大经典实验怎么做GOMS、Fitts 与可用性量表的具体落地3.1 GOMS 模型预测任务时间不用跑完整次实验也能算出来GOMS 是 Goals目标、Operators操作、Methods方法、Selection Rules选择规则四个部分的缩写常用来预测熟练用户在给定界面上完成任务的时间。它把人机交互拆成感知、认知、运动三类基本操作每类操作对应一个经验时长比如「点击按钮」约 1.10 秒、「移动鼠标到目标」约 1.10 秒、「心理准备」约 1.35 秒、「按下键盘一个键」约 0.20 秒。拿一份典型表单任务举例用户要点击「用户名输入框」、输入一段文本、再点击「登录按钮」。用 GOMS 预测的时间是移动鼠标进输入框 1.10 秒 心理准备 1.35 秒 键盘输入 12 个字符 × 0.20 秒 移动到登录按钮 1.10 秒 点击 0.20 秒总时间约 6.15 秒。实测时如果明显低于这个值说明用户使用了快捷键或自动填充明显高于这个值就要怀疑界面布局是否走了弯路。这段推演的价值是GOMS 给了一个可量化的基线。报告中按这个公式展开推导直接对应着实验报告加分项里的「理论建模」维度。资源里把常用操作的基准时间做成了表格可以直接抄进文献综述。3.2 Fitts 定律点击任务的目标大小与距离从定性描述变成可计算预测Fitts 定律把「点击一个目标的时间」建模成目标距离 D 和目标宽度 W 的函数常用公式是 MT a b × log2(2D / W 1)log2 那项叫「难度指数」单位是 bit。a 和 b 是回归系数通常通过实验数据拟合得到。这个公式在实验报告里有两个用途一是验证界面控件尺寸对效率的影响是否符合理论预测二是给控件尺寸设计提供依据——扩大 W、缩短 D 是提升效率的两个直白手段。具体实验流程是设计 3 个距离水平比如 200、400、600 像素和 3 个宽度水平20、40、60 像素两两组合共 9 个条件每个条件下让被试完成 20 次点击记录每次从起点移动到目标并完成点击的时间。实验程序要自动隐藏起点坐标和目标按钮的位置避免被试凭记忆提前移动鼠标那会破坏 MT 和 D、W 的对应关系。数据整理时每个条件下取 20 次的平均值再按上面的公式做线性回归横轴是难度指数纵轴是实测 MT。资源里附了这份幂律回归的实现代码以及如何从回归方程里读出截距 a 和斜率 b这两个值就是该任务环境的「内禀延迟」和「操作效率」。报告里直接给出回归 R²比单纯贴平均值表要有说服力得多。3.3 可用性量表的计分口径SUS、NASA-TLX、ASQ 各管哪一段问卷不是发下去收上来就结束了。人机交互里常用量表的计分口径有明确的适用范围混用会得出互相矛盾的解释。SUS 衡量的是「整体可用性感知」适合实验最后统一评估ASQ 针对「单一场景后的即时应答」每个子任务结束后立刻填写NASA-TLX 衡量「任务负荷」包含心智需求、体力需求、时间需求、表现、努力、挫折感六个维度计分时还要做权重配比。三者的时间点不同决定了你在实验中怎么插入问卷。以一次 40 分钟的实验为例顺序是前 5 分钟填被试基本信息 → 每个子任务结束后立刻填 ASQ每次约 2 分钟→ 全部任务结束后填 SUS约 3 分钟→ 再做 NASA-TLX 的配对权重比较约 5 分钟。如果把 SUS 放到每个子任务后填被试会烦越到后面数据越失真。资源里给出的三份量表是完整可打印版本每份都有计分说明。特别要注意 NASA-TLX 的成对比较题有 15 道被试要依次在所有维度对之间选「哪个更影响自己」这 15 道题是固定排序的不能随机打乱否则统计权重口径就乱了。4. 最后大实验从选题到报告输出六步走完整个流程4.1 选题方向三个能快速立起来的假设不用硬凹创新大实验的选题有两个硬约束一是能在 1 到 2 周内完成二是实验设计能对应到课堂上讲过的模型或方法。符合这两个条件的常见选题有三类。第一类是「界面布局对比」比如横排菜单和竖排菜单的操作效率差异用 Fitts 定律预测再用实测数据验证第二类是「输入方式对比」比如键盘快捷键和鼠标点击完成任务的速度差异用 GOMS 做理论预测再用实测数据做 T 检验第三类是「反馈形式对比」比如点击按钮时有无视觉动画对被试主观满意度的影响用 SUS 量表做差异检验。三类选题里第二类最容易做扎实因为 GOMS 的预测值和实测值的对比有明确的理论纵深报告可以写出一整章的推理链条。4.2 实验设计变量怎么设、顺序怎么平衡、样本量怎么估对一组被试设计两类条件时最常见的坑是顺序效应——先做 A 条件后做 B 条件被试已经熟练了B 的数据会系统性地偏快。解决办法是采用被试内设计 顺序平衡即把被试随机分成两组一组先 A 后 B另一组先 B 后 A。实验设计的完整要素表如下要素建议设置说明自变量2 个条件如 A/B有条件的话可做 2×2 双因素加入第二个维度因变量任务完成时间ms、错误次数、SUS 得分三个因变量分别对应效率、准确率与主观满意度被试内设计每名被试跑完所有条件减少个体差异带来的方差顺序平衡一半被试 AB一半被试 BA抵消学习效应试次数量每个条件 10~20 次太少数据噪声大太多被试疲劳样本量每组 15~20 人能力有限时最低可到 12 人但要注明局限任务完成时间和错误次数的统计代码可以用 Python 的 scipy 库直接跑配对样本 T 检验两个条件的数据作差后看均值是否显著不为零from scipy import stats # cond_a_time 和 cond_b_time 是两个条件下的完成时间列表(单位毫秒) # 按键间隔统计方法: 每条记录取 start_ts 到 end_ts 的间隔 # 这里的时间差值越接近 0 代表成绩越好, 统计上看 p 值是否小于 0.05 t_stat, p_value stats.ttest_rel(cond_a_time, cond_b_time) print(ft {t_stat:.3f}, p {p_value:.4f})这段代码的关键点在于配对关系cond_a_time 和 cond_b_time 需要按被试 ID 一一对应而不是两个独立的样本数组。如果实验过程中有被试中途退出配对关系会被破坏此时应改用独立样本 T 检验并在报告里单独说明数据剔除情况。p 值小于 0.05 时才能下「差异显著」的结论否则只能写「趋势」不能写「显著性差异」。4.3 报告结构每个章节写什么避免报告写成软件说明书报告的骨架是「问题 → 方法 → 结果 → 讨论」四段式但人机交互实验报告的问题和方法部分有自己的固定写法。第一章「引言」要交代实验背景和理论依据直接引用 GOMS、Fitts 相关文献说明本实验和前人工作的关联第二章「方法」要包含被试信息、实验设备、实验材料、实验流程四个子节逐项列清楚第三章「结果」用图和表展示描述性统计与显著性检验结果图放箱线图、表放均值与标准差第四章「讨论」解释结果是否符合预期若不符合给出可能的解释比如样本量不足、任务复杂度不够。最容易翻车的是附录部分。完整报告末尾应附完整问卷题目、被试知情同意书、实验环境照片、实验程序的 GitHub 仓库链接。没有知情同意书和仓库链接的报告答辩时会被追问到墙角。资源里给出了这几份附录的现成模板改个名字就能用。4.4 实验 APP 改造日志采集与问卷跳转的一条龙实现最后的呈现形式多数课程要求一个可运行的界面原型加后台日志脚本。推荐的做法是用 JavaScript 写一个简单的 Web 实验页面把事件监听器挂到答案组件上这样既能采集点击时间也能控制问卷的跳转逻辑。// 在浏览器控制台之外, 实验主页面加载完成后注册日志采集器 const logger { records: [], log(event) { this.records.push({ ts: Date.now(), // 毫秒, 与 CSV 的 ms 口径一致 user: document.getElementById(user_id).value, event: event.type, target: event.target.id || event.target.tagName }); } }; // 绑定常见交互事件, 注意只绑定实验任务区, 不要绑定全局 document const taskArea document.getElementById(task_area); [click, keydown, mouseenter].forEach(type { taskArea.addEventListener(type, (e) logger.log(e)); });这里有个参数要点ts 用 Date.now() 返回的是 13 位毫秒时间戳和上一章的 CSV 字段模板直接对齐不用再做单位换算。绑定范围限定在 task_area 而不是 document 也有讲究——避免被试在页面空白处随意点击产生的无意义事件污染日志。5. 避坑与排查人机交互实验里遇到的真实问题记录5.1 实验程序把点击时间记成了「系统时间」而不是「任务内相对时间」现象跑完实验后回看日志发现前后两批被试的时间戳差值有 8 小时而任务实际只做了 40 分钟。原因日志里存的是操作系统时钟的绝对时间而不是任务开始后的相对时间。如果实验中间电脑休眠、时间校准时间线就完全错乱了。解决实验开始时记录一个 start_ts之后所有事件的时间戳都写成 (current_ts - start_ts)也就是相对任务开始时刻的毫秒数。这样即使系统时间跳变实验内部的相对间隔依然准确。5.2 按键记录中「一次按键」被记成「两三次」间隔统计直接失真现象检查原始日志时发现一个普通字母按键产生了 keydown、keypress、keyup 三条记录按序列统计按键间隔方法时把这三条算成了三次输入。原因浏览器键盘事件的语义不同。keydown 表示物理按下keypress 表示字符产生keyup 表示释放同一物理按键会触发全部三个事件。解决统计时只取 keydown 作为按键有效标记keyup 单独用来计算按压持续时间。判断条件用 e.type keydown 过滤否则每个按键的间隔会被两条重复记录污染。5.3 问卷量表被「随机打乱」导致配对权重没法统计现象NASA-TLX 的 15 道成对比较题顺序被打乱了事后发现被试的权重分配结果和标准口径对不上。原因某些好心的同学把问卷题目「随机排序」想减轻被试的心理预期但没有同时调整计分逻辑。解决NASA-TLX 的 15 对比较是固定两两比较的方式题目顺序可以固定计分时目标对胜出一次记一分。资源里的计分脚本已经按固定顺序处理好了照原顺序呈现即可不需要随机。6. 进阶技巧按键间隔统计方法与结果可视化把日志数据变成实验结论按键间隔统计是人机交互实验里非常实用的分析手段尤其适合研究键盘输入的效率与节奏。最常用的两个指标是 Dwell Time一个按键从按下到释放的持续时长和 Flight Time前一个键释放到下一个键按下的间隔。两者合起来就是一次完整按键的周期周期越稳定说明输入越熟练周期波动大往往对应着输入中的停顿和犹豫。我的做法是把 keyup 事件和 keydown 事件配对计算import csv from collections import defaultdict # 读取上一章记录的 interaction_log.csv key_events [] with open(interaction_log.csv, r, encodingutf-8) as f: reader csv.DictReader(f) for row in reader: if row[event_type] in (keydown, keyup): key_events.append(row) # 按按键位置分组: (session_id, 被按下的实际内容) 作为 key key_times defaultdict(list) for ev in key_events: key_times[(ev[session_id], ev[target_control])].append(int(ev[start_ts])) # 计算 Dwell Time 和 Flight Time # dwell keyup 事件时间 - keydown 事件时间 # flight 当前 keydown 时间 - 上一个 keyup 时间 # 一个按键周期 dwell flight dwell_list, flight_list [], [] for key, times in key_times.items(): times.sort() for i in range(0, len(times) - 1, 2): dwell_list.append(times[i 1] - times[i]) for i in range(1, len(times) - 1, 2): flight_list.append(times[i 1] - times[i]) print(fDwell 均值: {sum(dwell_list) / len(dwell_list):.1f} ms) print(fFlight 均值: {sum(flight_list) / len(flight_list):.1f} ms)这段脚本的核心是配对逻辑keydown 和 keyup 按事件出现的先后顺序两两配对而不是按时间戳就近匹配。用字典分组后每组内按时间戳排序再每隔一个取一个值这样能规避多事件交错的情况。dwell 均值反映了单键操作粒度flight 均值反映了键间连击的流畅度两者分开统计报告中可以分别描述。数据结果出来后画图建议用箱线图或小提琴图不要用柱状图。柱状图只能表达均值丢了方差信息而人机交互实验最看重个体差异和分布形态。资源里附了 matplotlib 的作图代码能直接输出带显著星标的箱线图答辩直接用。从那以后每次带学生做人机交互实验我都强制走一遍这个按键间隔口径清单先把键位事件类型和配对数理清了再碰统计省掉的返工时间比什么都值。希望这份拆解能帮你把实验报告和最后大实验做成真正能讲清原理的完整作品祝顺利。本文还有配套的精品资源点击获取
返回列表