Python 数据分析实战:从零搭建数据看板

数据分析是 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
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容