当前位置:知识文库 ❯ 图文

Python数据分析入门:Pandas从入门到实战

发布日期: 作者:小城

在大数据时代,数据分析能力已经成为各行各业的核心竞争力。无论是互联网、金融、医疗还是教育领域,都需要通过数据来驱动决策。而Python作为数据分析领域最流行的编程语言,配合强大的Pandas库,让数据分析变得简单高效。本文将从零开始,带你系统学习Pandas数据分析,即使你没有任何编程基础,也能轻松上手。

目录

一、数据分析简介

什么是数据分析

数据分析是指通过对收集来的大量数据进行详细研究,提取有用信息并形成结论的过程。简单来说,数据分析就是从数据中找规律、发现问题、指导决策。

数据分析通常包含以下几个步骤:

  1. 数据收集:获取原始数据
  2. 数据清洗:处理缺失值、异常值、重复数据
  3. 数据探索:了解数据分布、特征关系
  4. 数据分析:运用统计方法进行深度分析
  5. 数据可视化:用图表直观展示分析结果
  6. 报告撰写:输出分析结论和建议

为什么选择Python做数据分析

Python之所以成为数据分析的首选语言,主要有以下优势:

  • 语法简单:Python语法接近自然语言,学习门槛低
  • 生态丰富:拥有Pandas、NumPy、Matplotlib等强大的数据科学库
  • 社区活跃:遇到问题很容易找到解决方案
  • 应用广泛:从数据清洗到机器学习,Python都能胜任

Pandas库介绍

Pandas是Python中最核心的数据分析库,它提供了高效的数据结构和数据分析工具。Pandas这个名字来源于"Panel Data"(面板数据),由Wes McKinney在2008年开发。

Pandas的核心数据结构是:

  • Series:一维数据结构,类似于带标签的数组
  • DataFrame:二维表格型数据结构,类似于Excel表格

在开始学习之前,先安装Pandas:

pip install pandas

二、Pandas基础入门

Series数据结构

**概念解释**:Series是Pandas中最基本的数据结构,它由一组数据和与之相关的标签(索引)组成。你可以把它想象成一个增强版的Python列表,每个元素都有自己的标签。

**代码示例**:

import pandas as pd

# 创建Series
s = pd.Series([10, 20, 30, 40, 50])
print("默认索引的Series:")
print(s)

# 指定索引
s2 = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
print("\n指定索引的Series:")
print(s2)

# 从字典创建
data = {'北京': 2154, '上海': 2428, '广州': 1530, '深圳': 1344}
s3 = pd.Series(data)
print("\n从字典创建的Series:")
print(s3)

**结果说明**:

  • 默认情况下,Series会自动生成从0开始的整数索引
  • 通过index参数可以自定义索引标签
  • 从字典创建Series时,字典的键会成为索引,值成为数据

DataFrame数据结构

**概念解释**:DataFrame是Pandas中最重要的数据结构,它是一个二维表格,既有行索引也有列索引,类似于Excel中的工作表或SQL中的表。每列可以是不同的数据类型。

**代码示例**:

import pandas as pd

# 从字典创建DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '年龄': [25, 30, 28, 35, 27],
    '城市': ['北京', '上海', '广州', '深圳', '杭州'],
    '薪资': [8000, 12000, 9500, 15000, 11000]
}

df = pd.DataFrame(data)
print("员工信息表:")
print(df)
print("\n数据形状:", df.shape)
print("列名:", df.columns.tolist())
print("索引:", df.index.tolist())

**结果说明**:

  • DataFrame以表格形式展示数据,每行代表一条记录,每列代表一个字段
  • shape属性返回数据的行数和列数
  • columns属性返回所有列名
  • index属性返回行索引

数据访问基础

**概念解释**:访问DataFrame中的数据是数据分析的基础操作。Pandas提供了多种方式来选择数据,包括按列访问、按行访问、按位置访问等。

**代码示例**:

import pandas as pd

data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '年龄': [25, 30, 28, 35, 27],
    '城市': ['北京', '上海', '广州', '深圳', '杭州'],
    '薪资': [8000, 12000, 9500, 15000, 11000]
}

df = pd.DataFrame(data)

# 按列访问
print("单列数据(薪资):")
print(df['薪资'])

# 多列访问
print("\n多列数据(姓名和年龄):")
print(df[['姓名', '年龄']])

# 按行访问(使用loc)
print("\n第2行数据:")
print(df.loc[1])

# 条件筛选
print("\n薪资大于10000的员工:")
print(df[df['薪资'] > 10000])

**结果说明**:

  • 使用方括号加列名可以访问单列数据,返回Series类型
  • 传入列名列表可以访问多列数据,返回DataFrame类型
  • loc属性按标签索引访问行数据
  • 条件筛选通过布尔索引实现,非常灵活强大

三、数据读取与写入

读取CSV文件

**概念解释**:CSV(Comma-Separated Values)是最常见的数据存储格式,用逗号分隔数值。Pandas的read_csv函数可以快速读取CSV文件,并自动转换为DataFrame。

**代码示例**:

import pandas as pd

# 读取CSV文件
df = pd.read_csv('sales_data.csv')

# 查看前5行数据
print("数据前5行:")
print(df.head())

# 查看数据基本信息
print("\n数据基本信息:")
print(df.info())

# 查看统计摘要
print("\n数值列统计摘要:")
print(df.describe())

**结果说明**:

  • read_csv()是最常用的数据读取函数,支持多种参数配置
  • head()方法默认显示前5行数据,用于快速了解数据结构
  • info()方法显示数据类型、非空值数量、内存使用等信息
  • describe()方法生成数值列的描述性统计,包括计数、均值、标准差、最小值、四分位数、最大值

读取Excel文件

**概念解释**:Excel是日常工作中最常用的电子表格软件。Pandas通过read_excel函数支持读取Excel文件,需要安装openpyxl或xlrd库作为引擎。

**代码示例**:

import pandas as pd

# 读取Excel文件
df = pd.read_excel('employee_data.xlsx', sheet_name='Sheet1')

# 读取指定列
df_selected = pd.read_excel('employee_data.xlsx', usecols=['姓名', '部门', '薪资'])

print("员工数据前10行:")
print(df.head(10))
print("\n数据形状:", df.shape)

**结果说明**:

  • read_excel()可以读取.xlsx和.xls格式的Excel文件
  • sheet_name参数指定读取哪个工作表
  • usecols参数可以只读取需要的列,节省内存
  • 读取Excel前需要确保安装了openpyxl:pip install openpyxl

数据写入

**概念解释**:分析完成后,通常需要将结果保存到文件中。Pandas提供了to_csv、to_excel等方法,可以方便地将DataFrame写入各种格式的文件。

**代码示例**:

import pandas as pd

data = {
    '产品': ['手机', '电脑', '平板', '耳机', '手表'],
    '销量': [1200, 850, 620, 2100, 480],
    '单价': [3999, 5999, 2999, 599, 1999],
    '销售额': [4798800, 5099150, 1859380, 1257900, 959520]
}

df = pd.DataFrame(data)

# 写入CSV文件
df.to_csv('sales_result.csv', index=False, encoding='utf-8-sig')

# 写入Excel文件
df.to_excel('sales_result.xlsx', index=False, sheet_name='销售数据')

print("文件保存成功!")

**结果说明**:

  • to_csv()将DataFrame保存为CSV文件
  • index=False表示不保存行索引
  • encoding='utf-8-sig'确保中文在Excel中正常显示
  • to_excel()保存为Excel格式,同样需要openpyxl支持

四、数据清洗实战

处理缺失值

**概念解释**:缺失值是数据分析中最常见的问题之一。缺失值可能由数据采集错误、用户未填写等原因产生。Pandas中缺失值通常用NaN(Not a Number)表示。处理缺失值的方法主要有删除和填充两种。

**代码示例**:

import pandas as pd
import numpy as np

# 创建含有缺失值的数据
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
    '年龄': [25, np.nan, 28, 35, np.nan, 32],
    '城市': ['北京', '上海', np.nan, '深圳', '杭州', '北京'],
    '薪资': [8000, 12000, np.nan, 15000, 11000, np.nan]
}

df = pd.DataFrame(data)

print("原始数据:")
print(df)

# 检查缺失值
print("\n各列缺失值数量:")
print(df.isnull().sum())

# 删除包含缺失值的行
df_dropna = df.dropna()
print("\n删除缺失值后:")
print(df_dropna)

# 用均值填充数值型缺失值
df_filled = df.copy()
df_filled['年龄'] = df['年龄'].fillna(df['年龄'].mean())
df_filled['薪资'] = df['薪资'].fillna(df['薪资'].median())
df_filled['城市'] = df['城市'].fillna('未知')

print("\n填充缺失值后:")
print(df_filled)

**结果说明**:

  • isnull().sum()可以快速统计每列的缺失值数量
  • dropna()删除包含任何缺失值的行,也可以通过参数控制删除策略
  • fillna()用于填充缺失值,数值列常用均值、中位数填充,分类列常用众数或固定值填充
  • 选择删除还是填充需要根据业务场景和缺失值比例来决定

处理重复数据

**概念解释**:重复数据会影响分析结果的准确性。Pandas提供了检测和删除重复行的功能,确保数据的唯一性。

**代码示例**:

import pandas as pd

data = {
    '姓名': ['张三', '李四', '王五', '张三', '赵六', '李四'],
    '年龄': [25, 30, 28, 25, 35, 30],
    '城市': ['北京', '上海', '广州', '北京', '深圳', '上海']
}

df = pd.DataFrame(data)

print("原始数据:")
print(df)

# 检查重复行
print("\n是否为重复行:")
print(df.duplicated())

print("\n重复行数量:", df.duplicated().sum())

# 删除重复行
df_unique = df.drop_duplicates()
print("\n删除重复行后:")
print(df_unique)

# 按指定列去重
df_name_unique = df.drop_duplicates(subset=['姓名'])
print("\n按姓名去重后:")
print(df_name_unique)

**结果说明**:

  • duplicated()返回布尔值Series,标记每行是否为重复行
  • drop_duplicates()删除完全重复的行
  • subset参数可以指定按哪些列判断重复,非常灵活
  • 去重时保留第一条记录,也可以通过keep参数调整

数据类型转换

**概念解释**:正确的数据类型对数据分析至关重要。有时读取的数据类型不正确,需要进行转换,比如将字符串转为数值、将字符串转为日期等。

**代码示例**:

import pandas as pd

data = {
    '日期': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
    '销售额': ['10000', '15000', '12000', '18000'],
    '是否促销': ['是', '否', '是', '否']
}

df = pd.DataFrame(data)

print("原始数据类型:")
print(df.dtypes)

# 转换销售额为数值型
df['销售额'] = pd.to_numeric(df['销售额'])

# 转换日期为datetime类型
df['日期'] = pd.to_datetime(df['日期'])

# 转换为分类类型
df['是否促销'] = df['是否促销'].astype('category')

print("\n转换后的数据类型:")
print(df.dtypes)
print("\n转换后的数据:")
print(df)

**结果说明**:

  • pd.to_numeric()将字符串转换为数值类型
  • pd.to_datetime()将字符串转换为日期时间类型,方便后续时间序列分析
  • astype()方法可以进行通用类型转换
  • 正确的数据类型不仅能提高运算效率,还能启用对应类型的专属方法

五、数据统计与分析

描述性统计

**概念解释**:描述性统计是数据分析的基础,通过计算均值、中位数、标准差、分位数等统计量,可以快速了解数据的集中趋势和离散程度。

**代码示例**:

import pandas as pd
import numpy as np

np.random.seed(42)
data = {
    '产品': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
    '销量': np.random.randint(100, 1000, 10),
    '单价': np.random.uniform(50, 500, 10).round(2),
    '评分': np.random.uniform(3.0, 5.0, 10).round(1)
}

df = pd.DataFrame(data)

print("完整数据:")
print(df)

print("\n描述性统计:")
print(df.describe())

print("\n各列均值:")
print(df.mean(numeric_only=True))

print("\n各列中位数:")
print(df.median(numeric_only=True))

print("\n各列标准差:")
print(df.std(numeric_only=True))

print("\n销量最大值:", df['销量'].max())
print("销量最小值:", df['销量'].min())
print("销量总和:", df['销量'].sum())

**结果说明**:

  • describe()生成完整的描述性统计,包括计数、均值、标准差、最小值、25%/50%/75%分位数、最大值
  • 单独的统计方法如mean()、median()、std()、max()、min()、sum()可以计算特定统计量
  • numeric_only=True参数表示只对数值型列进行计算
  • 中位数(50%分位数)比均值更能抵抗异常值的影响

分组聚合分析

**概念解释**:分组聚合是数据分析中最常用的操作之一。按照某个或某些列分组,然后对每组数据进行聚合计算,比如求和、求均值、计数等。这类似于SQL中的GROUP BY操作。

**代码示例**:

import pandas as pd

data = {
    '部门': ['技术部', '市场部', '技术部', '人事部', '市场部', '技术部', '人事部', '财务部', '市场部', '财务部'],
    '性别': ['男', '女', '男', '女', '男', '女', '男', '女', '男', '女'],
    '年龄': [28, 32, 35, 29, 27, 30, 33, 31, 26, 34],
    '薪资': [15000, 12000, 18000, 10000, 13000, 16000, 11000, 14000, 12500, 13500]
}

df = pd.DataFrame(data)

print("员工数据:")
print(df)

# 按部门分组,计算平均薪资
dept_avg = df.groupby('部门')['薪资'].mean().round(2)
print("\n各部门平均薪资:")
print(dept_avg)

# 按部门分组,计算多个统计量
dept_stats = df.groupby('部门')['薪资'].agg(['count', 'mean', 'min', 'max', 'sum']).round(2)
print("\n各部门薪资统计:")
print(dept_stats)

# 按多个字段分组
dept_gender = df.groupby(['部门', '性别'])['薪资'].mean().round(2)
print("\n各部门不同性别平均薪资:")
print(dept_gender)

**结果说明**:

  • groupby()用于分组,后面跟上聚合函数就能完成分组聚合
  • 常用聚合函数有:count(计数)、sum(求和)、mean(均值)、median(中位数)、min/max(最小/最大值)、std(标准差)
  • agg()方法可以一次应用多个聚合函数
  • 支持按多列分组,生成层次化索引的结果

数据排序与排名

**概念解释**:排序可以帮助我们快速找到最大、最小的值,观察数据的分布规律。排名则是给每个数据赋予一个排名名次,常用于竞赛、绩效评估等场景。

**代码示例**:

import pandas as pd

data = {
    '学生': ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十'],
    '语文': [85, 92, 78, 88, 95, 80, 90, 82],
    '数学': [90, 88, 95, 82, 78, 92, 86, 90],
    '英语': [88, 90, 85, 92, 86, 78, 90, 84]
}

df = pd.DataFrame(data)
df['总分'] = df['语文'] + df['数学'] + df['英语']

print("学生成绩表:")
print(df)

# 按总分降序排列
df_sorted = df.sort_values('总分', ascending=False)
print("\n按总分降序排列:")
print(df_sorted)

# 按多列排序
df_multi_sort = df.sort_values(['数学', '语文'], ascending=[False, False])
print("\n先按数学降序,再按语文降序:")
print(df_multi_sort)

# 添加排名列
df['排名'] = df['总分'].rank(ascending=False, method='min').astype(int)
df_ranked = df.sort_values('排名')
print("\n按总分排名:")
print(df_ranked[['学生', '总分', '排名']])

**结果说明**:

  • sort_values()按指定列排序,ascending=False表示降序
  • 支持多列排序,分别指定每列的升降序
  • rank()方法计算排名,method参数控制并列排名的处理方式
  • method='min'表示并列时取最小名次,即两个人都是第2名,下一个就是第4名

六、数据可视化

Matplotlib基础绘图

**概念解释**:数据可视化是数据分析的重要环节,通过图表可以直观地展示数据规律。Matplotlib是Python最基础也是最强大的绘图库,Pandas可以直接调用Matplotlib进行绘图。

**代码示例**:

import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

data = {
    '月份': ['1月', '2月', '3月', '4月', '5月', '6月'],
    '销售额': [120, 150, 130, 180, 200, 220],
    '利润': [20, 35, 28, 45, 50, 55]
}

df = pd.DataFrame(data)

# 折线图
plt.figure(figsize=(10, 6))
plt.plot(df['月份'], df['销售额'], marker='o', label='销售额', linewidth=2)
plt.plot(df['月份'], df['利润'], marker='s', label='利润', linewidth=2)
plt.title('2024年上半年销售趋势', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('金额(万元)', fontsize=12)
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

**结果说明**:

  • 折线图适合展示数据随时间变化的趋势
  • marker参数设置数据点样式,linewidth设置线宽
  • 设置中文字体很重要,否则中文会显示为方框
  • 添加标题、坐标轴标签、图例、网格可以让图表更专业

柱状图与饼图

**概念解释**:柱状图适合比较不同类别之间的数值差异,饼图适合展示各部分占整体的比例关系。这两种图表在数据分析报告中非常常用。

**代码示例**:

import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 柱状图数据
bar_data = {
    '产品': ['手机', '电脑', '平板', '耳机', '手表'],
    '销量': [1200, 850, 620, 2100, 480]
}
df_bar = pd.DataFrame(bar_data)

# 饼图数据
pie_data = {
    '部门': ['技术部', '市场部', '财务部', '人事部', '运营部'],
    '人数': [30, 20, 10, 8, 15]
}
df_pie = pd.DataFrame(pie_data)

# 创建画布,包含两个子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 柱状图
df_bar.plot.bar(x='产品', y='销量', ax=ax1, color='steelblue')
ax1.set_title('各产品销量对比', fontsize=14)
ax1.set_xlabel('产品', fontsize=12)
ax1.set_ylabel('销量(件)', fontsize=12)
ax1.tick_params(axis='x', rotation=0)

# 饼图
df_pie.plot.pie(y='人数', labels=df_pie['部门'], autopct='%1.1f%%', 
                ax=ax2, startangle=90)
ax2.set_title('公司部门人员分布', fontsize=14)
ax2.set_ylabel('')

plt.tight_layout()
plt.show()

**结果说明**:

  • 柱状图通过柱子的高度直观比较各类别的数值大小
  • 饼图展示各部分占比,autopct='%1.1f%%'显示百分比
  • subplots()可以创建包含多个子图的画布
  • Pandas的plot方法封装了Matplotlib,使用更简洁

直方图与箱线图

**概念解释**:直方图用于展示数据的分布情况,可以看出数据是否服从正态分布、是否有偏态。箱线图则通过五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值)展示数据的分布和异常值。

**代码示例**:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

np.random.seed(42)
scores = np.random.normal(75, 15, 200).clip(0, 100).round(1)
df = pd.DataFrame({'成绩': scores})

# 创建画布,包含两个子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 直方图
df['成绩'].plot.hist(bins=20, ax=ax1, color='skyblue', edgecolor='white')
ax1.set_title('学生成绩分布直方图', fontsize=14)
ax1.set_xlabel('成绩', fontsize=12)
ax1.set_ylabel('人数', fontsize=12)
ax1.axvline(df['成绩'].mean(), color='red', linestyle='--', label=f'均值: {df["成绩"].mean():.1f}')
ax1.axvline(df['成绩'].median(), color='orange', linestyle='--', label=f'中位数: {df["成绩"].median():.1f}')
ax1.legend()

# 箱线图
df['成绩'].plot.box(ax=ax2, patch_artist=True, boxprops=dict(facecolor='lightgreen'))
ax2.set_title('学生成绩箱线图', fontsize=14)
ax2.set_ylabel('成绩', fontsize=12)

plt.tight_layout()
plt.show()

# 输出统计数据
print(f"均值: {df['成绩'].mean():.2f}")
print(f"中位数: {df['成绩'].median():.2f}")
print(f"标准差: {df['成绩'].std():.2f}")
print(f"最小值: {df['成绩'].min():.2f}")
print(f"最大值: {df['成绩'].max():.2f}")

**结果说明**:

  • 直方图将数据分组(bins),用柱子高度表示每组的频数
  • 正态分布的数据直方图呈现中间高、两边低的钟形曲线
  • 箱线图中的箱子包含50%的数据(从25%到75%分位数)
  • 箱线图中的圆点表示异常值(超出上四分位数1.5倍四分位距的数据点)

七、完整实战项目:电商销售数据分析

项目背景与目标

假设你是一家电商公司的数据分析师,公司提供了过去一年的销售数据,需要你进行全面的数据分析,为运营决策提供数据支持。

**分析目标**:

  1. 了解整体销售情况和趋势
  2. 分析各品类的销售表现
  3. 识别高价值客户群体
  4. 发现销售的季节性规律
  5. 提出运营优化建议

数据准备

首先,我们生成一份模拟的电商销售数据,包含订单信息、商品信息、客户信息等字段。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

np.random.seed(42)

n_orders = 5000

categories = ['电子产品', '服装鞋帽', '食品饮料', '家居用品', '美妆护肤', '图书文具']
products = {
    '电子产品': ['手机', '电脑', '耳机', '平板', '智能手表'],
    '服装鞋帽': ['T恤', '运动鞋', '牛仔裤', '羽绒服', '连衣裙'],
    '食品饮料': ['零食礼盒', '进口红酒', '有机茶叶', '咖啡套装', '坚果礼包'],
    '家居用品': ['床上用品', '厨房用具', '收纳用品', '装饰摆件', '清洁用品'],
    '美妆护肤': ['面膜套装', '口红礼盒', '护肤套装', '香水', '洗面奶'],
    '图书文具': ['畅销小说', '教辅图书', '文具套装', '艺术画册', '儿童读物']
}

cities = ['北京', '上海', '广州', '深圳', '杭州', '成都', '武汉', '南京', '重庆', '西安']
payment_methods = ['微信支付', '支付宝', '银行卡', '花呗', '信用卡']

dates = pd.date_range('2024-01-01', '2024-12-31')
order_dates = np.random.choice(dates, n_orders)

data = []
for i in range(n_orders):
    category = np.random.choice(categories)
    product = np.random.choice(products[category])
    base_price = {
        '电子产品': 2000, '服装鞋帽': 300, '食品饮料': 150,
        '家居用品': 200, '美妆护肤': 250, '图书文具': 80
    }[category]
    price = round(base_price * np.random.uniform(0.8, 1.5), 2)
    quantity = np.random.randint(1, 5)
    amount = round(price * quantity, 2)
    
    data.append({
        '订单号': f'ORD{100000 + i}',
        '下单日期': order_dates[i],
        '客户ID': f'C{np.random.randint(1000, 2000)}',
        '商品品类': category,
        '商品名称': product,
        '单价': price,
        '数量': quantity,
        '订单金额': amount,
        '所在城市': np.random.choice(cities),
        '支付方式': np.random.choice(payment_methods)
    })

df = pd.DataFrame(data)
df['下单日期'] = pd.to_datetime(df['下单日期'])

print("数据形状:", df.shape)
print("\n数据前5行:")
print(df.head())
print("\n数据信息:")
print(df.info())

**结果说明**:

  • 我们生成了5000条订单数据,包含10个字段
  • 数据时间跨度为2024年全年
  • 涵盖6大商品品类,30种具体商品
  • 涉及10个城市、5种支付方式

整体销售趋势分析

# 按月统计销售额
df['月份'] = df['下单日期'].dt.to_period('M')
monthly_sales = df.groupby('月份')['订单金额'].sum()

# 绘制销售趋势图
plt.figure(figsize=(12, 6))
monthly_sales.plot(marker='o', linewidth=2, color='#2E86AB')
plt.title('2024年月度销售额趋势', fontsize=16)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额(元)', fontsize=12)
plt.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

print("月度销售额统计:")
print(monthly_sales.round(2))
print(f"\n全年总销售额:{df['订单金额'].sum():,.2f} 元")
print(f"全年订单数:{len(df)} 单")
print(f"客单价:{df['订单金额'].mean():.2f} 元")

**结果说明**:

  • 月度销售额趋势图可以直观展示全年销售走势
  • 可以观察到销售的淡旺季分布
  • 全年总销售额、订单数、客单价是最核心的运营指标
  • 可以进一步分析波动原因,比如节假日、促销活动等

品类销售分析

# 按品类统计
category_stats = df.groupby('商品品类').agg({
    '订单金额': ['sum', 'mean', 'count'],
    '数量': 'sum'
}).round(2)
category_stats.columns = ['销售总额', '平均客单价', '订单数', '总销量']
category_stats = category_stats.sort_values('销售总额', ascending=False)

print("各品类销售情况:")
print(category_stats)

# 绘制品类销售额占比饼图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 7))

category_stats['销售总额'].plot.pie(
    autopct='%1.1f%%', ax=ax1, startangle=90
)
ax1.set_title('各品类销售额占比', fontsize=14)
ax1.set_ylabel('')

# 绘制各品类销售额柱状图
category_stats['销售总额'].plot.bar(ax=ax2, color='#A23B72')
ax2.set_title('各品类销售额对比', fontsize=14)
ax2.set_xlabel('商品品类', fontsize=12)
ax2.set_ylabel('销售额(元)', fontsize=12)
ax2.tick_params(axis='x', rotation=45)

plt.tight_layout()
plt.show()

**结果说明**:

  • 通过分组聚合可以清晰对比各品类的销售表现
  • 饼图展示各品类销售额的占比结构
  • 柱状图更直观地比较各品类的绝对销售额
  • 可以识别出核心品类和潜力品类,为库存和营销策略提供依据

客户价值分析

# 计算每个客户的消费数据
customer_stats = df.groupby('客户ID').agg({
    '订单金额': ['sum', 'mean', 'count'],
    '下单日期': 'max'
}).round(2)
customer_stats.columns = ['消费总额', '平均客单价', '消费次数', '最后消费日期']

# 计算RFM模型相关指标
reference_date = df['下单日期'].max()
customer_stats['最近消费天数'] = (reference_date - customer_stats['最后消费日期']).dt.days

print("客户价值统计(前10名):")
print(customer_stats.sort_values('消费总额', ascending=False).head(10))

# 客户分层
def customer_level(row):
    if row['消费总额'] >= 5000 and row['消费次数'] >= 5:
        return '高价值客户'
    elif row['消费总额'] >= 2000 or row['消费次数'] >= 3:
        return '重要发展客户'
    elif row['消费总额'] >= 1000:
        return '一般客户'
    else:
        return '流失风险客户'

customer_stats['客户等级'] = customer_stats.apply(customer_level, axis=1)

level_counts = customer_stats['客户等级'].value_counts()
print("\n客户分层统计:")
print(level_counts)

# 绘制客户分层饼图
plt.figure(figsize=(10, 8))
level_counts.plot.pie(autopct='%1.1f%%', startangle=90)
plt.title('客户价值分层分布', fontsize=16)
plt.ylabel('')
plt.show()

**结果说明**:

  • 客户价值分析是精细化运营的基础
  • 通过消费总额、消费次数、最近消费时间可以评估客户价值
  • RFM模型是经典的客户价值评估方法
  • 客户分层后可以针对不同等级客户制定不同的营销策略

地域销售分析

# 按城市统计销售数据
city_stats = df.groupby('所在城市').agg({
    '订单金额': ['sum', 'count', 'mean']
}).round(2)
city_stats.columns = ['销售总额', '订单数', '客单价']
city_stats = city_stats.sort_values('销售总额', ascending=False)

print("各城市销售情况:")
print(city_stats)

# 绘制城市销售额柱状图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 12))

city_stats['销售总额'].plot.bar(ax=ax1, color='#F18F01')
ax1.set_title('各城市销售额排名', fontsize=14)
ax1.set_xlabel('城市', fontsize=12)
ax1.set_ylabel('销售额(元)', fontsize=12)
ax1.tick_params(axis='x', rotation=0)

city_stats['客单价'].plot.bar(ax=ax2, color='#C73E1D')
ax2.set_title('各城市客单价对比', fontsize=14)
ax2.set_xlabel('城市', fontsize=12)
ax2.set_ylabel('客单价(元)', fontsize=12)
ax2.tick_params(axis='x', rotation=0)

plt.tight_layout()
plt.show()

**结果说明**:

  • 地域分析可以帮助企业了解不同地区的市场表现
  • 销售额高的城市可以加大投入,销售额低的城市分析原因
  • 客单价反映了不同城市的消费水平和消费习惯
  • 地域分析对于线下门店布局、物流配送优化有重要参考价值

分析结论与建议

基于以上分析,我们可以得出以下结论和建议:

**主要发现**:

  1. 电子产品是销售额最高的品类,贡献了最大的收入占比
  2. 客户分层明显,高价值客户虽然数量少但贡献了大量销售额
  3. 一线和新一线城市的销售表现明显优于其他城市
  4. 下半年的销售表现普遍好于上半年,存在季节性波动

**运营建议**:

  1. 重点维护高价值客户,推出VIP专属服务和优惠
  2. 针对流失风险客户,通过优惠券、短信召回等方式激活
  3. 在销售淡季策划主题营销活动,平衡全年销售节奏
  4. 加大对核心品类的投入,同时扶持潜力品类的发展
  5. 在销售表现好的城市增加营销资源,拓展市场份额

八、总结与进阶学习路径

本文总结

本文从零基础开始,系统介绍了Python数据分析的核心工具Pandas。我们学习了:

  1. 数据分析基础概念:了解了数据分析的定义、流程和应用场景
  2. Pandas核心数据结构:掌握了Series和DataFrame的创建与基本操作
  3. 数据读取与写入:学会了读取CSV、Excel等常见格式的数据文件
  4. 数据清洗技巧:掌握了处理缺失值、重复值和数据类型转换的方法
  5. 数据统计分析:学会了描述性统计、分组聚合、排序排名等分析方法
  6. 数据可视化:掌握了折线图、柱状图、饼图、直方图、箱线图等常用图表
  7. 完整实战项目:通过电商销售数据分析项目,将所学知识融会贯通

Pandas是Python数据分析的基础工具,掌握它可以处理80%以上的日常数据分析需求。但数据分析是一个广阔的领域,Pandas只是起点。

进阶学习路径

如果你想在数据分析领域深入发展,可以按照以下路径继续学习:

**第一阶段:数据处理进阶**

  • 学习NumPy:掌握更高效的数值计算
  • 学习Pandas高级操作:透视表、时间序列、多表合并
  • 学习正则表达式:处理复杂的文本数据

**第二阶段:数据可视化进阶**

  • 学习Seaborn:绘制更美观的统计图表
  • 学习Plotly:创建交互式可视化图表
  • 学习Tableau或Power BI:商业智能工具

**第三阶段:统计学基础**

  • 描述性统计学:深入理解各种统计指标
  • 推断统计学:假设检验、置信区间
  • 回归分析:线性回归、逻辑回归

**第四阶段:机器学习入门**

  • 学习Scikit-learn:经典机器学习算法
  • 监督学习:分类、回归问题
  • 无监督学习:聚类、降维
  • 模型评估与调优

**第五阶段:大数据处理**

  • 学习SQL:数据库查询语言
  • 学习Spark:大规模数据处理
  • 学习Hadoop生态系统

学习建议

  1. 多动手实践:数据分析是实践性很强的技能,光看教程是学不会的。找一些公开数据集(如Kaggle、UCI),自己动手分析。
  1. 培养业务思维:技术只是工具,最终要服务于业务。做分析时多思考:这个分析能解决什么业务问题?能带来什么价值?
  1. 持续学习:数据分析领域发展很快,新工具、新方法层出不穷。保持学习的热情,不断更新自己的知识体系。
  1. 输出分享:把学到的知识写成博客或分享给他人,输出是最好的学习方式。

数据分析是一个充满机遇的领域,希望这篇文章能帮你开启数据分析之旅。记住,千里之行,始于足下。从现在开始,动手实践,你一定能成为一名优秀的数据分析师!

本文涉及AI创作

内容由AI创作,请仔细甄别

快速访问

上一篇: Excel函数公式大全:10个最常用函数详解 下一篇: AI办公软件推荐:7款神器对比效率提升300%

相关推荐