Python數據預處理之異常值的處理——【自定義的three_sigma()函數、boxplot()方法】

文章目錄

  • 基于3σ原則檢測異常值
    • 代碼實現
    • 測試
  • 基于箱型圖檢測異常值
  • 異常值的處理


基于3σ原則檢測異常值

3σ原則,又稱拉依達準則。是指假設一組檢測數據只含有隨機誤差。對其進行計算處理得到標準偏差,按一定概率確定一個區間,凡是超過這個區間的誤差都是粗大誤差,在此誤差范圍內的數據應予以剔除。

正態分布概率公式中,σ表示標準差,μ表示平均數,f(x)表示正態分布函數。

正態分布公式
在這里插入圖片描述

正態曲線下,

橫軸區間(μ-σ,μ+σ)內的面積為68.268949%。

P{|X-μ|<σ}=2Φ(1)-1=0.6826

橫軸區間(μ-2σ,μ+2σ)內的面積為95.449974%。

P{|X-μ|<2σ}=2Φ(2)-1=0.9544

橫軸區間(μ-3σ,μ+3σ)內的面積99.730020%。

P{|X-μ|<3σ}=2Φ(3)-1=0.9974

由于“小概率事件”和假設檢驗的基本思想 “小概率事件”通常指發生的概率小于5%的事件,認為在一次試驗中該事件是幾乎不可能發生的。

由上可知,X落在(μ-3σ,μ+3σ)以外的概率小于千分之三,在實際問題中常認為相應的事件是不會發生的,基本上可以把區間(μ-3σ,μ+3σ)看作是隨機變量X實際可能的取值區間,超過這個區間的就屬于異常值,應予以剔除。


代碼實現

import numpy as np
import pandas as pddef three_sigma(ser1):  # ser1表示傳入DataFrame的某一列mean_value = ser1.mean()  # 求平均值std_value = ser1.std()  # 求標準差rule = (mean_value - 3 * std_value > ser1) | (ser1.mean() + 3 * ser1.std() < ser1)# 位于(u-3std,u+3std)區間的數據是正常的,不在這個區間的數據為異常的# 一旦發現有異常值,就標注為True,否則標注為Falseindex = np.arange(ser1.shape[0])[rule]  # 返回異常值的位置索引outrange = ser1.iloc[index]  # 獲取異常數據return outrange

測試

將符合正態分布的包含異常值的測試數據保存在D:\數據分析\data.xlsx中。使用Pandas的read_excel()函數從文件中讀取數據,并轉換為DataFrame對象。之后分別對data中的A列數據和B列數據進行檢測。

data = pd.read_excel(r'D:\數據分析\data.xlsx')
print(data)
print(three_sigma(data['A']))
print(three_sigma(data['B']))

輸出結果:

    Unnamed: 0    A  B
0            0    1  2
1            1    2  3
2            2    3  8
3            3    4  5
4            4    5  6
5            5  560  7
6            6    2  8
7            7    3  9
8            8    4  0
9            9    5  3
10          10    3  4
11          11    2  5
12          12    4  6
13          13    5  7
14          14    5  2
15          15   23  4
16          16    2  55    560
Name: A, dtype: int64Series([], Name: B, dtype: int64)

基于箱型圖檢測異常值

箱型圖是一種用作顯示一組數據分散情況的統計圖。在箱型圖中,異常值通常被定義為小于QL-1.5QR或大于QU+1.5IQR的值。其中:

QL:下四分位數,表示全部觀察值中有四分之一的數據取值比它大。

QU:上四分位數,表示全部觀察值中有四分之一的數據取值比它小。

IQR:四分位數間距,是QU與QL之差,其間包含了全部觀察值的一半。


箱型圖是根據實際數據進行繪制,對數據沒有任何要求(3σ原則要求數據服從正態分布或近似正態分布)。箱型圖判斷異常值的標準是以四分位數和四分位距為基礎的。

Pandas中提供了一個專門用來繪制箱型圖的boxplot()方法。

df = pd.DataFrame({'A': [1, 2, 3, 4],'B': [2, 3, 4, 5],'C': [1, 4, 7, 4],'D': [1, 5, 30, 3]})
print(df.boxplot(column=['A', 'B', 'C', 'D']))

輸出結果:
在這里插入圖片描述


異常值的處理

檢測出異常值后,通常會才用如下四種方式處理這些異常值:

1、直接將含有異常值的記錄刪除

2、用具體的值來進行替換,可用前后兩個觀測值的平均值修正該異常值

3、不處理,直接在具有異常值的數據集上進行統計分析

4、視為缺失值,利用缺失值的處理方法修正該異常值

異常數據被檢測出來之后,需要進一步確認他們是否為真正的異常值,等確認完以后再決定選用哪種方法進行解決。

如果希望對異常值進行修改(執行操作2),則可以使用Pandas中replace()方法進行替換,該方法不僅可以對單個數據進行替換,也可以多個數據執行批量替換操作。

replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=‘pad’)

部分參數:

to_replace:表示查找被替換值的方式

value:用來替換任何匹配to_replace的值,默認值為None

limit:表示前向或后向填充的最大尺寸間隙

regex:接收布爾值或與to_replace相同的類型,默認為False,表示是否將to_replace和value解釋為正則表達式

method:替換時使用的方法,pad/ffill表示前向填充,bfill表示后向填充


replace()方法的使用

print(df.replace(to_replace=30, value=3))
print(data.replace(to_replace=data.loc[5, ['A']], value=6))

輸出結果:

AxesSubplot(0.125,0.11;0.775x0.77)A  B  C  D
0  1  2  1  1
1  2  3  4  5
2  3  4  7  3
3  4  5  4  3Unnamed: 0   A  B
0            0   1  2
1            1   2  3
2            2   3  8
3            3   4  5
4            4   5  6
5            5   6  7
6            6   2  8
7            7   3  9
8            8   4  0
9            9   5  3
10          10   3  4
11          11   2  5
12          12   4  6
13          13   5  7
14          14   5  2
15          15  23  4
16          16   2  5

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443859.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

那個谷歌的網紅扔雞蛋的題,來看看教科書式的回答

leetcode頂級難題&#xff0c;谷歌面試天天問&#xff0c;來看看吧&#xff0c;帶你來一步一步達到最優解。 谷歌不知道問了多少遍&#xff0c;藍橋杯也出現過&#xff0c;leetcode上是頂級難題&#xff0c;到底是什么題能如此頻繁地出現&#xff1f;我們一探究竟吧。 原題描述…

Python更改數據類型——astype()方法和to_numeric()函數

文章目錄明確指定數據的類型通過dtypes屬性進行查看創建Pandas對象指定數據類型轉換數據類型通過astype()方法強制轉換數據的類型通過to_numeric()函數轉換數據類型明確指定數據的類型 通過dtypes屬性進行查看 import pandas as pddf pd.DataFrame({A: [1, 2, 4],B: [9, -80…

不騙你,沒讀這一篇,你不可能懂二分

上篇文章講動態規劃獲得了80k瀏覽&#xff0c;這次的二分也值得你們一看&#xff0c;這個系列是特別用心寫的&#xff0c;準備出書的哦 動態規劃 3.0 引子 圖書館自習的時候,一女生背著一堆書進閱覽室,結果警報響了,大媽讓女生看是哪本書把警報弄響了&#xff0c;女生把書倒出…

Python之數據合并——【concat()函數、merge()函數、join()方法、combine_first()方法】

文章目錄軸向堆疊數據——concat()函數橫向堆疊與外連接縱向堆疊與內連接主鍵合并數據——merge()函數內連接方式外連接方式左連接方式右連接方式其他根據行索引合并數據——join()方法四種連接方式行索引與列索引重疊合并重疊數據——combine_first()方法軸向堆疊數據——conc…

超硬核!操作系統學霸筆記,考試復習面試全靠它

之后會發布基于基礎知識的大部分算法的模擬代碼合集&#xff0c;敬請關注。 進程基礎 進程的基本概念 程序順序執行的特征&#xff1a; 1&#xff09;順序性&#xff1a;處理機嚴格按照程序所規定的順序執行&#xff0c;每一步操作必須在下一步操作開始前執行 2&#xff09;封…

配置tomcat6.0的HTTPS(單向)

利用JDK自帶的產生證書的工具 生成證書 建立一個腳本文件&#xff0c;內容如下&#xff1a; set SERVER_DN"CNServer, OUshare, Oshare, Lsz, Sgd, CCN" set CLIENT_DN"CNClient, OUshare, Oshare, Lsz, Sgd, CCN" set KS_PASS-storepass changeit set KE…

Python之數據重塑——【stack()方法和unstack()方法、pivot()方法】

文章目錄重塑層次化索引對于單層索引的DataFrame類對象stack()方法unstack()方法對于多層索引的DataFrame類對象辨析操作內層索引與外層索引的區別查看多層索引對象轉換后的類型軸向旋轉——pivot()方法重塑層次化索引 Pandas中重塑層次化索引的操作主要是stack()方法和unstac…

超硬核!學霸把操作系統經典算法給敲完了!要知行合一

上期的筆記&#xff0c;瀏覽快1萬了&#xff0c;既然關注的人很多&#xff0c;那就發出來承諾過的算法全模擬&#xff0c;希望幫到你們。 上期的操作系統學霸筆記&#xff0c;考試復習面試全靠它 一、模擬進程調度 功能 data.h #ifndef _Data_h_ #define _Data_h_#include …

Python之數據轉換——【rename()方法、cut()函數、get_dummies()函數】

文章目錄重命名軸索引離散化連續數據啞變量處理類別型數據重命名軸索引 rename( self, mapper: Optional[Renamer] None, *, index: Optional[Renamer] None, columns: Optional[Renamer] None, axis: Optional[Axis] None, copy: bool True, inplace: bool False, level…

超硬核!數據結構學霸筆記,考試面試吹牛就靠它

上次發操作系統筆記&#xff0c;很快瀏覽上萬&#xff0c;這次數據結構比上次硬核的多哦&#xff0c;同樣的會發超硬核代碼&#xff0c;關注吧。 超硬核&#xff01;操作系統學霸筆記&#xff0c;考試復習面試全靠它 第一次筆記&#xff08;復習c&#xff0c;課程概述&#xff…

Python之數據拆分——groupby()方法

文章目錄groupby()方法通過列名進行分組通過Series對象進行分組Series對象與原數據的行索引長度相等Series對象與原數據的行索引長度不等通過字典進行分組按照columns軸的方向進行分組按照index軸的方向進行分組通過函數進行分組groupby()方法 groupby( self, byNone, axis0, l…

超硬核!小白讀了這篇文章,就能在算法圈混了

作為一只超級硬核的兔子&#xff0c;從來不給你說廢話&#xff0c;只有最有用的干貨&#xff01;這些神級算法送給你 目錄 第一節 1.1bogo排序 1.2位運算 1.3打擂臺 1.4morris遍歷 第二節 2.1睡眠排序 2.2會死的兔子 2.3矩陣快速冪 2.4摔手機/摔雞蛋 時空復雜度目錄 …

Python之數據聚合——aggregate()方法

文章目錄使用內置統計方法聚合數據面向列的聚合方法aggregate()方法對每一列數據應用同一個函數對某列數據應用不同的函數對不同列數據應用不同函數使用內置統計方法聚合數據 實現數據拆分成組并分別計算平均數的操作 代碼&#xff1a; import pandas as pd import numpy as…

超硬核十萬字!全網最全 數據結構 代碼,隨便秒殺老師/面試官,我說的

本文代碼實現基本按照《數據結構》課本目錄順序&#xff0c;外加大量的復雜算法實現&#xff0c;一篇文章足夠。能換你一個收藏了吧&#xff1f; 當然如果落下什么了歡迎大家評論指出 目錄 順序存儲線性表實現 單鏈表不帶頭標準c語言實現 單鏈表不帶頭壓縮c語言實現 約瑟…

Python之分組級運算——【transform()方法、apply()方法】

文章目錄數據轉換——transform()方法數據應用——apply()方法數據轉換——transform()方法 使用aggregate()方法進行聚合運算已經在上一篇博客中詳細闡述&#xff0c;我們知道aggregate()方法返回的數據集的形狀&#xff08;shape&#xff09;與被分組的數據集的形狀是不同的…

java限制在同一臺電腦上只允許有一個用戶登錄系統

在web應用系統中&#xff0c;出于安全性考慮&#xff0c;經常需要對同一客戶端登錄的用戶數量和一個客戶同時在多個客戶端登陸進行限制。 具體一點就是&#xff1a; 1、在同一臺電腦上一次只允許有一個用戶登錄系統&#xff1b; 2、一個用戶在同一時間只允許在一個客戶端登錄…

Matplotlib——繪制圖表

文章目錄通過figure()函數創建畫布通過subplot()函數創建單個子圖通過subplots()函數創建多個子圖通過add_subplot()方法添加和選中子圖添加各類標簽繪制常見圖表繪制直方圖——hist()函數繪制散點圖——scatter()函數繪制柱狀圖——bar()函數設定線條的相關參數本地保存圖片通…

限制在同一臺電腦上只允許有一個用戶登錄系統

在web應用系統中&#xff0c;出于安全性考慮&#xff0c;經常需要對同一客戶端登錄的用戶數量和一個客戶同時在多個客戶端登陸進行限制。 具體一點就是&#xff1a; 1、在同一臺電腦上一次只允許有一個用戶登錄系統&#xff1b; 2、一個用戶在同一時間只允許在一個客戶端登錄…

Seaborn——繪制統計圖形

文章目錄可視化數據的分布繪制單變量分布繪制雙變量分布繪制成對的雙變量分布用分類數據繪圖類別散點圖通過stripplot()函數畫散點圖swarmplot()函數類別內的數據分布繪制箱型圖繪制提琴圖類別內的統計估計繪制條形圖繪制點圖可視化數據的分布 繪制單變量分布 一般采用最簡單…

Bokeh——交互式可視化庫

文章目錄前言如何通過Plotting繪制圖形前言 Bokeh是一個專門針對Web瀏覽器使用的交互式可視化庫&#xff0c;這是與其他可視化庫相比最核心的區別。 如何通過Plotting繪制圖形 Plotting是以構建視覺符號為核心的接口&#xff0c;可以結合各種視覺元素&#xff08;例如&#x…