前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据清洗之 异常值处理

数据清洗之 异常值处理

原创
作者头像
ruochen
修改2021-05-14 10:02:29
4220
修改2021-05-14 10:02:29
举报
文章被收录于专栏:若尘的技术专栏

异常值处理

  • 指那些偏离正常范围的值,不是错误值
  • 异常值出现频率较低,但又会对实际项目分析造成偏差
  • 异常值一般用过箱线图法(分位差法)或者分布图(标准差法)来判断
  • 异常值检测可以使用均值的二倍标准差范围,也可以使用上下4分位数差方法
  • 异常值往往采取盖帽法或者数据离散化
代码语言:txt
复制
import pandas as pd
import numpy as np
import os
代码语言:txt
复制
os.getcwd()
代码语言:txt
复制
'D:\\Jupyter\\notebook\\Python数据清洗实战\\数据清洗之数据预处理'
代码语言:txt
复制
os.chdir('D:\\Jupyter\\notebook\\Python数据清洗实战\\数据')
代码语言:txt
复制
df = pd.read_csv('MotorcycleData.csv', encoding='gbk', na_values='Na')
代码语言:txt
复制
def f(x):
    if '$' in str(x):
        x = str(x).strip('$')
        x = str(x).replace(',', '')
    else:
        x = str(x).replace(',', '')
    return float(x)
代码语言:txt
复制
df['Price'] = df['Price'].apply(f)
代码语言:txt
复制
df['Mileage'] = df['Mileage'].apply(f)
代码语言:txt
复制
df.head(5)

<div>

<style scoped>

代码语言:txt
复制
.dataframe tbody tr th:only-of-type {
代码语言:txt
复制
    vertical-align: middle;
代码语言:txt
复制
}
代码语言:txt
复制
.dataframe tbody tr th {
代码语言:txt
复制
    vertical-align: top;
代码语言:txt
复制
}
代码语言:txt
复制
.dataframe thead th {
代码语言:txt
复制
    text-align: right;
代码语言:txt
复制
}

</style>

<table border="1" class="dataframe">

<thead>

代码语言:txt
复制
<tr style="text-align: right;">
代码语言:txt
复制
  <th></th>
代码语言:txt
复制
  <th>Condition</th>
代码语言:txt
复制
  <th>Condition_Desc</th>
代码语言:txt
复制
  <th>Price</th>
代码语言:txt
复制
  <th>Location</th>
代码语言:txt
复制
  <th>Model_Year</th>
代码语言:txt
复制
  <th>Mileage</th>
代码语言:txt
复制
  <th>Exterior_Color</th>
代码语言:txt
复制
  <th>Make</th>
代码语言:txt
复制
  <th>Warranty</th>
代码语言:txt
复制
  <th>Model</th>
代码语言:txt
复制
  <th>...</th>
代码语言:txt
复制
  <th>Vehicle_Title</th>
代码语言:txt
复制
  <th>OBO</th>
代码语言:txt
复制
  <th>Feedback_Perc</th>
代码语言:txt
复制
  <th>Watch_Count</th>
代码语言:txt
复制
  <th>N_Reviews</th>
代码语言:txt
复制
  <th>Seller_Status</th>
代码语言:txt
复制
  <th>Vehicle_Tile</th>
代码语言:txt
复制
  <th>Auction</th>
代码语言:txt
复制
  <th>Buy_Now</th>
代码语言:txt
复制
  <th>Bid_Count</th>
代码语言:txt
复制
</tr>

</thead>

<tbody>

代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>0</th>
代码语言:txt
复制
  <td>Used</td>
代码语言:txt
复制
  <td>mint!!! very low miles</td>
代码语言:txt
复制
  <td>11412.0</td>
代码语言:txt
复制
  <td>McHenry, Illinois, United States</td>
代码语言:txt
复制
  <td>2013.0</td>
代码语言:txt
复制
  <td>16000.0</td>
代码语言:txt
复制
  <td>Black</td>
代码语言:txt
复制
  <td>Harley-Davidson</td>
代码语言:txt
复制
  <td>Unspecified</td>
代码语言:txt
复制
  <td>Touring</td>
代码语言:txt
复制
  <td>...</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>FALSE</td>
代码语言:txt
复制
  <td>8.1</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>2427</td>
代码语言:txt
复制
  <td>Private Seller</td>
代码语言:txt
复制
  <td>Clear</td>
代码语言:txt
复制
  <td>True</td>
代码语言:txt
复制
  <td>FALSE</td>
代码语言:txt
复制
  <td>28.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>1</th>
代码语言:txt
复制
  <td>Used</td>
代码语言:txt
复制
  <td>Perfect condition</td>
代码语言:txt
复制
  <td>17200.0</td>
代码语言:txt
复制
  <td>Fort Recovery, Ohio, United States</td>
代码语言:txt
复制
  <td>2016.0</td>
代码语言:txt
复制
  <td>60.0</td>
代码语言:txt
复制
  <td>Black</td>
代码语言:txt
复制
  <td>Harley-Davidson</td>
代码语言:txt
复制
  <td>Vehicle has an existing warranty</td>
代码语言:txt
复制
  <td>Touring</td>
代码语言:txt
复制
  <td>...</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>FALSE</td>
代码语言:txt
复制
  <td>100</td>
代码语言:txt
复制
  <td>17</td>
代码语言:txt
复制
  <td>657</td>
代码语言:txt
复制
  <td>Private Seller</td>
代码语言:txt
复制
  <td>Clear</td>
代码语言:txt
复制
  <td>True</td>
代码语言:txt
复制
  <td>TRUE</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>2</th>
代码语言:txt
复制
  <td>Used</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>3872.0</td>
代码语言:txt
复制
  <td>Chicago, Illinois, United States</td>
代码语言:txt
复制
  <td>1970.0</td>
代码语言:txt
复制
  <td>25763.0</td>
代码语言:txt
复制
  <td>Silver/Blue</td>
代码语言:txt
复制
  <td>BMW</td>
代码语言:txt
复制
  <td>Vehicle does NOT have an existing warranty</td>
代码语言:txt
复制
  <td>R-Series</td>
代码语言:txt
复制
  <td>...</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>FALSE</td>
代码语言:txt
复制
  <td>100</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>136</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>Clear</td>
代码语言:txt
复制
  <td>True</td>
代码语言:txt
复制
  <td>FALSE</td>
代码语言:txt
复制
  <td>26.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>3</th>
代码语言:txt
复制
  <td>Used</td>
代码语言:txt
复制
  <td>CLEAN TITLE   READY TO RIDE HOME</td>
代码语言:txt
复制
  <td>6575.0</td>
代码语言:txt
复制
  <td>Green Bay, Wisconsin, United States</td>
代码语言:txt
复制
  <td>2009.0</td>
代码语言:txt
复制
  <td>33142.0</td>
代码语言:txt
复制
  <td>Red</td>
代码语言:txt
复制
  <td>Harley-Davidson</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>Touring</td>
代码语言:txt
复制
  <td>...</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>FALSE</td>
代码语言:txt
复制
  <td>100</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>2920</td>
代码语言:txt
复制
  <td>Dealer</td>
代码语言:txt
复制
  <td>Clear</td>
代码语言:txt
复制
  <td>True</td>
代码语言:txt
复制
  <td>FALSE</td>
代码语言:txt
复制
  <td>11.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>4</th>
代码语言:txt
复制
  <td>Used</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>10000.0</td>
代码语言:txt
复制
  <td>West Bend, Wisconsin, United States</td>
代码语言:txt
复制
  <td>2012.0</td>
代码语言:txt
复制
  <td>17800.0</td>
代码语言:txt
复制
  <td>Blue</td>
代码语言:txt
复制
  <td>Harley-Davidson</td>
代码语言:txt
复制
  <td>NO WARRANTY</td>
代码语言:txt
复制
  <td>Touring</td>
代码语言:txt
复制
  <td>...</td>
代码语言:txt
复制
  <td>NaN</td>
代码语言:txt
复制
  <td>FALSE</td>
代码语言:txt
复制
  <td>100</td>
代码语言:txt
复制
  <td>13</td>
代码语言:txt
复制
  <td>271</td>
代码语言:txt
复制
  <td>OWNER</td>
代码语言:txt
复制
  <td>Clear</td>
代码语言:txt
复制
  <td>True</td>
代码语言:txt
复制
  <td>TRUE</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>

</tbody>

</table>

<p>5 rows × 22 columns</p>

</div>

代码语言:txt
复制
# 对价格异常值处理
# 计算价格均值
x_bar = df['Price'].mean()
代码语言:txt
复制
# 计算价格标准差
x_std = df['Price'].std()
代码语言:txt
复制
# 异常值上限检测
any(df['Price'] > x_bar + 2 * x_std)
代码语言:txt
复制
True
代码语言:txt
复制
# 异常值下限检测
any(df['Price'] < x_bar - 2 * x_std)
代码语言:txt
复制
False
代码语言:txt
复制
# 描述性统计
df['Price'].describe()
代码语言:txt
复制
count      7493.000000
代码语言:txt
复制
mean       9968.811557
代码语言:txt
复制
std        8497.326850
代码语言:txt
复制
min           0.000000
代码语言:txt
复制
25%        4158.000000
代码语言:txt
复制
50%        7995.000000
代码语言:txt
复制
75%       13000.000000
代码语言:txt
复制
max      100000.000000
代码语言:txt
复制
Name: Price, dtype: float64
代码语言:txt
复制
# 25% 分位数
Q1 = df['Price'].quantile(q = 0.25)
代码语言:txt
复制
# 75% 分位数
Q3 = df['Price'].quantile(q = 0.75)
代码语言:txt
复制
# 分位差
IQR = Q3 - Q1
代码语言:txt
复制
any(df['Price'] > Q3 + 1.5 * IQR)
代码语言:txt
复制
True
代码语言:txt
复制
any(df['Price'] < Q1 - 1.5 * IQR)
代码语言:txt
复制
False
代码语言:txt
复制
import matplotlib.pyplot as plt
代码语言:txt
复制
%matplotlib inline
代码语言:txt
复制
df['Price'].plot(kind='box')
代码语言:txt
复制
<matplotlib.axes._subplots.AxesSubplot at 0x11ddad20ac8>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PioEYXZs-1587367435767)(output_21_1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PioEYXZs-1587367435767)(output_21_1.png)]
代码语言:txt
复制
# 设置绘图风格
plt.style.use('seaborn')
# 绘制直方图
df.Price.plot(kind='hist', bins=30, density=True)
# 绘制核密度图
df.Price.plot(kind='kde')
# 图形展现
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JWb6qAoD-1587367435770)(output_22_0.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JWb6qAoD-1587367435770)(output_22_0.png)]
代码语言:txt
复制
# 用99分位数和1分位数替换
# 计算P1和P99
P99 = df['Price'].quantile(q=0.99)
P1 = df['Price'].quantile(q=0.01)
代码语言:txt
复制
P99
代码语言:txt
复制
39995.32
代码语言:txt
复制
df['Price_new'] = df['Price']
代码语言:txt
复制
# 盖帽法
df.loc[df['Price'] > P99, 'Price_new'] = P99
df.loc[df['Price'] < P1, 'Price_new'] = P1
代码语言:txt
复制
df[['Price', 'Price_new']].describe()

<div>

<style scoped>

代码语言:txt
复制
.dataframe tbody tr th:only-of-type {
代码语言:txt
复制
    vertical-align: middle;
代码语言:txt
复制
}
代码语言:txt
复制
.dataframe tbody tr th {
代码语言:txt
复制
    vertical-align: top;
代码语言:txt
复制
}
代码语言:txt
复制
.dataframe thead th {
代码语言:txt
复制
    text-align: right;
代码语言:txt
复制
}

</style>

<table border="1" class="dataframe">

<thead>

代码语言:txt
复制
<tr style="text-align: right;">
代码语言:txt
复制
  <th></th>
代码语言:txt
复制
  <th>Price</th>
代码语言:txt
复制
  <th>Price_new</th>
代码语言:txt
复制
</tr>

</thead>

<tbody>

代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>count</th>
代码语言:txt
复制
  <td>7493.000000</td>
代码语言:txt
复制
  <td>7493.000000</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>mean</th>
代码语言:txt
复制
  <td>9968.811557</td>
代码语言:txt
复制
  <td>9821.220873</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>std</th>
代码语言:txt
复制
  <td>8497.326850</td>
代码语言:txt
复制
  <td>7737.092537</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>min</th>
代码语言:txt
复制
  <td>0.000000</td>
代码语言:txt
复制
  <td>100.000000</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>25%</th>
代码语言:txt
复制
  <td>4158.000000</td>
代码语言:txt
复制
  <td>4158.000000</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>50%</th>
代码语言:txt
复制
  <td>7995.000000</td>
代码语言:txt
复制
  <td>7995.000000</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>75%</th>
代码语言:txt
复制
  <td>13000.000000</td>
代码语言:txt
复制
  <td>13000.000000</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>max</th>
代码语言:txt
复制
  <td>100000.000000</td>
代码语言:txt
复制
  <td>39995.320000</td>
代码语言:txt
复制
</tr>

</tbody>

</table>

</div>

代码语言:txt
复制
# df['Price_new'].plot(kind='box')

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异常值处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档