数据分析是 Python 最强大的应用领域之一。作为冉冉博客的 Python 教程系列,今天带你从零搭建一个完整的数据分析看板。
一、环境搭建
数据分析四大核心库:
pip install pandas numpy matplotlib seaborn
pandas 处理数据,numpy 做计算,matplotlib + seaborn 画图表。
二、数据清洗与预处理
真实数据都有问题,清洗是第一步:
import pandas as pd
# 读取数据
df = pd.read_csv('sales_data.csv')
# 查看基本信息
print(df.shape) # 行列数
print(df.dtypes) # 数据类型
print(df.isnull().sum()) # 缺失值统计
# 处理缺失值
df['price'].fillna(df['price'].median(), inplace=True)
df.dropna(subset=['customer_id'], inplace=True)
# 处理异常值
q1 = df['amount'].quantile(0.25)
q3 = df['amount'].quantile(0.75)
iqr = q3 - q1
df = df[(df['amount'] >= q1 - 1.5*iqr) & (df['amount'] <= q3 + 1.5*iqr)]
# 日期处理
df['order_date'] = pd.to_datetime(df['order_date'])
df['month'] = df['order_date'].dt.month
df['weekday'] = df['order_date'].dt.day_name()
三、统计分析
# 月度销售趋势
monthly_sales = df.groupby('month')['amount'].agg(['sum', 'mean', 'count'])
print(monthly_sales)
# 客户分层
customer_stats = df.groupby('customer_id').agg(
total_spent=('amount', 'sum'),
order_count=('amount', 'count'),
avg_order=('amount', 'mean')
)
# RFM 分析
import datetime
ref_date = df['order_date'].max() + datetime.timedelta(days=1)
rfm = df.groupby('customer_id').agg({
'order_date': lambda x: (ref_date - x.max()).days, # Recency
'order_id': 'count', # Frequency
'amount': 'sum' # Monetary
})
rfm.columns = ['recency', 'frequency', 'monetary']
# 客户分群
rfm['r_score'] = pd.qcut(rfm['recency'], 4, labels=[4,3,2,1])
rfm['f_score'] = pd.qcut(rfm['frequency'], 4, labels=[1,2,3,4])
rfm['m_score'] = pd.qcut(rfm['monetary'], 4, labels=[1,2,3,4])
rfm['rfm_score'] = rfm['r_score'].astype(str) + rfm['f_score'].astype(str) + rfm['m_score'].astype(str)
四、数据可视化
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 图1: 月度销售趋势
fig, ax = plt.subplots(figsize=(12, 5))
monthly_data = df.groupby('month')['amount'].sum()
ax.plot(monthly_data.index, monthly_data.values, 'b-o', linewidth=2)
ax.fill_between(monthly_data.index, monthly_data.values, alpha=0.2)
ax.set_title('月度销售趋势')
ax.set_xlabel('月份')
ax.set_ylabel('销售额')
plt.savefig('monthly_trend.png', dpi=150, bbox_inches='tight')
# 图2: 品类销售占比
fig, ax = plt.subplots(figsize=(8, 8))
category_data = df.groupby('category')['amount'].sum()
ax.pie(category_data, labels=category_data.index, autopct='%1.1f%%',
colors=sns.color_palette('Set2'))
ax.set_title('品类销售占比')
plt.savefig('category_pie.png', dpi=150, bbox_inches='tight')
# 图3: 客户消费分布
fig, ax = plt.subplots(figsize=(10, 6))
sns.histplot(rfm['monetary'], bins=50, kde=True, ax=ax)
ax.set_title('客户消费金额分布')
ax.set_xlabel('消费金额')
plt.savefig('customer_dist.png', dpi=150, bbox_inches='tight')
五、生成自动化报表
def generate_report(df, output_path='report.xlsx'):
"""生成数据分析报表"""
with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
# Sheet1: 概览
summary = pd.DataFrame({
'指标': ['总销售额', '订单数', '客单价', '客户数'],
'数值': [
f"¥{df['amount'].sum():,.2f}",
df['order_id'].nunique(),
f"¥{df['amount'].mean():,.2f}",
df['customer_id'].nunique()
]
})
summary.to_excel(writer, sheet_name='概览', index=False)
# Sheet2: 月度数据
monthly = df.groupby('month').agg(
销售额=('amount', 'sum'),
订单数=('order_id', 'count'),
客单价=('amount', 'mean')
).round(2)
monthly.to_excel(writer, sheet_name='月度分析')
# Sheet3: 品类数据
category = df.groupby('category').agg(
销售额=('amount', 'sum'),
占比=('amount', lambda x: x.sum() / df['amount'].sum())
).round(4)
category.to_excel(writer, sheet_name='品类分析')
generate_report(df)
六、定时执行
# schedule_daily.py
import schedule
import time
def daily_analysis():
print('开始每日分析...')
df = pd.read_csv('sales_data.csv')
generate_report(df)
print('报表生成完成!')
schedule.every().day.at('08:00').do(daily_analysis)
while True:
schedule.run_pending()
time.sleep(60)
Python 数据分析的核心就是 pandas + 可视化,掌握这些工具就能应对大部分分析需求。更多 Python 实战教程,欢迎持续关注冉冉博客。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END















暂无评论内容