julia での度数分布の求め方
julia で、数値ベクトルの度数分布を求めてみましょう。文字列なら、StatsBase.countmap() で足りることが多いでしょう。
まずは、パッケージの読み込みと、テストサンプルデータを作ります。これからしばらく2次元データを使うので、2次元で作ります。
using Plots using KernelDensity using Distributions using StatsBase data = vcat( rand(Normal(),10000,2), rand(Normal(3,0.8),10000,2), rand(Normal(-2,2),10000,2).+[0 2], rand(TDist(10),1000,2) )[rand(1:31000,100000) ,:]; xdata = data[:,1]; ydata = data[:,2];
はじめに、10000個ずつ3通りの正規分布を縦に並べて、最後の t 分布はノイズで入れています。そして、この中から、ランダムで選ぶ方法を採りました。ランダムで採り直す方が現実に近いと考えています。
1列目を xdata として、使います。
次に、xdata のヒストグラムを作ります。
histogram(xdata, nbins=100)
このヒストグラムのそれぞれの階級のデータの数 (棒グラフの高さ) を求めたいということです。
それぞれのデータの個数は、fit(Histogram, xdata, ...) を使います。
julia> x_hist = fit(Histogram, xdata, nbins=100) ┌ Warning: Default for keyword argument "closed" has changed from :right to :left. │ To avoid this warning, specify closed=:right or closed=:left as appropriate. │ caller = ip:0x0 └ @ Core :-1 Histogram{Int64,1,Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}} edges: -10.0:0.2:6.2 weights: [6, 0, 4, 0, 2, 7, 8, 4, 7, 7 … 866, 626, 328, 159, 87, 75, 27, 13, 3, 3] closed: left isdensity: false
"x_hist.edges" などとして、それぞれの値を取り出します。
x_hist.edges は、階級の分け方です。-10 から、0.2 ずつ 6.2 までです。100階級を指定しましたが、81階級になっています。指定の仕方が、データに合わないのでしょう。julia は比較的、切れの良い階級を作ろうとする為と考えます。階級自身を指定する方法もありますが、これは、StatsBase.fit(Histogram, ... ) のマニュアルを見て下さいね。
この範囲指定を取り出す時は、さらに、
julia> x_hist.edges[1] -10.0:0.2:6.2
[1] を付けるようです。collect() ではダメなようです。
次に、それぞれの階級内のデータの数です。weights に格納されています。
julia> x_hist.weights 81-element Array{Int64,1}: 6 0 4 0 2 7 8 4 7 7 ⋮ 626 328 159 87 75 27 13 3 3
こちらは既に、Array ですので、そのまま使えるでしょう。