十三、数据清洗

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借贷数据预处理

  1. 工作年份处理;
  2. 每月借贷金额处理;
  3. 借贷评级处理;
  4. 借贷期限处理;
    ###5.2 数据集介绍
  5. https://www.kaggle.com/wendykan/lending-club-loan-data
  6. 数据集包含2007-2015年间的借贷数据,包含当前借贷状态(current,Late,Paid,等)以及最新的付账信息
  7. 额外的信息包括:信用评分、金融咨询次数、住址邮政编码、所在州等
  8. 该数据集包括约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 数据清洗的步骤

  1. 读取数据集
  2. 数据处理
  3. 借贷状态数据处理
  4. “工作年份” (emp_length) 数据处理
  5. “开始借贷每月付款金额” (installment) 数据处理
  6. “借贷评级” (grade) 数据处理
  7. “借贷期限” (term) 数据处理

6 完成代码

6.1 项目的目录结构

在这里插入图片描述

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()
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
天气数据是我们日常生活中不可或缺的数据之一。天气数据分析可以帮助人们更好地了解天气状况,预测天气变化,以及为农业、交通等行业提供决策支持。天气数据分析的流程包括数据获取、数据清洗数据管理、数据分析和数据呈现。 一、数据获取 数据获取是天气数据分析的第一步。在进行数据获取时,我们需要考虑以下几个因素: 1. 数据来源:天气数据的来源可以是气象局、天气预报网站或气象传感器等。我们需要根据具体需求选择合适的数据来源。 2. 数据类型:天气数据的类型包括温度、湿度、气压、降水量、风力等。我们需要根据研究目的选择需要的数据类型。 3. 数据时间范围:我们需要考虑获取数据的时间范围,例如过去一年、过去十年或更长时间。 二、数据清洗 数据清洗是指对获取的数据进行清理和处理,以保证数据的准确性和完整性。在数据清洗过程中,我们需要考虑以下几个因素: 1. 数据错误:数据错误包括数据缺失、数据异常等。我们需要对这些错误进行处理,例如通过插值等方法填充缺失值,通过删除异常值等方法处理异常数据。 2. 数据格式:数据格式包括数据类型、数据单位等。我们需要将数据格式统一,以便进行后续的数据分析。 3. 数据重复:数据重复是指同一时间、同一地点的数据被重复记录。我们需要对这些重复数据进行去重处理。 三、数据管理 数据管理是指对清洗后的数据进行管理和存储。在数据管理过程中,我们需要考虑以下几个因素: 1. 数据存储格式:数据存储格式包括文本格式、数据库格式等。我们需要根据数据量、数据类型等进行选择。 2. 数据备份:数据备份是指对数据进行备份,以防止数据丢失或损坏。 3. 数据安全:数据安全是指对数据进行保护,以防止数据泄露或被恶意篡改。 四、数据分析 数据分析是天气数据分析的核心部分。在数据分析过程中,我们需要考虑以下几个因素: 1. 数据可视化:数据可视化是指通过图表、地图等方式将数据可视化,以便更好地理解数据。 2. 数据挖掘:数据挖掘是指通过机器学习、深度学习等方法对数据进行挖掘,以发现数据中的规律和模式。 3. 数据预测:数据预测是指通过历史数据预测未来的天气变化趋势和天气状况。 五、数据呈现 数据呈现是指将数据分析结果以可视化的方式呈现给用户。在数据呈现过程中,我们需要考虑以下几个因素: 1. 用户需求:数据呈现需要根据用户需求进行选择,例如用户需要看到具体数值还是图表、地图等可视化方式。 2. 呈现方式:呈现方式包括网页、移动端、桌面端等。我们需要根据用户使用场景进行选择。 3. 用户体验:数据呈现需要考虑用户体验,以便用户更好地理解数据。 综上所述,天气数据分析的流程包括数据获取、数据清洗数据管理、数据分析和数据呈现。在每个步骤中,我们需要考虑不同的因素,以保证数据分析的准确性和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值