ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

大数据分析期末大作业:招聘数据清洗、可视化与python-docx报告生成

大数据分析期末大作业:招聘数据清洗、可视化与python-docx报告生成 简介这份大数据分析课程期末大作业完成报告与案例分析文档面向高校数据科学、人工智能及大模型相关专业学生以及需要完成课程综合作业的读者围绕从选题到成果复盘的全流程提供可直接参考的写作范式。全文以一份完整的期末项目为主线依次覆盖作业背景与目的、课程意义与价值、数据来源与类型、数据清洗与整理、数据转换与规约并延伸到描述性统计、推断性统计、数据挖掘与机器学习技术、大数据平台与工具应用等方法环节。案例分析部分进一步拆解案例选择与介绍、数据探索与初步分析、深入分析与挖掘、结论与建议最后落到成果总结、问题与不足以及未来发展方向目录层级清晰表格与要点齐备。压缩包仅含1个docx文件约47KB体量轻便便于随时查阅与二次编辑。目前已有74人学习适合作为作业框架模板、汇报材料底稿或答辩准备参考。1. 从一份 .docx 交作业说起大数据分析期末大作业真正被评的是什么期末周最容易被低估的一步不是模型跑不出来而是那份《完成报告与案例分析.docx》交上去之后老师翻两页就问三个问题数据从哪来清洗前后各多少条结论凭什么成立。很多同学的 notebook 里图表堆了一屏报告里却只有如图所示一线城市薪资更高这类空话分数自然上不去。大数据分析课程的期末大作业本质是一次完整链路的交付数据获取与口径说明、清洗与质量报告、多维分析与挖掘、可视化呈现、案例归因最后落到一份排版规范、图文对得上的文档。标题里带着完成报告与案例分析说明评分的重心有一半在文档侧——它要把你做过的事说清楚而不是把代码复制进去。这份东西适合两类人一类是刚学完 python数据分析与应用 课表内容、需要一条可复现路径把知识点串起来的同学另一类是做过项目但报告写散的人缺的是把分析结论映射成文档结构的模板。下面按数据、分析、报告、复现四段推进案例统一用招聘网站大数据分析与可视化项目这条线因为它字段够全、结论够直观、单人两周能收尾。2. 选题与数据落地把招聘网站大数据变成能跑的 pandas DataFrame2.1 选题边界一个人两周能跑完的题目长什么样选题最常见的失误是大而空比如基于大数据的用户行为分析听起来高级实际拿不到数据最后只能用几百行造出来的假数据老师在答辩时一问数据来源就露馅。可行的题目要同时满足三条数据能通过公开渠道或小规模采集拿到字段至少能支撑三个分析维度结论能被交叉验证而不是只有一张饼图。招聘数据恰好符合一份岗位表里有城市、公司规模、行业、学历要求、经验要求、薪资区间、技能标签天然能做出地域—薪资学历—经验—薪资技能词频—岗位热度三组交叉分析。大数据分析与挖掘课程里讲的分组聚合、透视表、词频统计、相关性分析都能在这里找到落点不用为了凑知识点硬塞模型。采集环节要守住两条底线只采公开列表页的可见字段不碰登录后数据和联系方式控制请求频率单次任务控制在合理规模用分页抓取或直接使用课程提供的公开数据集。常见做法是先用几百到几千条样本跑通全流程确认字段可用后再放大数据量——先小后大比一开始就爬几万条然后卡在清洗上要省时间。2.2 字段设计先定口径再动手采数字段表要在写第一行爬虫代码之前定下来否则后面每加一个维度就要重爬一次。下表是招聘项目里我一般会保留的最小字段集多了会增加清洗成本少了支撑不起分析。字段名类型示例分析用途job_namestring数据分析师岗位分类、词频citycategory杭州地域分布、薪资对比salary_rawstring15-25K·13薪待清洗的原始薪资educategory本科学历门槛分析expcategory3-5年经验与薪资关系company_sizecategory500-999人公司规模与薪资skillsstringPython,SQL,Tableau技能共现挖掘publish_datedatetime2024-05-11时间趋势口径要写在报告里比如薪资按岗位月薪中位数计算标注为年薪的按 13 薪换算否则同一批数据两个人算出不同结论评审会直接质疑分析过程。2.3 首轮数据体检的最小命令拿到原始文件先别急着画图用下面这段代码做一次体检把行数、缺失、重复、类型问题一次性看清楚。import pandas as pd # encoding 用 utf-8-sig 兼容 Excel 导出的 BOM 头 # dtype 指定 object 列避免 pandas 把 15-25K 误判为字符串后又做隐式转换 df pd.read_csv(jobs_raw.csv, encodingutf-8-sig, dtype{salary_raw: string}) print(行数/列数:, df.shape) print(df.isna().sum().sort_values(ascendingFalse).head(10)) # 缺失最多的前 10 列 print(完全重复行:, df.duplicated().sum()) print(df[city].value_counts().head(10)) # 城市分布是否合理 print(df[salary_raw].sample(5, random_state42).tolist()) # 抽样看薪资格式参数上encoding选错会直接抛UnicodeDecodeError国内数据源常见 utf-8-sig 和 gbk 两种报错就换dtype显式声明能防止薪资、手机号这类字段被读成数字后丢失前导零sample(random_state42)固定随机种子保证每次抽样结果一致方便在报告里复现。体检输出要留档它就是报告里数据质量一节的原始素材原始多少行、去掉多少重复、各字段缺失率多少这些数字比任何形容词都有说服力。3. 从清洗到挖掘python数据分析与应用课表里的分析链路怎么串起来3.1 薪资字段清洗从 15-25K·13薪 到数值列薪资是招聘数据里最有价值也最脏的一列格式包括 15-25K、1.5-2万、300元/天、面议。清洗策略是分层处理能解析的转成数值区间取中位数不能解析的单独打标后剔除并在报告里说明剔除了多少条。import re import numpy as np def parse_salary(s): if not isinstance(s, str): return np.nan s s.strip() # 统一单位万 - K s s.replace(万, 0000).replace(千, 000) # 抓取区间内所有数字 nums re.findall(r\d\.?\d*, s) if not nums: return np.nan # 面议 这类直接判缺失 vals [float(n) for n in nums[:2]] low, high min(vals), max(vals) if high 1000: # 过滤掉 300元/天 这类日薪 return np.nan return round((low high) / 2, 1) # 取中位数作为该岗位薪资 df[salary] df[salary_raw].apply(parse_salary) # 13 薪换算标注了 x薪 的按比例还原成月薪口径 df[months] df[salary_raw].str.extract(r(\d)薪).fillna(12).astype(int) df[salary_month] (df[salary] * df[months] / 12).round(1) print(可解析比例:, df[salary_month].notna().mean().round(3)) df df.dropna(subset[salary_month]).reset_index(dropTrue)逻辑上先做单位归一再取区间中位数最后用薪数把口径拉回月薪。months这一列容易被忽略但 13 薪和 12 薪混在一起算平均结论会系统性偏低。可解析比例是个关键指标如果低于 60%说明你的正则覆盖不够要先回去看未解析样本长什么样而不是直接进入分析。3.2 分组聚合城市、学历、经验三维交叉的指标体系单看平均薪资意义不大要给出指标口径。我一般固定四个指标岗位数、平均薪资、薪资中位数、高薪岗位占比月薪 ≥ 20K 的比例。中位数和均值同时给是因为薪资分布右偏严重均值常被少数高薪岗位拉高。agg ( df.groupby([city, edu], observedTrue) .agg( job_count(job_name, size), avg_salary(salary_month, mean), median_salary(salary_month, median), high_pay_ratio(salary_month, lambda x: (x 20000).mean()), ) .query(job_count 30) # 样本太少的组合不进入结论 .round(2) .reset_index() .sort_values(median_salary, ascendingFalse) ) print(agg.head(15)) # 三维透视行城市列经验值薪资中位数 pivot df.pivot_table(indexcity, columnsexp, valuessalary_month, aggfuncmedian) print(pivot.round(1))query(job_count 30)这行是很多报告被扣分的地方某个三线城市只抓到 5 条岗位却被写进XX 城市薪资反超一线结论站不住。给聚合结果设最小样本阈值并在报告里写明阈值评审会认为你的分析是有纪律的。observedTrue在分类列上能减少空组合的笛卡尔积数据量大时明显提速。3.3 技能标签挖掘jieba 词频与技能共现技能列是本次作业里最能出彩的部分因为它把数据分析从数字统计拉到了文本挖掘。做法是分词、去停用词、统计词频再算两两共现。import jieba from collections import Counter from itertools import combinations stopwords set([熟悉, 熟练, 优先, 具备, 能力, 相关, 经验, 以上]) job_skills [] for row in df[skills].dropna(): words [w.strip() for w in re.split(r[,/、|], row) if w.strip()] words [w for w in words if w not in stopwords and len(w) 1] job_skills.append(words) freq Counter([w for ws in job_skills for w in ws]) print(freq.most_common(20)) # 共现统计同时出现在同一岗位里的技能对 pair Counter() for ws in job_skills: for a, b in combinations(sorted(set(ws)), 2): pair[(a, b)] 1 print(pair.most_common(10))分隔符要按数据实际情况调整招聘网站的技能字段常用逗号、顿号、斜杠混合分隔用正则一次性切干净比多次split稳。停用词表要自己补熟悉优先这类词进词频榜只会稀释有效信息。共现结果能直接支撑一条结论Python 与 SQL 仍是数据岗的硬门槛。3.4 可视化落盘图表要能直接贴进 docx图要在生成阶段就定好尺寸和分辨率别等插进 Word 再拉伸变形。Linux 环境下中文字体缺失是最常见的乱码来源先设字体再画图。import matplotlib matplotlib.use(Agg) # 无界面环境必须指定后端否则报显示错误 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Noto Sans CJK SC, WenQuanYi Zen Hei, SimHei] plt.rcParams[axes.unicode_minus] False # 负号正常显示 top agg.head(10).iloc[::-1] fig, ax plt.subplots(figsize(7, 4.5), dpi300) ax.barh(top[city], top[median_salary], color#3b7dd8) ax.set_xlabel(薪资中位数元/月) fig.tight_layout() fig.savefig(fig_salary_city.png, bbox_inchestight)figsize按报告正文宽度定A4 页面正文宽约 15 cm7 英寸宽正好dpi300保证打印不糊bbox_inchestight去掉多余白边插入文档后不会有大片留白。每张图都单独存成 png 并命名规范后面自动生成报告时按文件名顺序插入即可。4. 完成报告与案例分析用 python-docx 把分析结果写成可交付文档4.1 报告骨架九个固定小节与对应证据报告最怕写成代码日志。固定一个骨架每个小节对应一份证据写完自查一遍就不会偏。小节必须出现的内容常见扣分点一、项目背景与目标选题理由、要回答的问题大段抄概念没问题意识二、数据来源与字段来源、时间范围、字段表不写采集时间与样本量三、数据清洗缺失率、剔除规则、前后行数只说做了清洗四、分析方法指标口径、分组维度口径缺失五、分析结果图表 文字结论图无编号、结论无数据六、案例深挖一个具体岗位/城市的拆解泛泛而谈七、结论与局限数据覆盖边界只写结论不写局限八、附录环境、依赖版本、代码结构无法复现结论与局限这一节很多人省掉其实它最容易加分写清数据只覆盖哪些城市、采集时间窗口多长、薪资为标注值而非实发值等于替评审把质疑提前回答了。4.2 用 python-docx 自动生成正文、表格与插图分析结果一旦产出 CSV报告正文里大量数字就可以自动填避免手改出错。from docx import Document from docx.shared import Pt, Cm, Inches doc Document() style doc.styles[Normal] style.font.name 宋体 style.font.size Pt(10.5) doc.add_heading(二、数据来源与字段说明, level1) doc.add_paragraph(f本次共采集岗位记录 {len(df)} 条覆盖城市 {df[city].nunique()} 个 f时间范围为 2024-05 至 2024-06。) # 表格表头 数据行样式用内置网格 table doc.add_table(rows1, cols4) table.style Table Grid for i, h in enumerate([城市, 岗位数, 薪资中位数, 高薪占比]): table.rows[0].cells[i].text h for _, r in agg.head(10).iterrows(): cells table.add_row().cells cells[0].text str(r[city]) cells[1].text str(r[job_count]) cells[2].text str(r[median_salary]) cells[3].text f{r[high_pay_ratio]:.0%} doc.add_picture(fig_salary_city.png, widthInches(5.5)) doc.save(完成报告与案例分析.docx)level1对应 Word 的标题 1生成后再手动调样式即可比在 Word 里逐段设格式快得多。widthInches(5.5)要和图片实际比例匹配否则会变形表格用Table Grid样式省去手动画框线。数字统一在代码里转成字符串再写入numpy的 float 直接赋值可能出现类型异常。4.3 案例分析怎么写才不空预期、偏差、归因、边界案例分析段落在评分表里通常单独占分写法可以固定成四步先给出预期例如杭州数据分析岗薪资应高于全国中位数再给实际数据然后解释偏差来源最后划边界。偏差来源要落到具体机制上比如某城市岗位数少导致中位数波动、某类岗位把经验要求写成不限从而拉低了整体均值。归因部分可以引用共现分析的结果比如要求 Python SQL 可视化三件套的岗位薪资中位数明显高于只要求 Excel 的岗位这说明岗位定价跟工具栈复杂度相关。边界部分要写明这套结论只适用于本次采集的样本范围不能外推到全行业。案例选择上优先挑一个反直觉的点展开比如某个新一线城市的薪资中位数超过一线然后把它拆开看是不是由少数高薪岗位拉动的。这种写法比罗列十个城市的平均薪资更能体现分析能力报告的可读性也会明显提升。5. 虚拟机复现与高频翻车点交作业前最后一遍自检5.1 干净环境里跑通 main.py用虚拟机做招聘网站大数据分析与可视化项目有个实际好处环境干净能验证依赖是否完整答辩时现场演示也不怕本机环境乱。常见做法是建一台 Ubuntu 虚拟机共享文件夹挂载到/mnt/share把代码和数据放进去。sudo apt update sudo apt install -y python3-pip fonts-noto-cjk # 中文字体缺了图会变方框 cd /mnt/share/project python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt python3 main.py # 单入口脚本清洗 - 分析 - 出图 - 生成 docxrequirements.txt里把 pandas、matplotlib、jieba、python-docx 的版本钉住避免换机器后接口行为变化。main.py按顺序串四步每步输出中间文件到output/这样任何一步失败都能定位不用重跑全流程。跑完检查三件事output/下 png 数量是否等于报告里的图数、docx 能否正常打开、表格里的数字和 CSV 是否一致。5.2 三个高频报错与排查顺序现象原因处理图中中文变方框系统缺 CJK 字体装 fonts-noto-cjk重设 rcParams读 CSV 报 UnicodeDecodeError编码不是 utf-8换 utf-8-sig 或 gbk 重试大数据量内存溢出全量读入 object 类型用 chunksize 分批category 降级排查顺序建议从数据入口开始先确认文件能读、字段名没变再看清洗后的行数是否符合预期最后才看图表。很多人一上来就调绘图参数结果问题是输入文件被 Excel 另存成了 gbk白白绕一圈。另外提醒一句add_picture用的是相对路径时务必在项目根目录执行脚本否则会报找不到文件。答辩前把main.py连跑三遍比对output/里 CSV 的行数与校验和完全一致说明流程没有隐藏的随机性这一步做完再动 PPT 不迟。本文还有配套的精品资源点击获取
返回列表