最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python實現(xiàn)檢測并刪除離群值

 更新時間:2024年01月24日 08:48:43   作者:python收藏家  
離群值是一個數(shù)據(jù)項/對象,它明顯偏離其余的(所謂的正常)對象,本文主要為大家詳細介紹了如何使用Python實現(xiàn)檢測并刪除離群值,感興趣的小伙伴可以了解下

離群值是一個數(shù)據(jù)項/對象,它明顯偏離其余的(所謂的正常)對象。它們可能由測量或執(zhí)行錯誤引起。離群點檢測的分析被稱為離群點挖掘。檢測離群值的方法有很多,刪除過程與從pandas的數(shù)據(jù)框中刪除數(shù)據(jù)項相同。

離群值檢測和刪除

在這里,pandas數(shù)據(jù)框架用于更現(xiàn)實的方法,因為現(xiàn)實世界的項目需要檢測數(shù)據(jù)分析步驟中出現(xiàn)的離群值,相同的方法可以用于列表和序列類型的對象。

# Importing
import sklearn
from sklearn.datasets import load_diabetes
import pandas as pd
import matplotlib.pyplot as plt

# Load the dataset
diabetics = load_diabetes()

# Create the dataframe
column_name = diabetics.feature_names
df_diabetics = pd.DataFrame(diabetics.data)
df_diabetics.columns = column_name
df_diabetics.head()

離群值可以使用可視化、在數(shù)據(jù)集上實現(xiàn)數(shù)學公式或使用統(tǒng)計方法來檢測。下文將討論所有這些問題。

離群值可視化

使用箱形圖可視化離群值

它只需要一個簡單的框和須就可以有效地捕獲數(shù)據(jù)摘要。箱形圖使用第25次、第50次和第75次采樣總結了樣本數(shù)據(jù)。人們可以通過查看數(shù)據(jù)集的箱形圖來了解數(shù)據(jù)集(四分位數(shù),中位數(shù)和離群值)。

# Box Plot
import seaborn as sns
sns.boxplot(df_diabetics['bmi'])

在上圖中,可以清楚地看到,高于10的值是離群值。

# Position of the Outlier
import numpy as np
print(np.where(df_diabetics['bmi']>0.12))

輸出

(array([ 32, 145, 256, 262, 366, 367, 405]),)

使用散點圖可視化離群值

當您有成對的數(shù)值數(shù)據(jù),并且因變量對每個閱讀自變量有多個值時,或者當嘗試確定兩個變量之間的關系時,使用該方法。在利用散點圖的過程中,也可以將其用于離群值檢測。

要繪制散點圖,需要兩個變量以某種方式彼此相關。因此,這里使用的是“每個城鎮(zhèn)的非零售業(yè)務面積比例”和“每10,000美元的全額財產稅稅率”,其列名分別為“INDUS”和“TAX”。

# Scatter plot
fig, ax = plt.subplots(figsize=(6, 4))
ax.scatter(df_diabetics['bmi'], df_diabetics['bp'])

# x-axis label
ax.set_xlabel('(body mass index of people)')

# y-axis label
ax.set_ylabel('(bp of the people )')
plt.show()

查看圖表可以總結出大多數(shù)數(shù)據(jù)點都在圖表的左下角,但很少有點正好相反,即圖表的右上角。右上角的那些點可以被視為離群值。

使用近似可以說所有那些x>20和y>600的數(shù)據(jù)點都是離群值。下面的代碼可以獲取滿足這些條件的所有點的精確位置。

BMI和BP列合并的離群值

在這里,NumPy的np.where()函數(shù)用于在DataFrame df_diabetics中查找條件(df_diabetics[‘bmi’] > 0.12) & (df_diabetics[‘bp’] < 0.8) 為真的位置(索引)。該條件檢查bmi大于0.12且bp小于0.8的離群值。輸出提供DataFrame中離群值位置的行和列索引。

# Position of the Outlier
print(np.where((df_diabetics['bmi'] > 0.12) & (df_diabetics['bp'] < 0.8)))

輸出

(array([ 32, 145, 256, 262, 366, 367, 405]),)

Z-score

Z-score也稱為標準分數(shù)。該值/分數(shù)有助于理解數(shù)據(jù)點距離平均值有多遠。并且在設置閾值之后,可以利用數(shù)據(jù)點的z得分值來定義離群值。

Zscore = (data_point -mean) / std. deviation

在本例中,我們使用SciPy stats模塊中的zscore函數(shù)計算DataFrame df_diabetics中“age”列的Z分數(shù)。生成的數(shù)組z包含“age”列中每個數(shù)據(jù)點的絕對Z分數(shù),指示每個值與平均值的標準差。

# Z score
from scipy import stats
import numpy as np
 
z = np.abs(stats.zscore(df_diabetics['age']))
print(z)

輸出

[0.80050009 0.03956713 1.79330681 1.87244107 0.11317236 1.94881082
 0.9560041  1.33508832 0.87686984 1.49059233 2.02518057 0.57139085
 0.34228161 0.11317236 0.95323959 1.1087436  0.11593688 1.48782782
 0.80326461 0.57415536 1.03237385 1.79607132 1.79607132 0.95323959
 1.33785284 1.41422259 2.25428981 0.49778562 1.10597908 1.41145807
 1.26148309 0.49778562 0.72413034 0.6477606  0.34228161 1.02960933
 0.26591186 0.19230663 0.03956713 0.03956713 0.11317236 2.10155031
 1.26148309 0.41865135 0.95323959 0.57139085 1.18511334 1.64333183                                                                                       
 1.41145807 0.87963435 0.72413034 1.25871858 1.1087436  0.19230663
 1.03237385 0.87963435 0.87963435 0.57415536 0.87686984 1.33508832
 1.49059233 0.87963435 0.57415536 0.72689486 1.41145807 0.9560041
 0.19230663 0.87686984 0.80050009 0.34228161 0.03956713 0.03956713
 1.33508832 0.26591186 0.26591186 0.19230663 0.65052511 2.02518057
 0.11317236 2.17792006 1.48782782 0.26591186 0.34504612 0.80326461
 0.03680262 0.95323959 1.49059233 0.95323959 1.1087436  0.9560041
 0.26591186 0.95323959 0.42141587 1.03237385 1.64333183 1.49059233
 1.18234883 0.57415536 0.03680262 0.03956713 0.34228161 0.34228161]

上面的輸出只是部分數(shù)據(jù)的快照;列表的實際長度(z)是506,即行數(shù)。它打印列的每個數(shù)據(jù)項的z得分值

現(xiàn)在,為了定義離群值,選擇通常為3.0的閾值。由于99.7%的數(shù)據(jù)點位于+/- 3標準差之間(使用高斯分布方法)。

Z值大于2的情況下

在這個例子中,我們設置了一個閾值2,然后使用NumPy的np.where()來標識Z分數(shù)數(shù)組z中絕對Z分數(shù)大于指定閾值(2)的位置(索引)。它根據(jù)Z分數(shù)標準在“年齡”列中打印離群值的位置。

threshold = 2
 
# Position of the outlier
print(np.where(z > 2))

輸出

(array([ 10,  26,  41,  77,  79, 106, 131, 204, 223, 226, 242, 311, 321,344, 374, 402]),)

IQR(四分位數(shù)間距)

四分位數(shù)間距(IQR)是研究領域中最常用和最可信的離群值發(fā)現(xiàn)方法。

IQR = Quartile3 - Quartile1

語法: numpy.percentile(arr, n, axis=None, out=None)

主要參數(shù):

arr:輸入數(shù)組。 n:百分位數(shù)值。

在本例中,我們計算DataFrame df_diabetics中“bmi”列的四分位距(IQR)。它首先使用中點法計算第一四分位數(shù)(Q1)和第三四分位數(shù)(Q3),然后計算IQR作為Q3和Q1之間的差值,提供“bmi”列中中間50%數(shù)據(jù)的分布度量。

# IQR
Q1 = np.percentile(df_diabetics['bmi'], 25, method='midpoint')
Q3 = np.percentile(df_diabetics['bmi'], 75, method='midpoint')
IQR = Q3 - Q1
print(IQR)

輸出

0.06520763046978838

為了定義離群值基礎值定義為高于和低于數(shù)據(jù)集的正常范圍,即上限和下限,定義上限和下限(考慮1.5*IQR值):

upper = Q3 +1.5*IQR
lower = Q1 – 1.5*IQR

在上述公式中,根據(jù)統(tǒng)計學,采用IQR的0.5比例放大(new_IQR = IQR + 0.5*IQR),以考慮高斯分布中2.7標準差之間的所有數(shù)據(jù)。

# Above Upper bound
upper = Q3+1.5*IQR
upper_array = np.array(df_diabetics['bmi'] >= upper)
print("Upper Bound:", upper)
print(upper_array.sum())

# Below Lower bound
lower = Q1-1.5*IQR
lower_array = np.array(df_diabetics['bmi'] <= lower)
print("Lower Bound:", lower)
print(lower_array.sum())

輸出

Upper Bound: 0.12879000811776306
3
Lower Bound: -0.13204051376139045
0

去除離群值

為了移除離群值,必須遵循使用其在數(shù)據(jù)集中的確切位置從數(shù)據(jù)集中移除條目的相同過程,因為在檢測離群值的所有上述方法中,最終結果是根據(jù)所使用的方法滿足離群值定義的所有那些數(shù)據(jù)項的列表。

dataframe.drop(row index,inplace=True)

上面的語法可以用來從數(shù)據(jù)集中刪除一行,給定要刪除的row_indexes。Inplace =True用于告訴Python在原始數(shù)據(jù)集中進行所需的更改。row_index只能是一個值或值列表或NumPy數(shù)組,但必須是一維的。

例:

df_diabetics.drop(lists[0],inplace = True)

基于IQR的離群點檢測與刪除

在這個例子中,我們使用四分位距(IQR)方法來檢測和刪除糖尿病數(shù)據(jù)集的“bmi”列中的離群值。它基于IQR計算上限和下限,使用布爾數(shù)組識別離群值索引,然后從DataFrame中刪除相應的行,從而生成排除離群值的新DataFrame。打印DataFrame的前后形狀以進行比較。

# Importing
import sklearn
from sklearn.datasets import load_diabetes
import pandas as pd

# Load the dataset
diabetes = load_diabetes()

# Create the dataframe
column_name = diabetes.feature_names
df_diabetes = pd.DataFrame(diabetes.data)
df_diabetes .columns = column_name
df_diabetes .head()
print("Old Shape: ", df_diabetes.shape)

''' Detection '''
# IQR
# Calculate the upper and lower limits
Q1 = df_diabetes['bmi'].quantile(0.25)
Q3 = df_diabetes['bmi'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5*IQR
upper = Q3 + 1.5*IQR

# Create arrays of Boolean values indicating the outlier rows
upper_array = np.where(df_diabetes['bmi'] >= upper)[0]
lower_array = np.where(df_diabetes['bmi'] <= lower)[0]

# Removing the outliers
df_diabetes.drop(index=upper_array, inplace=True)
df_diabetes.drop(index=lower_array, inplace=True)

# Print the new shape of the DataFrame
print("New Shape: ", df_diabetes.shape)

輸出

Old Shape:  (442, 10)
New Shape:  (439, 10)

到此這篇關于使用Python實現(xiàn)檢測并刪除離群值的文章就介紹到這了,更多相關Python離群值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python手動或自動協(xié)程操作方法解析

    Python手動或自動協(xié)程操作方法解析

    這篇文章主要介紹了Python手動或自動協(xié)程操作方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 淺談python中copy和deepcopy中的區(qū)別

    淺談python中copy和deepcopy中的區(qū)別

    Python學習過程中會遇到許多問題,最近對copy和deepcopy略感困惑,下面對其進行解答,需要的朋友可以參考。
    2017-10-10
  • Python Socket編程入門教程

    Python Socket編程入門教程

    這篇文章主要介紹了Python Socket編程入門教程,本文包含一個客戶端Socket編程實現(xiàn)和一個服務器端Socket編程例子,需要的朋友可以參考下
    2014-07-07
  • python實現(xiàn)nao機器人身體軀干和腿部動作操作

    python實現(xiàn)nao機器人身體軀干和腿部動作操作

    這篇文章主要為大家詳細介紹了python實現(xiàn)nao機器人身體軀干和腿部動作操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 基于Python實現(xiàn)撲克牌面試題

    基于Python實現(xiàn)撲克牌面試題

    這篇文章主要介紹了基于Python實現(xiàn)撲克牌面試題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Python字符串的encode與decode研究心得亂碼問題解決方法

    Python字符串的encode與decode研究心得亂碼問題解決方法

    為什么Python使用過程中會出現(xiàn)各式各樣的亂碼問題,明明是中文字符卻顯示成“\xe4\xb8\xad\xe6\x96\x87”的形式?
    2009-03-03
  • Python如何拆分ZIP文件

    Python如何拆分ZIP文件

    這篇文章主要介紹了Python如何拆分ZIP文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • PyTorch搭建多項式回歸模型(三)

    PyTorch搭建多項式回歸模型(三)

    這篇文章主要為大家詳細介紹了PyTorch搭建多項式回歸模型,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 基于python實現(xiàn)井字棋小游戲

    基于python實現(xiàn)井字棋小游戲

    這篇文章主要為大家詳細介紹了python實現(xiàn)井字棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 十個Python中常用的pip命令總結

    十個Python中常用的pip命令總結

    相信對于大多數(shù)熟悉Python的人來說,一定都聽說并且使用過pip這個工具,但是對它的了解可能還不一定是非常的透徹,今天小編就來為大家介紹10個使用pip的小技巧,相信對大家以后管理和使用Python當中的標準庫會有幫助
    2022-07-07

最新評論

大石桥市| 隆安县| 太和县| 体育| 通州市| 灵宝市| 安阳市| 保德县| 河南省| 梁平县| 洪雅县| 宜川县| 石门县| 东乌珠穆沁旗| 漠河县| 连山| 青神县| 启东市| 大厂| 汽车| 昆明市| 上饶县| 怀远县| 张北县| 铜梁县| 南昌县| 双柏县| 兴国县| 石泉县| 松滋市| 五家渠市| 晋宁县| 依兰县| 尚义县| 三门县| 买车| 武平县| 泸溪县| 德令哈市| 庆安县| 六安市|