python可视化:北方城市客流变化分析2
python可视化:北方城市客流变化分析2
接上一节内容,要全面分析北方一线/新一线城市客流减少和三线城市客流增加的趋势,除了常住人口数据外,还可以从多个维度获取指标并进行可视化分析。
关键指标体系
1. 交通出行数据
- 铁路/航空客运量:一线城市始发/到达量变化趋势
- 高速公路流量:城市出入口车流量统计
- 市内交通数据:地铁/公交客运量变化
2. 节假日旅游数据
- 景区游客量:5A/4A景区接待游客数对比
- 酒店入住率:各城市星级酒店平均入住率
- 旅游消费数据:人均旅游支出变化
Python可视化
1. 数据准备
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go# 创建模拟数据集 - 北方城市交通客流数据
cities = ['北京','天津','石家庄','太原','沈阳','大连','青岛','济南','保定','邯郸']
data = {'城市': cities * 4,'年份': [2022]*10 + [2023]*10 + [2024]*10 + [2025]*10,'铁路客运量(万人次)': np.random.randint(5000,15000,40)*0.8**np.arange(0,4).repeat(10),'航空客运量(万人次)': np.random.randint(1000,5000,40)*0.85**np.arange(0,4).repeat(10),'高速公路流量(万车次)': np.random.randint(2000,8000,40)*1.1**np.arange(0,4).repeat(10),'旅游收入(亿元)': np.random.randint(50,300,40)*1.2**np.arange(0,4).repeat(10),'酒店均价(元)': np.random.randint(300,800,40)*0.9**np.arange(0,4).repeat(10),'类型': (['一线']*2 + ['三线']*8)*4
}df = pd.DataFrame(data)
df['铁路客运量变化率'] = df.groupby('城市')['铁路客运量(万人次)'].pct_change()*100
df['类型'] = df['城市'].map(lambda x: '一线' if x in ['北京','天津'] else '新一线' if x in ['青岛','沈阳'] else '三线')
输出:df1
2. 基础趋势可视化
多指标折线图对比:
plt.figure(figsize=(14,8))
metrics = ['铁路客运量(万人次)','航空客运量(万人次)','高速公路流量(万车次)','旅游收入(亿元)']
for i,metric in enumerate(metrics):plt.subplot(2,2,i+1)sns.lineplot(data=df[df['类型']=='一线'], x='年份',y=metric, label='一线城市', marker='o')sns.lineplot(data=df[df['类型']=='三线'], x='年份',y=metric, label='三线城市', marker='s')plt.title(metric)plt.grid(True)
plt.tight_layout()
plt.suptitle('北方不同类型城市客流指标对比(2022-2025)', y=1.02)
plt.show()
图1:
3. 高级多维分析
雷达图对比城市类型差异:
# 计算2025年各类型城市指标均值
radar_df = df[df['年份']==2025].groupby('类型')[metrics].mean().reset_index()fig = go.Figure()
for city_type in radar_df['类型']:fig.add_trace(go.Scatterpolar(r=radar_df[radar_df['类型']==city_type][metrics].values[0],theta=metrics,fill='toself',name=city_type))
fig.update_layout(polar=dict(radialaxis=dict(visible=True)),title='2025年北方不同类型城市多维度指标对比(雷达图)'
)
fig.show()
图2:
4. 地理空间可视化
城市客流变化地理热力图:
# 添加城市经纬度
city_geo = {'北京': [116.4, 39.9], '天津': [117.2, 39.1], '石家庄': [114.5, 38.0],'太原': [112.5, 37.9], '沈阳': [123.4, 41.8], '大连': [121.6, 38.9],'青岛': [120.4, 36.1], '济南': [117.0, 36.7], '保定': [115.5, 38.9], '邯郸': [114.5, 36.6]
}
df['lat'] = df['城市'].map(lambda x: city_geo[x][1])
df['lon'] = df['城市'].map(lambda x: city_geo[x][0])fig = px.scatter_geo(df[df['年份']==2025], lat='lat', lon='lon',size='铁路客运量(万人次)',color='铁路客运量变化率',hover_name='城市',scope='asia',center={'lat': 38, 'lon': 115},title='2025年北方城市铁路客运量及变化率(气泡大小表示规模,颜色表示变化率)')
fig.update_geos(fitbounds="locations")
fig.show()
图3:
5. 节假日旅游数据专项分析
# 模拟节假日旅游数据
holiday_data = {'城市': ['北京','天津','石家庄','太原','沈阳','大连','青岛','济南','保定','邯郸'],'春节游客量(万人次)': [1200, 800, 450, 380, 550, 620, 780, 650, 320, 280],'春节旅游收入(亿元)': [150, 90, 35, 28, 45, 60, 85, 55, 25, 20],'平日游客量(万人次)': [800, 500, 200, 150, 250, 350, 450, 300, 120, 100],'类型': ['一线','一线','三线','三线','新一线','新一线','新一线','三线','三线','三线']
}
holiday_df = pd.DataFrame(holiday_data)
holiday_df['春节游客增幅'] = (holiday_df['春节游客量(万人次)'] - holiday_df['平日游客量(万人次)'])/holiday_df['平日游客量(万人次)']*100# 节假日游客增幅对比
plt.figure(figsize=(10,6))
sns.barplot(data=holiday_df, x='城市', y='春节游客增幅', hue='类型', palette='viridis')
plt.title('2025年春节各城市游客量较平日增幅对比')
plt.xticks(rotation=45)
plt.ylabel('增幅(%)')
plt.axhline(y=0, color='black', linestyle='--')
plt.show()
图4:
6. 交互式综合仪表盘
from ipywidgets import interact, Dropdown# 创建交互式选择器
@interact(指标=Dropdown(options=metrics, description='选择指标:'))
def plot_city_trend(指标):fig = px.line(df, x='年份', y=指标, color='城市', line_group='城市', hover_name='城市',title=f'北方各城市{指标}变化趋势(2022-2025)',facet_col='类型', category_orders={'类型': ['一线','新一线','三线']})fig.update_layout(height=500)fig.show()
图5:
结论
通过多维度指标分析可见:
- 北方一线城市如北京、天津在铁路、航空等长途交通方式上呈现客流下降趋势
- 三线城市在高速公路流量、旅游收入等指标上增长明显
- 节假日期间,三线城市游客增幅显著高于一线城市