スタートページJavaScript他言語R言語

基本統計量、ソート

主要関数
  sum(v)     合計
  var(v)     不偏分散:偏差平方和を(データ数-1)で割った値, 
  sd(v)      標準偏差:不偏分散の生の平方根
    apply(m, side=1/2, 関数)   行・列への関数の適用
    cov(m)     共分散行列
    cor(m)     相関行列
    sort(v)    ソート
    order(v)   順序つけ
    det(m)     行列式の値
    t(m)       転置行列
    solve(m)   逆行列
    eigen(m)   固有値、固有ベクトル

統計基本関数

統計基本関数

  length() 要素数
  max() 最大値、min() 最小値, 
  mean() 算術平均, median() 中央値, quantile() 分位点, 
  range() 範囲:最大値から最小値の差,
  sum() 合計, 
  var() 不偏分散:偏差平方和を(データ数-1)で割った値, 
  sd() 標準偏差:不偏分散の生の平方根

sum() での例

# ベクトル
    v <- c(30, 20, 50, 10, 40)
    sum(v)             # 150

# 行列
                                  #      [,1] [,2] [,3]
    m <- matrix(c(11, 12, 13,     # [1,]   11   12   13
                  21, 22, 23),    # [2,]   21   22   23
                nrow=2, byrow=T)

   sum(m)              # 102
   sum(m[1, ])         # 36    11+12+13
   sum(m[ , 1])        # 32    11+21

# 行列 apply関数
#一般形 apply(配列, MARGIN, 関数)   # 戻り値はベクトル
#           MARGIN = 1 行対象
#                    2 列対象
#                    c(1,2) 全要素
    apply(m, 1, sum)     # 36 66       11+12+13   21+22+23
    apply(m, 2, sum)     # 32 34 36    11+21   12+22   13+23

# データフレーム
    df <- data.frame(              #    c1 c2
              c1 = c(11, 21, 31),  # 1  11 12
              c2 = c(12, 22, 32))  # 2  21 22
                                   # 3  31 32

    df.sum()           # エラー
    sum(df)            # 129
    sum(df['c1'])      # 63
    sum(df$c1)         # 63

    apply(df, 2, sum)  # c1 c2 
                       # 63 66

分散・相関

分散や相関を求めるには、基本統計関数を組み合わせて求めることもできますが、次の関数を使えば簡単に記述できます。

    var()             # 不偏分散 不偏分散と同じ
    cov()             # 共分散行列
    cor()             # 相関行列
    cov2cor()         # 共分散行列を相関行列に変換する関数

このような処理では、データフレームが広く用いられるので、それを入力データとします。出力は matrix になります。

    df <- data.frame(体重=c( 56, 70, 75, 68, 58, 64, 53, 68, 65, 59),
                     身長=c(168,181,178,179,171,174,174,178,179,169),
                     腹囲=c( 65, 78, 83, 75, 72, 72, 67, 78, 69, 73))

    var(df)           # 不偏分散
                      #       体重     身長     腹囲
                      #  体重 48.26667 24.71111 33.42222
                      #  身長 24.71111 20.98889 14.86667
                      #  腹囲 33.42222 14.86667 30.17778

    cov(df)           # 分散共分散行列 不偏分散と同じ
                      #       体重     身長     腹囲
                      #  体重 48.26667 24.71111 33.42222
                      #  身長 24.71111 20.98889 14.86667
                      #  腹囲 33.42222 14.86667 30.17778
    m <= cov(df)
    m["身長","体重"}  # 24.71111
    m[2,1]            # 24.71111

    cor(df)           # 相関行列
                      #        体重     身長     腹囲
                      #  体重  1.000000 0.776379 0.875725
                      #  身長  0.776379 1.000000 0.590711
                      #  腹囲  0.875725 0.590711 1.000000

    cov2cor(cov(df))  #        体重     身長     腹囲
                      #  体重  1.000000 0.776379 0.875725
                      #  身長  0.776379 1.000000 0.590711
                      #  腹囲  0.875725 0.590711 1.000000

ソート・順序付け

ベクトルのソート・順序付け

# 単純ソート sort
    v <- c(50, 30, 20, 40)

    sort(v)               # 昇順  20 30 40 50
    sort(v, decreasing=T) # 降順  50 40 30 20

# 順序つけ order
    v <- c(50, 30, 20, 40)
    k <- order(v)   #       3 2 4 1
                    #         ↑
                    #  k[1]=v[3]=20
                    #  k[2]=v[2]=30
                    #  k[3}=v[4]=40
                    #  k[4]=v[1]=50

    order(-v)       # 降順  1 4 2 3

行列のソート

# 入力
                              #       [,1] [,2] [,3] [,4]
    m <- matrix(c(5,3,1,4,    # [1,]    5    3    1    4
                  3,4,1,3,    # [2,]    3    4    1    3
                  3,1,3,1,    # [3,]    3    1    3    1
                  4,2,4,3),   # [4,]    4    2    4    3
                 ncol=4, byrow=T)

# 列をキーにしたソート 一般形 行列[order(行列[,キー列]), ]
#     列1をキーにして昇順にソート
    order(m[,1])        # 2 3 4 1
                        # 他の行もこの順序にする
    m[order(m[,1]), ]   #       [,1] [,2] [,3] [,4]
                        # [1,]    3   *4    1    3
                        # [2,]    3   *1    3    1
                        # [3,]    4    2    4    3
                        # [4,]    5    3    1    4
                        #        └ キー列 昇順

# 複数のキー列によるソート
#     一般形 行列[order(行列[,キー列1], 行列[, キー列2], 行列[, キー列3], …)]
#     列1を順位1、列2を順位2としてソート
    m[order(m[,1], m[,2]), ]
                        #       [,1] [,2] [,3] [,4]
                        # [1,]    3   *1    3    1    * の行が入れ替わった
                        # [2,]    3   *4    1    3
                        # [3,]    4    2    4    3
                        # [4,]    5    3    1    4

# 行をキーとしたソート  一般形 行列[, order(行列[キー行, ])]
#     行1の降順でソート
    order(m[1,], decreasing=T)         # 降順  1 4 2 3
    m[ , order(m[1,], decreasing=T)]   #       [,1] [,2] [,3] [,4]
                                       # [1,]    5    4    3    1  降順ソート
                                       # [2,]    3    3    4    1
                                       # [3,]    3    1    1    3
                                       # [4,]    4    3    2    4

データフレームのソート

本来、データフレームは並びの順序は問わない形式なのですが、出力の見やすさなどのためにソートすることがあります。
行をキーとするソートは、実務的には稀ですので省略します。列をキーとするソートは、行列とほぼ同じです。

                                             #    c1 c2 c3 c4
    df <- data.frame(c1=c(5, 3, 3, 4),       # r1  5  3  1  4
                     c2=c(3, 4, 1, 2),       # r2  3  4  1  3
                     c3=c(1, 1, 3, 4),       # r3  3  1  3  1
                     c4=c(4, 3, 1, 3))       # r4  4  2  4  3
    rownames(df) <- c('r1','r2','r3','r4')

# c1列を順位1、c2列を順位2としてソートします。
    df[order(df$c1,df$c2), ]     #    c1 c2 c3 c4
                                 # r3  3  1  3  1
                                 # r2  3  4  1  3
                                 # r4  4  2  4  3
                                 # r1  5  3  1  4

関連操作

行列式の値 det()

                                  #       [,1] [,2]
    m <- matrix(c(2, 3,           # [1,]    2    3
                  1, 2),          # [2,]    1    2
                nrow=2, byrow=T)

    det(m)                        # 1 (= 2x2 - 3x1)

転置行列 t()

    m <- matrix(c(11, 12, 13,
                  21, 22, 23),
                nrow=2, byrow=T)

    t(m)      #       [,1] [,2]
              # [1,]   11   21
              # [2,]   12   22
              # [3,]   13   23

逆行列 solve()

                                  #       [,1] [,2]
    m <- matrix(c(2, 3,           # [1,]    2    3
                  1, 2),          # [2,]    1    2
                nrow=2, byrow=T)

    solve(m)                      #       [,1] [,2]
                                  # [1,]    2   -3
                                  # [2,]   -1    2

逆行列による連立一次方程式の解

次の連立一次方程式の解を求めます。
        2x + 3y = 7
        1x + 2y = 4
# 方程式の定義
    m <- matrix(c(2, 3,
                  1, 2),
                nrow=2, byrow=T)  # 係数
    b <- c(7, 4)                  # 定数項
# 求解
    解 <- solve(m) %*% b          # 内積
    解[1]                         # 2  (=x)
    解[2]                         # 1  (=y)

固有値と固有ベクトル eigen(X)

                                  #       [,1] [,2]
    m <- matrix(c(2, 3,           # [1,]    2    3
                  1, 2),          # [2,]    1    2
                nrow=2, byrow=T)

    eigen(m)                      # eigen() decomposition
                                  # $values
                                  #  [1] 3.7320508 0.2679492
                                  # $vectors
                                  #          [,1]       [,2]
                                  # [1,] 0.8660254 -0.8660254
                                  # [2,] 0.5000000  0.5000000
    結果 <- eigen(m)
    固有値 <- 結果$values
    固有ベクトル <- 結果$vectors
    固有値[1]                     # 3.7320508
    固有ベクトル[1,2]             # -0.8660254