数据处理与可视化案例:用Python分析新冠肺炎趋势 🌐📊
作者注:本文使用小学生都能理解的日常比喻,手把手教你用代码处理数据和画图,附带超详细代码注解!无需编程基础,跟着做就会!
案例背景:分析疫情数据
假设你是一位社区志愿者,需要向居民展示疫情蔓延趋势。你从疾控中心获得了2020年1-3月某地区的每日数据(CSV格式):
日期,新增确诊,新增康复,现存病例
2020-01-20,5,0,5
2020-01-21,12,0,17
...
目标:
- ✔️ 处理不完整数据
- ✔️ 找出新增确诊最多的3天
- ✔️ 绘制动态变化趋势图
一、数据处理:给数据做“大扫除”🧹
🛠 工具准备:Pandas库
就像用Excel整理表格,Python的Pandas(简称「熊猫」库)是数据处理的瑞士军刀
# 安装必备工具(只需运行一次)
!pip install pandas matplotlib
📥 第一步:读取数据
import pandas as pd
# 像打开文件夹一样读取数据
data = pd.read_csv('covid_data.csv')
print("原始数据预览:")
print(data.head()) # 显示前5行,像Excel的预览功能
🧼 第二步:数据清洗
常见问题处理:
# 1. 处理缺失值(如空单元格)
# 用前后两天的平均值填充(比如把空值变成左右日期的平均数)
data = data.fillna(method='ffill').fillna(method='bfill')
# 2. 删除重复行(像Excel的"删除重复值")
data = data.drop_duplicates()
# 3. 日期格式转换(确保系统能识别日期)
data['日期'] = pd.to_datetime(data['日期'])
二、数据分析:让数据开口说话 📈
🔎 关键指标分析
# 找最严重的三天 -> 像班级排名,选出前三名
top3_days = data.nlargest(3, '新增确诊')
print("\n新增确诊最多三天:")
print(top3_days[['日期', '新增确诊']])
# 计算治愈率 -> 做个算术题
data['治愈率'] = data['新增康复'] / data['新增确诊'] * 100
三、图形绘制:数据变动画 🎨
🛠 工具准备:Matplotlib库
画图就像在纸上绘制统计图表,这里使用Python的"Matplotlib"(数学绘图库)
📈 1. 绘制双指标发展趋势图
import matplotlib.pyplot as plt
plt.figure(figsize=(12,6)) # 设置画布大小(单位:英寸)
# 绘制折线图:就像用彩笔连点成线
plt.plot(data['日期'], data['新增确诊'],
color='red',
label='新增确诊',
marker='o') # 每个数据点用圆圈标记
plt.plot(data['日期'], data['新增康复'],
color='green',
linestyle='--',
label='新增康复')
# 添加装饰元素
plt.title('2020年新冠病例趋势 📅', fontsize=14) # 设置标题
plt.xlabel('日期 📆') # X轴标签
plt.ylabel('人数 👥') # Y轴标签
plt.legend() # 显示图例(右上角的小图标说明)
plt.grid(True, linestyle=':') # 添加虚线网格
# 自动旋转日期标签,避免重叠
plt.gcf().autofmt_xdate()
plt.show()
效果图预览:
📊 2. 绘制治愈率柱状图
plt.figure(figsize=(10,5))
# 绘制柱状图:每个柱子对应一天的数值
bars = plt.bar(data['日期'],
data['治愈率'],
color='skyblue',
alpha=0.7) # 透明度设置为70%
# 在柱子顶部添加数值标签
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height,
f'{height:.1f}%', # 显示到小数点后1位
ha='center', va='bottom') # 水平居中,垂直底部对齐
plt.title('每日新冠治愈率柱状图 💊')
plt.xticks(rotation=45) # X轴标签旋转45度
plt.ylim(0, 120) # Y轴范围从0到120%
plt.show()
四、实战技巧:让图表会说话 💡
🎨 图表美化技巧
# 设置全局字体(支持中文字体)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 添加注释重点信息
max_day = data.loc[data['新增确诊'].idxmax()]
plt.annotate(f'最高峰!\n{max_day["新增确诊"]}人',
xy=(max_day['日期'], max_day['新增确诊']),
xytext=(30,30), # 文本偏移量
textcoords='offset points',
arrowprops=dict(arrowstyle='->', color='darkred'))
👩💻 自动生成HTML报告
# 把图表和表格保存为网页
with open('report.html', 'w', encoding='utf-8') as f:
f.write("<h1>新冠疫情分析报告</h1>")
f.write(top3_days.to_html()) # 表格转成HTML
# 插入图片(需提前保存图片)
f.write('<img src="./covid_trend.png" width="800">')
五、常见问题解答 ❓
Q:如何安装Python环境?
A:推荐使用Anaconda(下载地址:https://www.anaconda.com/),安装时勾选"Add to Path"
Q:数据里出现负数怎么办?
A:在读取数据后添加验证:
if (data.select_dtypes(include=['number']) < 0).any().any():
print("发现异常负值!请检查数据准确性")
Q:怎样才能让图表动起来?
A:使用Plotly
库即可轻松创建交互式图表,示例代码:
import plotly.express as px
fig = px.line(data, x='日期', y=['新增确诊','新增康复'])
fig.show() # 会出现可缩放、悬停提示的动态图
扩展训练:
👉 尝试在代码中加入病死率 = 死亡病例 / 确诊病例
:使用Plotly
库即可轻松创建交互式图表,示例代码:
import plotly.express as px
fig = px.line(data, x='日期', y=['新增确诊','新增康复'])
fig.show() # 会出现可缩放、悬停提示的动态图
扩展训练:
👉 尝试在代码中加入病死率 = 死亡病例 / 确诊病例
👉 用散点图