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
dataset = randn(25)
# rugplotを書きます
sns.rugplot(dataset)
plt.ylim(0,1)
# ヒストグラムを重ねます。
plt.hist(dataset,alpha=0.3)
sns.rugplot(dataset)
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)
# 手動で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")
# これが1行で出来ます。
sns.kdeplot(dataset)
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)
kernel_options = ["biw", "cos", "epa", "gau", "tri", "triw"]
for kern in kernel_options:
sns.kdeplot(dataset,kernel=kern,label=kern)
for kern in kernel_options:
sns.kdeplot(dataset,kernel=kern,label=kern,shade=True,alpha=0.5)
# 軸を入れ替えることもできます。
sns.kdeplot(dataset,vertical=True)
cumulative distribution function (CDF)
累積分布関数
http://en.wikipedia.org/wiki/Cumulative_distribution_function
plt.hist(dataset, cumulative=True)
sns.kdeplot(dataset,cumulative=True)
# 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)
# 軸ごとにデータをわたせます。
sns.kdeplot(dframe.X,dframe.Y)
# 軸ごとにデータをわたせます。
sns.kdeplot(dframe.X,dframe.Y, shade=True)
# バンド幅を変えられます。
sns.kdeplot(dframe,bw=1)
# 文字列でも渡せます。
sns.kdeplot(dframe,bw='silverman')
# 同時分布の推定も可能です。
sns.jointplot('X','Y',dframe,kind='kde')