ARTICLE DETAIL

资讯详情

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

第二次作业脱胎换骨:共享单车数据可视化报告复盘

第二次作业脱胎换骨:共享单车数据可视化报告复盘 第二次作业这四个字大概是所有经历过学习和培训的人绕不开的一道坎。第一次作业你还能用“不懂规则”当借口到了第二次规则清楚了、工具熟了、演示套路也见过了反而容易陷入一种奇怪的焦虑做得太普通怕被说没进步做得太花哨又怕时间不够。我最近正好在带一个数据分析类的训练营给学员布置了第二次作业——完成一份数据可视化报告很多人在开始前都跑来问同一个问题第二次作业到底怎么做才能脱胎换骨而不是把第一次的毛病换个数据集再犯一遍为了回答这个问题我自己动手做了一份示范作业用的是一份城市共享单车骑行记录数据从选题、清洗、可视化到最终交付完整走了一遍。这篇文章就是这次复盘的全过程不光是给学员看的任何正在面对“第二次作业”或者类似项目交付的朋友都可以参考这里面的拆解思路和执行方法。1. 复盘第一次作业把批评翻译成改进清单第二次作业的质量一半取决于你如何看待第一次作业的反馈。大多数人拿到批语扫一眼分数就翻篇了这其实是最亏的。我自己的习惯是拿到批语后先做一次“翻译工作”——把那些模棱两可的评价转成下一轮能直接执行的动作。我第一次做示范作业时图快把各省份的GDP数据做成了一个多子图的大拼盘纯技术的角度没什么毛病折线图、柱状图、饼图全都用上了但最后得到的批语是“看不到分析重点更像数据搬运。”这句话我看第一遍是不服气的数据摆得清清楚楚怎么叫搬运呢后来才明白它说的是“你只告诉了我数据是什么没告诉我数据说明了什么”。1.1 作业反馈里的三种“黑话”与翻译我把这些年见过的作业批语和项目评审意见归纳成三类几乎每个都是同一个套路反馈原文可能的真实含义本次作业的对应动作“内容不够丰富深度不足”只做了描述性统计没有回答一个具体问题先写清楚核心论点再围绕论点选图表“图表太多找不到重点”缺少叙事主线评审不知道先看哪里收敛交付范围只保留三张主图“技术有亮点但像在炫技”使用了复杂方法但没解释为什么每个图表下方必须写“一句话发现”这个表格我每次布置作业都会发给学员因为它能逼着人把模糊的批评变成具体任务。比如“找不到重点”这条翻译过来就是“你要做一个摘要页把结论写在最前面”而不是继续在最后补一段“总结与展望”。1.2 改进清单实战从一句话到三条任务拿我丢人的第一次GDP作业举例从那条“数据搬运”的批语里我给自己列了五条改进动作只保留三张能支撑核心论点的图表其余全部丢到附录。每张图下面写一句“我发现……”写不出来就重画这张图。所有数据口径必须写注释比如“GDP使用名义值还是实际值”。报告第一页改成“结论先行”用100字说完全文重点。加上一页“局限与改进”主动承认哪些问题没解决。这五条里没有一条是“学新功能”或“上新技术”但效果立竿见影。第二次作业的质量会明显提升不是因为工具用得更花哨而是因为叙事逻辑顺了。1.3 启动前算一笔账时间分配表还有个容易被忽略的问题——多少人做第二次作业时比第一次还缺时间因为新鲜感过去了手头又多了论文、考核、实习一堆事。所以打开项目之前我会建议先花十分钟算一笔账。下面是我给训练营学员的一个基础时间分配表总共按10小时可用时间设计阶段预计耗时核心任务复盘第一次作业1.5小时提炼改进清单确定本次不做什么选题与拆解1小时定核心问题圈定数据范围数据清洗与检查2.5小时处理缺失值、格式、口径问题可视化制作2.5小时完成三张主图写一句话发现打磨与演示2小时自检、试讲、归档别小看“复盘1.5小时”这一行。很多人宁愿纠结两天选题也不肯回头花半小时看看上次怎么挂的结果就是在同一个坑里再摔一次。第二次作业最不需要的就是“从零开始”它是站在第一次废墟上盖楼的过程。2. 把“第二次作业”拆成一道能完成的题第二次作业通常会给你更大的自由度比如“自选主题”“自选数据”这对新手来说反而是灾难。没有限制等于无限纠结我见过太多人花了一星期选数据集最后做出来的东西还不如第一次。第二次的关键不是“做得更多”而是“把范围缩小到能讲清楚”。2.1 好题目自带一个“真问题”一份可视化报告如果只是展示数据那叫图表集不叫报告。真正好的题目应该自带一个可以回答的问题而且这个问题最好带一点立场能被反驳。同样面对共享单车数据我列过几个候选题目“共享单车的潮汐现象有多严重”“工作日和非工作日骑行规律差在哪”“早晚高峰哪些站点的供需最紧张”我最后选了第二个工作日与非工作日骑行规律差在哪。原因很简单它有清晰的对比例子也只有两种状态需要处理结果容易解释。像“潮汐现象”这种题目看似大气做起来要引入供需模型第二次作业的时间根本不够填。2.2 范围控制三张图讲一个故事无论你有多想炫技第二次作业的交付物建议控制在三张主图内。我自己这份示范作业最终也只交了三张主图回答的问题图表类型主图1工作日和非工作日全天用车趋势有什么差别双折线图主图2骑行热度在空间上是如何分布的站点聚合气泡图主图3早高峰最拥挤的站点集中在什么位置横向柱状图这三张图连起来就是一个完整的叙事先从时间维度发现“早晚高峰双峰”这个规律再从空间维度看这些峰值发生在哪里最后聚焦到“最拥挤的站点”。每一步都是从上一张图长出来的而不是三张无关的图表拼凑。如果有“很想放进去”的其他图比如天气影响、骑行时长分布我的做法是全部降级到附录。附录里的内容可以证明你做了探索但不会打乱主报告的节奏。2.3 数据准备拿到手先做四件事这次示范作业使用的是一份CSV格式的骑行记录包含了站点ID、站点名称、开始时间、结束时间等字段一共30多万行。拿到这种数据我建议先用四步建立基本认知再做任何处理import pandas as pd df pd.read_csv(bike_data.csv) # 1. 看一眼有多少行多少列 print(Shape:, df.shape) # 2. 看前几行确认字段含义 print(df.head()) # 3. 看每个字段的类型 print(df.dtypes) # 4. 查看时间字段的范围 print(Start time range:, df[start_time].min(), -, df[start_time].max())这四步输出的信息量很大。你立刻就知道数据量是否在自己的电脑能处理的范围内字段有没有需要解析的文本时间范围是否覆盖了想要的周期。有个学员曾经跳过这一步直接跑聚合跑到一半发现日期字段里混了三种格式整个清洗脚本全部推翻重写。先看结构再动手能省掉很多返工。3. 数据清洗的第二次境界少炫技、多设防第一次做数据类作业的时候很多人喜欢把清洗写成一条链式调用pandas方法一个接一个串起来看起来特别厉害。我也干过这事但后来发现链式调用一旦中间某一步出错报错信息会把人绕晕。第二次作业我更推荐分阶段清洗每个阶段都输出一条检查信息方便定位问题。df[start_time] pd.to_datetime(df[start_time]) # 转成标准时间格式 df[hour] df[start_time].dt.hour # 提取小时 df[date] df[start_time].dt.date # 提取日期 # 处理关键字段的缺失 df df.dropna(subset[start_station_id, end_station_id]) print(After dropping missing stations:, df.shape)这段代码很简单但每一步都留了检查空间。如果你发现“After dropping missing stations”之后行数少得离谱说明数据质量比你想象的差这时候停下来查原因比闷头继续画图重要得多。3.1 三个“隐形脏数据”现场比显式缺失值更坑人的是那些看起来正常、实际上带着问题的数据。这次共享单车数据里我遇到了三个典型的坑。第一个坑是时间戳格式不一致。同一个文件里一部分是“2023-05-01 08:30:00”另一部分是“2023/5/1 8:30”pd.to_datetime能处理这两种格式但坑在于它会静默解析个别日期还可能解析成NaT。处理完必须检查产生了多少个NaTtime_errors df[start_time].isna().sum() print(f时间解析失败: {time_errors} 条)如果这个数字是0继续如果达到几千条那说明污染比例太大需要用更严格的format参数重新解析。第二个坑是站点名不一致。数据里有个站点一会儿写“东单路口西”一会儿写“东单路口西南侧”如果不归一化后续按名称聚合就会拆成两个站点图形上出现不该有的分离。解决办法很朴素——建立一个字典手动映射station_map { 东单路口西南侧: 东单路口西, 东单路口西南: 东单路口西, } df[station_name] df[station_name].replace(station_map)别嫌这种手工活低级数据清洗里80%的工作都是这种“对账”功夫。第三个坑是工作日和节假日的判定。不少人直接用“周六周日”来区分工作日和休息日结果把调休安排全搞错了。比如五一前的那个周日其实是工作日中秋节假期的某一天可能是调休后的休息日。我建议引入一个节假日表或者直接使用现成的节假日库把每一天都打上“工作日/休息日/法定节假日”的标签。这一步直接决定了你的对比图是否可信。3.2 清洗完必须输出一份“可信度小结”清洗结束不能直接画图我会强制自己先写一段类似数据说明书的东西原始记录342,118 条剔除缺失站点记录1,231 条剔除时间解析异常68 条最终纳入分析340,819 条分析时间范围2023-04-01 至 2023-04-30这段小结我会直接放进报告的数据来源注释里。它有两个作用对内防止自己遗忘处理逻辑对外告诉评审“这份结果不是黑箱”。尤其当数据量很大时一段可信度小结能让项目的专业度提升一个台阶。4. 图表叙事的成人礼让三张图组成一个故事到这一步数据已经干净了接下来才是第二次作业的核心战场可视化。第一次作业做图表大家普遍的问题是“把数据画出来就结束”。第二次的要求是“让图表自己会说话”。我要求学员对每张图做一句话测试——图做完了必须能写下这句句式“从这张图我发现了……”。写不出来或者写出来跟图没关系的一律重画。4.1 第一张图工作日与非工作日的双峰对比我先画了24小时用车趋势图用两条折线分别代表工作日和休息日。横轴是0到23点纵轴是每小时的用车量。这张图的产出结论非常直接工作日的用车曲线是典型的“双峰”——早上8点一个峰晚上18点一个峰。休息日的曲线是“单峰”——从上午10点缓慢爬升到下午14点到16点之间最高然后下降。这个发现看起来简单但它揭示了城市共享单车的核心属性这是一个典型的通勤工具通勤需求主导了整体运营节奏。如果没有数据底座你也能猜到但有了这张图就可以把它作为整份报告的基调。画这张图的代码不复杂关键是分组聚合的逻辑要对usage df.groupby([date_type, hour]).size().reset_index(namecount) workday usage[usage[date_type] 工作日] restday usage[usage[date_type] 休息日] plt.plot(workday[hour], workday[count], label工作日) plt.plot(restday[hour], restday[count], label休息日) plt.xlabel(小时) plt.ylabel(用车量次) plt.legend()我第一次画这张图的时候犯过一个典型错误没把数据按日期类型分组直接画了全量所有天的平均曲线结果两条线几乎重合什么结论也说不出来。分组维度没想清楚图再怎么美化都是白搭。4.2 第二张图空间热度不是点密度第二张图我画的是站点热度分布。很多学员会习惯性把所有站点用车量渲染在真实地图上然后得到一张密密麻麻的点阵看着很酷信息量却很低。第二次作业的空间图我建议做聚合后再呈现。这次是先把所有站点的用车总量算出来再用经纬度画气泡图用气泡大小和颜色深浅同时编码数量。这时你看到的不是一个一个点而是几个明显的热点区域比如核心商务区、大型地铁换乘站附近。这中间要特别小心色阶的选择。同一张图里最大和最小值的量级可能差出100倍如果使用线性色阶小站点会全部糊成同一颜色。我习惯对数量取对数变换或者在图例里明确标注“气泡面积为用车量对数”这样才不会让读者产生误判。至于要不要用GIS库画真实地图我觉得第二次作业完全不需要。一张带经纬度坐标的散点图加一个城市底图的轮廓就足够支撑结论了。引入过多地图库只会增加环境配置的难度生产力会被严重拖慢。4.3 第三张图横向柱状图的“减法原则”第三张图我锁定在早高峰的用车量TOP15站点。因为站点名称是中文长文本我选了横向柱状图把站点名放在纵轴数值放在横轴。横向布局能保证文字可读不需要旋转角度。这里有个很关键的细节排序之后我只把前三个站名做了加粗标注其余保持默认。因为这张图要讲述的结论只有一个——“早高峰的拥挤集中在少数几个核心站点”而不是“所有站点都拥挤”。如果30个站点全部突出视觉上等于什么都没说。给这张图配的一句话发现是“早高峰用车量TOP3站点合计占比达到18%且全部位于地铁换乘站500米范围内。”这句结论既结合了图又结合了站点位置信息比单纯写“TOP15站点分布图”有价值得多。4.4 叙事顺序结论先行的摘要页图表全做完之后我把它们组装进报告时特意调整了顺序摘要页放在最前面三张主图按“时间规律 → 空间规律 → 节点聚焦”的顺序展开而不是按完成时间先后排列。摘要页只写三段话第一段点明“工作日的早晚高峰形成双峰共享单车承担了重要的通勤接驳功能”第二段说“热度集中的热点区域呈现明显聚集”第三段说“少数站点贡献了不成比例的用车量”。每一句话都指向一张主图。这样读者看完整份报告只需要3分钟剩下的时间可以用来验证和深入。这个“结论先行”的套路大家第一次做作业的时候基本都不会用。第二次作业学会它等于迈过了从“学生思维”到“职场交付思维”的那道坎。5. 演示、打磨与交付作业变身作品的最后一公里图表做完了报告装订好很多人觉得任务完成了但我认为第二次作业和第一次最显著的差距在最后一个环节——交付前的打磨。5.1 三轮“陌生化检查”我打磨的顺序是三轮检查每一轮都有明确的目的。第一轮是数据一致性核查。拿着清洗后的统计数字和每张图上的数值逐一对照。图例写的是“次”还是“辆”柱子顶端的数字是不是聚合后的行数这一轮最能暴露低级错误比如我示范作业里的第一版热量图上图例单位写成了“人”但数据里根本没有人字段纯粹是复制模板时带出来的。第二轮是“自嗨元素”清理。把报告中所有与核心论点无关的内容删掉。我第一次做作业时特别爱写“本次分析使用了Python3.10和Seaborn库”仿佛工具本身就值得表扬。实际上评审只关心你发现了什么。这一轮要对自己狠一点凡是删掉后不影响理解的段落全部删掉。第三轮是三分钟测试。找一个对这个数据完全陌生的人让他用3分钟读完报告然后复述他看到了什么。如果对方能把“工作日双峰”“核心站点聚集”这两点说出来说明叙事成立了如果对方只能说出“画了很多图”说明报告的整体结构还需要调整。5.2 “反思笔记”才是隐藏加分项第二次作业如果想冲高分我强烈建议在报告的最后一页加一个短小的反思段落回答三个问题我在分析中做了哪些关键选择比如为什么用“工作日/休息日”而不是“周一/周二”来分组。什么情况下结论不成立我这份示范作业只选了一个月的数据如果换到炎热夏季曲线形态可能变化。如果时间充足我会补做什么比如加入天气因素、站点密度归一化、流量方向分析。别小看这三问。它展示的不是“我掌握了某些技术”而是“我具备批判性审视自己工作的能力”。这一点恰恰是第一次作业中最稀缺的。评审看到这部分时通常会认为你比其他学员更成熟也更适合承担独立项目。5.3 归档与复用把作业做成简历素材最后一个容易被忽略的点是归档。第二次作业的交完它不应该静静地躺在下载文件夹里发霉而应该成为作品集里的一个可用资产。我的归档方式是固定的目录结构project_root/ ├── README.md # 项目说明与复现步骤 ├── data/ # 原始数据或数据来源说明 ├── scripts/ # 清洗与可视化脚本 ├── report.pdf # 最终报告 └── figs/ # 图表源文件其中README里必须写清楚两件事一是数据集从哪里来二是运行脚本需要哪些依赖。这个习惯在求职或者后续项目复用时会救你一命。我见过不少人三个月后翻自己的作业看着scripts文件夹里的untitled1.py完全想不起来当时的处理逻辑最后只能全部重做。把作业按“可复现项目”标准归档意味着你不再只是交了一次差而是在积累个人知识库。这个习惯比任何一次作业分数都值钱。最后说一点我的私人体会跟“第二次作业”缠斗过很多轮之后我越来越确信一件事决定作业质量的从来不是你用了多新的库、画了多少张图而是你有没有从上次的批评里提炼出清晰的动作。我做任何新项目时都会把上一次的反馈批语截图放在文档顶部等项目做完再删掉。这个小小的仪式感会让我在每一步都记得“这次我是来解决问题的不是来表演搬运的。”如果你现在也正对着第二次作业发愁先别急着打开代码编辑器。回去翻翻上一次的批语哪怕只有一行“缺少重点”它都是一个很好的起点。把这一行翻译成三件具体的事再做下去你会发现第二次作业并没有想象中那么难。
返回列表