網(wǎng)站首頁 編程語言 正文
異常值
異常值是指樣本中的個(gè)別值,其數(shù)值明顯偏離其余的觀測值。異常值也稱離群點(diǎn),異常值的分析也稱為離群點(diǎn)的分析。
常用的異常值分析方法為3σ原則、箱型圖分析、機(jī)器學(xué)習(xí)算法檢測,一般情況下對異常值的處理都是刪除和修正填補(bǔ),即默認(rèn)為異常值對整個(gè)項(xiàng)目的作用不大,只有當(dāng)我們的目的是要求準(zhǔn)確找出離群點(diǎn),并對離群點(diǎn)進(jìn)行分析時(shí)有必要用到機(jī)器學(xué)習(xí)算法,其他情況下不用費(fèi)精力去分析他們
1、異常值定義
在統(tǒng)計(jì)學(xué)中,離群點(diǎn)是并不屬于特定族群的數(shù)據(jù)點(diǎn),是與其它值相距甚遠(yuǎn)的異常觀測。離群點(diǎn)是一種與其它結(jié)構(gòu)良好的數(shù)據(jù)不同的觀測值。
例如,你可以很清楚地看到這個(gè)列表中的離群點(diǎn):[20,24,22,19,29,18,4300,30,18]
當(dāng)觀測值是一堆數(shù)字且都是一維時(shí),辨別離群點(diǎn)很容易,但如果有數(shù)以千計(jì)的觀測值或數(shù)據(jù)是多維的,你可能會需要更機(jī)智的方法來檢測這些離群點(diǎn)。
2、異常值處理方式
2.1 均方差
3σ原則
如果數(shù)據(jù)服從正態(tài)分布,在3σ原則下,異常值被定義為一組測定值中與平均值的偏差超過三倍標(biāo)準(zhǔn)差的值。
在正態(tài)分布下,距離平均值3σ之外的值出現(xiàn)的概率為 P(|x-μ|>3σ)<=0.003,屬于極個(gè)別的小概率事件。
如果數(shù)據(jù)不服從正態(tài)分布,也可以用遠(yuǎn)離平均值的多少倍標(biāo)準(zhǔn)差來描述
這個(gè)原則有個(gè)前提條件:數(shù)據(jù)需要服從正態(tài)分布
在3?原則下,如果觀測值與平均值的差值超過3倍標(biāo)準(zhǔn)差,那么可以將其視為異常值。
正負(fù)3?的概率是99.7%,那么距離平均值3?之外的值出現(xiàn)的概率為P(|x-u| > 3?) <= 0.003,屬于極個(gè)別的小概率事件。
import numpy as np import pandas as pd def detect_outliers(data,threshold=3): mean_d = np.mean(data) std_d = np.std(data) outliers = [] for y in data_d: z_score= (y - mean_d)/std_d if np.abs(z_score) > threshold: outliers.append(y) return outliers
2.2 箱形圖
四分位間距 (IQR) 的概念被用于構(gòu)建箱形圖。IQR 是統(tǒng)計(jì)學(xué)中的一個(gè)概念,通過將數(shù)據(jù)集分成四分位來衡量統(tǒng)計(jì)分散度和數(shù)據(jù)可變性。
簡單來說,任何數(shù)據(jù)集或任意一組觀測值都可以根據(jù)數(shù)據(jù)的值以及它們與整個(gè)數(shù)據(jù)集的比較情況被劃分為四個(gè)確定的間隔。四分位數(shù)會將數(shù)據(jù)分為三個(gè)點(diǎn)和四個(gè)區(qū)間。
四分位間距對定義離群點(diǎn)非常重要。它是第三個(gè)四分位數(shù)和第一個(gè)四分位數(shù)的差 (IQR = Q3 -Q1)。在這種情況下,離群點(diǎn)被定義為低于箱形圖下觸須(或 Q1 ? 1.5x IQR)或高于箱形圖上觸須(或 Q3 + 1.5x IQR)的觀測值。
IQR是統(tǒng)計(jì)分散程度的一個(gè)度量,分散程度通過需要借助箱線圖來觀察,通常把小于 Q1 - 1.5 * IQR 或者大于 Q3 + 1.5 * IQR的數(shù)據(jù)點(diǎn)視作離群點(diǎn),探測離群點(diǎn)的公式是:
outliers = value < ( Q1 - 1.5 * IQR ) or value > ( Q3 + 1.5 * IQR )
這種探測離群點(diǎn)的方法,是箱線圖默認(rèn)的方法,箱線圖提供了識別異常值/離群點(diǎn)的一個(gè)標(biāo)準(zhǔn):
異常值通常被定義為小于 QL - l.5 IQR 或者 大于 Qu + 1.5 IQR的值,QL稱為下四分位數(shù), Qu稱為上四分位數(shù),IQR稱為四分位數(shù)間距,是Qu上四分位數(shù)和QL下四分位數(shù)之差,其間包括了全部觀察值的一半。
def detect_outliers(sr): q1 = sr.quantile(0.25) q3 = sr.quantile(0.75) iqr = q3-q1 #Interquartile range fence_low = q1-1.5*iqr fence_high = q3+1.5*iqr outliers = sr.loc[(sr < fence_low) | (sr > fence_high)] return outliers
3、實(shí)戰(zhàn)
上面數(shù)據(jù)基礎(chǔ)知識的介紹了,下面我們進(jìn)入今天的正題,也就是利用python與pandas進(jìn)行數(shù)據(jù)分析,今天的主要目標(biāo)就是找到數(shù)據(jù)中的異常值。(我們使用的是前面介紹的第一種方法)
3.1 加載數(shù)據(jù)
首先,我們需要加載進(jìn)行分析的數(shù)據(jù),同樣使用beer的數(shù)據(jù),不過這里的數(shù)據(jù)是經(jīng)過處理的,可以看到abv屬性列的值中大部分都是0.0*,基本都不超過1,但是也有數(shù)據(jù)是55,也就是說這些數(shù)據(jù)是遠(yuǎn)大于其他數(shù)據(jù)的,我們主要是對這部分?jǐn)?shù)據(jù)進(jìn)行處理。
class Repair_Dirty(object): __init_data = 0 def __init__(self, filename): self.filename = filename def get_data(self): if self.filename == " ": # print("您輸入的文件路徑為空") return else: self.__init_data = pd.read_csv(self.filename) return self.__init_data #主函數(shù)定義一個(gè)對象,并實(shí)現(xiàn)對方法的調(diào)用 if __name__ == "__main__": file_path = 'dirty_beer_last.csv' data_cla = Repair_Dirty(file_path) data = data_cla.get_data()#得到數(shù)據(jù)
形如下面的數(shù)據(jù)圖,紅色框內(nèi)數(shù)據(jù)為55的,就是我們所說的異常值,我們的目標(biāo)就是通過第一種方法,將此類數(shù)據(jù)找出來。
3.2 檢測異常值數(shù)據(jù)
使用第一種檢測方式來檢測異常值,我們主要是定義一個(gè)函數(shù)find_outlier(),并且函數(shù)是在類的內(nèi)部實(shí)現(xiàn)的。
# 找到異常值,abv列 def find_outlier(self, attribute): data_att = self.__init_data[attribute] # 找到異常值 outlier = data_att[np.abs(data_att - data_att.mean()) > 3 * data_att.std()] print(data.loc[data[attribute] == 55])#對abv屬性的異常值進(jìn)行輸出 #print(np.where(self.__init_data[attribute] == 55)) # 返回指定位置的索引 return outlier
下面的圖片中可以看到整個(gè)數(shù)據(jù)表中有108行數(shù)據(jù)中abv值為55的,所以很明顯,我們基本上已經(jīng)達(dá)到了想要的目標(biāo),找到了數(shù)據(jù)中的異常值,根據(jù)索引或者id我們便可以將其進(jìn)行值替換操作,對異常值進(jìn)行修復(fù)。
3.3 顯示異常值的索引位置
既然已經(jīng)找到了異常值,那我們再對其進(jìn)行索引顯示就比較簡單了,也就是一行代碼的事,其實(shí)在上面代碼中也可以看到,只不過上面這行代碼被我們給注釋掉了,下面將其單獨(dú)拿出來顯示。
print(np.where(self.__init_data[attribute] == 55)) # 返回指定位置的索引
這行代碼就是對異常值索引進(jìn)行顯示了。
至此,我們今天的數(shù)據(jù)分析異常值處理的博文就寫到這里了,小張同學(xué)仍在馬不停蹄的進(jìn)行學(xué)習(xí),希望這篇文章能夠幫助正在學(xué)習(xí)數(shù)據(jù)分析的小伙伴!!!
奧利給
最后,將源代碼附上,有需要的小伙伴可以自取。
import pandas as pd import numpy as np import re class Repair_Dirty(object): __init_data = 0 def __init__(self, filename): self.filename = filename def get_data(self): if self.filename == " ": # print("您輸入的文件路徑為空") return else: self.__init_data = pd.read_csv(self.filename) return self.__init_data # 找到異常值,abv列 def find_outlier(self, attribute): data_att = self.__init_data[attribute] # 找到異常值 outlier = data_att[np.abs(data_att - data_att.mean()) > 3 * data_att.std()] print(data.loc[data[attribute] == 55])#對abv屬性的異常值進(jìn)行輸出 print(np.where(self.__init_data[attribute] == 55)) # 返回指定位置的索引 return outlier if __name__ == "__main__": file_path = 'dirty_beer_last.csv' data_cla = Repair_Dirty(file_path) data = data_cla.get_data() print((data)) if data is None: print("路徑為空,程序退出!!!") else: data = data_cla.fill_na() outlier = data_cla.find_outlier() print(outlier)
總結(jié)
原文鏈接:https://blog.csdn.net/baidu_41797613/article/details/120342256
相關(guān)推薦
- 2022-03-14 IDEA 上傳文件 getRealpath("/upload)獲取不到文件上傳路徑問題
- 2022-11-10 在React項(xiàng)目中使用TypeScript詳情_React
- 2021-09-01 Go語言集成開發(fā)環(huán)境IDE詳細(xì)安裝教程_Golang
- 2022-09-02 selenium動態(tài)數(shù)據(jù)獲取的方法實(shí)現(xiàn)_python
- 2022-04-19 idea如何解決jar包沖突
- 2022-03-23 shell中的流編輯器awk工作原理_linux shell
- 2023-05-29 postgresql數(shù)據(jù)庫配置文件postgresql.conf,pg_hba.conf,pg_id
- 2022-03-18 C語言實(shí)現(xiàn)一個(gè)閃爍的圣誕樹_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支