第 47 课:Jupyter Notebook 与实验环境
🎯 核心实操目标
通关要求:建立”一文一码互动伴随”的可复现研究工作流。本课你将掌握 Jupyter Notebook 的基本操作、Python 数据分析速成(pandas + matplotlib),并能产出代码+文字+图表一体化的研究文档——让任何审稿人或同行能一键复现你的全部分析。
📋 课前准备(10 分钟,含安装)
工具/环境(二选一)
方案 A:Anaconda(推荐零基础) — 一键含 Python + Jupyter + pandas + matplotlib
- [ ] 下载:anaconda.com/download(约 500 MB)
- [ ] 国内镜像:mirrors.tuna.tsinghua.edu.cn/anaconda(更快)
- [ ] 安装后开始菜单 → Anaconda Navigator → Launch Jupyter Notebook
方案 B:纯 Python + pip(适合已装 Python 的进阶轨)
# 创建虚拟环境
python -m venv aicourse_env
source aicourse_env/bin/activate # Mac/Linux
# 或 aicourse_env\Scripts\activate # Windows
# 安装依赖
pip install jupyter pandas matplotlib numpy scipy seaborn
# 启动
jupyter notebook数据/素材
- [ ] 三选一案例数据集:
配置验证
打开 Jupyter Notebook,新建一个 Cell 跑通:
import pandas as pd
import matplotlib.pyplot as plt
print(pd.__version__, plt.matplotlib.__version__)
# 应输出版本号,无报错即成功应急通道
- 本地安装失败 → 用 Google Colab(云端 Jupyter,免安装,需 Google 账号)
- 内地访问 Colab 困难 → 用 百度飞桨 AI Studio 或 阿里云 Notebook
场景痛点破冰:你为什么陷入了学术造假风暴的信任危机?
“近年顶级学术圈频频撤稿撤文。很多同学感到委屈:我明明辛辛苦苦算了一下午! 问题出在你的论述方式。在论文的 Result 部分,你直接给出了一张完美对称的折线图,然后告诉审稿人‘这就是运行得到的结果’。 这很难令人信服。 当你用鼠标删去那些因乱填导致的离群数据点时,并没有在论文中说明和报告。学术界如今对这种只呈现结果、不展示过程的做法越来越审慎。解决它的关键工具——就是与代码相伴的完整记录。”
🗺️ 架构重组:文本与机器火花的乐高咬合拼接
Jupyter 的核心在于“一段供人阅读的说明”+“一段供机器运行的代码”,像分层结构一样自上而下排布执行:
🚀 拆解实战:跑通一份"Markdown 说明 + 代码 + 图"的可复现 Notebook
以 Case A 问卷数据为例,一格说明 + 一格代码交替往下排。把 case_A_questionnaire.csv 放到 Notebook 同目录,逐格运行(Shift+Enter)。
① 载入数据(Markdown 格写一句"步骤1:载入并查看数据",下面 Code 格):
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("case_A_questionnaire.csv")
print(df.shape) # (540, 33)
df.head()② 清洗:剔除作答过快 + 列表删除缺失(与第 23 课口径一致):
items = [c for c in df.columns
if c.split('_')[0] in ('Anxiety', 'Strategy', 'Efficacy')]
clean = df[df['Duration_Min'] >= 3] # 作答 < 3 分钟视为无效
clean = clean.dropna(subset=items).copy() # 列表删除任何题项缺失的行
print(f"清洗后样本量: {len(clean)}") # 约 500③ 反向题反转 + 维度均分(反向题 _R = 6 - 原值):
clean['Anxiety_4_R'] = 6 - clean['Anxiety_4'] # 认知焦虑反向题
clean['Anxiety_Cog'] = clean[['Anxiety_1', 'Anxiety_2',
'Anxiety_3', 'Anxiety_4_R']].mean(axis=1)
clean[['Anxiety_1', 'Anxiety_4', 'Anxiety_4_R', 'Anxiety_Cog']].head()④ 画相关热力图(结果格正下方即时出图):
corr = clean[['Anxiety_1', 'Anxiety_2', 'Anxiety_3', 'Anxiety_4_R']].corr()
plt.figure(figsize=(5, 4))
sns.heatmap(corr, annot=True, cmap='RdBu_r', center=0, vmin=-1, vmax=1)
plt.title('认知焦虑题项相关矩阵')
plt.tight_layout()
plt.show()全部跑通后,
文件 → Download as → PDF/HTML导出,就得到一份代码 + 文字 + 图一体、审稿人能一键复现的分析记录。这就是 Jupyter 的价值:把分析过程透明化。
让 AI 当助手,但你要看懂每一格
你可以让 AI 帮你写某一格代码,但粘贴前先读懂它做了什么——尤其是清洗那一格(它删了哪些行?怎么处理缺失?)。看不懂就让它逐行加注释。"透明地跑出图"不等于"做对了",方法本身要站得住(见下)。
🚦 批判性复核:清洗与插补不能"为了好看"
Jupyter 让过程透明,但透明地做错仍然是错。两条最容易翻车的红线:
- 离群值不能"鼠标随手删":要预设客观准则(如
|Z| > 3或箱线图 1.5×IQR),并在论文 Methods 里报告删了几个、依据是什么。绝不能为了让曲线好看而偷偷删点。 - 缺失值插补要慎重:均值填充会低估方差、可能引入偏倚。优先做法:量表得分用该题项所在维度的可用题项求均值(跳过 NA),或对缺失较多时用多重插补;并先判断缺失机制(MCAR/MAR)。无论怎么处理,都要在论文里如实说明。
一句话:上一节那种"向下均值强行补录、鼠标删离群点"的做法,恰恰是会被盲审抓的——正确姿势是预设准则 + 如实报告。
📦 本课交付物(提交给 AI 初审/讲师抽检)
按本节实操任务完成并提交以下内容,AI 初审 + 讲师抽检按 Module_Rubrics.md 对应维度评分:
- [ ] 可运行的 .ipynb:含上面 4 格(载入 / 清洗 / 反转 / 出图),每格都能跑通
- [ ] 导出的 PDF 或 HTML:含代码 + 文字 + 热力图的可复现记录
- [ ] 清洗方法说明:你的离群值准则 + 缺失处理方式(如实写明,对应批判性复核)
- [ ] AI 协作日志:让 AI 写某格代码的"指令 → 输出 → 你读懂 / 修正"记录
🏁 小结与自测 (Milestone Checklist)
- [ ] 我能在 Jupyter 跑通"载入 → 清洗 → 反转 → 出图"四格,并导出可复现的 .ipynb / PDF
- [ ] 我清楚反向题要
_R = 6 - 原值,维度均分用反转后的题项 - [ ] 我会预设客观准则处理离群值,并在论文 Methods 如实报告(不随手删)
- [ ] 我知道均值插补的风险,会先判断缺失机制、优先用可用题项均值 / 多重插补
- [ ] 我把 AI 当代码助手,但粘贴前读懂每一格,不盲信"出了图就对了"
