こんにちは、usagi-sanです。今回はデータ集計に関する関数を紹介します。
データ解析を行う上でデータ集計はほぼ必須である上、列数が多いデータの集計は非常に面倒です。
いちいちrbindやcbindを用いて集計表を作成するのがおっくうになったので、集計表を自動で作成してくれる関数を作りました。
今回紹介する関数は以下のパッケージをインストールすることで使えます。
R言語 自作パッケージ UsagiSan
こんにちは、usagi-sanです。 R言語の自作パッケージを紹介します。 統計解析のアルバイトをしている中、暇な時間を見つけて自分でパッケージを作ってみました。 Rのパッケージには、統計解析用のパッ ...
続きを見る
関数getSummaryTable
関数getSummaryTableは集計表を作成する関数です。numeric型のデータに対しては平均や標準偏差などを計算し、factor型のデータに対して各カテゴリー数やその割合(パーセント)を計算します。集計表は2元分割表となっており、指定した変数についてまとめてくれます。
関数getSummaryTableとその引数は以下の通りです。
data | 集計したいデータフレーム。 |
namesForRow | 行方向に集計したい変数名。 |
nameForCol | 列方向に集計したいfactor型の変数名。 |
digits | 小数点以下の桁数。 |
locationPar | character型で位置母数を指定できる。"mean"で平均値、"median"で中央値、"mode"で最頻値を集計表にまとめます。 |
sd | 標準偏差を集計表に含めるか含めないか。 |
Qu | 第一四部位数と第二四部位数を含めるか含めないか。 |
ratio | 割合(パーセント)を含めるか含めないか。 |
以下、関数getSuumaryTableのソースコードになります(getSummaryTable中に未定義の関数があるため、コピペしても使えないことに注意としてください)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | getSummaryTable <- function(data, namesForRow, nameForCol, digits = 0, locationPar = "mean", sd = FALSE, Qu = FALSE, ratio = FALSE) { if (length(nameForCol) > 1) { stop("The length of the argument nameForCol must be one") } if (is.null(data)) { stop("data is null") } if (!is.factor(data[, nameForCol])) { stop("The type of data[, nameForCol] must be factor") } table <- as.data.frame(matrix(rep(NA, nlevels(data[, nameForCol])), nrow = 1)[numeric(0), ]) colnames(table) <- rep("", ncol(table)) table <- rbind(table, t(c("", paste0(nameForCol, " (n=", length(na.omit(data[, nameForCol])), ")"), rep("", nlevels(data[, nameForCol]) - 1)))) table <- rbind(table, t(c("", paste0(levels(data[, nameForCol]), " (n=", table(na.omit(data[, nameForCol])), ")")))) for (nameForRow in namesForRow) { if (is.numeric(data[, nameForRow])) { table <- rbind(table, getSummaryNumeric(data, nameForRow, nameForCol, digits, locationPar, sd, Qu)) } else if (is.factor(data[, nameForRow])) { table <- rbind(table, getSummaryFactor(data, nameForRow, nameForCol, digits, ratio)) } } return(table) } |
使用例
関数getSummaryTableの使いかたをいくつか紹介します。
まず、データセットirisを集計する例についてみていきます。
irisのSpeciesに関してSepal.Length、Sepal.Width、Petal.Length、Petal.Widthの平均と標準偏差を得たい場合、次のように引数を与えます。
1 2 3 4 5 6 7 8 | > getSummaryTable(iris, colnames(iris)[-5], "Species", sd = TRUE) V1 V2 V3 V4 1 Species (n=150) 2 setosa (n=50) versicolor (n=50) virginica (n=50) 3 Sepal.Length (sd) 5.01 (0.35) 5.94 (0.52) 6.59 (0.64) 4 Sepal.Width (sd) 3.43 (0.38) 2.77 (0.31) 2.97 (0.32) 5 Petal.Length (sd) 1.46 (0.17) 4.26 (0.47) 5.55 (0.55) 6 Petal.Width (sd) 0.25 (0.11) 1.33 (0.20) 2.03 (0.27) |
縦方向にSepal.Length、Sepal.Width、Petal.Length、Petal.Width、横方向にSpeciesの水準が並び、各水準、データごとの平均値と標準偏差が計算されます。
また、次のように引数locationParを変更することで、位置母数を平均値以外に変えることができます。
ポイント
次の実行結果は最頻値を算出しており、スタージェスの公式に分割された区間または度数の最頻値を算出しています(各データの数が30以上かつ階級数が7以上の場合、データを区間に分割する)。
1 2 3 4 5 6 7 8 | > getSummaryTable(iris, colnames(iris)[-5], "Species" , locationPar="mode") V1 V2 V3 V4 1 Species (n=150) 2 setosa (n=50) versicolor (n=50) virginica (n=50) 3 Sepal.Length [5.00, 5.20) [6.50, 7.00) [6.50, 7.00) 4 Sepal.Width [4.00, 4.50) [2.80, 3.00) [3.00, 3.20) 5 Petal.Length [1.40, 1.50) [5.00, 5.50) [6.50, 7.00) 6 Petal.Width 0.20 [1.40, 1.50) [2.20, 2.40) |
Bostonの住宅価格のようなより大きなデータセットも一瞬で集計することが可能です。
まず、Bostonのデータセットを使うためにパッケージMASSを用意します。
1 2 | library(MASS) data <- Boston |
dataは次のような住宅価格に関するデータから構成されたいます。
1 2 3 4 5 6 7 8 | > head(data) crim zn indus chas nox rm age dis rad tax ptratio black lstat medv 1 0.00632 18 2.31 0 0.538 6.575 65.2 4.0900 1 296 15.3 396.90 4.98 24.0 2 0.02731 0 7.07 0 0.469 6.421 78.9 4.9671 2 242 17.8 396.90 9.14 21.6 3 0.02729 0 7.07 0 0.469 7.185 61.1 4.9671 2 242 17.8 392.83 4.03 34.7 4 0.03237 0 2.18 0 0.458 6.998 45.8 6.0622 3 222 18.7 394.63 2.94 33.4 5 0.06905 0 2.18 0 0.458 7.147 54.2 6.0622 3 222 18.7 396.90 5.33 36.2 6 0.02985 0 2.18 0 0.458 6.430 58.7 6.0622 3 222 18.7 394.12 5.21 28.7 |
カテゴリカルデータがnumeric型となっているため、次を実行しカテゴリカルデータをfactor型に変更してあげます。
1 2 | data[, "rad"] <- as.factor(data[, "rad"]) data[, "chas"] <- as.factor(data[, "chas"]) |
データ整形が終わったので、早速カテゴリカルデータradに関してデータセットを集計してみましょう。
次のようにgetSummaryTableを実行することで集計表が一瞬で作成できます。引数にQu = TRUE, ratio = TRUEを追加したことで、numeric型のデータの集計に第1四部位数、第3四部位数、factor型のデータの主計に割合の項目が追加されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | > getSummaryTable(data, setdiff(colnames(data), "rad"), "rad", sd = TRUE, Qu = TRUE, ratio = TRUE) V1 V2 V3 V4 1 rad (n=506) 2 1 (n=20) 2 (n=24) 3 (n=38) 3 crim (sd) [1st Qu., 3rd Qu.] 0.04 (0.03) [0.01, 0.05] 0.08 (0.08) [0.04, 0.10] 0.10 (0.07) [0.04, 0.14] 4 zn (sd) [1st Qu., 3rd Qu.] 39.90 (33.23) [0.00, 65.00] 20.42 (36.14) [0.00, 20.00] 16.38 (30.81) [0.00, 20.00] 5 indus (sd) [1st Qu., 3rd Qu.] 5.07 (4.28) [1.86, 7.53] 9.63 (10.60) [2.67, 25.65] 4.42 (2.11) [2.46, 6.91] 6 chas (%) 7 0 19 (95.00) 24 (100.00) 36 (94.74) 8 1 1 (5.00) 0 (0.00) 2 (5.26) 9 nox (sd) [1st Qu., 3rd Qu.] 0.46 (0.08) [0.40, 0.55] 0.48 (0.07) [0.44, 0.58] 0.45 (0.03) [0.45, 0.46] 10 rm (sd) [1st Qu., 3rd Qu.] 6.56 (0.53) [6.12, 6.83] 6.65 (0.71) [6.00, 7.21] 6.47 (0.65) [6.01, 6.99] 11 age (sd) [1st Qu., 3rd Qu.] 45.02 (25.70) [24.43, 66.18] 64.77 (23.62) [38.38, 84.65] 49.31 (25.29) [33.90, 61.00] 12 dis (sd) [1st Qu., 3rd Qu.] 6.03 (2.52) [3.69, 7.68] 4.10 (2.11) [2.24, 5.29] 5.15 (1.69) [3.92, 6.06] 13 tax (sd) [1st Qu., 3rd Qu.] 291.45 (44.03) [273.00, 306.75] 260.67 (55.63) [188.00, 285.25] 246.08 (63.72) [222.00, 247.00] 14 ptratio (sd) [1st Qu., 3rd Qu.] 17.57 (2.49) [15.57, 20.02] 17.29 (2.15) [17.68, 19.10] 18.17 (0.76) [17.80, 18.60] 15 black (sd) [1st Qu., 3rd Qu.] 389.27 (13.94) [391.48, 395.87] 386.41 (13.46) [379.06, 396.27] 392.42 (6.20) [390.83, 396.90] 16 lstat (sd) [1st Qu., 3rd Qu.] 7.37 (2.53) [5.60, 8.76] 10.02 (6.66) [5.65, 14.29] 9.08 (5.51) [5.08, 12.81] 17 medv (sd) [1st Qu., 3rd Qu.] 24.37 (8.02) [20.48, 27.23] 26.83 (7.87) [21.40, 33.23] 27.93 (8.32) [21.12, 34.52] V5 V6 V7 V8 1 2 4 (n=110) 5 (n=115) 6 (n=26) 7 (n=17) 3 0.39 (0.45) [0.07, 0.62] 0.69 (0.94) [0.08, 1.17] 0.15 (0.07) [0.10, 0.18] 0.15 (0.10) [0.08, 0.20] 4 14.73 (27.31) [0.00, 21.00] 11.11 (21.44) [0.00, 20.00] 12.98 (19.27) [0.00, 30.00] 26.71 (5.81) [22.00, 33.00] 5 10.75 (6.79) [6.16, 13.14] 9.76 (6.50) [3.97, 19.58] 8.20 (2.33) [5.32, 10.01] 5.03 (1.63) [5.86, 5.86] 6 7 102 (92.73) 104 (90.43) 26 (100.00) 17 (100.00) 8 8 (7.27) 11 (9.57) 0 (0.00) 0 (0.00) 9 0.50 (0.07) [0.44, 0.54] 0.57 (0.14) [0.49, 0.60] 0.51 (0.07) [0.43, 0.58] 0.44 (0.02) [0.43, 0.43] 10 6.13 (0.51) [5.83, 6.41] 6.39 (0.73) [5.91, 6.80] 6.10 (0.37) [5.88, 6.35] 6.65 (0.64) [6.43, 6.96] 11 60.84 (30.84) [32.02, 92.55] 69.22 (27.00) [45.20, 93.95] 60.14 (24.10) [43.35, 78.15] 40.14 (26.72) [17.50, 70.20] 12 4.43 (1.93) [3.59, 5.29] 3.70 (2.00) [2.10, 4.91] 4.02 (2.07) [2.47, 6.30] 6.50 (2.05) [5.49, 7.95] 13 335.98 (101.88) [277.00, 345.00] 331.84 (68.25) [276.00, 403.00] 372.88 (58.34) [300.00, 432.00] 304.41 (47.12) [329.00, 330.00] 14 19.14 (1.82) [18.30, 21.00] 16.55 (2.56) [14.70, 19.20] 17.82 (1.07) [16.60, 19.20] 18.41 (1.14) [18.40, 19.10] 15 382.72 (29.87) [384.24, 396.90] 369.19 (62.15) [377.62, 395.54] 387.37 (15.61) [385.02, 396.90] 388.43 (8.55) [383.61, 395.75] 16 12.20 (6.47) [7.35, 16.46] 10.66 (6.21) [6.13, 13.27] 12.31 (3.82) [10.20, 14.91] 7.99 (3.72) [5.90, 9.50] 17 21.39 (6.96) [17.57, 23.65] 25.71 (9.33) [19.50, 30.00] 20.98 (2.31) [18.90, 23.03] 27.11 (6.49) [24.30, 29.60] V9 V10 1 2 8 (n=24) 24 (n=132) 3 0.37 (0.17) [0.27, 0.51] 12.76 (13.04) [5.69, 14.33] 4 6.25 (11.06) [0.00, 6.25] 0.00 (0.00) [0.00, 0.00] 5 5.93 (0.47) [5.93, 6.20] 18.10 (0.00) [18.10, 18.10] 6 7 19 (79.17) 124 (93.94) 8 5 (20.83) 8 (6.06) 9 0.49 (0.02) [0.49, 0.51] 0.67 (0.06) [0.61, 0.71] 10 6.95 (0.88) [6.16, 7.48] 6.02 (0.72) [5.71, 6.42] 11 67.35 (21.09) [65.03, 80.12] 89.81 (12.63) [85.92, 98.82] 12 4.41 (1.77) [3.26, 4.82] 2.06 (0.62) [1.59, 2.43] 13 301.25 (10.17) [301.25, 307.00] 666.00 (0.00) [666.00, 666.00] 14 17.97 (1.02) [17.40, 17.97] 20.20 (0.00) [20.20, 20.20] 15 385.28 (9.41) [378.28, 392.55] 288.09 (145.86) [167.38, 395.29] 16 7.96 (4.37) [4.51, 9.77] 18.60 (6.91) [14.18, 23.04] 17 30.36 (9.73) [23.82, 33.17] 16.40 (8.54) [11.23, 19.90] |
まとめ
R言語で集計表を作成してくれる関数を実装してみました。
今回紹介した関数を用いれば、面倒でかつ時間のかかるデータの集計があっという間に終わってしまいます。
この記事の上で紹介したパッケージをインストールすれば紹介した関数を使えるようになります。