先说说数据清洗这个重头戏。拿到手的CSV文件简直惨不忍睹:用户年龄有200岁的,骑行时长有负数的,坐标点漂到太平洋的。直接用pandas的describe()函数看了个大概,心里就有底了。处理异常值时用了quantile()方法,把骑行时长超过97%分位数的数据统统归为异常值。至于缺失值,用isnull().sum()快速统计后,发现只有少量用户性别字段缺失,干脆用fillna('Unknown')单独标记。
接下来是探索性分析。用groupby()统计不同用户群的骑行习惯时发现个有趣现象:工作日的早晚高峰明显,但周末的骑行高峰却出现在下午2-5点。更意外的是,35岁左右的用户群体平均骑行时长最长,而不是想象中的年轻人。这个发现后来被客户用来调整车辆调度策略,据说调度效率提升了20%。
可视化环节我用了subplot组合图。左上角放工作日/周末对比折线图,右上角是用户年龄分布直方图,下面用热力图展示24小时骑行密度。这里有个小技巧:用plt.tight_layout()自动调整间距,省去手动调参数的麻烦。颜色方案选了seaborn的deep调色板,比matplotlib默认颜色更专业。
深度分析时玩了把交叉分析。用pd.crosstab()计算不同年龄段在工作日/周末的骑行偏好,结果发现50岁以上用户更喜欢周末骑行,而25岁以下用户工作日的使用频率更高。这个洞察直接影响了客户的营销策略------他们后来针对不同年龄段推出了差异化优惠券。
最后用聚类分析做了用户分群。先用StandardScaler标准化数据,然后扔进KMeans算法。根据手肘法确定分4类最合适:通勤族、休闲骑行者、高频用户和偶尔使用者。这个分类结果用散点图呈现时,客户一眼就看懂了用户结构。
写完这份报告最大的体会是:数据分析师要像侦探一样从数据里找故事。Python就是最得力的放大镜和指纹采集器------pandas负责梳理线索,matplotlib负责还原现场,sklearn则像DNA检测仪。记住几个关键点:数据清洗要狠,可视化要直观,结论要落地。下次遇到类似项目,完全可以把这个分析框架复用过来,只需要根据业务需求调整特征工程部分就行了。