PythonでBox-Cox変換を試してみる
今回の目的
正の実数に値をとるサンプルの分析のための前処理を行う方法として Box-Cox 変換を紹介する。
サンプルが正規分布でない分布から生成されている場合に, Box-Cox変換を用いることで, その分布を正規分布に近づけることができる.
Box-Cox変換は, 適当なが与えられた上で, 次の式で表される:
scipy.stats.boxcoxを使うと, 適切なを得た上で, 与えたサンプルをBox-Cox変換してくれる.
例として,
の二つの分布から得られたサンプルをBox-Cox変換してみる.
import numpy as np from scipy import stats import matplotlib.pyplot as plt if __name__ == '__main__': plt.close('all') np.random.seed(0) y1 = np.random.exponential(scale=0.5, size=1000000) y1_lambda, lmax1 = stats.boxcox(y1) y2 = np.random.beta(2.0, 5.0, size=1000000) y2_lambda, lmax2 = stats.boxcox(y2) bins = 100 plt.rcParams["font.size"] = 15 plt.figure(figsize=(10, 10)) plt.subplot(2, 2, 1) plt.hist(y1, bins=bins) plt.title(r'$y_1$') plt.subplot(2, 2, 2) plt.hist(y1_lambda, bins=bins) plt.title(r'$y_1^{(\lambda)} (\lambda=%f)$' % lmax1) plt.subplot(2, 2, 3) plt.hist(y2, bins=bins) plt.title(r'$y_2$') plt.subplot(2, 2, 4) plt.hist(y2_lambda, bins=bins) plt.title(r'$y_2^{(\lambda)} (\lambda=%f)$' % lmax2) plt.tight_layout() plt.savefig('figure.png') plt.show()
結果:
内部的には, 対数尤度関数
を最大化するようなをの範囲で見つけて返している.