skew normal distribution in scipy skew normal distribution in scipy python python

skew normal distribution in scipy


From the Wikipedia description,

from scipy import linspacefrom scipy import pi,sqrt,expfrom scipy.special import erffrom pylab import plot,showdef pdf(x):    return 1/sqrt(2*pi) * exp(-x**2/2)def cdf(x):    return (1 + erf(x/sqrt(2))) / 2def skew(x,e=0,w=1,a=0):    t = (x-e) / w    return 2 / w * pdf(t) * cdf(a*t)    # You can of course use the scipy.stats.norm versions    # return 2 * norm.pdf(t) * norm.cdf(a*t)n = 2**10e = 1.0 # locationw = 2.0 # scalex = linspace(-10,10,n) for a in range(-3,4):    p = skew(x,e,w,a)    plot(x,p)show()

If you want to find the scale, location, and shape parameters from a dataset use scipy.optimize.leastsq, for example using e=1.0,w=2.0 and a=1.0,

fzz = skew(x,e,w,a) + norm.rvs(0,0.04,size=n) # fuzzy datadef optm(l,x):    return skew(x,l[0],l[1],l[2]) - fzzprint leastsq(optm,[0.5,0.5,0.5],(x,))

should give you something like,

(array([ 1.05206154,  1.96929465,  0.94590444]), 1)


The accepted answer is more or less outdated, because a skewnorm function is now implemented in scipy. So the code can be written a lot shorter:

 from scipy.stats import skewnorm import numpy as np from matplotlib import pyplot as plt X = np.linspace(min(your_data), max(your_data)) plt.plot(X, skewnorm.pdf(X, *skewnorm.fit(your_data))