數(shù)據(jù)預(yù)處理_標(biāo)準(zhǔn)化和分類數(shù)據(jù)轉(zhuǎn)換

一仆邓、數(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%以上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市以舒,隨后出現(xiàn)的幾起案子趾痘,更是在濱河造成了極大的恐慌,老刑警劉巖蔓钟,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件永票,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奋刽,警方通過(guò)查閱死者的電腦和手機(jī)瓦侮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)佣谐,“玉大人肚吏,你說(shuō)我怎么就攤上這事∠粱辏” “怎么了罚攀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵党觅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我斋泄,道長(zhǎng)杯瞻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任炫掐,我火速辦了婚禮魁莉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘募胃。我一直安慰自己旗唁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布痹束。 她就那樣靜靜地躺著检疫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祷嘶。 梳的紋絲不亂的頭發(fā)上屎媳,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音论巍,去河邊找鬼烛谊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛环壤,可吹牛的內(nèi)容都是我干的晒来。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼郑现,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼湃崩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起接箫,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤攒读,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后辛友,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體薄扁,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年废累,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邓梅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邑滨,死狀恐怖日缨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掖看,我是刑警寧澤匣距,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布面哥,位于F島的核電站,受9級(jí)特大地震影響毅待,放射性物質(zhì)發(fā)生泄漏尚卫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一尸红、第九天 我趴在偏房一處隱蔽的房頂上張望吱涉。 院中可真熱鬧,春花似錦外里、人聲如沸邑飒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至县匠,卻和暖如春风科,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乞旦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工贼穆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兰粉。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓故痊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親玖姑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愕秫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容