#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。
Excel にある一変量統計関数
http://aoki2.si.gunma-u.ac.jp/R/univariate.html
ファイル名: univariate.jl
関数名: avedev, average, count, devsq, geomean, harmean, scale, skew, kurt
stdev, stdevp, trimmean, varp, large, small, fact, combin
翻訳するときに書いたメモ
Julia が持っている関数と定義が少し違っていたりするものもあるので,利用するときには注意が必要かな。
==========#
using Statistics
using StatsBase # trim, geomean, harmmean
x = [21.5, 63.3, 52.1, 50.7, 58.3, 62.2, 43.7, 52.0, 60.0, 45.9,
36.4, 44.1, 80.4, 56.2, 51.7, 60.4, 38.8, 66.8, 33.0, 46.5];
avedev(x) = mean(abs.(x .- mean(x)))
avedev(x) # 10.02
average(x) = mean(x)
average(x) # 51.2
count(x) = length(x)
count(x) # 20
devsq(x) = (length(x)-1) * var(x)
devsq(x) # 3345.8200000000006
geomean(x) = StatsBase.geomean(x)
geomean(x) # 49.352768555879464
harmean(x) = StatsBase.harmmean(x)
harmean(x) # 47.18603977346159
scale(x; corrected=true) = (x .- mean(x)) ./ std(x; corrected)
std(scale(x)) # 1.0
std(scale(x, corrected=false)) # 1.025978352085154
function skew(x; corrected = true)
n = length(x)
return corrected ?
n*sum(scale(x) .^ 3)/(n-1)/(n-2) :
sum(scale(x; corrected) .^ 3) / n
end
skew(x) # -0.11679753569198104
skew(x, corrected=false) # -0.10784856887717938
Julia の skewness() は corrected=false に相当するもの
skewness(x) # -0.10784856887717896
function kurt(x; corrected = true)
n = length(x)
return corrected ?
n*(n+1)*sum(scale(x) .^ 4)/(n-1)/(n-2)/(n-3)-3*(n-1)^2/(n-2)/(n-3) :
sum(scale(x; corrected) .^ 4)/n-3
end
kurt(x) # 0.6657329536764971
kurt(x, corrected=false) # 0.22484782913535772
Julia の kurtosis() は corrected=false に相当するもの
kurtosis(x) # 0.22484782913535906; corrected=false
stdev(x) = std(x)
stdev(x) # 13.27010887196048
stdevp(x) = std(x; corrected = false)
stdevp(x) # 12.934102210822367
trimmean(x; p) = mean(trim(x; prop=p/2)) # trim() は合わせて p を取り除く
trimmean(x, p = 0.2) # 51.39375
varp(x) = var(x; corrected=false)
varp(x) # 167.29100000000003
large(x, k) = sort!(x)[end-k+1]
large(x, 3) # 63.3
small(x, k) = sort!(x)[k]
small(x, 4) # 38.8
fact(n) = factorial(n)
fact(9) # 362880
combin(n, i) = binomial(n, i)
combin(8, 3) #56