十三、数据清洗
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 數據集介紹
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.05.4 數據清洗的步驟
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 preprocessingdataset_path = './dataset' zip_file_name = 'loan.csv.zip' csv_file_name = './loan.csv'def create_label(status_val):label = 1if status_val == 'Fully Paid':label = 0return labeldef proc_emp_length(emp_length_val):# 補全該函數if emp_length_val == '< 1 year' or emp_length_val == 'n/a':emp_length_feat = 0.5elif emp_length_val == '10+ years':emp_length_feat = 10else:emp_length_val = str(emp_length_val)emp_length_feat = float(emp_length_val.rstrip(' years'))return emp_length_featdef 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 -> 1proc_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_colfinal_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()總結
- 上一篇: 十一、探索性数据分析应用案例
- 下一篇: 十四、数据集成