Python 数据分析轻松入门:蜗牛学院手把手教学全流程
欢迎来到蜗牛学院的Python数据分析课堂!本教程将手把手带你走完一个数据分析项目的标准全流程:从数据获取、数据清洗、探索性分析,到最终的数据可视化与结论得出。我们将使用Python最核心的数据分析库:Pandas, NumPy 和 Matplotlib/Seaborn。
第一阶段:环境搭建与数据准备
1.1 搭建你的分析工具箱
首先,确保你的Python环境中已安装必要的库。在终端或命令提示符中执行以下命令:
bash
pip install pandas numpy matplotlib seaborn jupyter
我们推荐使用Jupyter Notebook进行交互式数据分析,它能让你清晰地看到每一步的结果。
1.2 准备数据:我们的"原材料"
数据分析的第一步是获取数据。我们将使用Pandas内置的便捷方法,从一个CSV文件加载数据。这里我们以一个模拟的"电商订单数据"为例。
python
# 导入必要的库。这是每个分析脚本的开头
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文显示和图形样式(让图表更美观)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
sns.set_style("whitegrid") # 设置Seaborn的绘图风格为白色网格
# 手把手第一步:读取数据
# 假设我们的数据文件名为 'sales_data.csv'
# 如果文件在其他路径,需要写上完整路径,如:'C:/Users/.../sales_data.csv'
df = pd.read_csv('sales_data.csv')
# 让我们先看一眼数据的"长相"和大小
print("数据形状(行数, 列数):", df.shape)
print("\n数据前5行:")
df.head()
假设我们的 sales_data.csv 文件内容如下:
csv
order_id,customer_name,product_category,sales_volume,unit_price,order_date,city
1001,张三,电子产品,2,2999.0,2023-10-01,北京
1002,李四,服装,1,150.5,2023-10-01,上海
1003,王五,家居,1,450.0,2023-10-02,广州
1004,赵六,电子产品,1,1599.0,2023-10-02,深圳
1005,钱七,图书,3,45.0,2023-10-02,北京
1006,孙八,服装,2,180.0,2023-10-03,上海
1007,周九,家居,1,NULL,2023-10-03,杭州
1008,吴十,电子产品,1,3999.0,2023-10-04,北京
运行 df.head() 后,你将看到一个清晰的表格预览。
第二阶段:数据清洗与预处理------为分析打下坚实基础
原始数据往往是"脏"的,包含缺失值、异常值或不一致的格式。清洗是保证分析结果准确的关键。
2.1 探索数据基本信息
python
# 查看数据集的整体信息,包括每列的非空数量、数据类型
print("数据信息:")
df.info()
# 查看数值型列的基本统计信息(计数、均值、标准差、最值等)
print("\n数值列描述性统计:")
df.describe()
2.2 处理缺失值
df.info() 可能会显示某些列存在非空数量少于总行数,这意味着有缺失值。我们用 isnull() 来检查。
python
# 检查每列的缺失值数量
print("缺失值统计:")
print(df.isnull().sum())
假设 unit_price 列有一个缺失值(NULL)。我们有多种处理方式:
python
# 方法1:删除含有缺失值的行(如果缺失数据很少,可以用此法)
# df_cleaned = df.dropna()
# 方法2:填充缺失值(更常用)
# 这里我们用该列的平均值来填充缺失值
average_price = df['unit_price'].mean()
df['unit_price'].fillna(average_price, inplace=True) # inplace=True表示直接修改原DataFrame
print("填充后再次检查缺失值:")
print(df.isnull().sum())
2.3 处理重复值与数据类型转换
python
# 检查并删除完全重复的行
duplicate_rows = df.duplicated().sum()
print(f"重复行数量: {duplicate_rows}")
if duplicate_rows > 0:
df.drop_duplicates(inplace=True)
# 转换数据类型:将订单日期字符串转换为Pandas的日期时间类型,便于时间序列分析
df['order_date'] = pd.to_datetime(df['order_date'])
print("\n转换后日期列信息:")
print(df['order_date'].dtype)
2.4 创建新特征(特征工程)
很多时候,我们需要从现有列中衍生出新的、更有分析价值的列。
python
# 创建一个新列 'total_sales',表示每笔订单的总销售额
df['total_sales'] = df['sales_volume'] * df['unit_price']
# 从日期中提取新的维度,如月份、星期几
df['order_month'] = df['order_date'].dt.month
df['order_weekday'] = df['order_date'].dt.day_name()
print("创建新特征后的数据:")
df.head()
第三阶段:探索性数据分析------发现数据中的故事
现在,干净的数据已经准备好,让我们开始探索吧!
3.1 整体销售情况分析
python
# 计算总销售额和总订单数
total_revenue = df['total_sales'].sum()
total_orders = df['order_id'].nunique() # nunique() 计算唯一值数量
print(f"总销售额: ¥{total_revenue:,.2f}")
print(f"总订单数: {total_orders}")
3.2 哪个产品类别最受欢迎?(分类汇总)
python
# 按产品类别分组,并聚合计算总销售额和销售数量
category_analysis = df.groupby('product_category').agg({
'total_sales': 'sum',
'sales_volume': 'sum',
'order_id': 'count' # 计算每个类别的订单数
}).rename(columns={'order_id': 'order_count'}) # 重命名列
# 按总销售额降序排列
category_analysis = category_analysis.sort_values('total_sales', ascending=False)
print("按产品类别分析:")
category_analysis
3.3 哪个城市的消费能力最强?
python
city_analysis = df.groupby('city')['total_sales'].sum().sort_values(ascending=False)
print("各城市总销售额:")
print(city_analysis)
第四阶段:数据可视化------一图胜千言
数字是冰冷的,图表却能让我们直观地看到趋势和模式。
4.1 绘制产品类别销售额柱状图
python
# 使用Matplotlib
plt.figure(figsize=(10, 6))
# 从之前分组聚合的结果中取数据
plt.bar(category_analysis.index, category_analysis['total_sales'])
plt.title('各产品类别总销售额对比')
plt.xlabel('产品类别')
plt.ylabel('总销售额 (元)')
plt.xticks(rotation=45) # 旋转X轴标签,避免重叠
# 在柱子上显示数值
for i, v in enumerate(category_analysis['total_sales']):
plt.text(i, v, f'¥{v:,.0f}', ha='center', va='bottom')
plt.tight_layout() # 自动调整布局
plt.show()
4.2 绘制城市销售额饼图
python
plt.figure(figsize=(8, 8))
plt.pie(city_analysis.values, labels=city_analysis.index, autopct='%1.1f%%', startangle=90)
plt.title('各城市销售额占比')
plt.show()
4.3 使用Seaborn绘制更高级的图表
Seaborn基于Matplotlib,提供了更美观的样式和更高级的绘图功能。
python
# 绘制每日销售额趋势图(时间序列图)
daily_sales = df.groupby('order_date')['total_sales'].sum()
plt.figure(figsize=(12, 6))
sns.lineplot(x=daily_sales.index, y=daily_sales.values)
plt.title('每日销售额趋势')
plt.xlabel('日期')
plt.ylabel('销售额 (元)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
4.4 箱线图:查看销售额的分布与异常值
python
plt.figure(figsize=(8, 6))
# 按类别查看总销售额的分布
sns.boxplot(data=df, x='product_category', y='total_sales')
plt.title('各产品类别销售额分布箱线图')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# 箱线图可以清晰地显示出数据的中位数、四分位数以及可能的异常值(上下边缘之外的点)。
第五阶段:分析结论与报告
通过以上分析,我们可以得出一些初步结论,并形成报告。
python
print("=== 蜗牛学院数据分析报告 ===")
print(f"分析时间段: {df['order_date'].min()} 至 {df['order_date'].max()}")
print(f"核心发现:")
print(f"1. 业绩总览:在此期间,共产生{total_orders}笔订单,实现总销售额¥{total_revenue:,.2f}。")
print(f"2. 明星品类:'{category_analysis.index[0]}'是销售额最高的品类,贡献了¥{category_analysis.iloc[0]['total_sales']:,.2f}。")
print(f"3. 核心市场:'{city_analysis.index[0]}'是消费能力最强的城市。")
print(f"4. 销售趋势:从每日趋势图可以看出,销售额在...日期附近有显著波动(可根据实际图表补充)。")
print("\n建议:")
print("- 加大对明星品类 '{category_analysis.index[0]}' 的库存和营销投入。")
print("- 深入研究 '{city_analysis.index[0]}' 市场的成功经验,并尝试复制到其他城市。")
print("- 针对销售额较低的品类和城市,制定专项促销策略。")
总结
恭喜你!你已经跟着蜗牛学院完成了一个完整的数据分析流程:
- 数据获取 :使用
pd.read_csv() - 数据清洗 :处理缺失值
fillna()、转换数据类型、创建新特征。 - 数据探索 :使用
groupby()、agg()进行分组聚合,计算关键指标。 - 数据可视化:使用 Matplotlib 和 Seaborn 绘制柱状图、饼图、折线图等,将数据直观呈现。
- 得出结论:基于数据和图表,形成商业洞察和建议。
这个流程是数据分析的通用范式。不断练习,使用更复杂、更真实的数据集,你将很快从入门走向精通!记住,数据分析的核心不在于记住所有函数,而在于形成提出问题 -> 用数据和工具验证 -> 得出结论的思维模式。