Python 数据分析实战指南:从数据清洗到出报告
一、为什么使用 Python 进行数据分析
优势:
- 自动化处理大数据量
- 绘图无需手动调整格式
- 免费开源,社区资源丰富
常见误区:
- '不会编程学不会':Python 语法简洁,易上手
介绍使用 Python 进行数据分析的全流程。涵盖环境安装、Pandas 数据清洗(缺失值处理、类型转换)、分组聚合分析以及 Matplotlib 和 Seaborn 可视化图表绘制。通过电商案例演示了从数据加载到生成报告的实际操作,并总结了常见编码与显示问题的解决方案。适合希望快速掌握数据处理技能的初学者。
优势:
常见误区:
推荐使用 Jupyter Notebook。
# 安装所需库
pip install pandas matplotlib seaborn plotly geopandas
验证安装:在 Notebook 中输入 import pandas,无报错即成功。
import pandas as pd
df = pd.read_csv('sales_data.csv')
print(df.head())
若为 Excel 文件:pd.read_excel('data.xlsx')。
# 填充缺失值
df['price'].fillna(0, inplace=True)
# 删除重复行
df.drop_duplicates(inplace=True)
# 转换日期格式
df['date'] = pd.to_datetime(df['date'])
# 检查数据类型
print(df.info())
注意:价格列缺失值建议用平均值填充 df['price'].mean()。
# 分组聚合
grouped = df.groupby('category')['sales'].mean()
# 计算占比
df['ratio'] = df['sales'] / df['sales'].sum()
# 滚动平均
df['3day_avg'] = df['sales'].rolling(window=3).mean()
原则:一个图表表达一个核心结论。
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(df['date'], df['sales'], marker='o')
plt.title('每日销售额趋势')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('sales_trend.png')
plt.show()
import seaborn as sns
# 分布图
sns.histplot(df['sales'], kde=True)
plt.title('销售额分布')
plt.show()
# 箱线图
plt.figure(figsize=(10, 6))
sns.boxplot(x='category', y='sales', data=df)
plt.title('不同类别销售额对比')
plt.show()
# 热力图
corr = df.corr()
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.show()
plt.figure(figsize=(15, 10))
plt.subplot(2, 1, 1)
sns.lineplot(x='date', y='sales', data=df)
plt.title('每日销售额趋势')
plt.subplot(2, 1, 2)
df.groupby('category')['sales'].sum().plot(kind='pie', autopct='%1.1f%%')
plt.title('品类销售占比')
plt.tight_layout()
plt.savefig('analysis_report.png')
plt.show()
import plotly.express as px
fig = px.line(df, x='date', y='sales', color='category', title='交互式销售额趋势')
fig.update_layout(xaxis_title='日期', yaxis_title='销售额')
fig.show()
import geopandas as gpd
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world['gdp_per_capita'] = world['gdp_md_est'] / world['pop_est']
world.plot(column='gdp_per_capita', cmap='OrRd', legend=True, figsize=(12, 8))
plt.title('各国人均 GDP')
plt.show()
df = pd.read_excel('orders.xlsx')
df['order_date'] = pd.to_datetime(df['order_date'])
df['order_hour'] = df['order_date'].dt.hour
df = df[df['amount'] > 0]
# 每日销售额趋势
daily_sales = df.resample('D', on='order_date')['amount'].sum()
# 品类销售占比
category_sales = df.groupby('category')['amount'].sum().sort_values(ascending=False)
# 用户购买频次
user_frequency = df.groupby('user_id').size().value_counts().sort_index()
plt.figure(figsize=(15, 12))
plt.subplot(3, 1, 1)
daily_sales.plot(marker='o')
plt.title('每日销售额趋势')
plt.subplot(3, 1, 2)
category_sales.plot(kind='pie', autopct='%1.1f%%', startangle=90)
plt.title('品类销售占比')
plt.subplot(3, 1, 3)
user_frequency.plot(kind='bar')
plt.title('用户购买频次分布')
plt.xlabel('购买次数')
plt.ylabel('用户数')
plt.tight_layout()
plt.savefig('ecommerce_report.png')
plt.show()
| 问题 | 错误做法 | 正确做法 | 原因 |
|---|---|---|---|
| 中文显示乱码 | plt.title('销售额') | plt.rcParams['font.sans-serif'] = ['SimHei'] | Matplotlib 默认不支持中文 |
| 图表不显示 | 缺少 plt.show() | 必须加 plt.show() | Jupyter 需显式显示 |
| 数据类型错误 | df['date'] = '2023-01-01' | df['date'] = pd.to_datetime(df['date']) | 日期需转为 datetime 类型 |
| 画图太小 | plt.figure() | plt.figure(figsize=(12,6)) | 需设置合适尺寸 |
| 缺失值处理不当 | df.dropna() | df.dropna(subset=['amount']) | 仅删除关键列缺失值 |
数据分析师的核心能力在于用数据说清问题。建议先用 Pandas 清洗数据集,再用 Seaborn 绘制图表,最后生成报告。记住:'代码写得再好,如果无法清晰传达业务价值,效果有限。'建议尝试使用 Titanic 数据集练习本文代码,修改参数观察变化。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online