四分位差发现异常值
在具体报警流程上,四分位差法和西格玛法则是一致的。都需要经过获取数据、构建区间和比较三个步骤。我们就不在这里赘述了。四分位差法的一个好处是,由于其利用的是中位数和分位数,因此受异常值影响较小。因此在指标有较多异常值的情景下或者不符合正态分布的情况下,就可以利用四分位差法进行异常值的判断。
Excel里分位数的公式用percentile(x:x,n),第二个参数n可以选填0.1-1之间以0.1为步长的小数。
但也一样奉上Python代码,以供有需之人:
Python其函数代码如下所示:
# 四分位差
def alarm_ts_q(data, col, time_col="date"):
"""
data :数据框
col :str,关注的指标列名
time_col:时间名
"""
data = data.copy()
data = data.sort_values(time_col)
data.index = data[time_col]
# 按周工作日记周末分别构建预紧期间
q1_weekday = data.loc[data.is_holiday == False, col].rolling(30).quantile(0.25)
q3_weekday = data.loc[data.is_holiday == False, col].rolling(30).quantile(0.75)
q1_weekend = data.loc[data.is_holiday == True, col].rolling(10).quantile(0.25)
q3_weekend = data.loc[data.is_holiday == True, col].rolling(10).quantile(0.75)
q1 = pd.concat([q1_weekday, q1_weekend], 0)
q3 = pd.concat([q3_weekday, q3_weekend], 0)
iqr = q3 - q1
down, up = q1 - 1.5 * iqr, q3 1.5 * iqr
up = up.sort_index()
down = down.sort_index()
# 画图
fig = plt.figure(figsize=(15, 6))
matplotlib.rcParams["font.family"] = ["Heiti TC"] # 需要显示的是汉语
plt.plot(data[col], "k-")
plt.plot(up, "k--", linewidth=0.8)
plt.plot(down, "k--", linewidth=0.8)
plt.fill_between(up.index, up, down, alpha=0.1)
plt.xlim(data.index[32], data.index[-1])
alarm_date_down = data.index[(data[col] < down)]
for i in alarm_date_down:
plt.axvline(i, color="r", alpha=0.4)
alarm_date_up = data.index[(data[col] > up)]
for i in alarm_date_up:
plt.axvline(i, color="g", alpha=0.4)
plt.title(
"{}趋势及预警:下限预警{}次,上限预警{}次".format(col, len(alarm_date_down), len(alarm_date_up)),
fontsize="x-large",
)
plt.xticks(fontsize="x-large")
plt.yticks(fontsize="x-large")
return alarm_date_up, alarm_date_down, up, down, q1, q3
本公众号会持续更新体系化的数据分析技能、思维文章,文章内容来源都是数据禅心团队超十年累积的经验。
这些经验已经被集结成书,也已经被制作成付费课程。
但在这个号,大家可以免费学习,请关注“数据禅心DataZen”不要迷路。
如果看完能学以致用,即使不点赞收藏,就是对码字老师最大的支持啦~
目前这系列文章非常适合数据分析入门,建议大家每一篇都不要落下~