将“tips”数据集绘制为jointplot,我想通过“tips”数据框中的索引在图表上标记前10个异常值(或前n个异常值)。我计算残差(点与平均线的距离)来找出异常值。请忽略这种异常值检测方法的优点。我只想根据规范注释图表。
import seaborn as sns
sns.set(style="darkgrid", color_codes=True)
tips = sns.load_dataset("tips")
model = pd.ols(y=tips.tip, x=tips.total_bill)
tips['resid'] = model.resid
#indices to annotate
tips.sort_values(by=['resid'], ascending=[False]).head(5)
tips.sort_values(by=['resid'], ascending=[False]).tail(5)
%matplotlib inline
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg",
xlim=(0, 60), ylim=(0, 12), color="r", size=7)
如何通过每个点的索引值(最大残差)来注释图表中的前10个异常值(最大5个和最小5个残差):
答案 0 :(得分:7)
您可以使用matplotlib annotate
为点创建注释。我们的想法是迭代数据框并在"tip"
和"total_bill"
列给出的相应位置放置注释。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="darkgrid", color_codes=True)
tips = sns.load_dataset("tips")
model = pd.ols(y=tips.tip, x=tips.total_bill)
tips['resid'] = model.resid
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg",
xlim=(0, 60), ylim=(0, 12), color="r", size=7)
#indices to annotate
head = tips.sort_values(by=['resid'], ascending=[False]).head(5)
tail = tips.sort_values(by=['resid'], ascending=[False]).tail(5)
def ann(row):
ind = row[0]
r = row[1]
plt.gca().annotate(ind, xy=(r["total_bill"], r["tip"]),
xytext=(2,2) , textcoords ="offset points", )
for row in head.iterrows():
ann(row)
for row in tail.iterrows():
ann(row)
plt.show()
<小时/> 请注意,从pandas版本0.20
pandas.ols
has been removed开始。要替换它,可以使用statsmodels
中的OLS model。然后各行将显示为:
import statsmodels.api as sm
model = sm.OLS(tips.tip, tips.total_bill)
tips['resid'] = model.fit().resid
请注意,结果略有不同(可能是由于加权不同)。