裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Julia: sum(), var() に対応する describe()

2022年02月22日 | ブログラミング

"""
DataFrames の describe() は,sum(), var() を計算しない。

sum(), var() に対応する関数 describe2() を定義しておく。

指定できるのは :sum, :mean, :var, :std, :min, :q25, :median, :q75, :max, :nmissing である。

すべての統計量を計算するときは,統計量の指定をしないようにするか :all を指定すればよい。

なお,DataFrames.describe() と競合してもかまわないならば,関数名を describe にしてもよい。
この場合,DataFrames の describe() を使うときは,DataFrames.describe() とする。

"""

using DataFrames, Statistics
function describe(df, arg...=:all)
    q25(x) = quantile(x, 0.25)
    q75(x) = quantile(x, 0.75)
    nmissing(x) = nrow(df) - length(ismissing.(x))
    arg0 = [:sum, :mean, :var, :std, :min, :q25, :median, :q75, :max, :nmissing]
    func = [sum, mean, var, std, minimum, q25, median, q75, maximum, nmissing]
    funcname = ["sum", "mean", "var", "std", "minimum", "q25", "median", "q75", "maximum", "nmissing"]
    arg[1] == :all && (arg = arg0)
    res = DataFrame(variable = Symbol.(names(df)))
    n = ncol(df)
    m = length(arg)
    body = Array{Float64, 2}(undef, n, m)
    loc = indexin(arg, arg0)
    for i in 1:n
        x = skipmissing(df[!, i])
        body[i, :] = [func[j](x) for j in loc]
    end
    bodydf = DataFrame(body, funcname[loc])
    pos = indexin(["nmissing"], funcname[loc])[1]
    isnothing(pos) || (bodydf[!, pos] = Int.(bodydf[:, pos]))
    hcat(res, bodydf)
end

"""
使用例

julia> using RDatasets, Statistics

julia> iris = dataset("datasets", "iris");

julia> describe(iris[:, 1:4])
4×11 DataFrame
 Row │ variable     sum      mean     var       std       minimum  q25      median   q75      maximum  nmissing
     │ Symbol       Float64  Float64  Float64   Float64   Float64  Float64  Float64  Float64  Float64  Int64
─────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────
   1 │ SepalLength    876.5  5.84333  0.685694  0.828066      4.3      5.1     5.8       6.4      7.9         0
   2 │ SepalWidth     458.6  3.05733  0.189979  0.435866      2.0      2.8     3.0       3.3      4.4         0
   3 │ PetalLength    563.7  3.758    3.11628   1.7653        1.0      1.6     4.35      5.1      6.9         0
   4 │ PetalWidth     179.9  1.19933  0.581006  0.762238      0.1      0.3     1.3       1.8      2.5         0

julia> DataFrames.describe(iris[:, 1:4])
4×7 DataFrame
 Row │ variable     mean     min      median   max      nmissing  eltype
     │ Symbol       Float64  Float64  Float64  Float64  Int64     DataType
─────┼─────────────────────────────────────────────────────────────────────
   1 │ SepalLength  5.84333      4.3     5.8       7.9         0  Float64
   2 │ SepalWidth   3.05733      2.0     3.0       4.4         0  Float64
   3 │ PetalLength  3.758        1.0     4.35      6.9         0  Float64
   4 │ PetalWidth   1.19933      0.1     1.3       2.5         0  Float64
"""

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で水平方向のデンドログラムを描く

2022年02月22日 | 統計学

"""

Julia の Clustering.hclust() は StatsPlots パッケージで普通の(垂直方向の)デンドログラムを描く。機能を持たない。

以下のプログラムは,R の plot() と同じであるが水平方向のデンドログラムを描く。
"""

using Plots
function plot_hclust_horizontal(hc)
    function get(i, x)
        x[i] < 0 && return(ord[abs(x[i])])
        get(x[i], x)
    end
    n = length(hc.order)
    apy = collect(n:-1:1) .+ 0.5
    apx = zeros(n)
    ord = sortperm(hc.order)
    plot(yshowaxis=false, yticks=false, tick_direction=:out, grid=false,
         xlims=(-0.05, maximum(hc.height)), ylims=(0, apy[1]),
         xlabel="height", label="")
    for i in 1:n
        annotate!(0, apy[i], text(string(hc.labels[hc.order[i]]) * " ", 8, :right))
    end
    for i in 1:n-1
        c1 = get(i, hc.merge[:,1])
        c2 = get(i, hc.merge[:,2])
        plot!([apx[c1], hc.height[i], hc.height[i], apx[c2]],
              [apy[c1], apy[c1], apy[c2], apy[c2]], color=:black, label="")
        apx[c1] = apx[c2] = hc.height[i]
        apy[c1] = apy[c2] = (apy[c1] + apy[c2]) / 2
    end
    plot!()
end

"""
使用法

julia> using RDatasets

julia> iris = RDatasets.dataset("datasets", "iris");

julia> function distancematrix(X)
           nr,  nc = size(X)
           d = zeros(nr, nr)
           for i in 1:nr-1
               for j in i+1:nr
                   d[i, j] = d[j, i] = sqrt(sum((X[i, :] .- X[j, :]).^2))
               end
           end
           d
       end;

julia> # using Random; Random.seed!(123) # 毎回同じ結果にするためには乱数の種を設定する
       using Clustering

julia> x = Matrix(iris[1:20, 1:4]);

julia> D = distancematrix(x);

julia> hc = hclust(D, linkage=:ward);

julia> plot_hclust_horizontal(hc)

"""

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で統計解析--その8 多変量解析

2022年02月22日 | 統計学

Julia で統計解析--その8 多変量解析

これらの文書群は github で管理することとした

最新バージョン 2022-02-22 07:25

以下を参照のこと

https://r-de-r.github.io/stats/Julia-stats8.html

1. 回帰分析
1.1. 線形最小二乗回帰 Linear Least Square
1.1.1. 単回帰分析
1.1.2. 重回帰分析
1.2. リッジ回帰 Ridge Regression
1.2.1. 説明変数が 1 個の場合
1.2.2. 説明変数が 2 個以上の場合
1.3. GLM パッケージによる回帰分析
1.3.1. 重回帰分析 Ordinary Least Squares Regression
1.3.2. プロビット回帰 Probit Regression
1.3.3. ロジット回帰 Logit Regression
1.4. 多項式回帰
1.4.1. 重回帰プログラムを用いる
1.4.2. 多項式回帰 Polynomials パッケージ
1.5. 指数回帰
1.5.1. 説明変数が 1 個の場合
1.5.2. 説明変数が 2 個以上の場合
1.6. 累乗回帰
1.6.1. 説明変数が 1 個の場合
1.6.2. 説明変数が 2 個以上の場合
1.7. 非線形回帰
2. 判別分析
2.1. 二群判別分析
2.2. 多重判別分析
3. 主成分分析
4. 因子分析
5. 古典的多次元尺度解析
6. クラスター分析
6.1. K-means 法による非階層的クラスター分析
6.2. 階層的クラスター分析
7. カテゴリー変数の取り扱い方
7.1. 重回帰分析
7.2. 判別分析の場合

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村