什么是数据清洗
在大数据时代下,我们在针对某一问题的研究时,会有很多数据,但是这些数据一定是合理且能够使用的数据吗?答案当然是否定的。
比如学生信息数据集中,可能有人恶意将年龄写成9999,将重量写成0.0001,如果我们直接使用这些可能出现的错误数据,那么在进行之后的数据分析或者是机器学习时,这些情况都会导致很大的误差。
那么数据清洗这一名词就出现了,其原理就是,先知道数据中大致有哪些错误,然后将这些错误问题一一解决。
数据清洗过程
- 引入数据处理的pandas包
pandas可以很方便的让我们进行数据清洗的过程吗。 - 读取所要清洗的数据
- 分析数据中可能存在的问题
- 针对上述问题选取合理的解决方案
- 进行代码编写,完成解决方案
- 应用到所选取的数据中
- 将清洗完成的数据重新进行存储
数据大概如图
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
def truncate_value(value):
if value == 0:
return None
return value * (-1)
# 定义一个函数,对数值大于1000的进行截取两位
def truncate_value_year(value):
if value > 1000:
return int(value) % 100
return value
def truncate_value_weight(value):
while value < 1000:
print(value)
value = value * 10
return value
df = pd.read_csv("Auto.csv")
# print(df[-5:])
# 提取除了某一列之外的所有列
columns_to_check = df.columns.difference(['name'])
# 将除了某一列之外的所有列尝试转换为数字,无法转换的设置为NaN
df[columns_to_check] = df[columns_to_check].apply(pd.to_numeric, errors='coerce')
# 删除包含NaN值的行
df = df.dropna()
# 将所有数字转换为大于0的数
df[columns_to_check] = df[columns_to_check].applymap(lambda x: truncate_value(x) if x <= 0 else x)
# 删除包含值为0的行
df = df.dropna()
# 删除座位大小不符合的内容
df = df[(df['cylinders'] >= 4) & (df['cylinders'] <= 8)]
# 修改生产年月不符合的数据
df['year'] = df['year'].apply(truncate_value_year)
# 修改生产年月不符合的数据
df['weight'] = df['weight'].apply(truncate_value_weight)
df_cleaned = df
df.to_csv('clean_data.csv', index=False)
# 绘制带有线性回归线的散点图
plt.figure(figsize=(10, 6))
sns.lmplot(x='year', y='mpg', data=df_cleaned, ci=None)
plt.title('MPG vs Year with Linear Regression')
plt.xlabel('Year')
plt.ylabel('MPG')
plt.grid(True)
plt.show()
plt.figure(figsize=(10, 6))
plt.scatter(df_cleaned['year'], df_cleaned['mpg'], alpha=0.5, label='Data')
# 拟合趋势线
x = df_cleaned['year']
y = df_cleaned['mpg']
coefficients = np.polyfit(x, y, 1)
polynomial = np.poly1d(coefficients)
plt.plot(x, polynomial(x), color='red', label='Trendline')
# 添加标签和标题
plt.title('MPG vs Year with Trendline')
plt.xlabel('Year')
plt.ylabel('MPG')
plt.legend()
# 显示图形
plt.grid(True)
plt.show()