Python实验报告5
实验报告:数据清洗、数据分析与可视化操作
1. 数据集概述
数据集(order2019.xlsx)包含了2019年所有订单的相关信息。主要列包括:
id:订单ID,唯一标识一个订单。payTime:订单支付时间,包含日期和时间。amount:订单金额,表示该订单的支付金额。customer:客户ID,表示购买该订单的客户。platformType:平台类型,表示订单来源的平台(例如,移动端、PC端等)。status:订单状态,可能包含如“已支付”,“未支付”等状态信息。
2. 数据清洗
数据清洗阶段的目的是处理原始数据中的异常、不一致、缺失和冗余信息,以确保数据质量。此阶段的关键操作包括:
2.1 处理缺失值
首先,检查数据集中是否有缺失值。如果有缺失值,可以选择填充或删除缺失记录。常用的填充方法有均值、中位数或前后值填充。根据数据的特点,选择合适的处理方式。
# 检查数据中的缺失值
df.isnull().sum()
# 对缺失的 'amount' 列进行填充,可以选择填充均值
df['amount'].fillna(df['amount'].mean(), inplace=True)
# 对 'platformType' 列缺失值进行填充,可以填充为 'Unknown'
df['platformType'].fillna('Unknown', inplace=True)
2.2 格式转换
数据中的某些列可能需要转换为合适的格式。例如,payTime 列应该是日期时间类型,amount 列应为数值类型。使用 pd.to_datetime() 转换日期时间格式。
2.3 处理重复数据
如果数据集中存在重复记录,需将其删除。可以使用 drop_duplicates() 函数去除重复行。
2.4 处理异常值
在数据分析之前,需要检查数据是否存在异常值(如负数金额、极端的时间等)。通过统计方法或可视化来检测和处理这些异常值。
2.5 提取时间特征
从 payTime 列中提取有用的时间特征,如年、月、日、小时等,帮助进行时序分析。
3. 数据分析
3.1 基本统计分析
通过 describe() 函数获取数据集中各列的基本统计信息,包括均值、标准差、最小值、最大值等。
3.2 按月分组分析
为了分析订单的时序趋势,我们可以按月份对数据进行分组,计算每月的总订单金额和订单数量。
# 按月分析每月的订单金额和订单数量
monthly_sales = df.groupby('month')['amount'].sum()
monthly_orders = df.groupby('month')['id'].count()
3.3 平台类型分析
分析不同平台类型的订单数量和金额,帮助识别哪些平台更受欢迎或哪些平台贡献的订单金额更大。
# 按平台类型分析订单数量和金额
platform_sales = df.groupby('platformType')['amount'].sum()
platform_orders = df.groupby('platformType')['id'].count()
3.4 客户分析
通过分析不同客户的订单数量和总金额,帮助识别最活跃和贡献最大金额的客户。
# 按客户分析总订单金额
customer_sales = df.groupby('customer')['amount'].sum()
# 排序并显示前10名客户
top_customers = customer_sales.sort_values(ascending=False).head(10)
4. 数据可视化
4.1 订单金额随月份变化的趋势
使用折线图展示不同月份的订单金额变化趋势。
import matplotlib.pyplot as plt
import seaborn as sns
# 绘制订单金额随月份变化的趋势图
plt.figure(figsize=(10,6))
sns.lineplot(x=monthly_sales.index, y=monthly_sales.values)
plt.title('Monthly Order Amount Trend')
plt.xlabel('Month')
plt.ylabel('Total Amount')
plt.show()
4.2 每月订单数量的柱状图
使用柱状图展示每月的订单数量,帮助观察订单数量的季节性波动。
# 绘制每月订单数量的柱状图
plt.figure(figsize=(10,6))
sns.barplot(x=monthly_orders.index, y=monthly_orders.values)
plt.title('Monthly Order Count')
plt.xlabel('Month')
plt.ylabel('Order Count')
plt.show()
4.3 平台类型分析
使用柱状图或饼图展示不同平台类型的订单数量和金额。
# 绘制平台类型的订单金额柱状图
plt.figure(figsize=(10,6))
sns.barplot(x=platform_sales.index, y=platform_sales.values)
plt.title('Order Amount by Platform')
plt.xlabel('Platform Type')
plt.ylabel('Total Amount')
plt.show()
# 绘制平台类型的订单数量柱状图
plt.figure(figsize=(10,6))
sns.barplot(x=platform_orders.index, y=platform_orders.values)
plt.title('Order Count by Platform')
plt.xlabel('Platform Type')
plt.ylabel('Order Count')
plt.show()
4.4 客户订单金额分析
展示前10名客户的订单金额分布,识别出主要的高价值客户。
# 绘制前10名客户的订单金额条形图
plt.figure(figsize=(10,6))
top_customers.plot(kind='bar')
plt.title('Top 10 Customers by Order Amount')
plt.xlabel('Customer ID')
plt.ylabel('Total Order Amount')
plt.show()
5. RFM 模型
RFM模型通过三个维度对客户进行评估:
- Recency(最近购买时间):客户上次购买距离现在的时间间隔。最近购买的客户一般具有较高的忠诚度。
- Frequency(购买频率):客户在一定时间内购买的次数。购买频率越高,表明客户的忠诚度越强。
- Monetary(总消费金额):客户在一定时间内的总消费金额。消费金额越高,客户的价值越大。
附录:完整代码
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 读取数据
df = pd.read_excel('order2019.xlsx', index_col='id')
# 数据清洗
df['payTime'] = pd.to_datetime(df['payTime'])
df['platformType'] = df['platformType'].str.lower()
df['amount'].fillna(df['amount'].mean(), inplace=True)
df['platformType'].fillna('Unknown', inplace=True)
df.drop_duplicates(inplace=True)
# 提取时间特征
df['year'] = df['payTime'].dt.year
df['month'] = df['payTime'].dt.month
df['day'] = df['payTime'].dt.day
df['hour'] = df['payTime'].dt.hour
# 按月分析
monthly_sales = df.groupby('month')['amount'].sum()
monthly_orders = df.groupby('month')['id'].count()
# 按平台类型分析
platform_sales = df.groupby('platformType')['amount'].sum()
platform_orders = df.groupby('platformType')['id'].count()
# 按客户分析
customer_sales = df.groupby('customer')['amount'].sum()
top_customers = customer_sales.sort_values(ascending=False).head(10)
# 绘制每月订单金额趋势图
plt.figure(figsize=(10,6))
sns.lineplot(x=monthly_sales.index, y=monthly_sales.values)
plt.title('Monthly Order Amount Trend')
plt.xlabel('Month')
plt.ylabel('Total Amount')
plt.show()
# 绘制每月订单数量柱状图
plt.figure(figsize=(10,6))
sns.barplot(x=monthly_orders.index, y=monthly_orders.values)
plt.title('Monthly Order Count')
plt.xlabel('Month')
plt.ylabel('Order Count')
plt.show()
# 绘制平台类型的订单金额柱状图
plt.figure(figsize=(10,6))
sns.barplot(x=platform_sales.index, y=platform_sales.values)
plt.title('Order Amount by Platform')
plt.xlabel('Platform Type')
plt.ylabel('Total Amount')
plt.show()
# 绘制前10名客户的订单金额条形图
plt.figure(figsize=(10,6))
top_customers.plot(kind='bar')
plt.title('Top 10 Customers by Order Amount')
plt.xlabel('Customer ID')
plt.ylabel('Total Order Amount')
plt.show()