Python 数据分析实战:多场景数据处理与可视化全解析

在数据驱动的时代,掌握数据分析技能至关重要。本文将带你使用 Python 中的 pandas、numpy 和 matplotlib 库,对地铁客流、网约车订单、体检中心健康和健身房运动四类真实场景的数据进行完整分析。每个案例都包含数据清洗、统计计算、可视化呈现和结果解读。

一、地铁客流数据分析

代码

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 1. 读取 CSV 文件数据,计算每个站点的总客流(进站人数 + 出站人数),添加为新列。
df = pd.read_csv("地铁客流数据.csv")
df['总客流'] = df['进站人数'] + df['出站人数']
print(df)
total = df.groupby('站点名称')['总客流'].sum()
print(total)

# 2. 按 "线路" 和 "时段" 双重分组,统计不同线路、不同时段的平均进站人数。
avg_in = df.groupby(['线路', '时段 (早高峰/平峰/晚高峰)'])['进站人数'].mean()
print(avg_in)

# 3. 提取 "日期" 中的月份,统计每月的总客流(所有站点进出站之和),绘制柱状图。
df['日期'] = pd.to_datetime(df['日期']) # 字符串转换为datetime
df['月份'] = df['日期'].dt.month
total_month = df.groupby('月份')['总客流'].sum()
plt.bar(total_month.index, total_month)
plt.show()

# 4. 计算每个站点进站人数与出站人数的相关系数。
station = df.groupby('站点名称').agg({
    '进站人数':'sum',
    '出站人数':'sum'
}).sort_index()
print(station)
corr = station['进站人数'].corr(station['出站人数'])
print(corr)

# 5. 筛选出总客流前 10 的站点,绘制水平柱状图展示结果。
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体
total = total.sort_values(ascending=False) # 降序排序
top10 = total[:10]
print(top10)
plt.bar(top10.index, top10)
plt.show()

代码结果

代码分析

  • 数据预处理 :使用 pd.read_csv 读取数据,通过列运算添加"总客流"列。
  • 分组统计 :利用 groupby 实现单分组和双重分组统计,结合 sum()mean() 完成聚合计算。
  • 时间处理 :通过 pd.to_datetime 转换日期格式,提取月份进行月度统计。
  • 相关性分析 :先按站点聚合进出站人数,再使用 corr() 计算相关系数。
  • 可视化 :使用 plt.bar 绘制柱状图,并设置中文字体防止乱码。
  • 数据筛选 :通过 sort_values 和切片获取 Top10 数据。

二、网约车订单数据分析

代码

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt

# 1. 读取 CSV 文件数据,计算订单总费用(起步价 + 行程距离 × 里程费 + 附加费),添加为新列。
data = pd.read_csv(
    "网约车订单数据.csv",
    index_col="订单ID"
)
data['订单量'] = [1 for i in range(data.shape[0])]
data['总费用'] = data['起步价 (元)'] + data['行程距离 (km)']*data['里程费 (元/km)'] + data['附加费 (元)']
print(data)

# 2. 按 "出发时间" 提取小时信息,统计各小时的订单量和平均行程距离。
data['出发时间'] = pd.to_datetime(data['出发时间'])
data['小时'] = data['出发时间'].dt.hour
state = data.groupby('小时').agg({
    '订单量':'sum',
    '行程距离 (km)':'mean'
})
print(state)

# 3. 计算总费用的最大值、最小值、均值和标准差。
total_sales_state = data['总费用'].agg(['max', 'min', 'mean', 'std'])
print(total_sales_state)

# 4. 按行程距离分组(0-5km、5-10km、10km+),统计每组的订单数和平均总费用,绘制柱状图。
data_taxi = data.groupby('行程距离 (km)').agg({
    '订单量':'sum',
    '总费用':'mean'
})
plt.bar(data_taxi.index, data_taxi['订单量'])
plt.show()
plt.bar(data_taxi.index, data_taxi['总费用'])
plt.show()

# 5. 保存行程距离 ≥10km 的订单数据为 "长途订单.csv"(不含索引)。
new_data = data[data['行程距离 (km)'] >= 10]
print(new_data)
new_data.to_csv("长途订单.csv")

代码结果

代码分析

  • 费用计算:通过列运算实现总费用公式,注意单位为元。
  • 时间提取 :使用 dt.hour 提取小时信息,便于按小时聚合。
  • 多指标聚合 :在 groupby 后使用 agg 同时计算多个统计量。
  • 分组统计 :直接按数值列分组,但更佳做法是使用 pd.cut 进行区间分组。
  • 数据筛选与导出 :使用布尔索引筛选长途订单,to_csv 导出时设置 index=False 可省略索引。

三、体检中心健康数据分析

代码

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 1. 读取 CSV 文件数据,判断是否为高血压(收缩压 ≥140 或舒张压 ≥90),添加 "是否高血压" 列(是 / 否)。
df = pd.read_csv(
    "体检数据.csv",
    index_col="体检编号"
)
df['是否高血压'] = np.where((df['收缩压 (mmHg)']>=140)|(df['舒张压 (mmHg)'] >= 90), '是', '否')
print(df)

# 2. 按 "性别" 和 "年龄分组"(18-30、31-50、50+)双重分组,统计每组的高血压比例。
df['年龄分组'] = pd.cut(
    df['年龄'],
    bins=[17, 30, 50, np.inf],
    labels=['18-30', '31-50', '50+'],
    right=False
)
print(df)
state = df.groupby(['性别', '年龄分组'])['是否高血压'].apply(lambda x:(x == '是').mean()).reset_index()
state['高血压比例'] = state['是否高血压'].round(3) * 100
print(state)

# 3. 计算空腹血糖与胆固醇的相关系数。
corr = df['空腹血糖 (mmol/L)'].corr(df['胆固醇 (mmol/L)'])
print(corr)

# 4. 按性别分组,统计收缩压、舒张压、空腹血糖的均值和方差(使用 agg 函数)。
df_mean = df.groupby('性别').agg({
    '收缩压 (mmHg)':'mean',
    '舒张压 (mmHg)':'mean',
    '空腹血糖 (mmol/L)':'mean'
})
print(df_mean)
df_var = df.groupby('性别').agg({
    '收缩压 (mmHg)':'var',
    '舒张压 (mmHg)':'var',
    '空腹血糖 (mmol/L)':'var'
})
print(df_var)

# 5. 绘制男性和女性的平均收缩压对比柱状图。
plt.bar(df_mean.index, df_mean['收缩压 (mmHg)'])
plt.show()

代码结果

代码分析

  • 条件判断列 :使用 np.where 实现条件判断,生成分类列。
  • 区间分组pd.cut 可将连续年龄离散化为年龄段,right=False 表示左闭右开。
  • 比例计算 :在 groupby 后使用 apply 结合 lambda 函数计算高血压比例。
  • 多函数聚合agg 可同时指定多个统计函数,也可分别计算均值和方差。
  • 简单可视化:直接使用分组聚合结果绘制柱状图,直观对比性别差异。

四、健身房运动数据分析

代码

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt

# 1. 读取 CSV 文件数据,将 "运动日期" 转换为 datetime 格式。
data = pd.read_csv(
    "健身房数据.csv",
    index_col="用户ID"
)
data['运动日期'] = pd.to_datetime(data['运动日期'])
print(data)

# 2. 按 "运动类型" 分组,统计平均运动时长、平均消耗热量和用户数。
data['用户个数'] = [1 for i in range(data.shape[0])]
state = data.groupby('运动类型 (有氧/力量/综合)').agg({
    '运动时长 (分钟)':'mean',
    '消耗热量 (大卡)':'mean',
    '用户个数':'sum'
})
print(state)

# 3. 提取 "运动日期" 中的月份,统计每月的总运动时长,绘制折线图。
data['月份'] = data['运动日期'].dt.month
month_day = data.groupby('月份')['运动时长 (分钟)'].sum()
plt.plot(month_day.index, month_day)
plt.show()

# 4. 计算运动时长与消耗热量的相关系数。
corr = data['运动时长 (分钟)'].corr(data['消耗热量 (大卡)'])
print(corr)

# 5. 筛选出消耗热量 ≥500 大卡的记录,保存为 "高强度运动记录.csv"(不含索引)。
new_Data = data[data['消耗热量 (大卡)'] >= 500]
print(new_Data)
new_Data.to_csv('高强度运动记录.csv')

代码结果

代码分析

  • 日期处理pd.to_datetime 将字符串转为时间格式,便于提取月份。
  • 用户计数 :通过添加值为1的列实现计数,也可直接用 size() 统计。
  • 折线图适用场景:月度趋势数据适合用折线图展示变化趋势。
  • 相关性分析:直接计算两数值列的相关系数,评估线性关系强度。
  • 数据筛选与导出:筛选高强度记录并导出为 CSV,便于后续分析。

总结

通过这四个完整的数据分析案例,我们实践了以下核心技能:

  1. 数据读取与预处理:使用 pandas 读取 CSV、处理日期、添加衍生列。
  2. 数据分组与聚合 :灵活运用 groupby 进行单维度、多维度和条件分组统计。
  3. 统计计算:掌握均值、总和、方差、相关系数等常用统计量的计算。
  4. 数据可视化:使用 matplotlib 绘制柱状图、折线图,直观展示数据分布与趋势。
  5. 数据导出:将处理结果保存为新文件,便于后续使用或分享。

提示:实际运行时请确保 CSV 文件与代码在同一目录,或使用完整文件路径。若中文显示异常,可调整 matplotlib 字体设置或使用英文标签。

相关推荐
程序员三藏1 小时前
如何用Postman做接口自动化测试?
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
n***27191 小时前
JAVA (Springboot) i18n国际化语言配置
java·spring boot·python
心无旁骛~1 小时前
python多进程multiprocessing——spawn启动方式解析
开发语言·python
家家小迷弟2 小时前
docker容器内部安装python和numpy的方法
python·docker·numpy
conkl2 小时前
Python中的鸭子类型:理解动态类型的力量
开发语言·python·动态·鸭子类型·动态类型规划
故事挺秃然2 小时前
Python异步(Asyncio)(一)
服务器·网络·python
大飞记Python2 小时前
【2025全攻略】PyCharm专业版 / 社区版如何打开.db 数据库文件
数据库·python·sql·pycharm
坚持就完事了2 小时前
数据结构之链表
数据结构·python·算法·链表
木头左2 小时前
自动化超参搜索框架在PCA参数调优中的应用
python