人工智能训练师三级实操题第一部分数据处理
数据处理全流程:从采集到可视化与保存
在数据分析与挖掘的工作中,数据处理是至关重要的环节,它直接影响后续分析结果的准确性和可靠性。本文将详细介绍数据处理的完整流程,包括数据采集与加载、清洗与预处理、标准化、分组统计、可视化以及保存,并结合 Python 代码实例展示各环节的具体操作。
一、数据采集与加载
数据采集是数据处理的第一步,我们通常会从各种数据源获取数据,其中 CSV 文件是一种常见的格式。Python 的pandas
库提供了便捷的函数来加载 CSV 文件。
代码实例:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# 生成模拟数据(实际场景中可替换为真实CSV文件路径)
data = {'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],'Age': [25, 30, None, 45, 50, 35, 60, 22, 70, 33, 150, 28], # 包含缺失值和异常值'Income': [50000, 60000, 75000, None, 90000, 85000, 120000, 45000, 110000, 70000, 80000, 55000], # 包含缺失值'Score': [85.5, 90.0, 78.5, 92.0, 88.0, 76.0, 89.5, 91.0, 82.0, 87.0, 95.0, 80.5],'Category': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
# 保存为CSV/Excel文件,模拟实际数据加载场景
df.to_csv('original_data.csv', index=False)
df.to_excel('example.xlsx', index=False)# 从CSV/Excel文件加载数据
df = pd.read_csv('original_data.csv')
excel_data = pd.read_excel('example.xlsx')# 查看数据前5行
print("数据前5行:")
print(df.head())
运行结果:
数据前5行:ID Age Income Score Category
0 1 25.0 50000.0 85.5 A
1 2 30.0 60000.0 90.0 B
2 3 NaN 75000.0 78.5 A
3 4 45.0 NaN 92.0 B
4 5 50.0 90000.0 88.0 A
二、数据清洗与预处理
原始数据往往存在缺失值、数据类型错误、异常值等问题,需要进行清洗和预处理,为后续分析做准备。
代码实例:
# 1. 处理缺失值
# 查看缺失值情况
print("\n缺失值情况:")
print(df.isnull().sum())# 对数值型列(Age、Income)使用均值填充缺失值
df['Age'] = df['Age'].fillna(df['Age'].mean())
df['Income'] = df['Income'].fillna(df['Income'].mean())# 检查缺失值数量
missing_values = df.isna().sum()
print("缺失值统计:")
print(missing_values)# 前向填充缺失值
df['Age'].ffill(inplace=True)# 后向填充缺失值
df['Score'].bfill(inplace=True)# 检查重复值
duplicates = df.duplicated().sum()
print(f"\n重复值数量:{duplicates}")# 删除重复值
df.drop_duplicates(inplace=True)
print(f"删除重复值后的数据形状:{df.shape}")# 2. 数据类型转换
# 将ID列转换为字符串类型
df['ID'] = df['ID'].astype(str)
print("\n转换后的数据类型:")
print(df.dtypes)# 3. 过滤异常值(以Age为例,合理年龄范围假设为18-90岁)
# 使用between()方法过滤
normal_age = df['Age'].between(18, 90)
# 结合布尔索引保留正常年龄数据
df = df[normal_age]
print("\n过滤异常值后的年龄数据:")
print(df['Age'].values)# 4. 使用groupby()和聚合函数进行数据统计
# 按Category分组,计算各分组的Income均值和Score总和
group_stats = df.groupby('Category').agg({'Income': 'mean','Score': 'sum'
})
print("\n按Category分组的统计结果:")
print(group_stats)
运行结果:
缺失值情况:
ID 0
Age 1
Income 1
Score 0
Category 0
dtype: int64转换后的数据类型:
ID object
Age float64
Income float64
Score float64
Category object
dtype: object过滤异常值后的年龄数据:
[25. 30. 41.57142857 45. 50. 35.60. 22. 70. 33. 28. ]按Category分组的统计结果:Income Score
Category
A 83333.333333 433.0
B 63333.333333 439.0
三、数据标准化
在很多数据分析场景中,不同特征的量纲差异较大,需要进行标准化处理,使各特征具有相同的尺度。Z-score 标准化是一种常用的方法,公式为(x - x.mean()) / x.std()
。
代码实例:
# 对Income列进行Z-score标准化
df['Income_Zscore'] = (df['Income'] - df['Income'].mean()) / df['Income'].std()
print("\n标准化后的Income数据:")
print(df[['Income', 'Income_Zscore']].head())
运行结果:
标准化后的Income数据:Income Income_Zscore
0 50000.0000 -1.068753
1 60000.0000 -0.567239
2 75000.0000 0.283620
3 76666.6667 0.373165
4 90000.0000 1.085966
四、数据分组与统计
对数据进行分组和统计可以帮助我们从不同维度理解数据的分布和特征。
代码实例:
# 1. 使用pd.cut()创建数据区间(将Age分为3个区间)
df['Age_Group'] = pd.cut(df['Age'], bins=[18, 35, 60, 90], labels=['青年', '中年', '老年'])# 2. 使用value_counts()统计类别分布
age_group_dist = df['Age_Group'].value_counts()
print("\n年龄分组分布:")
print(age_group_dist)# 3. 使用groupby()结合mean()计算分组平均值
group_avg_score = df.groupby('Age_Group')['Score'].mean()
print("\n各年龄分组的平均分数:")
print(group_avg_score)
运行结果:
年龄分组分布:
青年 6
中年 4
老年 1
Name: Age_Group, dtype: int64各年龄分组的平均分数:
Age_Group
青年 84.166667
中年 86.000000
老年 82.000000
Name: Score, dtype: float64
五、数据条件处理
import numpy as np# 使用np.where根据分数添加等级标签
excel_data['Grade'] = np.where(excel_data['Score'] >= 90, 'A', np.where(excel_data['Score'] >= 80, 'B', np.where(excel_data['Score'] >= 70, 'C', 'D')))print("添加等级标签后的数据前几行:")
print(excel_data[['Name', 'Score', 'Grade']].head())
添加等级标签后的数据前几行:Name Score Grade
0 Alice 85.0 B
1 Bob 92.0 A
2 Charlie 76.0 C
3 David 65.0 D
4 Emma 88.0 B
六、数据可视化
数据可视化可以直观地展示数据的分布和规律,帮助我们更好地理解数据。下面使用matplotlib.pyplot
绘制几个关键图表。
代码实例:
# 设置中文显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]# 1. 绘制年龄分组分布柱状图
plt.figure(figsize=(8, 5))
age_group_dist.plot(kind='bar', color='skyblue')
plt.title('年龄分组分布')
plt.xlabel('年龄分组')
plt.ylabel('人数')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()# 2. 绘制各年龄分组平均分数折线图
plt.figure(figsize=(8, 5))
group_avg_score.plot(kind='line', marker='o', color='orange')
plt.title('各年龄分组的平均分数')
plt.xlabel('年龄分组')
plt.ylabel('平均分数')
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
运行结果:
- 年龄分组分布柱状图:直观展示了青年、中年、老年三个分组的人数差异,青年组人数最多。
- 各年龄分组平均分数折线图:清晰呈现不同年龄分组的平均分数变化趋势,中年组平均分数最高。
七、数据保存
处理完成的数据需要保存起来,以便后续使用或分享。我们可以使用to_csv()
方法将数据保存为 CSV 文件。
代码实例:
# 将清洗和处理后的数据保存为新文件
df.to_csv('processed_data.csv', index=False)
print("\n数据已成功保存为processed_data.csv文件")df.to_excel('processed_data.xlsx', index=False)
print("数据已保存为Excel文件")
运行结果:
数据已成功保存为processed_data.csv文件
总结
本文详细介绍了数据处理的完整流程,从数据的采集与加载,到清洗预处理(处理缺失值、转换数据类型、过滤异常值),再到数据标准化、分组统计、可视化以及最后的保存。通过 Python 的pandas
和matplotlib
库,我们可以高效地完成这些操作,为后续的数据分析和挖掘奠定坚实的基础。在实际应用中,还需要根据具体的数据特点和分析目标,灵活调整处理方法,以获得更有价值的 insights。