一仆邓、數(shù)據(jù)說(shuō)明
本次演練的數(shù)據(jù)集為某企業(yè)業(yè)務(wù)部門(mén)的客戶數(shù)據(jù)鲜滩,將對(duì)該數(shù)據(jù)集進(jìn)行數(shù)據(jù)預(yù)處理等操作。
二节值、缺失值判斷及處理
# 設(shè)置cell多行輸出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all' #默認(rèn)為'last'
# 導(dǎo)入相關(guān)庫(kù)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
os.chdir(r'E:\python_learn\data\python_book_v2\chapter4')
file_name = 'cluster.txt'
data = pd.read_table(file_name,sep=',')
print(data.head())
USER_ID AVG_ORDERS AVG_MONEY IS_ACTIVE SEX
0 1 3.58 40.43 活躍 1
1 2 4.71 41.16 不活躍 1
2 3 3.80 39.49 不活躍 2
3 4 2.85 38.36 不活躍 1
4 5 3.71 38.34 活躍 1
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 5 columns):
USER_ID 1000 non-null int64
AVG_ORDERS 1000 non-null float64
AVG_MONEY 1000 non-null float64
IS_ACTIVE 1000 non-null object
SEX 1000 non-null int64
dtypes: float64(2), int64(2), object(1)
memory usage: 39.1+ KB
從返回信息可知徙硅,數(shù)據(jù)結(jié)構(gòu)為(1000,5),1000條數(shù)據(jù),5個(gè)字段搞疗,分別是:
- 用戶ID(USER_ID)
- 平均用戶訂單數(shù)量(AVG_ORDERS)
- 平均訂單價(jià)值(AVG_MONEY)
- 是否活躍(IS_ACTIVE)
- 性別(SEX),0(未知),1(男),2(女)
通過(guò)以上數(shù)據(jù)說(shuō)明嗓蘑,可以發(fā)現(xiàn)有幾個(gè)字段需要做相關(guān)預(yù)處理
- USER_ID字段,不參與計(jì)算分析,分割出來(lái)
- AVG_ORDERS,AVG_MONEY這兩個(gè)字段桩皿,單位不一樣豌汇,也就是存在量綱差異,不能直接參與分析泄隔,需要標(biāo)準(zhǔn)化處理
- IS_ACTIVE字段拒贱,是字符串類型,為方便后面分析計(jì)算佛嬉,需對(duì)其進(jìn)行轉(zhuǎn)換為分類類型數(shù)據(jù)
- SEX字段逻澳,其實(shí)際應(yīng)屬于分類類型數(shù)據(jù)
# 缺失值判斷(其實(shí)就data.info()返回信息看出不存在缺失值)
data.isna().sum() # 不存在缺失值,不需要處理缺失值
data.isna().sum().sum()
USER_ID 0
AVG_ORDERS 0
AVG_MONEY 0
IS_ACTIVE 0
SEX 0
dtype: int64
0
三暖呕、分割數(shù)據(jù)斜做,提取需要處理的字段
# 分割數(shù)據(jù)
data_id = data['USER_ID']
data_numeric = data.iloc[:,1:3]
四、數(shù)據(jù)標(biāo)準(zhǔn)化處理
1缰揪、z-score標(biāo)準(zhǔn)化
z-socre標(biāo)準(zhǔn)化陨享,又稱為零均值標(biāo)準(zhǔn)化。
公式:(x-x.mean)/x.std
z-score標(biāo)準(zhǔn)化后的數(shù)據(jù)集是以0為均值钝腺,1為標(biāo)準(zhǔn)差的正態(tài)分布抛姑。
但是z-score標(biāo)準(zhǔn)化是一種去中心化的方法會(huì)改變?cè)瓟?shù)據(jù)的分布結(jié)構(gòu),不適用于稀疏數(shù)據(jù)使用艳狐。
print(data_numeric.head())
AVG_ORDERS AVG_MONEY
0 3.58 40.43
1 4.71 41.16
2 3.80 39.49
3 2.85 38.36
4 3.71 38.34
方法1 → 創(chuàng)建匿名函數(shù)直接使用公式定硝,并用apply()函數(shù)將公式映射到DataFrame的每一列
f1 = lambda x :(x-x.mean())/x.std()
data_1 = data_numeric.apply(f1)
print(data_1.head())
AVG_ORDERS AVG_MONEY
0 0.255318 0.754353
1 1.388814 1.473263
2 0.475998 -0.171366
3 -0.476941 -1.284200
4 0.385720 -1.303896
方法2 → 使用sklearn.preprocessing的StandarScaler方法做z-score標(biāo)準(zhǔn)化處理
from sklearn import preprocessing
zscore = preprocessing.StandardScaler() # 創(chuàng)建StandarScaler對(duì)象
data_scaler_1 = zscore.fit_transform(data_numeric) # 用fit_transform方法轉(zhuǎn)換
data_scaler_1 = pd.DataFrame(data_scaler_1,columns=['AVG_ORDERS','AVG_MONEY'])
print(data_scaler_1.head())
AVG_ORDERS AVG_MONEY
0 0.255445 0.754731
1 1.389509 1.474000
2 0.476236 -0.171452
3 -0.477180 -1.284842
4 0.385913 -1.304548
2、Max-Min歸一標(biāo)準(zhǔn)化
Max-Min歸一標(biāo)準(zhǔn)化又稱為最大-最小標(biāo)準(zhǔn)化毫目。
公式:(x-x.min)/(x.max-x.min)
Max-Min標(biāo)準(zhǔn)化后的數(shù)據(jù)會(huì)落入[0,1]區(qū)間內(nèi)蔬啡,并且Max-Min標(biāo)準(zhǔn)化最大優(yōu)點(diǎn)是保持原數(shù)據(jù)的結(jié)構(gòu),適合用于稀疏數(shù)據(jù)
print(data_numeric.head())
AVG_ORDERS AVG_MONEY
0 3.58 40.43
1 4.71 41.16
2 3.80 39.49
3 2.85 38.36
4 3.71 38.34
1.方法1 → 創(chuàng)建匿名函數(shù)直接使用公式镀虐,并用apply()函數(shù)將公式映射到DataFrame的每一列
f2 = lambda x : (x-x.min())/(x.max()-x.min())
data_2 = data_numeric.apply(f2)
print(data_2.head())
AVG_ORDERS AVG_MONEY
0 0.642005 0.625917
1 0.911695 0.804401
2 0.694511 0.396088
3 0.467780 0.119804
4 0.673031 0.114914
方法2 → 使用sklearn.preprocessing的MinMaxScaler方法做Max-Min標(biāo)準(zhǔn)化處理
minmaxscaler = preprocessing.MinMaxScaler() # 創(chuàng)建MinMaxScaler對(duì)象
data_scaler_2 = minmaxscaler.fit_transform(data_numeric) # 標(biāo)準(zhǔn)化處理
data_scaler_2 = pd.DataFrame(data_scaler_2,columns=['AVG_ORDERS','AVG_MONEY'])
print(data_scaler_2.head())
AVG_ORDERS AVG_MONEY
0 0.642005 0.625917
1 0.911695 0.804401
2 0.694511 0.396088
3 0.467780 0.119804
4 0.673031 0.114914
3箱蟆、MaxAbs最大值絕對(duì)值標(biāo)準(zhǔn)化
MaxAbs標(biāo)準(zhǔn)化與Max-Min標(biāo)準(zhǔn)化類似。
公式:x/|x.max()|
MaxAbs標(biāo)準(zhǔn)化后的數(shù)據(jù)也是落入一個(gè)區(qū)間刮便,但區(qū)間為[-1,1]空猜,并且MaxAbs標(biāo)準(zhǔn)化也能保持?jǐn)?shù)據(jù)原有分布結(jié)構(gòu),因而能用于稀疏數(shù)據(jù)
方法1 → 創(chuàng)建匿名函數(shù)直接使用公式恨旱,并用apply()函數(shù)將公式映射到DataFrame的每一列
f3 = lambda x : x/abs(x.max())
data_3 = data_numeric.apply(f3)
print(data_3.head())
AVG_ORDERS AVG_MONEY
0 0.704724 0.963537
1 0.927165 0.980934
2 0.748031 0.941134
3 0.561024 0.914204
4 0.730315 0.913727
2.方法2 → 使用sklearn.preprocessing的MaxAbsScaler方法做MaxAbs標(biāo)準(zhǔn)化處理
maxabsscaler = preprocessing.MaxAbsScaler() # 創(chuàng)建MaxAbsScaler對(duì)象
data_scaler_3 = maxabsscaler.fit_transform(data_numeric) # 標(biāo)準(zhǔn)化處理
data_scaler_3 = pd.DataFrame(data_scaler_3,columns=['AVG_ORDERS','AVG_MONEY'])
print(data_scaler_3.head())
AVG_ORDERS AVG_MONEY
0 0.704724 0.963537
1 0.927165 0.980934
2 0.748031 0.941134
3 0.561024 0.914204
4 0.730315 0.913727
4辈毯、RobustScaler標(biāo)準(zhǔn)化
RobustScaler是針對(duì)離群點(diǎn)的標(biāo)準(zhǔn)化方法。
當(dāng)需要最大限度保留數(shù)據(jù)中的異常值時(shí)搜贤,可以使用該方法進(jìn)行標(biāo)準(zhǔn)化
# 僅使用data_numeric數(shù)據(jù)作為演示RobustScaler的使用谆沃,不代表data_numeric的數(shù)據(jù)屬于離群點(diǎn)
robustscaler = preprocessing.RobustScaler()
data_scaler_4 = robustscaler.fit_transform(data_numeric)
data_scaler_4
array([[-0.07212205, 0.63355705],
[ 0.55478502, 1.02550336],
[ 0.04993065, 0.12885906],
...,
[-0.81553398, -0.35973154],
[-0.58807212, -0.05369128],
[-0.0554785 , 0.1557047 ]])
5、數(shù)據(jù)標(biāo)準(zhǔn)化處理-總結(jié)
-
實(shí)際運(yùn)用種應(yīng)選擇何種方法進(jìn)行標(biāo)準(zhǔn)化處理仪芒?
- 要做中心化處理唁影,并且對(duì)數(shù)據(jù)分布有正態(tài)分布的需求時(shí) ---->>> z-score標(biāo)準(zhǔn)化
- 要指定標(biāo)準(zhǔn)化后的數(shù)據(jù)范圍時(shí) ---->>> Max-Min和MaxAbs標(biāo)準(zhǔn)化都適用耕陷,但前者更好
- 要對(duì)稀疏數(shù)據(jù)進(jìn)行處理時(shí) ---->>> Max-Min和MaxAbs標(biāo)準(zhǔn)化都是理想的選擇
- 要最大限度保留數(shù)據(jù)中的異常值時(shí) ---->>> RobustScaler標(biāo)準(zhǔn)化
五、分類數(shù)據(jù)轉(zhuǎn)換為標(biāo)志變量
- 1据沈、分類數(shù)據(jù):沒(méi)有內(nèi)在數(shù)學(xué)意義的數(shù)據(jù)啃炸,僅用于區(qū)分事物類別
- 2、分類數(shù)據(jù)轉(zhuǎn)換為標(biāo)志變量的方法:用pandas的pd.get_dummies()方法轉(zhuǎn)換
- pd.get_dummies(data,prefix=None,prefix_sep='_',dummy_na=False,columns=None,sparse=False,drop_first=False,dtype=None)
- data卓舵,需要轉(zhuǎn)換的對(duì)象,Series或DataFrame
- prefix_sep膀钠,轉(zhuǎn)換后列名前綴的分隔符掏湾,默認(rèn)下劃線_
- dummy_na,是否增加一列表示NaN值肿嘲,默認(rèn)False融击,忽略NaN
- columns,可以指定需要轉(zhuǎn)換的列名雳窟,默認(rèn)所有數(shù)據(jù)類型為category,object的類型列都會(huì)被轉(zhuǎn)換
- sparse尊浪,是否為稀疏矩陣,默認(rèn)False
# 提取分類數(shù)據(jù)
data_category = data.iloc[:,3:]
print(data_category.head())
IS_ACTIVE SEX
0 活躍 1
1 不活躍 1
2 不活躍 2
3 不活躍 1
4 活躍 1
# sex列應(yīng)為category類型數(shù)據(jù)封救,先查看其一共有多是個(gè)唯一值
data_category['SEX'].unique()
array([1, 2, 0], dtype=int64)
# 將sex字段轉(zhuǎn)換為分類類型
data_category['SEX'] = data_category['SEX'].astype('category')
data_category.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 2 columns):
IS_ACTIVE 1000 non-null object
SEX 1000 non-null category
dtypes: category(1), object(1)
memory usage: 9.0+ KB
# 用pd.get_dummies()將兩個(gè)分類數(shù)據(jù)轉(zhuǎn)換為標(biāo)志數(shù)據(jù)
data_category = pd.get_dummies(data_category)
print(data_category.head())
IS_ACTIVE_不活躍 IS_ACTIVE_活躍 SEX_0 SEX_1 SEX_2
0 0 1 0 1 0
1 1 0 0 1 0
2 1 0 0 0 1
3 1 0 0 1 0
4 0 1 0 1 0
# 為了方便辨認(rèn)拇涤,給其列標(biāo)簽修改名字
data_category = data_category.rename(columns={'SEX_0':'SEX_未知','SEX_1':'SEX_男','SEX_2':'SEX_女'})
print(data_category.head())
IS_ACTIVE_不活躍 IS_ACTIVE_活躍 SEX_未知 SEX_男 SEX_女
0 0 1 0 1 0
1 1 0 0 1 0
2 1 0 0 0 1
3 1 0 0 1 0
4 0 1 0 1 0
六、數(shù)據(jù)接拼重塑
data_clean = pd.concat([data_id,data_1,data_category],axis=1)
print(data_clean.head())
# data_1是上面已經(jīng)使用z-score進(jìn)行標(biāo)準(zhǔn)化后的數(shù)據(jù)
USER_ID AVG_ORDERS AVG_MONEY IS_ACTIVE_不活躍 IS_ACTIVE_活躍 SEX_未知 SEX_男 \
0 1 0.255318 0.754353 0 1 0 1
1 2 1.388814 1.473263 1 0 0 1
2 3 0.475998 -0.171366 1 0 0 0
3 4 -0.476941 -1.284200 1 0 0 1
4 5 0.385720 -1.303896 0 1 0 1
SEX_女
0 0
1 0
2 1
3 0
4 0
知識(shí)補(bǔ)充 --->>> 什么是稀疏數(shù)據(jù)誉结?
稀疏數(shù)據(jù)是指絕大多數(shù)數(shù)值缺失或?yàn)?的數(shù)據(jù)鹅士。但稀疏數(shù)據(jù)絕不是無(wú)用數(shù)據(jù),通過(guò)適當(dāng)?shù)氖侄文軌蛲诰虺龃罅坑杏玫男畔⒊涂印T谝恍┣闆r下掉盅,稀疏數(shù)據(jù)達(dá)到95%以上