ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于大数据的B站用户行为分析与可视化实践

基于大数据的B站用户行为分析与可视化实践 去年准备开题的时候我一度觉得“大数据”这个方向快被写烂了。翻来覆去就是淘宝电商分析、微博舆情分析、豆瓣电影评分预测身边的同学十个里有八个在做类似的题。直到有天刷到一个B站UP主做的“UID查成分”小工具——输入一个用户ID就能看到这个人平时混迹在哪个分区、给哪些UP主投过币、发过哪些弹幕评论区玩得飞起。我突然意识到这不就是一个现成的、非常鲜活的用户行为分析场景吗于是题目就这么定了基于大数据的B站用户行为数据分析与可视化。这篇东西把我从选题到开题答辩踩过的坑、想清楚的逻辑以及最后落地的技术方案完整梳理了一遍。如果你也在准备类似的大数据毕业设计、开题报告或者单纯想拿真实社区的开放数据练手这套思路可以直接抄作业能帮你少走很多弯路。1. 为什么选B站一个把“用户行为”写在脸上的平台1.1 “查成分”背后的画像逻辑其实就是用户行为画像很多人第一次接触“查成分”这个概念都是从B站的UID查询工具开始的。这类工具做的事情很简单把某个用户公开的观看历史、关注列表、弹幕记录抓下来然后判断这个人属于什么圈层——是二次元、游戏区、科技区还是生活区甚至会给人打上“XX区用户”的标签。评论区里大家玩得不亦乐乎。但仔细想想这不就是典型的用户行为画像吗一个人在什么时间看了什么视频、发了什么弹幕、给谁投了币这些行为数据组合在一起就能还原出这个人的兴趣偏好和活跃程度。民间工具用脚本实现而我们的课题要做的是把这套逻辑用大数据的技术体系系统地做出来——采集、存储、清洗、建模、可视化一步都不能少。B站和传统的电商平台、新闻客户端最大的不同在于它的用户行为链路特别完整。你看完一个视频可以发弹幕、写评论、投币、点赞、收藏、分享还能关注UP主、加入粉丝群、充电。整条链路上每一个动作都是一次真实意愿的表达数据维度极其丰富。相比之下很多App的“行为”往往只有点击和浏览分析起来总觉得少了点厚度。1.2 开题之前先把三个问题想明白写开题报告最忌讳的事情就是题目定了但心里没底硬着头皮凑字数。导师看一眼就知道你有没有想清楚。我当时的做法是拿一张纸写下三个问题不写完不开工做什么对B站用户的观看、弹幕、评论、互动行为进行采集、清洗、分析最终以可视化方式呈现用户画像、内容偏好和互动规律。凭什么能做B站有公开的视频信息、弹幕池、评论接口技术上可以用Python采集用大数据组件做存储计算可行性高。做完长什么样一套用户行为分析报告 一个可视化大屏 一个用户分层模型。这三个问题想清楚开题报告的骨架就有了。后面写出来的每一段都是在回答其中一个问题。1.3 同类工作做过什么你的增量在哪里调研阶段一定要看别人做过什么不然很容易做出重复劳动。我当时把现有工作分成了三类一类是纯弹幕情感分析很多论文做的是对单条弹幕做情感极性判断停留在NLP层面一类是用户画像研究但多数用的是问卷或平台内部数据普通人根本拿不到还有一类是可视化大屏展示往往只有炫酷的图表背后的分析深度不够。这个课题的增量就在于把“可获取的公开数据”和“成体系的分析方法”结合起来。不是单纯做某一块而是打通从数据采集到可视化展示的全链路同时在中间加入用户分层、兴趣建模、语义分析这些有分析深度的环节。说白了这是一个“工程完整性 分析方法论”的题目导师看起来会觉得工作量饱满、技术路线清晰。2. 数据采集与存储搭一条能跑通的数据管道2.1 B站的公开数据源盘点开题报告里最容易被追问的就是“数据从哪来”。B站的平台上有大量公开数据不需要任何内部权限就能获取我们做学术研究完全够用视频基础信息标题、分区、标签、发布时间、播放量、弹幕数、点赞投币收藏分享数这些在视频页的HTML里或相关公开接口中就能拿到。弹幕池每条弹幕会附带出现时间、弹幕内容、发送者的部分标识信息。老版本接口可以直接拿XML格式新版本是protobuf编码解析稍麻烦一点。评论内容视频下方的一级评论和二级回复包含评论文本、点赞数、发送时间和用户标识。UP主信息昵称、粉丝数、投稿列表、视频平均播放量等在用户空间页公开可见。排行榜数据B站有每日热榜、分区热榜适合冷启动阶段快速拿到一批高热度视频。这些数据有个共同特点它们都是公开的、不需要登录就能获取的。后文我会专门说合规边界的问题这里先记住一个原则——只拿公开数据控制请求频率别给平台添麻烦。2.2 从视频切入、向用户聚合采集策略的设计思路理想状态下我们想要的数据集是“用户-视频-行为”三元组也就是知道哪个用户对哪个视频做了什么动作。但现实是B站不会把完整的用户行为日志对外开放你得学会设计采集策略。我最终采用的是“从视频切入、向用户聚合”的策略。具体来说先选一批种子视频。按分区、按UP主、按热榜三个维度覆盖科技、游戏、生活、动画、音乐等主要分区每个分区挑不同量级的UP主保证数据多样性。我当时第一批选了200个视频后面扩到1000个。采集视频元数据和弹幕、评论。弹幕采集特别需要注意时间窗口老视频的弹幕池可能很大要分批拉取。从弹幕和评论中解析出用户标识再去请求这些用户的公开空间信息比如关注列表、粉丝数、投稿记录。这样就完成了“用户—行为—内容”的关联。采集端的实现我用的是Python搭配httpx做异步请求。这里多提一句不要用同步的requests一把梭爬全站带宽和效率都跟不上。异步并发能把采集速度提升好几倍同时更好控制请求节奏。2.3 存储链路设计把大数据组件用在该用的地方数据采下来以后存储方案是开题报告里体现“大数据”含量的关键。有的同学直接把所有数据塞进MySQL也能跑但题目里的“大数据”就成了摆设。我的做法是设计了一条完整的存储链路每个组件都有明确的职责采集端到消息队列采集脚本把原始数据封装成JSON发送到Kafka。Kafka在这里做削峰填谷和异步解耦即使某段时间采集速度波动下游处理端也不会被冲垮。结构化数据进MySQL视频信息、UP主信息、统计汇总结果这些是需要频繁查询的元数据放进MySQL最合适。原始行为数据进HDFS弹幕、评论这类海量半结构化日志按日期和视频ID做分区存到HDFS上用Hive建外部表供查询。热点数据放Redis可视化大屏需要高频读取的指标比如实时弹幕量、热门视频Top榜直接查Hive太慢先算好结果放Redis前端读起来就是毫秒级。集群方面我当时搭的是3节点测试集群一个主节点负责NameNode和资源调度两个从节点负责DataNode和计算任务。测试阶段不需要很大的规模关键是每个组件的角色要清楚。再配合Kafka可视化管理工具和Redis可视化客户端比如常见的Redis DeskTop Manager这类监控起来很方便答辩演示的时候也能体现工程能力。2.4 采集过程的合规边界提前想好再动手这一节必须单独说因为答辩的时候老师一定会问。但凡做数据采集相关的课题数据的合法合规性是最容易翻车的点。我的原则是三条第一只采集公开可见的数据不碰任何需要登录权限、需要绕过风控才能获取的非公开数据第二请求频率严格限制宁可采得慢一点也不给平台服务器造成压力第三采集到的数据仅用于学术研究和个人学习不做任何商业用途不对外公开原始数据集。写开题报告的时候把数据来源、采集方式、隐私保护措施、研究用途写清楚导师看了会觉得你很稳妥。答辩的时候也能理直气壮地回应相关提问。3. 清洗与特征工程把“脏乱差”的原始数据变成分析素材3.1 弹幕和评论数据到手之后长什么样做过数据采集的人都知道刚爬下来的数据基本没法直接分析。弹幕数据的原始字段大约长这样出现时间视频内的时间点、发送时间、弹幕内容、字号、颜色、弹幕池类型、发送者标识。评论数据则包含楼层、点赞数、回复内容、发送者等字段。脏数据的种类比我预想的多得多。最典型的是重复弹幕——热门视频里同一个梗会被刷几百上千遍分析的时候如果不做去重聚类和词频统计都会失真。还有空字符串弹幕、纯颜文字的弹幕、表情符号编码错乱的乱码文本以及发送时间为空或明显异常的数据。这些全部要清洗。3.2 中文文本清洗与分词的实操细节文本清洗这步看起来不起眼实际上是最花时间的地方。我当时的处理流程是先去掉重复项有空字段的直接剔除再把内容里的表情符号和特殊字符统一处理保留中文和常用标点最后用jieba做分词同时维护一个自定义词典把B站的高频梗词汇加进去——比如“下次一定”“梦幻联动”“要素过多”“一键三连”这类词默认词典根本切不对。分词之后还有一步容易被忽略停用词过滤。B站的弹幕里“哈哈哈哈哈”“啊这”“草”这类无意义的语气词频率极高不过滤的话词云和高频词统计会被它们淹没。我当时维护了一份停用词表覆盖常见语气词、虚词、B站通用口头禅过滤完之后的高频词才有真正的分析价值。还有一个经验B站对弹幕里的用户标识做了一层处理很多接口返回的用户ID是哈希值或脱敏后的字符串不是完整的UID。这意味着你很难精确追踪某个自然人但对群体分析来说影响不大。我们本来也不是要做个人隐私追踪而是分析群体的行为规律这个口径在开题报告里一定要写清楚避免答辩被质疑。3.3 用户维度和视频维度的特征表怎么建清洗完之后下一步是特征工程。特征工程决定了下游分析能做什么我把它拆成三张表第一张是用户行为特征表。每个可识别用户一行字段包括观看视频数、弹幕发送数、评论数、活跃天数、平均每天行为次数、最活跃的时间段按小时分布、观看视频涉及的分区数、每个分区的行为次数占比。这张表是后面做用户分层的主要输入。第二张是视频内容特征表。每个视频一行字段包括分区、时长、播放量、弹幕数、评论数、投币数、弹幕情感分布正面/中性/负面比例、弹幕高频词Top20。这张表用于分析内容特征与用户互动之间的关联。第三张是时间维度表。把行为数据按天聚合统计每日新增视频数、每日弹幕量、每日活跃用户数用于观察整体走势和周期性规律。三张表都算好了分析阶段就相当于有了米后面做什么菜都方便。3.4 把民间“查成分”思路正式化从单用户画像到群体分群前面提到UID查成分工具它本质上是给单个用户做画像。但在课题里单用户画像只是起点更有价值的是群体分群。你可以先用同样的逻辑给每个用户算兴趣向量然后把所有用户放在一起聚类看平台上到底存在哪几类用户群体——有人是深度二次元有人是科技区常客有人是游戏爱好者还有人天天在生活区闲逛。这种群体分群就是所谓的“用户圈层”。它和民间工具最大的区别在于民间工具是点对点的个人查询娱乐性强而你的课题是站在宏观视角看整个平台的用户结构分析不同群体的规模、活跃度、内容偏好差异这就有研究价值了。4. 分析模型与结论产出行为数据背后的用户分层4.1 改造RFM模型适配B站的互动体系RFM模型是用户价值分析里的经典方法常规定义是最近一次消费时间Recency、消费频率Frequency和消费金额Monetary。但B站用户不花钱消费不考虑充电和直播打赏的话所以必须改造。我把三个维度重新定义为RRecency用户最近一次互动距今的天数互动包括发弹幕、发评论、投币、收藏、分享。FFrequency统计周期内用户的互动总次数。MMonetary改叫Engagement互动深度。不是所有互动都一个权重我给每个行为打了分发弹幕1分、发评论2分、点赞1分、收藏2分、投币3分、分享3分。加权求和得到综合互动指数。每个维度按三分位分成高、中、低三档组合起来就有27种用户类型再合并成几大类核心用户高R高F高M、活跃用户高R高F低M、潜力用户高R低F低M、沉默用户低R低F低M、流失风险用户低R低F高M但R很低等。分完层之后每类用户的数量占比、行为特征一目了然。4.2 兴趣向量与用户分群算出来给你看用户分层做完再叠加兴趣维度。我给每个用户建了一个分区兴趣向量向量的每一维是对应分区的行为次数占比比如某个用户游戏区行为占60%、科技区占30%、其他占10%那他的兴趣向量就是(0, 0.3, 0, 0.6, 0.1, ...)这样一组数。有了向量就可以做聚类了。我在Spark MLlib里用K-Means做了聚类选K值的时候用肘部法则看误差平方和的拐点最后确定分成6个群。每个群里的用户兴趣中心一目了然有的是“游戏生活”型有的是“动画音乐”型有的是“科技知识”型。把分群结果和上一节的RFM分层做交叉能得出非常有价值的结论比如“科技知识”型用户虽然数量不多但互动深度普遍偏高是典型的高质量用户而某些泛娱乐型用户数量大但互动主要集中在弹幕上投币收藏比例低。这类交叉分析的价值在于它揭示了平台用户生态的结构性规律。写论文的时候这部分内容分量很足答辩也好讲。4.3 弹幕语义与情感分析不能只停留在词频层面弹幕分析如果只做词频统计会显得技术含量不够。我加了两个层面的分析高频词共现网络和情感时间线。高频词共现网络是把同一视频弹幕里高频词两两组合统计它们在同一条视频里共同出现的频率频率高的词对说明它们在话题上强关联。把网络图画出来能看到一个视频讨论的核心议题是什么以及议题之间有什么关系。比如一个科技区的评测视频词云里可能出现“续航”“发热”“拍照”“价格”这些词共现网络能看出“续航”和“发热”经常一起被讨论。情感时间线是把弹幕按视频进度时间切分成多个窗口每个窗口做情感识别画出情感曲线。这个曲线能直观反映视频内容节奏对观众情绪的带动作用——一个成功的视频往往是情绪波峰和视频内容的高潮点高度重合的。情感识别我用的是SnowNLP做初版分类效果不够好的时候又用标注数据微调了一个小模型在弹幕这种短文本上表现比通用模型好不少。4.4 从统计结果到业务含义分析结论怎么落地分析做得再深落不到业务含义上答辩的时候就会被问“所以呢”。我总结了三个层面的业务结论用户运营层面根据分层结果不同价值用户需要不同的运营策略。核心用户数量少但贡献大要重点维系沉默用户占比高需要通过推送召回潜力用户互动意愿强但深度不够可以通过引导一键三连转化为高价值用户。内容生态层面从视频维度的数据可以看出不同分区的互动转化率差异明显。知识区和科技区的投币率远高于娱乐区说明用户对“干货型”内容的认可度更高这类视频的商业价值和社区价值都更大。推荐策略层面用户的兴趣向量和分群结果天然可以作为个性化推荐的输入维度。聚类发现用户确实存在明显的圈层结构推荐系统可以在圈层内做扩散而不是只依赖单个用户的历史行为。每一层结论都对应真实的业务场景导师和答辩老师一听就能感受到这个项目的实际价值。5. 可视化落地让分析结果真正可看可用5.1 可视化技术选型从快速出图到完整大屏可视化部分我做了两套东西一套是分析报告用的快速出图一套是答辩展示用的可视化大屏。技术选型上有清晰的层次。快速出图我用的是Python生态Matplotlib和Seaborn做常规统计图pyecharts做交互图表。这些库的优势是产出快跑完分析顺手就出图了适合放在论文里和开题报告里。大屏部分我选了ECharts作为核心图表库前端框架用的Vue 3后端是FastAPI。ECharts对中文社区的数据可视化支持最好文档全、示例多、交互能力强该有的图表类型都有。网页版改快捷键这种需求也简单ECharts的toolbox自带保存图片、查看数据等功能按键配置一下就有不用自己造轮子。5.2 大屏的信息架构一屏讲清楚一个完整故事可视化大屏不是把图表堆上去就完事了信息架构远比图表数量重要。我当时设计的大屏分四个区域逻辑上是“总—分—细”的递进关系顶部是核心指标卡区放最关键的几个数字采集视频总数、弹幕总量、识别用户数、整体互动率。这些数字让看的人第一眼就建立全局认知。中部左侧是用户分析区放用户分层的漏斗图和用户活跃时段热力图。漏斗显示不同价值层级的用户数量占比热力图展示用户在一天24小时内的活跃分布规律。中部右侧是内容分析区放分区热度排行和分区互动转化率对比图。这里能直观看出哪些分区流量大、哪些分区互动质量高。底部是弹幕分析区放弹幕高频词云和弹幕情感时间线示例。词云展示用户讨论的焦点情感曲线展示特定爆款视频的情绪起伏配合起来很有冲击力。这个结构下来站在大屏前不用讲一个字看图就能把整个项目的内容理解个七七八八。5.3 实时刷新与数据下钻别把大屏做成静态PPT很多人的大屏做完是静态的好看但经不起追问。我做了两个增强功能效果很好。实时刷新后端FastAPI启动一个定时任务每隔10秒从Kafka消费最新采集的数据汇总后推送到Redis前端通过WebSocket订阅Redis的更新事件一旦有变化就局部刷新图表。现场演示的时候我开着采集脚本大屏上的弹幕总量数字自己在跳那种“活”的感觉比任何语言都有说服力。Python加FastAPI加WebSocket的技术栈很成熟实现起来并不复杂。数据下钻大屏上的图表不是死的。点击分区热度排行里的某个分区下面会联动展示该分区下的视频Top榜再点某个视频能弹出这个视频的弹幕情感曲线和高频词。从宏观到微观一层层钻下去整个系统就像一棵数据树。评委可以从任何感兴趣的地方继续探索这比对着PPT讲十分钟有效得多。5.4 可视化与分析报告的配合各有各的用处做完整套东西之后我最大的体会是可视化大屏和分析报告是两种不同的表达方式二者互补没法互相替代。大屏适合展示结论和成果适合答辩开场和演示环节直观、有冲击力短时间内让人对整个项目建立信任感。但大屏不适合讲推导过程因为它的空间有限放不下完整的分析逻辑。分析报告则负责展示严谨性。从数据采集规模、清洗规则、特征定义、模型参数、实验结果到结论推导每一步都有据可查。老师想看细节的时候报告比大屏可靠得多。答辩之前把两块都准备好讲的时候以报告为主线、以大屏为辅助节奏就很舒服。6. 开题报告的撰写节奏与答辩避坑6.1 开题报告的结构怎么组织最稳妥开题报告的核心是让导师和评审老师相信三件事题目值得做、你能做出来、你计划做得完。我的报告结构是标准的六段式一、选题背景与研究意义从B站平台生态讲起引出用户行为分析的价值。二、国内外研究现状分三块综述用户画像研究、弹幕文本分析研究、数据可视化研究然后指出现有研究的不足和本课题的切入点。三、研究内容与技术路线列出四个研究模块——数据采集与存储、数据清洗与特征工程、用户行为分析与建模、可视化系统设计与实现。每个模块配一段说明和对应的技术栈。四、预期成果与创新点三个创新方向——融合多源行为数据构建用户兴趣画像、基于分层和聚类揭示用户圈层结构、实现数据采集到展示的全链路自动化。五、进度安排按周排期。六、参考文献真实的、读过的文献列10到15篇开题报告阶段不需要太多但每一篇都要真的读过因为答辩会问。这个结构的好处是逻辑清晰、覆盖全面绝大多数评审老师看了不会有异议。6.2 技术选型的“为什么”口径答辩前一定要背熟技术选型是答辩提问的重灾区。老师不一定要求你用最前沿的技术但你得能说清楚为什么选这个不选那个。我整理了几个高频问题先说答案再说原因为什么用Spark不用MapReduce因为MapReduce对迭代式计算支持差每个MapReduce任务都要落盘而K-Means聚类这类算法需要多轮迭代Spark基于内存计算迭代效率高出一个数量级。而且Spark提供MLlib组件算法接口现成不用自己造轮子。为什么加Kafka这层因为采集端和处理端需要解耦。采集速度受网络和平台限制会波动如果采集脚本直接把数据写进数据库上游抖动会影响下游。加了Kafka之后采集端只负责往消息队列丢数据处理端按自己的节奏消费整个系统稳定性大增。这一条也直接回答“数据管道怎么设计”的问题。为什么可视化选ECharts不选国外那几家一是中文支持好二是和Vue生态整合方便三是对实时数据更新的支持成熟WebSocket推送过来直接更新。四是社区例子多遇到问题能快速找到解决方案。这三个问题准备好了大屏上任何一个组件被追问你都能从业务需求讲到技术选型再到实现细节。6.3 排期、风险与兜底方案开题报告里最容易忽视的部分进度安排如果只是简单写“第1-2周调研、第3-4周采集”这种话等于没写。我是按里程碑拆的每一阶段都有可交付成果第1-2周文献调研和开题报告撰写交付开题报告初稿。第3-6周采集系统开发与数据获取交付采集脚本、数据集初始版本。这一阶段要留缓冲时间处理接口变动和反爬策略调整弹幕接口升级导致解析代码重写我遇到过不止一次。第7-9周数据清洗与特征工程交付清洗后的结构化数据集和特征表。第10-13周分析建模交付用户分层模型、兴趣聚类结果、弹幕情感分析报告。第14-16周可视化大屏开发交付可视化系统。第17-18周论文撰写和答辩准备预留两周缓冲。风险控制也要写而且是实打实的方案。我当时列了三个主要风险数据获取不稳定、数据质量不达标、模型效果不理想。分别给的兜底方案是使用公开数据集做备选、扩大采集范围并加强清洗规则、降级为统计描述性分析。写清楚这些评审会认为你是真的在考虑怎么落地而不是画饼。6.4 答辩现场的经验这些坑我替你踩过了最后集中整理几条答辩现场的真实经验都是我自己或身边同学踩过的坑。第一介绍项目的时候先讲清楚数据规模这是大数据项目说服力的基础。不要说“采集了几万条”要说“采集了1000个视频、共获取约280万条弹幕和12万条评论识别出约25万个活跃用户标识”具体数字一出来项目的真实感完全不一样。第二主动提及数据合规性。答辩老师一定会问到数据来源与其被问到时支支吾吾不如自己主动说所有数据均为平台公开数据采集频率严格受控不涉及非公开信息数据仅用于学术研究。这一句话能避免之后所有关于隐私和合规的穷追猛打。第三提前准备好“一句话版本”的项目介绍。老师让你用一分钟介绍项目的时候怎么讲我当时练的是这是一个面向B站社区的用户行为分析项目我采集了公开的弹幕评论等行为数据用Spark做了清洗建模识别出六类具有不同兴趣特征的用户群体最后通过可视化大屏把分析结果完整展示出来。40秒讲完信息量密度极高老师听完基本就有数了。第四演示大屏之前一定关闭所有无关窗口备好一个本地演示环境。现场网络不稳定是常有的事我见过同学在大屏演示时因为网络卡顿导致图表加载不出来半天打不开页面全场沉默的尴尬场面。这个项目做下来我最大的感受是它真正难的地方不在某一个具体算法而在于把整条数据链路跑通——从采集到存储、清洗、建模、可视化每一环都会出幺蛾子你都得逐一解决。但恰恰是这种打通全链路的经验才是开题报告里最有说服力的部分。开题的时候我紧张得手心冒汗后来发现只要数据合法、链路完整、逻辑自洽老师们不会为难你。最后分享一个小技巧给你的大屏加一个自动轮播答辩现场挂着演示模式进场的时候大屏自己在跑数据在动图表在切换那个画面第一眼就能把气场拉起来。后面再配合谢幕时的问答环节整场答辩的节奏就会很稳。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进