2014-05-21 13 views
5

Ich möchte die Beziehung zwischen zwei Variablen visuell untersuchen. Die funktionale Form der Beziehung ist nicht sichtbar in dichten Streudiagramme wie folgt aus:So visualisieren Sie eine nichtlineare Beziehung in einem Streudiagramm

scatter plot

Wie kann ich eine Lowess glatt auf die Streudiagramm in Python hinzufügen?

Oder haben Sie weitere Vorschläge, um nichtlineare Beziehungen visuell zu untersuchen?

habe ich versucht, die folgenden, aber es funktionierte nicht richtig (auf einem Beispiel aus Michiel de Hoon Zeichnung):

import numpy as np 
from statsmodels.nonparametric.smoothers_lowess import lowess 
x = np.arange(0,10,0.01) 
ytrue = np.exp(-x/5.0) + 2*np.sin(x/3.0) 

# add random errors with a normal distribution      
y = ytrue + np.random.normal(size=len(x)) 
plt.scatter(x,y,color='cyan') 

# calculate a smooth curve through the scatter plot 
ys = lowess(x, y) 
_ = plt.plot(x,ys,'red',linewidth=1) 

# draw the true values for comparison 
plt.plot(x,ytrue,'green',linewidth=3) 

lowess

Die Lowess glatter (rote Linien) seltsam.

EDIT:

Die folgende Matrix enthält auch Lowess Glätter (von this question auf CV genommen): enter image description here

Hat jemand den Code für ein solches Diagramm haben?

+0

Sie scheinen diese Frage bearbeitet zu haben, um eine neue Frage einzubeziehen. Bitte stellen Sie stattdessen eine separate Frage, damit die Leute sie finden können. – DSM

+0

Ja, tut mir leid, die neue Frage ist [hier] (http://stackoverflow.com/questions/23800130/scatter-plot-matrix-with-lowess-smoother). – tobip

Antwort

9

Von der lowess Dokumentation:

Definition: lowess(endog, exog, frac=0.6666666666666666, it=3, delta=0.0, is_sorted=False, missing='drop', return_sorted=True) 

[...] 

Parameters 
---------- 
endog: 1-D numpy array 
    The y-values of the observed points 
exog: 1-D numpy array 
    The x-values of the observed points 

Er akzeptiert Argumente in der anderen Reihenfolge. Es ist auch nicht nur y zurück:

>>> lowess(y, x) 
array([[ 0.00000000e+00, 1.13752478e+00], 
     [ 1.00000000e-02, 1.14087128e+00], 
     [ 2.00000000e-02, 1.14421582e+00], 
     ..., 
     [ 9.97000000e+00, -5.17702654e-04], 
     [ 9.98000000e+00, -5.94304755e-03], 
     [ 9.99000000e+00, -1.13692896e-02]]) 

Aber wenn Sie

ys = lowess(y, x)[:,1] 

rufen Sie so etwas wie

example lowess output

13

Sie auch seaborn verwenden konnte sehen sollte:

import numpy as np 
import seaborn as sns 

x = np.arange(0, 10, 0.01) 
ytrue = np.exp(-x/5) + 2 * np.sin(x/3) 
y = ytrue + np.random.normal(size=len(x)) 

sns.regplot(x, y, lowess=True) 

enter image description here

Verwandte Themen