??????????歡迎來(lái)到我的博客??????????
??作者:秋無(wú)之地??簡(jiǎn)介:CSDN爬蟲、后端、大數(shù)據(jù)領(lǐng)域創(chuàng)作者。目前從事python爬蟲、后端和大數(shù)據(jù)等相關(guān)工作,主要擅長(zhǎng)領(lǐng)域有:爬蟲、后端、大數(shù)據(jù)開(kāi)發(fā)、數(shù)據(jù)分析等。
??歡迎小伙伴們點(diǎn)贊????、收藏??、留言??、關(guān)注??,關(guān)注必回關(guān)
上一篇文章已經(jīng)跟大家介紹過(guò)《Python爬蟲:如何下載懂車帝的電動(dòng)車數(shù)據(jù)(完整代碼)》,相信大家對(duì)python爬蟲都有一個(gè)基本的認(rèn)識(shí)。下面我講一下:數(shù)據(jù)清洗:數(shù)據(jù)挖掘的前期準(zhǔn)備工作。
一、數(shù)據(jù)清洗重要性
上一節(jié)中講了python爬蟲采集數(shù)據(jù),但做完數(shù)據(jù)采集就可以直接進(jìn)行挖掘了嗎?肯定不是的。
1、什么是數(shù)據(jù)清洗
就拿做飯打個(gè)比方吧,對(duì)于很多人來(lái)說(shuō),熱油下鍋、掌勺翻炒一定是做飯中最過(guò)癮的環(huán)節(jié),但實(shí)際上炒菜這個(gè)過(guò)程只占做飯時(shí)間的 20%,剩下 80% 的時(shí)間都是在做準(zhǔn)備,比如買菜、擇菜、洗菜等等。
在數(shù)據(jù)挖掘中,數(shù)據(jù)清洗就是這樣的前期準(zhǔn)備工作。對(duì)于數(shù)據(jù)科學(xué)家來(lái)說(shuō),我們會(huì)遇到各種各樣的數(shù)據(jù),在分析前,要投入大量的時(shí)間和精力把數(shù)據(jù)“整理裁剪”成自己想要或需要的樣子。
說(shuō)白了,數(shù)據(jù)清洗就是將源數(shù)據(jù)整理成自己想要或需要的樣子。
2、為什么要數(shù)據(jù)清洗
繼續(xù)用上面做飯的例子,我們買回來(lái)的菜,不是馬上就下鍋煮,是不是要清洗一下,菜葉可能殘留農(nóng)藥是不是需要浸泡一下,蔥花有些變黃干枯的是不是需要摘掉等等。我們采集回來(lái)的數(shù)據(jù)同樣存在這些問(wèn)題。
下面舉個(gè)例子,假設(shè)老板給你以下的數(shù)據(jù),讓你做數(shù)據(jù)分析,你看到這個(gè)數(shù)據(jù)后有什么感覺(jué)呢?
你剛看到這些數(shù)據(jù)可能會(huì)比較懵,因?yàn)檫@些數(shù)據(jù)缺少標(biāo)注。
我們?cè)谑占頂?shù)據(jù)的時(shí)候,一定要對(duì)數(shù)據(jù)做標(biāo)注,數(shù)據(jù)表頭很重要。比如這份數(shù)據(jù)表,就缺少列名的標(biāo)注,這樣一來(lái)我們就不知道每列數(shù)據(jù)所代表的含義,無(wú)法從業(yè)務(wù)中理解這些數(shù)值的作用,以及這些數(shù)值是否正確。但在實(shí)際工作中,也可能像這個(gè)案例一樣,數(shù)據(jù)是缺少標(biāo)注的。
我簡(jiǎn)單解釋下這些數(shù)據(jù)代表的含義。
這是一家服裝店統(tǒng)計(jì)的會(huì)員數(shù)據(jù)。最上面的一行是列坐標(biāo),最左側(cè)一列是行坐標(biāo)。
列坐標(biāo)中,第 0 列代表的是序號(hào),第 1 列代表的會(huì)員的姓名,第 2 列代表年齡,第 3 列代表體重,第 4~6 列代表男性會(huì)員的三圍尺寸,第 7~9 列代表女性會(huì)員的三圍尺寸。
了解含義以后,我們?cè)倏聪轮虚g部分具體的數(shù)據(jù),你可能會(huì)想,這些數(shù)據(jù)怎么這么“臟亂差”啊,有很多值是空的(NaN),還有空行的情況。
是的,這還僅僅是一家商店的部分會(huì)員數(shù)據(jù),我們一眼看過(guò)去就能發(fā)現(xiàn)一些問(wèn)題。日常工作中的數(shù)據(jù)業(yè)務(wù)會(huì)復(fù)雜很多,通常我們要統(tǒng)計(jì)更多的數(shù)據(jù)維度,比如 100 個(gè)指標(biāo),數(shù)據(jù)量通常都是超過(guò) TB、EB 級(jí)別的,所以整個(gè)數(shù)據(jù)分析的處理難度是呈指數(shù)級(jí)增加的。這個(gè)時(shí)候,僅僅通過(guò)肉眼就很難找到問(wèn)題所在了。
我舉了這樣一個(gè)簡(jiǎn)單的例子,帶你理解在數(shù)據(jù)分析之前為什么要有數(shù)據(jù)清洗這個(gè)重要的準(zhǔn)備工作。有經(jīng)驗(yàn)的數(shù)據(jù)分析師都知道,好的數(shù)據(jù)分析師必定是一名數(shù)據(jù)清洗高手,要知道在整個(gè)數(shù)據(jù)分析過(guò)程中,不論是在時(shí)間還是功夫上,數(shù)據(jù)清洗大概都占到了 80%。
二、數(shù)據(jù)質(zhì)量的準(zhǔn)則
在上面這個(gè)服裝店會(huì)員數(shù)據(jù)的案例中,一看到這些數(shù)據(jù),你肯定能發(fā)現(xiàn)幾個(gè)問(wèn)題。你是不是想知道,有沒(méi)有一些準(zhǔn)則來(lái)規(guī)范這些數(shù)據(jù)的質(zhì)量呢?
準(zhǔn)則肯定是有的。不過(guò)如果數(shù)據(jù)存在七八種甚至更多的問(wèn)題,我們很難將這些規(guī)則都記住。有研究說(shuō)一個(gè)人的短期記憶,最多可以記住 7 條內(nèi)容或信息,超過(guò) 7 條就記不住了。而數(shù)據(jù)清洗要解決的問(wèn)題,遠(yuǎn)不止 7 條,我們?nèi)f一漏掉一項(xiàng)該怎么辦呢?有沒(méi)有一種方法,我們既可以很方便地記住,又能保證我們的數(shù)據(jù)得到很好的清洗,提升數(shù)據(jù)質(zhì)量呢?
在這里,我將數(shù)據(jù)清洗規(guī)則總結(jié)為以下 4 個(gè)關(guān)鍵點(diǎn),統(tǒng)一起來(lái)叫“完全合一”,下面我來(lái)解釋下。
- 完整性:?jiǎn)螚l數(shù)據(jù)是否存在空值,統(tǒng)計(jì)的字段是否完善。
- 全面性:觀察某一列的全部數(shù)值,比如在 Excel 表中,我們選中一列,可以看到該列的平均值、最大值、最小值。我們可以通過(guò)常識(shí)來(lái)判斷該列是否有問(wèn)題,比如:數(shù)據(jù)定義、單位標(biāo)識(shí)、數(shù)值本身。
- 合法性:數(shù)據(jù)的類型、內(nèi)容、大小的合法性。比如數(shù)據(jù)中存在非 ASCII 字符,性別存在了未知,年齡超過(guò)了 150 歲等。
- 唯一性:數(shù)據(jù)是否存在重復(fù)記錄,因?yàn)閿?shù)據(jù)通常來(lái)自不同渠道的匯總,重復(fù)的情況是常見(jiàn)的。行數(shù)據(jù)、列數(shù)據(jù)都需要是唯一的,比如一個(gè)人不能重復(fù)記錄多次,且一個(gè)人的體重也不能在列指標(biāo)中重復(fù)記錄多次。
在很多數(shù)據(jù)挖掘的教學(xué)中,數(shù)據(jù)準(zhǔn)則通常會(huì)列出來(lái) 7~8 項(xiàng),在這里我們歸類成了“完全合一”4 項(xiàng)準(zhǔn)則,按照以上的原則,我們能解決數(shù)據(jù)清理中遇到的大部分問(wèn)題,使得數(shù)據(jù)標(biāo)準(zhǔn)、干凈、連續(xù),為后續(xù)數(shù)據(jù)統(tǒng)計(jì)、數(shù)據(jù)挖掘做好準(zhǔn)備。如果想要進(jìn)一步優(yōu)化數(shù)據(jù)質(zhì)量,還需要在實(shí)際案例中靈活使用。
了解了數(shù)據(jù)質(zhì)量準(zhǔn)則之后,我們針對(duì)上面服裝店會(huì)員數(shù)據(jù)案例中的問(wèn)題進(jìn)行一一擊破。
1、完整性
問(wèn)題 1:缺失值
在數(shù)據(jù)中有些年齡、體重?cái)?shù)值是缺失的,這往往是因?yàn)閿?shù)據(jù)量較大,在過(guò)程中,有些數(shù)值沒(méi)有采集到。通常我們可以采用以下三種方法:
- 刪除:刪除數(shù)據(jù)缺失的記錄;
- 均值:使用當(dāng)前列的均值;
- 高頻:使用當(dāng)前列出現(xiàn)頻率最高的數(shù)據(jù)。
比如我們想對(duì) df[‘Age’]中缺失的數(shù)值用平均年齡進(jìn)行填充,可以這樣寫:
df['Age'].fillna(df['Age'].mean(), inplace=True)
如果我們用最高頻的數(shù)據(jù)進(jìn)行填充,可以先通過(guò) value_counts 獲取 Age 字段最高頻次 age_maxf,然后再對(duì) Age 字段中缺失的數(shù)據(jù)用 age_maxf 進(jìn)行填充:
age_maxf = train_features['Age'].value_counts().index[0]
train_features['Age'].fillna(age_maxf, inplace=True)
問(wèn)題 2:空行
我們發(fā)現(xiàn)數(shù)據(jù)中有一個(gè)空行,除了 index 之外,全部的值都是 NaN。Pandas 的 read_csv() 并沒(méi)有可選參數(shù)來(lái)忽略空行,這樣,我們就需要在數(shù)據(jù)被讀入之后再使用 dropna() 進(jìn)行處理,刪除空行。
# 刪除全空的行
df.dropna(how='all',inplace=True)
2、全面性
問(wèn)題:列數(shù)據(jù)的單位不統(tǒng)一
觀察 weight 列的數(shù)值,我們能發(fā)現(xiàn) weight 列的單位不統(tǒng)一。有的單位是千克(kgs),有的單位是磅(lbs)。
這里我使用千克作為統(tǒng)一的度量單位,將磅(lbs)轉(zhuǎn)化為千克(kgs):
# 獲取 weight 數(shù)據(jù)列中單位為 lbs 的數(shù)據(jù)
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
# 將 lbs轉(zhuǎn)換為 kgs, 2.2lbs=1kgs
for i,lbs_row in df[rows_with_lbs].iterrows():
# 截取從頭開(kāi)始到倒數(shù)第三個(gè)字符之前,即去掉lbs。
weight = int(float(lbs_row['weight'][:-3])/2.2)
df.at[i,'weight'] = '{}kgs'.format(weight)
3、合理性
問(wèn)題:非 ASCII 字符
我們可以看到在數(shù)據(jù)集中 Firstname 和 Lastname 有一些非 ASCII 的字符。我們可以采用刪除或者替換的方式來(lái)解決非 ASCII 問(wèn)題,這里我們使用刪除方法:
# 刪除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
4、唯一性
問(wèn)題 1:一列有多個(gè)參數(shù)
在數(shù)據(jù)中不難發(fā)現(xiàn),姓名列(Name)包含了兩個(gè)參數(shù) Firstname 和 Lastname。為了達(dá)到數(shù)據(jù)整潔目的,我們將 Name 列拆分成 Firstname 和 Lastname 兩個(gè)字段。我們使用 Python 的 split 方法,str.split(expand=True),將列表拆成新的列,再將原來(lái)的 Name 列刪除。
# 切分名字,刪除源數(shù)據(jù)列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)
問(wèn)題 2:重復(fù)數(shù)據(jù)
我們校驗(yàn)一下數(shù)據(jù)中是否存在重復(fù)記錄。如果存在重復(fù)記錄,就使用 Pandas 提供的 drop_duplicates() 來(lái)刪除重復(fù)數(shù)據(jù)。
# 刪除重復(fù)數(shù)據(jù)行
df.drop_duplicates(['first_name','last_name'],inplace=True)
這樣,我們就將上面案例中的會(huì)員數(shù)據(jù)進(jìn)行了清理,來(lái)看看清理之后的數(shù)據(jù)結(jié)果。怎么樣?是不是又干凈又標(biāo)準(zhǔn)?
三、養(yǎng)成數(shù)據(jù)審核的習(xí)慣
現(xiàn)在,你是不是能感受到數(shù)據(jù)問(wèn)題不是小事,上面這個(gè)簡(jiǎn)單的例子里都有 6 處錯(cuò)誤。所以我們常說(shuō),現(xiàn)實(shí)世界的數(shù)據(jù)是“骯臟的”,需要清洗。
第三方的數(shù)據(jù)要清洗,自有產(chǎn)品的數(shù)據(jù),也需要數(shù)據(jù)清洗。比如美團(tuán)自身做數(shù)據(jù)挖掘的時(shí)候,也需要去除爬蟲抓取,作弊數(shù)據(jù)等。可以說(shuō)沒(méi)有高質(zhì)量的數(shù)據(jù),就沒(méi)有高質(zhì)量的數(shù)據(jù)挖掘,而數(shù)據(jù)清洗是高質(zhì)量數(shù)據(jù)的一道保障。
當(dāng)你從事這方面工作的時(shí)候,你會(huì)發(fā)現(xiàn)養(yǎng)成數(shù)據(jù)審核的習(xí)慣非常重要。而且越是優(yōu)秀的數(shù)據(jù)挖掘人員,越會(huì)有“數(shù)據(jù)審核”的“職業(yè)病”。這就好比編輯非常在意文章中的錯(cuò)別字、語(yǔ)法一樣。
數(shù)據(jù)的規(guī)范性,就像是你的作品一樣,通過(guò)清洗之后,會(huì)變得非常干凈、標(biāo)準(zhǔn)。當(dāng)然了,這也是一門需要不斷修煉的功夫。終有一天,你會(huì)進(jìn)入這樣一種境界:看一眼數(shù)據(jù),差不多 7 秒鐘的時(shí)間,就能知道這個(gè)數(shù)據(jù)是否存在問(wèn)題。為了這一眼的功力,我們要做很多練習(xí)。
剛開(kāi)始接觸數(shù)據(jù)科學(xué)工作的時(shí)候,一定會(huì)覺(jué)得數(shù)據(jù)挖掘是件很酷、很有價(jià)值的事。確實(shí)如此,不過(guò)今天我還要告訴你,再酷炫的事也離不開(kāi)基礎(chǔ)性的工作,就像我們今天講的數(shù)據(jù)清洗工作。對(duì)于這些基礎(chǔ)性的工作,我們需要耐下性子,一個(gè)坑一個(gè)坑地去解決。
四、總結(jié)
下面是數(shù)據(jù)清洗的總結(jié):
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-732176.html
版權(quán)聲明
本文章版權(quán)歸作者所有,未經(jīng)作者允許禁止任何轉(zhuǎn)載、采集,作者保留一切追究的權(quán)利。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-732176.html
到了這里,關(guān)于數(shù)據(jù)清洗:數(shù)據(jù)挖掘的前期準(zhǔn)備工作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!