本文將詳細介紹如何使用Python剔除異常值。異常值是在一個數據集中與其他數據點明顯不同的值,會影響到數據的分析和可視化。
一、找出異常值
首先需要找出異常值。可以使用Python中的三種方法來找出異常值:基於分佈的方法、基於距離的方法和基於模型的方法。
1. 基於分佈的方法
基於分佈的方法假設數據遵循某種分佈,從而判斷哪些值可能是異常值。可以通過以下步驟實現這種方法:
import numpy as np
import matplotlib.pyplot as plt
# 生成數據
data = np.random.normal(0, 1, 1000)
# 繪製正態分佈概率密度圖
plt.hist(data, bins=50, density=True, alpha=0.6, color='g')
# 設定閾值標準
threshold = 3
# 識別異常點
outliers = np.where(abs(data - np.mean(data)) > threshold * np.std(data))[0]
# 將異常點標紅
plt.scatter(data[outliers], np.zeros_like(data[outliers]), c='r')
plt.show()
2. 基於距離的方法
基於距離的方法使用數據點之間的距離來識別異常點。可以通過以下步驟實現這種方法:
import numpy as np
from scipy.spatial.distance import cdist
# 生成數據
data = np.random.normal(0, 1, (100, 2))
# 計算所有數據點之間的距離
distances = cdist(data, data)
# 設定閾值標準
threshold = np.percentile(distances, 95)
# 識別異常點
outliers = np.where(distances > threshold)
# 繪製散點圖
plt.scatter(data[:,0], data[:,1])
plt.scatter(data[outliers[0],0], data[outliers[0],1], color='r')
plt.show()
3. 基於模型的方法
基於模型的方法使用數據建立模型,然後通過數據點與模型的差異來判斷哪些值可能是異常值。可以通過以下步驟實現這種方法:
from sklearn.covariance import EllipticEnvelope
import numpy as np
# 生成數據
data = np.random.multivariate_normal([0, 0], [[1, 0], [0, 1]], 100)
# 使用EllipticEnvelope模型識別異常點
detector = EllipticEnvelope(contamination=0.1)
detector.fit(data)
# 標記異常點
outliers = detector.predict(data)
# 繪製散點圖
plt.scatter(data[:,0], data[:,1], c=outliers)
plt.show()
二、剔除異常值
找出異常值之後,需要將其排除在數據集之外。以下是幾種剔除異常值的常用方法:
1. 刪除異常值所在的行
最簡單的方法是刪除異常值所在的行:
import pandas as pd
# 生成數據
data = {'A': [1, 2, 3, 4, 5, 6],
'B': [4, 2, 1, 3, 6, 8]}
df = pd.DataFrame(data)
# 找出異常值
q1 = df['B'].quantile(0.25)
q3 = df['B'].quantile(0.75)
iqr = q3 - q1
upper_bound = q3 + 1.5 * iqr
lower_bound = q1 - 1.5 * iqr
outliers = df[(df['B'] < lower_bound) | (df['B'] > upper_bound)]
# 刪除異常值所在的行
clean_data = df.drop(outliers.index)
2. 替換異常值
另一種方法是將異常值替換為數據集的中位數或平均值:
import pandas as pd
# 生成數據
data = {'A': [1, 2, 3, 4, 5, 6],
'B': [4, 2, 1, 3, 6, 8]}
df = pd.DataFrame(data)
# 找出異常值
q1 = df['B'].quantile(0.25)
q3 = df['B'].quantile(0.75)
iqr = q3 - q1
upper_bound = q3 + 1.5 * iqr
lower_bound = q1 - 1.5 * iqr
outliers = df[(df['B'] < lower_bound) | (df['B'] > upper_bound)]
# 替換異常值
median = df['B'].median()
df['B'] = df['B'].apply(lambda x: median if (x < lower_bound or x > upper_bound) else x)
3. 使用插值法填補異常值
另一種方法是使用插值法填補異常值。例如,使用數據集的前一個數據點和後一個數據點之間的平均值作為異常值的替代值:
import pandas as pd
# 生成數據
data = {'A': [1, 2, 3, 4, 5, 6],
'B': [4, 2, 1, 3, 6, 8]}
df = pd.DataFrame(data)
# 找出異常值
q1 = df['B'].quantile(0.25)
q3 = df['B'].quantile(0.75)
iqr = q3 - q1
upper_bound = q3 + 1.5 * iqr
lower_bound = q1 - 1.5 * iqr
outliers = df[(df['B'] < lower_bound) | (df['B'] > upper_bound)]
# 使用插值法填補異常值
df['B'] = df['B'].interpolate()
三、結語
本文介紹了如何使用Python找出和剔除異常值,並通過代碼實現了三種查找異常值的方法和三種剔除異常值的方法。剔除異常值可以提高數據分析和可視化的準確性,但是需要根據實際情況酌情使用。
原創文章,作者:DJUCW,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/374062.html