Python星球日记 - 第20天:数据分析入门

🌟引言
欢迎来到Python星球🪐的第20天!今天我们将踏入数据分析 的世界,学习如何使用pandas 处理数据并提取有价值的信息。无论你是想分析商业销售数据、股票市场趋势还是科学实验结果,pandas都是你必不可少的工具!

上一篇:Python星球日记 - 第19天:Web开发基础
名人说:路漫漫其修远兮,吾将上下而求索。------ 屈原《离骚》
创作者:Code_流苏(CSDN) (一个喜欢古诗词和编程的Coder😊)

目录

专栏介绍: Python星球日记专栏介绍(持续更新ing)
更多Python知识,请关注我、订阅专栏《 Python星球日记》,内容持续更新中...

一、Pandas简介:数据分析的瑞士军刀

Pandas 是Python数据分析的核心库,它提供了高效的数据结构和数据分析工具。如果你想在Python中进行数据分析,pandas是必不可少的库。

1. Pandas的两大核心数据结构

Pandas有两个基本的数据结构:SeriesDataFrame

  • Series :一维数组结构,类似于Python的列表,但具有标签索引
  • DataFrame :二维表格数据结构,可以看作是多个Series组成的表格

2. 安装并导入pandas

在开始学习之前,我们需要安装pandas库并导入它:

1️⃣使用 pip 安装pandas

python 复制代码
pip install pandas

2️⃣通过import导入pandas库

python 复制代码
# 导入pandas
import pandas as pd  # pd是pandas的常用缩写

二、数据处理基础

1. 创建DataFrame

DataFrame是pandas最常用的数据结构,类似于Excel表格或SQL表。让我们看看如何创建一个DataFrame:

python 复制代码
import pandas as pd
import numpy as np

# 从字典创建DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 40],
    '城市': ['北京', '上海', '广州', '深圳'],
    '工资': [10000, 20000, 15000, 25000]
}

df = pd.DataFrame(data)
print(df)

输出结果:

python 复制代码
   姓名  年龄  城市    工资
0  张三  25  北京  10000
1  李四  30  上海  20000
2  王五  35  广州  15000
3  赵六  40  深圳  25000

2. 基本数据查看

拿到数据后,首先需要对数据有个基本了解:

python 复制代码
# 查看前几行数据
print(df.head())  # 默认显示前5行
python 复制代码
# 查看数据基本信息
print(df.info())
python 复制代码
# 查看数据统计摘要
print(df.describe())
python 复制代码
# 查看数据维度
print(df.shape)  # 输出: (行数, 列数)

完整代码:

python 复制代码
import pandas as pd
import numpy as np

# 从字典创建DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 40],
    '城市': ['北京', '上海', '广州', '深圳'],
    '工资': [10000, 20000, 15000, 25000]
}

df = pd.DataFrame(data)
# 查看前几行数据
print(df.head())  # 默认显示前5行

# 查看数据基本信息
print(df.info())

# 查看数据统计摘要
print(df.describe())

# 查看数据维度
print(df.shape)  # 输出: (行数, 列数)

输出结果:

python 复制代码
   姓名  年龄  城市     工资
0  张三  25  北京  10000
1  李四  30  上海  20000
2  王五  35  广州  15000
3  赵六  40  深圳  25000
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  -----
 0   姓名      4 non-null      object
 1   年龄      4 non-null      int64
 2   城市      4 non-null      object
 3   工资      4 non-null      int64
dtypes: int64(2), object(2)
memory usage: 260.0+ bytes
None
              年龄            工资
count   4.000000      4.000000
mean   32.500000  17500.000000
std     6.454972   6454.972244
min    25.000000  10000.000000
25%    28.750000  13750.000000
50%    32.500000  17500.000000
75%    36.250000  21250.000000
max    40.000000  25000.000000
(4, 4)

3. 数据选择与索引

pandas提供了多种方式来选择数据:

python 复制代码
# 选择单列
print(df['姓名'])  # 返回Series
python 复制代码
# 选择多列
print(df[['姓名', '工资']])  # 返回DataFrame
python 复制代码
# 通过位置选择行
print(df.iloc[0])  # 选择第一行
print(df.iloc[0:2])  # 选择前两行
python 复制代码
# 通过标签选择行
print(df.loc[0])  # 选择索引为0的行
python 复制代码
# 条件选择
print(df[df['年龄'] > 30])  # 选择年龄大于30的行

完整代码:

python 复制代码
import pandas as pd
import numpy as np

# 从字典创建DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 40],
    '城市': ['北京', '上海', '广州', '深圳'],
    '工资': [10000, 20000, 15000, 25000]
}

df = pd.DataFrame(data)
# 选择单列
print(df['姓名'])  # 返回Series

# 选择多列
print(df[['姓名', '工资']])  # 返回DataFrame

# 通过位置选择行
print(df.iloc[0])  # 选择第一行
print(df.iloc[0:2])  # 选择前两行

# 通过标签选择行
print(df.loc[0])  # 选择索引为0的行

# 条件选择
print(df[df['年龄'] > 30])  # 选择年龄大于30的行

输出结果:

python 复制代码
0    张三
1    李四
2    王五
3    赵六
Name: 姓名, dtype: object
   姓名     工资
0  张三  10000
1  李四  20000
2  王五  15000
3  赵六  25000
姓名       张三
年龄       25
城市       北京
工资    10000
Name: 0, dtype: object
   姓名  年龄  城市     工资
0  张三  25  北京  10000
1  李四  30  上海  20000
姓名       张三
年龄       25
城市       北京
工资    10000
Name: 0, dtype: object
   姓名  年龄  城市     工资
2  王五  35  广州  15000
3  赵六  40  深圳  25000

三、数据清洗与处理

在实际工作中,数据 往往不是完美 的,需要进行清洗和处理

清洗流程如下:

1. 处理缺失值

缺失值是数据分析中常见的问题。pandas使用NaN(Not a Number)表示缺失值:

python 复制代码
# 创建包含缺失值的DataFrame
df_missing = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', None],
    '年龄': [25, None, 35, 40],
    '城市': ['北京', '上海', None, '深圳'],
    '工资': [10000, 20000, None, 25000]
})

# 检查缺失值
print(df_missing.isnull().sum())  # 统计每列的缺失值数量

# 处理缺失值的方法
# 1. 删除包含缺失值的行
df_drop = df_missing.dropna()

# 2. 填充缺失值
df_fill = df_missing.fillna({
    '姓名': '未知',
    '年龄': df_missing['年龄'].mean(),  # 使用平均年龄填充
    '城市': '未知',
    '工资': df_missing['工资'].median()  # 使用工资中位数填充
})

2. 数据转换

数据转换是数据处理中的重要步骤:

python 复制代码
# 将年龄转换为分类
df['年龄段'] = pd.cut(df['年龄'], 
                    bins=[20, 30, 40, 50], 
                    labels=['20-30岁', '30-40岁', '40-50岁'])

# 数值变换
df['工资_千元'] = df['工资'] / 1000

# 字符串操作
df['城市_省份'] = df['城市'] + '市'

3. 数据聚合

聚合操作可以帮助我们了解数据的整体特征:

python 复制代码
# 按城市分组计算平均工资
city_salary = df.groupby('城市')['工资'].mean()
print(city_salary)

# 多列聚合
summary = df.groupby('城市').agg({
    '工资': ['mean', 'max', 'min'],
    '年龄': ['mean', 'max', 'min']
})
print(summary)

四、数据分析与可视化

pandasmatplotlibseaborn结合,可以轻松实现数据可视化。

数据分析流程图:

1. 基本统计分析

python 复制代码
# 描述性统计
print(df.describe())

# 相关性分析
print(df[['年龄', '工资']].corr())

# 唯一值计数
print(df['城市'].value_counts())

2. 简单可视化

python 复制代码
import matplotlib.pyplot as plt
import seaborn as sns

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 绘制柱状图
df.groupby('城市')['工资'].mean().plot(kind='bar', figsize=(10, 6))
plt.title('各城市平均工资')
plt.ylabel('平均工资(元)')
plt.xticks(rotation=0)
plt.show()

# 绘制散点图
plt.figure(figsize=(10, 6))
plt.scatter(df['年龄'], df['工资'])
plt.title('年龄与工资关系')
plt.xlabel('年龄')
plt.ylabel('工资(元)')
plt.grid(True)
plt.show()

五、实战练习:销售数据分析

现在,让我们通过一个实际的例子来应用我们所学的知识。假设我们有一个名为sales_data.csv的销售数据文件,包含了商品的销售记录。

蓝奏云:https://www.lanzoum.com/icqEd2t4joti

密码:99ku

1. 读取CSV文件

python 复制代码
# 读取CSV文件
sales_df = pd.read_csv('sales_data.csv')

# 查看前几行数据
print(sales_df.head())

# 查看数据信息
print(sales_df.info())

假设我们的CSV文件包含以下列:

  • 日期: 销售日期
  • 商品ID: 商品编号
  • 商品名称: 商品名称
  • 类别: 商品类别
  • 单价: 商品单价
  • 数量: 销售数量
  • 总金额: 单价 × 数量
  • 客户ID: 客户编号
  • 销售员: 销售员姓名

2. 数据清洗

python 复制代码
# 检查缺失值
print(sales_df.isnull().sum())

# 处理缺失值
sales_df['单价'].fillna(sales_df['单价'].mean(), inplace=True)
sales_df['商品名称'].fillna('未知商品', inplace=True)

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

# 创建新的时间特征
sales_df['月份'] = sales_df['日期'].dt.month
sales_df['季度'] = sales_df['日期'].dt.quarter
sales_df['是否周末'] = sales_df['日期'].dt.dayofweek >= 5

3. 数据分析

让我们探索一些业务问题:

python 复制代码
# 1. 各类别商品的销售总额
category_sales = sales_df.groupby('类别')['总金额'].sum().sort_values(ascending=False)
print("各类别商品销售总额:")
print(category_sales)

# 2. 月度销售趋势
monthly_sales = sales_df.groupby('月份')['总金额'].sum()
print("\n月度销售总额:")
print(monthly_sales)

# 3. 热销商品分析
top_products = sales_df.groupby('商品名称')['数量'].sum().sort_values(ascending=False).head(10)
print("\n销量前10的商品:")
print(top_products)

# 4. 销售员业绩分析
salesperson_performance = sales_df.groupby('销售员')['总金额'].sum().sort_values(ascending=False)
print("\n销售员业绩排名:")
print(salesperson_performance)

# 5. 周末与工作日销售对比
weekend_vs_weekday = sales_df.groupby('是否周末')['总金额'].sum()
print("\n周末与工作日销售对比:")
print(weekend_vs_weekday)

4. 数据可视化

python 复制代码
# 1. 类别销售总额柱状图
plt.figure(figsize=(12, 6))
category_sales.plot(kind='bar')
plt.title('各类别商品销售总额')
plt.xlabel('商品类别')
plt.ylabel('销售总额(元)')
plt.xticks(rotation=45)
plt.grid(axis='y')
plt.show()

# 2. 月度销售趋势折线图
plt.figure(figsize=(12, 6))
monthly_sales.plot(kind='line', marker='o')
plt.title('月度销售趋势')
plt.xlabel('月份')
plt.ylabel('销售总额(元)')
plt.grid(True)
plt.show()

# 3. 热销商品前10名
plt.figure(figsize=(14, 7))
top_products.plot(kind='barh')
plt.title('销量前10的商品')
plt.xlabel('销售数量')
plt.ylabel('商品名称')
plt.grid(axis='x')
plt.show()

5. 高级分析:RFM客户分析

RFM分析是一种常用的客户价值分析模型,基于以下三个维度:

  • Recency(最近购买时间):客户最近一次购买的时间
  • Frequency(购买频率):客户购买的次数
  • Monetary(购买金额):客户购买的金额
python 复制代码
# 获取最大日期(数据集中的最后一天)
max_date = sales_df['日期'].max()

# 按客户ID分组计算RFM指标
rfm = sales_df.groupby('客户ID').agg({
    '日期': lambda x: (max_date - x.max()).days,  # 最近购买时间(天数)
    '商品ID': 'count',  # 购买频率(订单数)
    '总金额': 'sum'  # 购买金额
})

# 重命名列
rfm.columns = ['最近购买时间', '购买频率', '购买金额']

# 查看RFM分析结果
print(rfm.head())

# 对RFM指标进行分段
rfm['R_Score'] = pd.qcut(rfm['最近购买时间'], 5, labels=[5, 4, 3, 2, 1])
rfm['F_Score'] = pd.qcut(rfm['购买频率'], 5, labels=[1, 2, 3, 4, 5])
rfm['M_Score'] = pd.qcut(rfm['购买金额'], 5, labels=[1, 2, 3, 4, 5])

# 计算RFM总分
rfm['RFM_Score'] = rfm['R_Score'].astype(str) + rfm['F_Score'].astype(str) + rfm['M_Score'].astype(str)

# 识别高价值客户
high_value = rfm[rfm['RFM_Score'].str.startswith('5')]
print("\n高价值客户:")
print(high_value.head())

6.完整代码

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 1. 读取CSV文件
print("1. 读取销售数据文件...")
sales_df = pd.read_csv('sales_data.csv')

# 查看前几行数据
print("\n数据预览:")
print(sales_df.head())

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

# 查看数据统计摘要
print("\n数据统计摘要:")
print(sales_df.describe())

# 2. 数据清洗
print("\n2. 进行数据清洗...")

# 检查缺失值
print("\n缺失值统计:")
print(sales_df.isnull().sum())

# 处理缺失值
# 对于缺失的单价,用同一商品的平均单价填充
print("\n处理缺失的单价...")
for product_id in sales_df['商品ID'].unique():
    mask = (sales_df['商品ID'] == product_id) & (sales_df['单价'].isnull())
    if mask.any():
        avg_price = sales_df[sales_df['商品ID'] == product_id]['单价'].mean()
        sales_df.loc[mask, '单价'] = avg_price

# 对于缺失的数量,用同一商品的中位数填充
print("处理缺失的数量...")
for product_id in sales_df['商品ID'].unique():
    mask = (sales_df['商品ID'] == product_id) & (sales_df['数量'].isnull())
    if mask.any():
        median_quantity = sales_df[sales_df['商品ID'] == product_id]['数量'].median()
        sales_df.loc[mask, '数量'] = median_quantity

# 重新计算总金额(针对缺失的总金额或者填充了单价/数量的记录)
print("更新总金额...")
mask = (sales_df['总金额'].isnull()) | (sales_df['单价'].isnull().shift(fill_value=False)) | (sales_df['数量'].isnull().shift(fill_value=False))
sales_df.loc[mask, '总金额'] = sales_df.loc[mask, '单价'] * sales_df.loc[mask, '数量']

# 转换日期列为日期类型
print("转换日期格式...")
sales_df['日期'] = pd.to_datetime(sales_df['日期'])

# 创建新的时间特征
print("创建时间特征...")
sales_df['月份'] = sales_df['日期'].dt.month
sales_df['季度'] = sales_df['日期'].dt.quarter
sales_df['是否周末'] = sales_df['日期'].dt.dayofweek >= 5  # 5和6代表周六和周日

# 查看清洗后的数据
print("\n清洗后的数据预览:")
print(sales_df.head())
print("\n清洗后的缺失值统计:")
print(sales_df.isnull().sum())

# 3. 数据分析
print("\n3. 进行数据分析...")

# 1. 各类别商品的销售总额
print("\n各类别商品销售总额:")
category_sales = sales_df.groupby('类别')['总金额'].sum().sort_values(ascending=False)
print(category_sales)

# 2. 月度销售趋势
print("\n月度销售总额:")
monthly_sales = sales_df.groupby('月份')['总金额'].sum()
print(monthly_sales)

# 3. 热销商品分析
print("\n销量前10的商品:")
top_products = sales_df.groupby('商品名称')['数量'].sum().sort_values(ascending=False).head(10)
print(top_products)

# 4. 销售员业绩分析
print("\n销售员业绩排名:")
salesperson_performance = sales_df.groupby('销售员')['总金额'].sum().sort_values(ascending=False)
print(salesperson_performance)

# 5. 周末与工作日销售对比
print("\n周末与工作日销售对比:")
weekend_vs_weekday = sales_df.groupby('是否周末')['总金额'].sum()
print(weekend_vs_weekday)

# 6. 客户消费分析
print("\n客户消费排名:")
customer_spending = sales_df.groupby('客户ID')['总金额'].sum().sort_values(ascending=False)
print(customer_spending)

# 7. 季度销售趋势
print("\n季度销售总额:")
quarterly_sales = sales_df.groupby('季度')['总金额'].sum()
print(quarterly_sales)

# 8. 商品均价分析
print("\n各类别商品均价:")
category_avg_price = sales_df.groupby('类别')['单价'].mean().sort_values(ascending=False)
print(category_avg_price)

# 4. 数据可视化
print("\n4. 创建数据可视化...")

# 设置图表风格
sns.set(style="whitegrid")

# 1. 类别销售总额柱状图
plt.figure(figsize=(12, 6))
category_sales.plot(kind='bar', color='skyblue')
plt.title('各类别商品销售总额', fontsize=14)
plt.xlabel('商品类别', fontsize=12)
plt.ylabel('销售总额(元)', fontsize=12)
plt.xticks(rotation=45)
plt.grid(axis='y', linestyle='--', alpha=0.7)
for i, v in enumerate(category_sales):
    plt.text(i, v + 0.1, f'{v:.0f}', ha='center')
plt.tight_layout()
plt.savefig('category_sales.png')
plt.close()
print("已保存图表: category_sales.png")

# 2. 月度销售趋势折线图
plt.figure(figsize=(12, 6))
monthly_sales.plot(kind='line', marker='o', color='#FF7F0E', linewidth=2)
plt.title('月度销售趋势', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售总额(元)', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.7)
plt.xticks(range(1, 13))  # 显示1-12月
for i, v in enumerate(monthly_sales):
    plt.text(monthly_sales.index[i], v + 0.1, f'{v:.0f}', ha='center')
plt.tight_layout()
plt.savefig('monthly_sales.png')
plt.close()
print("已保存图表: monthly_sales.png")

# 3. 热销商品前10名
plt.figure(figsize=(14, 8))
ax = top_products.plot(kind='barh', color='#2CA02C')
plt.title('销量前10的商品', fontsize=14)
plt.xlabel('销售数量', fontsize=12)
plt.ylabel('商品名称', fontsize=12)
plt.grid(axis='x', linestyle='--', alpha=0.7)
# 在条形末端添加数值标签
for i, v in enumerate(top_products):
    plt.text(v + 0.5, i, f'{v:.0f}', va='center')
plt.tight_layout()
plt.savefig('top_products.png')
plt.close()
print("已保存图表: top_products.png")

# 4. 销售员业绩饼图
plt.figure(figsize=(10, 8))
plt.pie(salesperson_performance, labels=salesperson_performance.index, autopct='%1.1f%%', 
        startangle=90, shadow=True, explode=[0.05]*len(salesperson_performance))
plt.title('销售员业绩占比', fontsize=14)
plt.axis('equal')  # 保证饼图是圆的
plt.tight_layout()
plt.savefig('salesperson_performance.png')
plt.close()
print("已保存图表: salesperson_performance.png")

# 5. 周末与工作日销售对比条形图
plt.figure(figsize=(8, 6))
colors = ['#D62728' if x else '#1F77B4' for x in weekend_vs_weekday.index]
weekend_vs_weekday.plot(kind='bar', color=colors)
plt.title('周末与工作日销售对比', fontsize=14)
plt.xlabel('是否周末', fontsize=12)
plt.ylabel('销售总额(元)', fontsize=12)
plt.xticks(ticks=[0, 1], labels=['工作日', '周末'], rotation=0)
plt.grid(axis='y', linestyle='--', alpha=0.7)
for i, v in enumerate(weekend_vs_weekday):
    plt.text(i, v + 0.1, f'{v:.0f}', ha='center')
plt.tight_layout()
plt.savefig('weekend_vs_weekday.png')
plt.close()
print("已保存图表: weekend_vs_weekday.png")

# 6. 季度销售趋势
plt.figure(figsize=(10, 6))
quarterly_sales.plot(kind='bar', color=['#1F77B4', '#FF7F0E', '#2CA02C', '#D62728'])
plt.title('季度销售趋势', fontsize=14)
plt.xlabel('季度', fontsize=12)
plt.ylabel('销售总额(元)', fontsize=12)
plt.xticks(rotation=0)
plt.grid(axis='y', linestyle='--', alpha=0.7)
for i, v in enumerate(quarterly_sales):
    plt.text(i, v + 0.1, f'{v:.0f}', ha='center')
plt.tight_layout()
plt.savefig('quarterly_sales.png')
plt.close()
print("已保存图表: quarterly_sales.png")

# 5. 高级分析:RFM客户分析
print("\n5. 进行RFM客户分析...")

# 获取最大日期(数据集中的最后一天)
max_date = sales_df['日期'].max()

# 按客户ID分组计算RFM指标
rfm = sales_df.groupby('客户ID').agg({
    '日期': lambda x: (max_date - x.max()).days,  # 最近购买时间(天数)
    '商品ID': 'count',  # 购买频率(订单数)
    '总金额': 'sum'  # 购买金额
})

# 重命名列
rfm.columns = ['最近购买时间', '购买频率', '购买金额']

# 查看RFM分析结果
print("\nRFM分析结果:")
print(rfm.head())

# 对RFM指标进行分段
rfm['R分数'] = pd.qcut(rfm['最近购买时间'], 5, labels=[5, 4, 3, 2, 1])
rfm['F分数'] = pd.qcut(rfm['购买频率'].rank(method='first'), 5, labels=[1, 2, 3, 4, 5])
rfm['M分数'] = pd.qcut(rfm['购买金额'].rank(method='first'), 5, labels=[1, 2, 3, 4, 5])

# 计算RFM总分
rfm['RFM_Score'] = rfm['R分数'].astype(str) + rfm['F分数'].astype(str) + rfm['M分数'].astype(str)

# 识别客户类型
print("\n客户分类:")
# 定义客户类型
customer_segments = {
    r'^5': '近期活跃客户',
    r'^[45][45]': '高价值客户',
    r'^[45][1-3]': '高潜力客户',
    r'^3': '中等价值客户',
    r'^[12][45]': '流失高价值客户',
    r'^[12]': '流失低价值客户'
}

# 标记客户类型
for pattern, segment in customer_segments.items():
    rfm[segment] = rfm['RFM_Score'].str.contains(pattern).astype(int)

# 统计各类型客户数量
segment_counts = rfm.iloc[:, 7:].sum().sort_values(ascending=False)
print(segment_counts)

# 可视化客户分类
plt.figure(figsize=(10, 6))
segment_counts.plot(kind='bar', color='purple')
plt.title('客户类型分布', fontsize=14)
plt.xlabel('客户类型', fontsize=12)
plt.ylabel('客户数量', fontsize=12)
plt.xticks(rotation=45)
plt.grid(axis='y', linestyle='--', alpha=0.7)
for i, v in enumerate(segment_counts):
    plt.text(i, v + 0.05, str(v), ha='center')
plt.tight_layout()
plt.savefig('customer_segments.png')
plt.close()
print("已保存图表: customer_segments.png")

# 输出高价值客户
high_value = rfm[rfm['高价值客户'] == 1].sort_values(by='购买金额', ascending=False)
print("\n高价值客户名单:")
print(high_value[['最近购买时间', '购买频率', '购买金额', 'RFM_Score']])

print("\n分析完成! 所有结果都已保存.")

运行结果如图:

在这段销售数据分析代码中,一共创建了7个可视化图表。这些图表系统地展示了销售数据的不同方面,让数据分析结果更加直观和易于理解。

详细图表清单

让我们逐一看看这些图表及其用途:

1.类别销售总额柱状图 (category_sales.png)

  • 展示不同商品类别的总销售额
  • 使用了蓝色柱状图并包含数值标签

2.月度销售趋势折线图 (monthly_sales.png)

  • 显示各月份销售额的变化趋势
  • 使用了橙色线条和圆形标记点

3.热销商品前10名 (top_products.png)

  • 用水平条形图展示销量最高的10种商品
  • 使用了绿色条形并在条形末端添加了数值标签

4.销售员业绩饼图 (salesperson_performance.png)

  • 展示各销售员的销售额占比
  • 使用了带阴影的饼图,各部分略微分离

5.周末与工作日销售对比条形图 (weekend_vs_weekday.png)

  • 比较工作日和周末的销售总额
  • 使用了不同颜色区分(蓝色表示工作日,红色表示周末)

6.季度销售趋势 (quarterly_sales.png)

  • 展示各季度的销售总额
  • 使用了彩色条形图,每个季度用不同颜色表示

7.客户类型分布 (customer_segments.png)

  • 在RFM分析部分创建
  • 展示不同类型客户的数量分布
  • 使用了紫色条形图

这些可视化图表共同构成了一个全面的销售数据分析报告,涵盖了产品、时间、人员和客户多个维度的分析视角,帮助业务人员快速理解数据中的重要模式和趋势。

六、总结与进阶学习路径

在本文中,我们学习了pandas 的基础知识,包括数据结构、基本操作、数据清洗和分析方法。我们还通过销售数据分析的实例,将所学知识应用到实际问题中。

1. 今日要点

  • pandas是Python数据分析的核心库,提供了强大的数据处理功能
  • DataFrame和Series是pandas的两个核心数据结构
  • 数据清洗是数据分析的关键步骤,包括处理缺失值、异常值和数据转换
  • 数据分析涉及数据探索、统计分析和可视化
  • 通过实际案例(销售数据分析)学习数据分析的流程和方法

2. 进阶学习方向

随着对pandas的深入了解,你可以继续学习一下几个方向的内容:

3. 实践建议

数据分析是一项实践性很强的技能,建议:

  • 尝试解决实际业务问题
  • 创建自己的分析项目并分享结果
  • 学习他人的分析案例和方法

七、练习题

  1. 编写代码读取一个CSV文件,并显示其基本信息和统计摘要。
  2. 使用pandas处理缺失值,尝试不同的填充方法。
  3. 对数据进行分组聚合,计算不同类别的统计量。
  4. 创建一个简单的数据可视化,展示数据的某个特征。
  5. 尝试完成一个简单的销售数据分析项目,包括数据清洗、分析和可视化。

谢谢大家阅读《Python星球日记》第20天的内容!

在下一篇文章中,我们将对前20天所学内容进行总结,为基础阶段做一次收尾。如果有任何问题,欢迎在评论区留言!

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

如果你对今天的内容有任何问题,或者想分享你的学习心得,欢迎在评论区留言讨论!

相关推荐
wapicn9913 分钟前
查看手机在线状态,保障设备安全运行
java·网络·数据库·python·php
Andy__M20 分钟前
【AI入门】MCP 初探
人工智能·python·mac
北京_宏哥27 分钟前
🔥PC端自动化测试实战教程-4-pywinauto 操作PC端应用程序窗口 - 上篇(详细教程)
前端·python·测试
北京_宏哥29 分钟前
🔥PC端自动化测试实战教程-3-pywinauto 启动PC端应用程序 - 下篇(详细教程)
前端·windows·python
浪淘沙jkp30 分钟前
智慧水务项目(八)基于Django 5.1 版本PyScada详细安装实战
后端·python·django·pyscada
互联网搬砖老肖1 小时前
21 天 Python 计划:MySQL索引机制从基础到应用
python·mysql·adb
Lounger661 小时前
107.二叉树的层序遍历II- 力扣(LeetCode)
python·算法·leetcode
Code_流苏1 小时前
《Python星球日记》第25天:Pandas 数据分析
python·数据分析·pandas·数据聚合·时间序列
Chh07151 小时前
[特殊字符] 第十二讲 | 地统计学基础与克里金插值法(Kriging)建模实践
分类·数据分析·回归·r语言
小旺不正经1 小时前
数据分析-数据预处理
数据挖掘·数据分析