使用 Python 进行数据清洗与分析:一个完整的技术实践

06-24 14阅读

在当今大数据时代,数据清洗和分析是数据科学流程中不可或缺的一环。无论是机器学习、商业智能还是可视化分析,原始数据往往存在缺失值、异常值或格式不统一等问题,直接使用这些数据可能会导致模型效果不佳或者错误。本文将通过一个完整的案例,演示如何使用 Python 对真实数据集进行清洗与分析,并展示相关的代码实现。

项目背景与目标

我们以一个虚构的电商销售数据集为例,包含以下字段:

OrderID: 订单编号CustomerName: 客户姓名Product: 商品名称Quantity: 购买数量Price: 单价OrderDate: 下单日期Region: 销售地区

我们的目标是:

加载并初步查看数据;检查并处理缺失值;处理异常值(如负数价格);格式标准化(如日期格式);分析销售额、销量分布等指标;可视化部分结果。

环境准备与数据加载

首先,我们需要安装必要的 Python 库:

pip install pandas numpy matplotlib seaborn openpyxl

接下来,我们使用 Pandas 来读取 Excel 数据文件(假设为 sales_data.xlsx):

import pandas as pd# 读取数据df = pd.read_excel('sales_data.xlsx')# 查看前几行数据print(df.head())

输出示例:

   OrderID CustomerName    Product  Quantity  Price   OrderDate Region0     1001      Alice Li  Laptop X        2   1200  2023-01-01   East1     1002     Bob Chen   Phone A        1    800         NaN   West2     1003    Charlie Wu        NaN        5    -50  2023-01-02   East3     1004       David G    Tablet        3    300  2023-01-03   North

从输出中可以看出,数据中存在一些问题,例如:

缺失值(如 OrderDateProduct 字段)异常值(如 Price 为 -50)需要标准化的数据格式(如日期)

数据清洗过程

3.1 处理缺失值

我们可以使用 isnull() 方法检查缺失情况:

print(df.isnull().sum())

输出示例:

OrderID        0CustomerName   0Product        1Quantity       0Price          0OrderDate      1Region         0dtype: int64

可以看到 ProductOrderDate 存在缺失值。我们采用如下策略:

删除 Product 缺失的行(因为无法推断商品名)使用前后日期填充 OrderDate 缺失值
# 删除 Product 为空的行df.dropna(subset=['Product'], inplace=True)# 填充 OrderDate 缺失值df['OrderDate'].fillna(method='ffill', inplace=True)

3.2 处理异常值

比如单价为负数的情况:

# 查找价格小于0的数据negative_price_rows = df[df['Price'] < 0]print(negative_price_rows)# 将负数价格转为正数df['Price'] = df['Price'].abs()

3.3 格式标准化

确保 OrderDate 是日期类型:

df['OrderDate'] = pd.to_datetime(df['OrderDate'])

还可以提取出订单的年份、月份等信息用于后续分析:

df['Year'] = df['OrderDate'].dt.yeardf['Month'] = df['OrderDate'].dt.month

数据分析与建模

4.1 添加新特征:销售额

df['Revenue'] = df['Quantity'] * df['Price']

4.2 各区域销售额统计

region_revenue = df.groupby('Region')['Revenue'].sum().sort_values(ascending=False)print(region_revenue)

输出示例:

RegionEast     500000North    300000West     200000South    150000Name: Revenue, dtype: float64

4.3 各月销售额趋势

monthly_revenue = df.groupby(['Year', 'Month'])['Revenue'].sum().reset_index()print(monthly_revenue.head())

输出示例:

   Year  Month   Revenue0  2023      1   85000.01  2023      2  120000.02  2023      3   95000.0

数据可视化

我们使用 Matplotlib 和 Seaborn 进行图表绘制:

import matplotlib.pyplot as pltimport seaborn as snssns.set(style="whitegrid")# 区域销售额柱状图plt.figure(figsize=(10, 6))sns.barplot(x=region_revenue.index, y=region_revenue.values)plt.title('Total Revenue by Region')plt.xlabel('Region')plt.ylabel('Revenue ($)')plt.show()# 月度销售额折线图plt.figure(figsize=(12, 6))sns.lineplot(x='Month', y='Revenue', hue='Year', data=monthly_revenue)plt.title('Monthly Revenue Trend')plt.xlabel('Month')plt.ylabel('Revenue ($)')plt.legend(title='Year')plt.grid(True)plt.show()

总结与建议

通过本篇文章,我们完成了一个完整的数据清洗与分析流程,包括:

数据加载与查看缺失值处理异常值识别与修正数据格式标准化特征工程(销售额计算)分组统计与趋势分析图表可视化

这个流程适用于大多数结构化数据集的预处理任务,也为我们后续的建模与预测打下了基础。


附录:完整代码汇总

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# 读取数据df = pd.read_excel('sales_data.xlsx')# 查看缺失值print(df.isnull().sum())# 删除 Product 缺失的行df.dropna(subset=['Product'], inplace=True)# 填充 OrderDate 缺失值df['OrderDate'].fillna(method='ffill', inplace=True)# 将日期列转换为 datetime 类型df['OrderDate'] = pd.to_datetime(df['OrderDate'])# 提取年份和月份df['Year'] = df['OrderDate'].dt.yeardf['Month'] = df['OrderDate'].dt.month# 处理价格为负数的情况df['Price'] = df['Price'].abs()# 添加销售额字段df['Revenue'] = df['Quantity'] * df['Price']# 区域销售额统计region_revenue = df.groupby('Region')['Revenue'].sum().sort_values(ascending=False)print("Region Revenue:")print(region_revenue)# 月度销售额统计monthly_revenue = df.groupby(['Year', 'Month'])['Revenue'].sum().reset_index()print("\nMonthly Revenue:")print(monthly_revenue.head())# 可视化设置sns.set(style="whitegrid")# 区域销售额柱状图plt.figure(figsize=(10, 6))sns.barplot(x=region_revenue.index, y=region_revenue.values)plt.title('Total Revenue by Region')plt.xlabel('Region')plt.ylabel('Revenue ($)')plt.show()# 月度销售额折线图plt.figure(figsize=(12, 6))sns.lineplot(x='Month', y='Revenue', hue='Year', data=monthly_revenue)plt.title('Monthly Revenue Trend')plt.xlabel('Month')plt.ylabel('Revenue ($)')plt.legend(title='Year')plt.grid(True)plt.show()

参考资料:

Pandas DocumentationSeaborn DocumentationMatplotlib Documentation

如需获取完整数据集或进一步扩展功能(如预测建模、聚类分析),欢迎继续关注后续文章!

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第1969名访客 今日有24篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!