ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

校园消费行为分析:Python实现DFM模型的完整项目详解

校园消费行为分析:Python实现DFM模型的完整项目详解 简介这是一份基于Python的学生校园消费行为分析完整项目面向高校学生、毕业设计及期末大作业场景帮助使用者从零掌握校园消费数据的处理与分析流程。项目以某高校消费记录为核心涵盖数据清洗、特征工程、行为建模、结果可视化等完整环节并附有可运行源码和详细的项目文档。压缩包共8个文件大小约10.07MB主要包含3个Python脚本分别实现数据加载、DFM模型构建与图表展示、1个数据集压缩包、1份DOCX设计文档以及依赖列表和说明文档等辅助文件目录结构清晰便于按需查阅。源码已在本地编译通过评审分数达98分难度适中且经过助教审定可直接运行学习也适合作为二次开发的基础。随包附带的高校消费行为数据集与基于DFM模型的说明文档能显著节省数据收集与文档撰写时间帮助读者理解消费行为分析的关键思路。目前已有141人浏览学习对需要完整项目参考的同学来说是一个实用且有质量保障的选择。1. 学生校园消费行为分析从一份数据集到能扛住答辩的 Python 项目拿到这份“学生校园消费行为分析”资源时我的第一反应是先翻数据集和文档再看代码能不能直接跑。结果比预期顺利源码在 Windows 和 macOS 上都能直接运行数据集是某高校校园卡消费流水文档把模型、字段口径和结论都串成了一条线。这不是一个停留在“画两张图”的演示项目而是一条从数据清洗、特征聚合到消费群体分层、再落到图表解读的完整链路。适合三类人要做期末大作业的本科生、想省时间的毕设选手以及想用一份现成数据练手消费分析的转行者。第 2 章先拆资源结构让你知道每个文件该在什么阶段用。2. 先拆资源结构源码、数据集和文档里到底有什么打开压缩包后第一件事不要急着跑代码先把目录捋清楚。这个项目的文件不是随手堆的而是按“数据 → 模型 → 分析 → 文档”四层来组织的。我先按实际用途给你画一张文件地图再逐层说每个文件是干什么的、什么时候用得上。2.1 src 目录四个 Python 文件各管一段分析流程src 下只有四个文件init.py、data.py、model.py、analysis.py。没有花哨的模块分包按顺序执行就是一个完整的分析流程。init.py 负责初始化全局配置比如文件路径、输出目录、展示开关等data.py 读入原始校园卡消费数据并做清洗model.py 实现消费行为建模的核心逻辑analysis.py 负责跑分析、出图表和 CSV 结果。scbanalysis-master/ ├── doc/ │ └── 基于DFM模型的学生消费行为分析.docx ├── src/ │ ├── __init__.py │ ├── init.py │ ├── data.py │ ├── model.py │ └── analysis.py ├── 某高校校园消费行为数据集.zip ├── requirements.txt └── README.md运行顺序也按这个编号推进先 init再 data再 model最后 analysis。很多人一上来就运行 analysis.py结果报错找不到中间变量这不是代码坏了而是没有按依赖顺序执行。2.2 数据集校园卡流水通常长什么样数据集压缩包解压后一般是一份或多份以 CSV 或 Excel 格式存储的交易流水。典型字段至少包含学号或卡号、交易日期时间、消费金额、消费类型或商户名称。有些数据集还会带上校区、楼栋、窗口编号这些地理维度方便做位置相关的分析。import pandas as pd df pd.read_csv(campus_card.csv, encodinggbk, parse_dates[交易时间]) print(df.head()) print(df.info()) print(df[消费类型].value_counts())这段代码做了三件事第一行用 gbk 编码读取文件因为很多校园卡系统导出的数据是 GBK 编码直接用 utf-8 读会乱码第二行打印前五行确认字段名第三行查看消费类型的分布比如食堂、超市、洗浴、开水等。这里的字段名要以你实际解压后的数据为准如果有出入改成数据集里的列名即可。2.3 doc 文档不只是一份说明是答辩提词器doc 目录下的文档不是简单的“使用说明”而是按模型、数据处理、实验设计、结果分析组织的。我的建议是在做毕设或期末作业时先花半小时读这份文档再回头看代码。因为文档里写了每个方法为什么被选用、数据字段怎么定义、模型怎么评分、结果图表怎么解读。这些内容恰恰是答辩时老师最爱问的。3. 核心模型DFM 消费行为分析是怎么在代码里落地的很多拿到这套资源的人第一反应是“我能画出图就行”。但答辩老师不这么想他们会问你的分析依据是什么模型为什么选这个模型模型参数是怎么定的这一章把 model.py 里最核心的建模逻辑拆开讲清楚让你能回答这些问题而不是只会上交运行结果。3.1 为什么用 DFM 而不是直接统计平均值资源文档里写的模型名是 DFM从代码逻辑和字段来看它对应经典的 RFM 模型——Recency 最近一次消费时间、Frequency 消费频次、Monetary 消费金额。校园场景下这三个维度会被重新定义为适合学生的口径。项目里为什么要做这个转换因为校园卡消费和电商消费有本质差异学生消费周期短、金额波动小、行为受上课时间表驱动直接用电商的绝对阈值分层会失效。# 对每个学生做三件事算最近消费时间、算消费笔数、算累计金额 def compute_dfm(df): # df 必须包含 学号、交易时间、交易金额 三列 df[交易时间] pd.to_datetime(df[交易时间]) agg df.groupby(学号).agg( recency(交易时间, lambda x: (df[交易时间].max() - x.max()).days), frequency(交易时间, count), monetary(交易金额, sum) ) return agg这个聚合是整个模型的地基。recency 用的是“数据集中最后一条交易时间 - 该学生最后一条消费时间”算出来的是天数越小说明该学生近期仍在消费frequency 是消费笔数不是消费天数同一窗口一天消费五笔就会计为 5monetary 是累计金额。这三个字段分别反映活跃度、粘性和消费力。3.2 打分与分层先分位数再分人群拿到 DFM 三维数值后下一步是打分分层。常见做法是取各自的分位数做阈值而不是用固定数值。比如把每个维度按三分位分成高、中、低三档然后组合出 8 类人群。高活跃高金额高频率是核心用户全低是沉睡用户中间还有培育期、成长期、流失期等类型。def dfm_score(dfm): # 每个维度按三分位映射到 1-3 分 for col in [recency, frequency, monetary]: q1, q2 dfm[col].quantile([0.33, 0.66]) dfm[col _score] 0 dfm.loc[dfm[col] q1, col _score] 3 # 最近消费越早越好 dfm.loc[(dfm[col] q1) (dfm[col] q2), col _score] 2 dfm.loc[dfm[col] q2, col _score] 1 dfm[total_score] dfm[[recency_score, frequency_score, monetary_score]].sum(axis1) return dfm这段代码有个极容易踩的坑recency 是越小越好最近刚消费frequency 和 monetary 是越大越好。所以 recency 的分位数映射要反过来赋值——小于 q1 的反而得 3 分。文件里默认用的就是这个逻辑如果你自己重写别把方向搞反了。3.3 分层之后分析才有“解释力”模型跑完你会得到一张每个学生的 DFM 评分表。第 4 章要讲的所有图表——消费时段分布、月度交易趋势、窗口消费排行——都必须基于这个分层去解释而不是孤立地画图。比如某食堂窗口消费额高要看是核心用户在贡献还是沉睡用户的随机消费。这一层区分就是高分作业和低分作业的分水岭。4. 把分析跑起来环境配置、运行顺序与结果解读第 3 章讲清了模型逻辑这一章解决“怎么让它在我电脑上跑起来”以及“跑完后结果怎么解读”。很多人拿到资源第一步就卡在环境上不是代码的问题是 Python 版本和依赖库版本不匹配。4.1 环境准备Python 版本、依赖和国内镜像源项目对 Python 版本不挑剔3.8~3.11 都能跑。关键看 requirements.txt里面一般是 pandas、numpy、matplotlib、seaborn、scikit-learn 这几个。如果电脑上已经有 Python 环境直接安装依赖pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple这里的-i参数指定了清华镜像源主要解决国内下载慢的问题。装完后可以用python -c import pandas, matplotlib, seaborn; print(ok)验证关键库是否可用。注意 scikit-learn 在 Python 3.12 以上需要更新版本如果安装失败用pip install scikit-learn --upgrade。4.2 运行顺序从 init 到 analysis一步都不能跳项目没有集成一键运行的脚本需要按顺序执行四个文件。按顺序执行的原因是每个文件都会生成中间产物后面的文件依赖前面的结果。cd src python init.py python data.py python model.py python analysis.py我自己的习惯是前三个文件在命令行里跑analysis.py 用 IDE 跑因为 analysis 里会有可视化绘图命令行下容易因为缺少图形界面报错或用不了交互窗口。另外data.py 运行后会生成一份清洗后的 CSVmodel.py 运行后会生成一份带 DFM 评分的 CSV这些中间文件建议保留方便排查问题。4.3 结果图表怎么读四个关键输出analysis.py 会输出四类图表第一是消费金额的月度趋势折线图看整体消费规模的走向第二是消费时段的分布柱状图能看出早餐、午餐、晚餐的峰值第三是不同 DFM 人群的消费金额占比饼图或条形图第四是高频窗口的消费排行。看图表时有一个顺序先看整体趋势再看时段分布然后用 DFM 分层去解释这些趋势是由哪些人群贡献的。4.4 参数怎么改时间窗口和分位数阈值如果你想在项目基础上做改动两个参数最值得调。第一是 data.py 里的时间窗口比如只分析某个月或某个学期的数据第二是 model.py 里的分位数阈值把三分位改成四分位或五分位人群会分得更细。改完阈值后第 3 章的 total_score 分布会变后面的图表也会跟着变。这是成本最低的“二次开发”方式答辩时也能说成“我对模型参数做了敏感性分析”。5. 常见问题与避坑指南五个最容易翻车的地方这一章写成血泪经验是每个初次跑本项目的人大概率会遇到的问题按“现象 → 原因 → 解决”的方式记录。5.1 CSV 读进来全是乱码中文变成“锟斤拷”现象data.py 或自己写代码读数据集时打印出来的中文列名和值全是乱码或问号。原因校园卡系统导出的 CSV 通常是 GBK/GB2312 编码而 pandas 默认用 utf-8 解析。解决在 read_csv 时显式指定编码为 gbk或用encodingutf-8, enginepython尝试。更稳妥的办法是用记事本打开 CSV 看右下角编码或者直接用with open(file.csv, encodinggbk) as f先读一遍确认正常。5.2 data.py 报错提示“KeyError: 交易时间”现象运行时提示找不到列名明明数据里有一列是“交易日期”。原因数据集里的字段名和各源码文件里写死的字段名不一致可能是这份资源和另一份数据混用了也可能是因为逗号分隔导致列名错位。解决用df.columns.tolist()打印出所有列名然后在 init.py 里找到字段映射配置把“交易时间”改成实际列名。5.3 matplotlib 图表里中文全部变成小方框现象柱状图和折线图的标签、图例里中文显示为方块。原因matplotlib 默认字体不支持中文这个不是项目代码的问题是当前运行环境缺中文字体。解决在代码开头加上中文字体的设置常见做法是import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei] plt.rcParams[axes.unicode_minus] False加了第一行设置中文字体第二行是解决负号显示问题。不同系统中 SimHei 不一定存在macOS 可以用 “PingFang SC”Linux 可以改为 “Noto Sans CJK SC”。5.4 时间筛选后12 月和 1 月的数据连不起来了现象按月份切分数据做月度趋势时发现跨年月份的曲线断掉或者 1 月数据消失。原因用于筛选的时间字符串没有转成 datetime 类型字符串排序时“1月”排到“12月”后面。解决在 date 列上用pd.to_datetime(df[交易时间])做一次统一转换再按df[交易时间].dt.month或dt.to_period(M)分组聚合避免直接拿字符串切片。5.5 数据量大时内存暴涨程序卡死或闪退现象把好几年的消费流水一次性读入内存后执行 groupby 和 merge 时内存占用飙高。原因数据没有做类型优化尤其是学号和商户名这些字段被读成 object 类型。解决读取时指定 usecols只保留需要的列再用dtype{学号: category}把学号转为分类类型内存能省一半以上。如果还卡就把数据集按月切片逐月聚合再拼接。6. 从复现到提分三处值得自己动手改的进阶点如果你只是想让项目“跑通”第 4 章的步骤已经够了。但如果这是毕设或答辩项目想从“能运行”变成“有亮点”下面三个方向是我会动手加进去的改动量不大但能让报告和答辩实打实多两张牌。第一个建议是加一个“月均消费波动率”字段。校园消费和电商最大的区别是周期性学生平时在校内消费规律周末和节假日波动很大。用std / mean给每个学生计算消费金额的变异系数就能识别出哪些人的消费节奏最稳定。这个字段加在 model.py 的计算结果里几乎不增加代码量但在答辩时能引出一个很有价值的结论——“校园消费的稳定性受周末和假期影响显著”。第二个建议是把 analysis.py 里的柱状图换成“时段-星期”热力图。横轴是星期纵轴是小时颜色深浅代表消费笔数这一张图就能同时回答“什么时候吃早饭”和“周末消费去向哪”。matplotlib 画热力图只多二十行代码但对信息密度的提升是很直观的。第三个建议是针对数据集本身。如果数据集里包含商户或窗口信息可以做一次“单人消费窗口数量”的统计用来判断学生的消费多样性。消费窗口越多说明选择越分散集中在两三个窗口说明消费习惯非常固定。这两个人群在 DFM 分层里往往对应不同的流失风险。最后说一个我的习惯拿到这类带文档的资源我会先跑一遍原始代码不做任何修改把输出结果全部保存一遍然后改一个参数再跑一遍对比两个版本的结果差异。这个过程能帮你确认自己对项目的理解到底到位了没有。我从做第一个数据分析项目起就保持这个习惯后来每次换新数据集或新模型都强制走一遍这个流程确实能提前避开很多答辩时的尴尬问题。希望这个思路对你有帮助。本文还有配套的精品资源点击获取
返回列表