Kommentieren Ausreißer Seaborn Jointplot

Grafische Darstellung des „Tipps“ dataset als jointplot, ich möchte Aufkleber die top 10 der Ausreißer (oder top-n Ausreißer) auf dem Graphen, die durch Ihre Indizes aus der „Tipps“ dataframe. Ich berechne den Restwert (ein Punkt, der Abstand von der mittleren Linie) für die Suche nach dem Ausreißer. Bitte ignorieren Sie die Vorzüge dieses Ausreißer-Erkennung-Methode. Ich möchte nur anmerken das Diagramm nach spec.

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)

Kommentieren Ausreißer Seaborn Jointplot

tips.sort_values(by=['resid'], ascending=[False]).tail(5)

Kommentieren Ausreißer Seaborn Jointplot

%matplotlib inline
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg",
                  xlim=(0, 60), ylim=(0, 12), color="r", size=7)

Wie kann ich kommentieren die top 10 der Ausreißer (größten 5 und die kleinste 5 Residuen) auf dem Graphen von jedem Punkt der index-Wert (größte Residuen), um diese:

Kommentieren Ausreißer Seaborn Jointplot



One Reply
  1. 7

    Können Sie matplotlib annotate zu erstellen, eine Anmerkung zu einem Punkt. Die Idee ist, die Iteration über die dataframes und Stelle eine annotation an der entsprechenden position des "tip" und "total_bill" Spalte.

    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()

    Kommentieren Ausreißer Seaborn Jointplot


    Beachten Sie, dass der pandas version 0.20 der pandas.ols entfernt wurde. Um es zu ersetzen, kann man mit der OLS-Modell von statsmodels. Die entsprechenden Zeilen wären dann zu Lesen:

    import statsmodels.api as sm
    model = sm.OLS(tips.tip, tips.total_bill)
    tips['resid'] = model.fit().resid

    Beachten Sie, dass das Ergebnis leicht anders (wahrscheinlich aufgrund unterschiedlicher Gewichtung).

    • Sortierung und Rundung der iterables head und tail war ein schöner Weg, um die Zahl der Iterationen, esp für große dataframes wie meine aktuellen Datensatz. Dank
    • Ich aktualisierte die Antwort mit einer Lösung für die neueren Versionen von pandas.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.