用Python+Matplotlib搞定地铁客流分析:从Excel数据到散点图、柱状图实战

张开发
2026/4/4 12:41:32 15 分钟阅读
用Python+Matplotlib搞定地铁客流分析:从Excel数据到散点图、柱状图实战
PythonMatplotlib地铁客流分析实战从数据清洗到可视化洞察地铁作为城市交通的动脉每天承载着数百万人的出行需求。对于运营管理者来说理解客流规律是优化调度、提升服务的关键对于商业开发者而言掌握客流趋势意味着精准选址的可能。本文将带你用Python和Matplotlib从一份真实的Excel客流数据出发完成从基础图表到多维分析的全流程实战。1. 数据准备与环境搭建在开始分析前我们需要确保工具链的完整性。推荐使用Anaconda发行版它预装了数据分析三件套Python、Jupyter Notebook和主要科学计算库。conda create -n subway_analysis python3.9 conda activate subway_analysis conda install pandas matplotlib openpyxl假设我们获得的原始数据是metro_flow_2023.xlsx包含以下字段字段名类型说明station_idint站点唯一标识time_slotstr时段如07:00-08:00entry_flowint进站客流人次exit_flowint出站客流人次datestr观测日期YYYY-MM-DD提示实际数据中可能包含异常值或缺失值建议先用pandas的describe()方法快速了解数据分布import pandas as pd df pd.read_excel(metro_flow_2023.xlsx) print(df.describe())2. 单站点时序分析散点图与折线图对比选择人流量中等的155号站作为分析样本先观察其24小时进站客流分布。散点图适合展示原始数据点分布而折线图能更清晰呈现趋势变化。import matplotlib.pyplot as plt station_155 df[df[station_id] 155].sort_values(time_slot) plt.figure(figsize(12, 6)) plt.scatter(station_155[time_slot], station_155[entry_flow], alpha0.6, label原始数据点) plt.plot(station_155[time_slot], station_155[entry_flow], r-, linewidth2, label趋势线) plt.xticks(rotation45) plt.xlabel(时段) plt.ylabel(进站人次) plt.title(155号站24小时进站客流分布) plt.legend() plt.tight_layout() plt.show()关键观察点早高峰07:00-09:00呈现典型的脉冲式增长午间11:00-13:00出现小高峰晚高峰17:00-19:00持续时间比早高峰更长3. 多站点对比分析柱状图与箱线图应用比较相邻站点155、157、151、123的日均客流柱状图能直观展示总量差异而箱线图则揭示数据分布特征。# 计算各站日均客流 daily_avg df.groupby(station_id)[entry_flow].mean().loc[[155, 157, 151, 123]] plt.figure(figsize(10, 5)) plt.subplot(1, 2, 1) daily_avg.plot(kindbar, color[#1f77b4, #ff7f0e, #2ca02c, #d62728]) plt.ylabel(日均进站人次) plt.title(四站点日均客流对比) plt.subplot(1, 2, 2) station_data [df[df[station_id]sid][entry_flow] for sid in [155,157,151,123]] plt.boxplot(station_data, labels[155,157,151,123]) plt.ylabel(进站人次分布) plt.title(客流分布箱线图) plt.tight_layout()分析发现155站虽然日均客流不是最高但存在更多极端高峰值123站客流稳定适合设置常规商业设施157站早晚高峰差异最大可能需要弹性调度4. 客流时空矩阵热力图与子图组合要同时分析时间和空间维度可以创建热力图展示各时段各站点的客流强度并用子图组合多个视角。from matplotlib.colors import LinearSegmentedColormap # 创建时段-站点客流矩阵 time_station df.pivot_table(indextime_slot, columnsstation_id, valuesentry_flow, aggfuncmean) plt.figure(figsize(15, 8)) plt.subplot(2, 1, 1) custom_cmap LinearSegmentedColormap.from_list(custom, [#f7fbff,#4292c6,#08306b]) plt.imshow(time_station.T, aspectauto, cmapcustom_cmap) plt.colorbar(label客流强度) plt.yticks(range(len(time_station.columns)), time_station.columns) plt.title(各站点分时段客流热力图) plt.subplot(2, 2, 3) df[hour] pd.to_datetime(df[time_slot].str[:5]).dt.hour hourly_avg df.groupby(hour)[entry_flow].mean() hourly_avg.plot(kindarea, alpha0.5) plt.title(全路网小时级客流趋势) plt.subplot(2, 2, 4) top_stations df.groupby(station_id)[entry_flow].sum().nlargest(5) top_stations.plot(kindpie, autopct%1.1f%%) plt.ylabel() plt.title(客流总量TOP5站点) plt.tight_layout()5. 高级分析技巧客流预测与异常检测在基础可视化之上我们可以结合统计学方法进行深度分析。例如使用移动平均平滑数据或通过Z-score识别异常客流日。from scipy import stats import numpy as np # 计算7天移动平均 station_155[7d_avg] station_155[entry_flow].rolling(window7).mean() # 异常值检测 z_scores np.abs(stats.zscore(station_155[entry_flow])) anomalies station_155[z_scores 3] plt.figure(figsize(12, 6)) plt.plot(station_155[date], station_155[entry_flow], label实际客流, alpha0.5) plt.plot(station_155[date], station_155[7d_avg], r-, label7日移动平均) plt.scatter(anomalies[date], anomalies[entry_flow], colorblack, markerx, s100, label异常值) plt.xticks(rotation45) plt.legend() plt.title(155号站客流趋势与异常检测)实际项目中这种分析能帮助运营方快速发现设备故障、大型活动等特殊情况导致的客流异常及时调整应急预案。

更多文章