In [40]:
import numpy as np
from numpy.random import randn
import pandas as pd

from scipy import stats

import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
In [45]:
dataset = randn(25)
# rugplotを書きます
sns.rugplot(dataset)
plt.ylim(0,1)
Out[45]:
(0, 1)
In [4]:
# ヒストグラムを重ねます。
plt.hist(dataset,alpha=0.3)
sns.rugplot(dataset)
Out[4]:
<matplotlib.axes._subplots.AxesSubplot at 0x1099465c0>
In [38]:
sns.rugplot(dataset);

# X軸を競ってい
x_min = dataset.min() - 2
x_max = dataset.max() + 2

# 全体を等間隔に100分割します。
x_axis = np.linspace(x_min,x_max,100)

bandwidth = ((4*dataset.std()**5)/(3*len(dataset)))**.2

kernel_list = []

for data_point in dataset:
    
    kernel = stats.norm(data_point,bandwidth).pdf(x_axis)
    kernel_list.append(kernel)

    kernel = kernel / kernel.max()
    kernel = kernel * .4
    plt.plot(x_axis,kernel,color = 'grey',alpha=0.5)

plt.ylim(0,1)
Out[38]:
(0, 1)
In [41]:
# 手動でKDEを作ります。
sum_of_kde = np.sum(kernel_list,axis=0)

fig = plt.plot(x_axis,sum_of_kde,color='indianred')

sns.rugplot(dataset,c = 'indianred')

plt.yticks([])

plt.suptitle("Sum of the Basis Functions")
Out[41]:
<matplotlib.text.Text at 0x10c428390>
In [12]:
# これが1行で出来ます。
sns.kdeplot(dataset)
Out[12]:
<matplotlib.axes._subplots.AxesSubplot at 0x109af9550>
In [17]:
sns.rugplot(dataset,color='black')
# バンド幅を変えてみましょう。
for bw in np.arange(0.5,2,0.25):
    sns.kdeplot(dataset,bw=bw,label=bw)

カーネル関数の説明(英語)
http://en.wikipedia.org/wiki/Kernel_(statistics)

In [36]:
kernel_options = ["biw", "cos", "epa", "gau", "tri", "triw"]

for kern in kernel_options:
    sns.kdeplot(dataset,kernel=kern,label=kern)
In [34]:
for kern in kernel_options:
    sns.kdeplot(dataset,kernel=kern,label=kern,shade=True,alpha=0.5)
In [21]:
# 軸を入れ替えることもできます。
sns.kdeplot(dataset,vertical=True)
Out[21]:
<matplotlib.axes._subplots.AxesSubplot at 0x10abbdda0>

cumulative distribution function (CDF)
累積分布関数
http://en.wikipedia.org/wiki/Cumulative_distribution_function

In [43]:
plt.hist(dataset, cumulative=True)
Out[43]:
(array([  6.,   9.,  15.,  16.,  18.,  20.,  22.,  24.,  24.,  25.]),
 array([-1.64681409, -1.17059479, -0.6943755 , -0.21815621,  0.25806309,
         0.73428238,  1.21050167,  1.68672096,  2.16294026,  2.63915955,
         3.11537884]),
 <a list of 10 Patch objects>)
In [23]:
sns.kdeplot(dataset,cumulative=True)
Out[23]:
<matplotlib.axes._subplots.AxesSubplot at 0x10ade2278>
In [25]:
# 2次元平面上の中心
mean = [0,0]
# それぞれの分散を決めます。
cov = [[1,0],[0,100]]
# これに従う多変量正規分布
dataset2 = np.random.multivariate_normal(mean,cov,1000)
# DataFrameにしておきましょう。
dframe = pd.DataFrame(dataset2,columns=['X','Y'])
# プロットします。SeabornとPandasの相性は抜群
sns.kdeplot(dframe)
Out[25]:
<matplotlib.axes._subplots.AxesSubplot at 0x10aa2d978>
In [26]:
# 軸ごとにデータをわたせます。
sns.kdeplot(dframe.X,dframe.Y)
Out[26]:
<matplotlib.axes._subplots.AxesSubplot at 0x10b02f550>
In [27]:
# 軸ごとにデータをわたせます。
sns.kdeplot(dframe.X,dframe.Y, shade=True)
Out[27]:
<matplotlib.axes._subplots.AxesSubplot at 0x10aff3860>
In [29]:
# バンド幅を変えられます。
sns.kdeplot(dframe,bw=1)
Out[29]:
<matplotlib.axes._subplots.AxesSubplot at 0x10a7266d8>
In [30]:
# 文字列でも渡せます。
sns.kdeplot(dframe,bw='silverman')
Out[30]:
<matplotlib.axes._subplots.AxesSubplot at 0x10b2a78d0>
In [31]:
# 同時分布の推定も可能です。
sns.jointplot('X','Y',dframe,kind='kde')
Out[31]:
<seaborn.axisgrid.JointGrid at 0x10aa7a080>