如何用Python分析城市与运动变量的共现关联并实现可视化
Python实现运动项目-城市受欢迎度分析方案
1. 依赖库导入
import pandas as pd import scipy.stats as stats import matplotlib.pyplot as plt import seaborn as sns # 配置中文显示避免乱码 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
2. 统计列表计算与输出
2.1 构建/导入数据集
自有数据集直接用pd.read_csv()导入即可,以下为模拟样例数据参考:
# 模拟1000条样本,覆盖3个城市、4种运动 data = pd.DataFrame({ 'City': ['City1']*300 + ['City2']*400 + ['City3']*300, 'Sport': ['Sport1']*80 + ['Sport2']*120 + ['Sport3']*60 + ['Sport4']*40 + ['Sport1']*50 + ['Sport2']*200 + ['Sport3']*70 + ['Sport4']*80 + ['Sport1']*100 + ['Sport2']*70 + ['Sport3']*90 + ['Sport4']*40 })
2.2 交叉统计计算
分别计算绝对参与人数、各城市内运动占比两种统计结果,消除城市人口基数差异影响:
# 1. 绝对参与人数交叉表 count_cross = pd.crosstab(index=data['Sport'], columns=data['City']) print("各城市各运动参与人数统计:") print(count_cross) # 导出为csv格式统计列表 count_cross.to_csv("运动参与人数统计.csv", encoding='utf-8-sig') # 2. 城市内占比统计 rate_cross = pd.crosstab(index=data['Sport'], columns=data['City'], normalize='columns') * 100 print("\n各城市运动参与占比统计(单位:%):") print(rate_cross.round(2)) rate_cross.to_csv("运动参与占比统计.csv", encoding='utf-8-sig')
2.3 显著性差异检验
用卡方独立性检验验证「运动项目受欢迎度和城市无关」的原假设是否成立:
chi2, p_value, dof, expected = stats.chi2_contingency(count_cross) print(f"\n卡方检验结果: chi2值={chi2:.2f}, p值={p_value:.4f}") if p_value < 0.05: print("结论:不同城市的运动项目受欢迎度存在显著差异") else: print("结论:没有足够证据证明不同城市的运动项目受欢迎度存在差异")
3. 可视化展示
3.1 分组柱状图(对比同项目在不同城市的参与度差异)
plt.figure(figsize=(10,6)) count_cross.plot(kind='bar', ax=plt.gca()) plt.title('不同城市各运动参与人数对比') plt.xlabel('运动项目') plt.ylabel('参与人数') plt.xticks(rotation=0) plt.legend(title='城市') plt.show()
如需展示占比,将上述代码中count_cross替换为rate_cross即可。
3.2 热力图(直观定位高参与度的城市-运动组合)
plt.figure(figsize=(8,6)) sns.heatmap(rate_cross, annot=True, fmt='.1f', cmap='Blues', cbar_kws={'label': '参与占比(%)'}) plt.title('各城市运动项目参与占比热力图') plt.xlabel('城市') plt.ylabel('运动项目') plt.show()
内容的提问来源于stack exchange,提问作者praha1984
相关产品推荐
相关产品推荐

