1.清洗数据
数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等:
清洗数据的原则包括以下方面的内容:
- 尽可能赋予属性名和属性值明确的含义
- 统一多数据源的属性值编码
- 去除重复属性
- 去除可忽略字段
- 合理选择关联字段
- 尽可能赋予属性名和属性值明确的含义
- 统一多数据源的属性值编码
- 去除重复属性
- 去除可忽略字段
- 合理选择关联字段
2 处理缺失数据
- 2.1 缺失值
空值在数据处理过程中,经常见到数据为空的现象。比如在商场销售数据时,顾客的收入属性多数为空值。 - 2.2 引起空值的原因
1.设备异常
2.与其他已有数据不一致而被删除
3.因为误解而没有输入的数据
对数据的改变没有进行日志记载 - 2.3 处理空缺值要经过推断而补上
忽略该记录
去掉属性
手工填写空缺值
使用默认值
使用属性平均值
使用同类样本平均值
预测最可能的值
3 处理噪声数据
- 3.1 噪声的概念和原因
噪声:在测量一个变量时可能出现的测量值相对于真实值的偏差或者错误。
1.噪声数据指的是异常数据或错误数据
2.引起噪声数据的原因可能是硬件故障、编程错误、语音或光学字符识别程序出错等。
3.噪声数据对数据分析的结果影响很大,线性回归中,噪声数据回影响数据的收敛速度。 - 3.2 噪声数据的处理-分箱
分箱:把待处理的数据按照一定的规则放进一些箱子中,考察每一个箱子中的数据、采用某种方法分别对各个箱子中的数据进行处理。
箱子:按照属性划分子区间,如果一个属性值处于某个子区间范围内,就把属性值放进这个子区间代表的“箱子”里。 - 3.3 分箱的方法
分箱的方法:分箱前对记录集按目标属性值的大小进行排序。
1.等深分箱法
2.等宽分箱法 3.用户自定义区间
例子:客户收入属性income排序后的值(人民币:元)800 1000 1200 1500 1800 2000 2300 2800 3000 3500 4000 4500 4800 5000。 - 3.4 等深分箱法(统一权重)
按记录行数分箱,每箱具有相同的记录数,每箱记录数称为箱的权重,也称为箱子的深度。
设定权重(箱子深度)为4,上述例子分箱后的结果如下
箱1:800 1000 1200 1500
箱2:1500 1800 2000 2300
箱3:2500 2800 3000 3500
箱4:4000 4500 4800 5000 - 3.5 等宽分箱法(统一区间)
在整个属性值的区间上平均分布,即每个箱的区间范围是一个常量,称为箱子宽度。
设定区间范围(箱子宽度)为1000元人民币,分箱后。 箱1:800 1000 1200 1500 1500 1800
箱2:2000 2300 2500 2800 3000
箱3:3500 4000 4500
箱4:4800 5000 - 3.6 用户自定义区间
用户自定义:如将客户划分为1000元以下、1000~2000、2000~3000、3000~4000和4000以上几组,分箱后
箱1:800
箱2:1000 1200 1500 1500 2000
箱3:2300 2500 2800 3000
箱4:3500 4000
箱5:4500 4800 5000 - 3.7 聚类处理聚类数据
将物理的或抽象对象的集合分组为不同的簇,找出并清除哪些落在簇之外的值(孤立点),这些孤立点被视为噪声。
特点:直接形成簇并对簇进行描述,不需要任何先验知识。
4 不一致数据处理
- 4.1 数据不一致性的概念
数据不一致性,是指各类数据的矛盾性、不相容性。其一是由于数据冗余造成的,二是由于并发控制不当造成的,三是由于各种故障、错误造成
的。 - 4…2 解决方法
1、设定强制合法的规则范围。凡是不在此范围内的,强制设为最大值或者将其剔除。
2、设定警告规则。凡是不在此规则范围内的,进行警告,然后人工处理
3、离群值人工处理。使用分箱、聚类、回归等方式发现离群值
##5 数据清洗实战
###5.1 Lending Club借贷数据预处理
- 工作年份处理;
- 每月借贷金额处理;
- 借贷评级处理;
- 借贷期限处理;
###5.2 数据集介绍 - https://www.kaggle.com/wendykan/lending-club-loan-data
- 数据集包含2007-2015年间的借贷数据,包含当前借贷状态(current,Late,Paid,等)以及最新的付账信息
- 额外的信息包括:信用评分、金融咨询次数、住址邮政编码、所在州等
- 该数据集包括约890,000条记录,75列数据
5.3 资源和工具库
Python资源库
cycler==0.10.0
husl==4.0.3
joblib==0.14.1
matplotlib==1.5.3
numpy==1.18.0
pandas==0.23.0
pyparsing==2.4.6
python-dateutil==2.8.1
pytz==2019.3
scikit-learn==0.22.1
scipy==1.1.0
seaborn==0.7.1
six==1.14.0
sklearn==0.0
5.4 数据清洗的步骤
- 读取数据集
- 数据处理
- 借贷状态数据处理
- “工作年份” (emp_length) 数据处理
- “开始借贷每月付款金额” (installment) 数据处理
- “借贷评级” (grade) 数据处理
- “借贷期限” (term) 数据处理
6 完成代码
6.1 项目的目录结构
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020030709241729.png)
6.2 完成代码
# -*- coding: utf-8 -*-
"""
作者: Guangzhan
版本: 1.0
项目名称:Lending Club借贷数据处理及初步分析
"""
from __future__ import division, print_function
import os
import pandas as pd
import zipfile
from sklearn import preprocessing
dataset_path = './dataset'
zip_file_name = 'loan.csv.zip'
csv_file_name = './loan.csv'
def create_label(status_val):
label = 1
if status_val == 'Fully Paid':
label = 0
return label
def proc_emp_length(emp_length_val):
# 补全该函数
if emp_length_val == '< 1 year' or emp_length_val == 'n/a':
emp_length_feat = 0.5
elif emp_length_val == '10+ years':
emp_length_feat = 10
else:
emp_length_val = str(emp_length_val)
emp_length_feat = float(emp_length_val.rstrip(' years'))
return emp_length_feat
def run_main():
"""
主函数
"""
zip_file_path = os.path.join(dataset_path, zip_file_name)
csv_file_path = os.path.join(dataset_path, csv_file_name)
if not os.path.exists(csv_file_path):
# 如果不存在csv文件,解压zip文件
with zipfile.ZipFile(zip_file_path) as zf:
zf.extractall(dataset_path)
# == 1. 读取数据集 ==
raw_data = pd.read_csv(csv_file_path)
# == 2. 数据处理 ==
# 数据处理及转换,用于后续模型的输入
# 2.1 “借贷状态” (loan_status) 数据处理
# 根据借贷状态筛选数据,只保留借贷状态为'Fully Paid', 'Charged Off'和'Default'的数据
filter_mask = raw_data['loan_status'].isin(['Fully Paid', 'Charged Off', 'Default'])
filter_data = raw_data[filter_mask]
print(filter_data['loan_status'].value_counts())
# 为数据添加 0, 1 标签,'Fully Paid' -> 0, Otherwise -> 1
proc_filter_data = filter_data.copy()
proc_filter_data['label'] = filter_data['loan_status'].apply(create_label)
# 2.2 “工作年份” (emp_length) 数据处理
# 使用apply函数处理emp_length特征
proc_filter_data['emp_length_feat'] = filter_data['emp_length'].apply(proc_emp_length)
# 2.3 “开始借贷每月付款金额” (installment) 数据处理
proc_filter_data['installment_feat'] = proc_filter_data['installment'] / (proc_filter_data['annual_inc'] / 12)
# 2.4 “借贷评级” (grade) 数据处理
label_enc = preprocessing.LabelEncoder()
proc_filter_data['grade_feat'] = label_enc.fit_transform(proc_filter_data['grade'].values)
# 2.5 “借贷期限” (term) 数据处理
proc_filter_data['term_feat'] = proc_filter_data['term'].apply(lambda x: int(x[1:3]))
# 选择使用的列
numeric_cols = ['int_rate', 'grade_feat', 'loan_amnt', 'installment', 'annual_inc', 'dti',
'delinq_2yrs', 'inq_last_6mths', 'open_acc', 'pub_rec', 'revol_bal', 'revol_util',
'total_acc', 'collections_12_mths_ex_med', 'acc_now_delinq', 'term_feat',
'installment_feat', 'emp_length_feat']
category_cols = ['home_ownership']
label_col = ['label']
user_cols = numeric_cols + category_cols + label_col
final_samples = proc_filter_data[user_cols]
# 去掉空值
final_samples.dropna(inplace=True)
# 保存处理后的数据集
proc_data_filepath = './output/proc_data.csv'
final_samples.to_csv(os.path.join(proc_data_filepath), index=False)
if os.path.exists(csv_file_path):
# 如果存在csv文件,删除csv文件,释放空间
os.remove(csv_file_path)
if __name__ == '__main__':
run_main()
final_samples.to_csv(os.path.join(proc_data_filepath), index=False)
if os.path.exists(csv_file_path):
# 如果存在csv文件,删除csv文件,释放空间
os.remove(csv_file_path)
if __name__ == '__main__':
run_main()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)