Python数据分析实战:从数据清洗到可视化全流程
1. 项目概述
这个Python数据分析实战项目系列的第一篇,将带大家从零开始掌握数据分析的核心技能。不同于市面上那些只讲理论不落地的教程,我们直接通过真实商业场景数据集,手把手教你完成从数据清洗到可视化呈现的全流程。
为什么选择Python作为数据分析工具?简单来说就是"瑞士军刀"般的全能性。Python拥有pandas这样的数据处理神器,matplotlib这样的可视化利器,还有scikit-learn这样的机器学习库,从简单的数据整理到复杂的预测建模都能搞定。更重要的是,它的语法对新手极其友好,不像R语言那样需要统计学背景,也不像Java那样需要复杂的配置。
2. 环境准备与工具配置
2.1 Python环境安装
建议直接安装Anaconda发行版,它已经集成了数据分析所需的全部核心库。最新版的Anaconda可以从官网免费下载,安装时记得勾选"Add to PATH"选项。安装完成后,在命令行输入conda list检查是否包含以下关键包:
- pandas (1.5.0+)
- numpy (1.23.0+)
- matplotlib (3.6.0+)
- jupyter (1.0.0+)
2.2 Jupyter Notebook使用技巧
数据分析师最爱的交互式工具非Jupyter Notebook莫属。启动方式很简单,在Anaconda Navigator中点击启动,或者命令行输入jupyter notebook。分享几个提高效率的快捷键:
- Shift+Enter:运行当前单元格
- Esc+M:将单元格转为Markdown格式
- B:在当前单元格下方新增单元格
注意:建议为每个项目单独创建虚拟环境,避免包版本冲突。使用
conda create -n myenv python=3.9创建环境,conda activate myenv激活环境。
3. 数据集介绍与加载
3.1 餐厅订单数据集
我们使用一个真实的餐厅经营数据集,包含以下关键字段:
- order_id:订单编号
- order_date:下单日期时间
- item_name:菜品名称
- quantity:点餐数量
- product_price:单品价格
- total_items:订单总商品数
- payment_type:支付方式
数据集以CSV格式存储,使用pandas加载只需一行代码:
import pandas as pd df = pd.read_csv('restaurant_orders.csv', parse_dates=['order_date'])3.2 数据质量检查
加载后立即执行这组检查命令:
print(df.shape) # 查看数据规模 print(df.info()) # 查看字段类型 print(df.isnull().sum()) # 检查缺失值 print(df.describe()) # 数值型字段统计常见问题处理方案:
- 日期格式混乱:用
pd.to_datetime()强制转换 - 价格包含货币符号:
df['price'] = df['price'].str.replace('$','').astype(float) - 分类字段空格:
df['category'] = df['category'].str.strip()
4. 数据清洗实战
4.1 处理缺失值
根据业务场景选择适当策略:
- 删除整行:
df.dropna() - 填充默认值:
df.fillna(0) - 向前/向后填充:
df.fillna(method='ffill')
对于我们的餐厅数据,菜品价格缺失可以直接删除,因为无法进行后续分析:
df = df.dropna(subset=['product_price'])4.2 异常值检测与处理
使用箱线图快速定位异常值:
import matplotlib.pyplot as plt plt.boxplot(df['quantity']) plt.show()处理方案示例:
# 定义合理范围 q_low = df['quantity'].quantile(0.01) q_high = df['quantity'].quantile(0.99) # 过滤超出范围的值 df = df[(df['quantity'] > q_low) & (df['quantity'] < q_high)]4.3 数据转换技巧
创建衍生字段往往能揭示更深层信息:
# 提取小时时段 df['hour'] = df['order_date'].dt.hour # 计算订单总金额 df['total_amount'] = df['quantity'] * df['product_price'] # 菜品分类映射 category_map = {'汉堡':'主食', '薯条':'小食', '可乐':'饮料'} df['category'] = df['item_name'].map(category_map)5. 探索性数据分析(EDA)
5.1 基础统计分析
使用pandas内置方法快速洞察数据:
# 各菜品销量TOP5 df['item_name'].value_counts().head(5) # 支付方式占比 df['payment_type'].value_counts(normalize=True) # 分时段平均消费金额 df.groupby('hour')['total_amount'].mean()5.2 可视化分析
销售趋势分析
daily_sales = df.resample('D', on='order_date')['total_amount'].sum() daily_sales.plot(figsize=(12,6), title='Daily Sales Trend') plt.ylabel('Total Sales') plt.show()热销商品分析
top_items = df['item_name'].value_counts().head(10) top_items.plot(kind='barh', figsize=(10,6)) plt.title('Top 10 Popular Items') plt.xlabel('Sales Count') plt.show()支付方式偏好
pay_type = df['payment_type'].value_counts() plt.pie(pay_type, labels=pay_type.index, autopct='%1.1f%%') plt.title('Payment Method Distribution') plt.show()6. 深入业务分析
6.1 客单价分析
计算并可视化不同时间段的客单价变化:
order_totals = df.groupby('order_id')['total_amount'].sum() plt.hist(order_totals, bins=30) plt.title('Order Value Distribution') plt.xlabel('Amount') plt.ylabel('Frequency') plt.show()6.2 菜品组合分析
使用关联规则挖掘常一起购买的商品:
from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import apriori # 按订单分组菜品 orders = df.groupby('order_id')['item_name'].apply(list).values.tolist() # 转换格式并应用Apriori算法 te = TransactionEncoder() te_ary = te.fit(orders).transform(orders) df_encoded = pd.DataFrame(te_ary, columns=te.columns_) frequent_itemsets = apriori(df_encoded, min_support=0.02, use_colnames=True)6.3 用户消费行为聚类
使用RFM模型分析客户价值:
# 计算最近消费时间(R) snapshot_date = df['order_date'].max() + pd.Timedelta(days=1) rfm = df.groupby('customer_id').agg({ 'order_date': lambda x: (snapshot_date - x.max()).days, 'order_id': 'count', 'total_amount': 'sum' }) rfm.columns = ['recency', 'frequency', 'monetary'] # 分箱处理 rfm['R'] = pd.qcut(rfm['recency'], 5, labels=[5,4,3,2,1]) rfm['F'] = pd.qcut(rfm['frequency'], 5, labels=[1,2,3,4,5]) rfm['M'] = pd.qcut(rfm['monetary'], 5, labels=[1,2,3,4,5]) rfm['RFM_Score'] = rfm[['R','F','M']].sum(axis=1)7. 分析报告生成
7.1 关键指标计算
metrics = { 'Total Sales': df['total_amount'].sum(), 'Average Order Value': df.groupby('order_id')['total_amount'].sum().mean(), 'Busiest Hour': df['hour'].mode()[0], 'Most Popular Item': df['item_name'].value_counts().idxmax() }7.2 自动化报告生成
使用Jupyter Notebook的nbconvert工具:
jupyter nbconvert --to html --template full analysis.ipynb或者用Python创建PDF报告:
from fpdf import FPDF pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) pdf.cell(200, 10, txt="Restaurant Analysis Report", ln=1, align='C') pdf.output("restaurant_report.pdf")8. 项目扩展方向
掌握了基础分析后,可以尝试这些进阶方向:
- 预测模型:使用时间序列预测未来销售额
- 推荐系统:基于用户历史订单推荐菜品
- 库存优化:根据销售规律制定采购计划
- 促销效果分析:对比活动前后的销售变化
实际业务中,数据分析从来不是一次性工作。建议设置定期自动运行脚本,将分析结果通过邮件自动发送给相关决策者。可以使用Windows任务计划或Linux的cron定时执行Python脚本。
