データフレーム(文字列)の頻度を可視化したい 〜エラーバーを添えて〜 with dplyr, ggplot2
の続きみたいなもん。
前回の記事では
> sample(letters[1:15], 100, replace=TRUE) [1] "j" "n" "a" "n" "a" "l" "l" "h" "d" "o" "l" "l" "c" "f" "m" "g" "c" "j" "h" "m" "a" "d" "m" "c" [25] "g" "h" "c" "h" "d" "d" "l" "m" "l" "b" "i" "e" "d" "g" "f" "h" "c" "j" "i" "a" "m" "f" "n" "f" [49] "e" "e" "o" "f" "b" "b" "g" "m" "n" "h" "k" "g" "g" "b" "i" "d" "e" "n" "b" "h" "o" "a" "b" "m" [73] "n" "j" "b" "j" "h" "a" "h" "g" "k" "e" "f" "c" "c" "n" "e" "l" "k" "n" "i" "o" "f" "g" "o" "j" [97] "g" "c" "c" "f"
というデータの可視化を行ったが、今回はこれを
- 複数回繰り返して(GROUP化するイメージ)
- 各GROUP内での各文字の出現頻度を計算して
- 各GROUP間での各文字の出現頻度の相対誤差を計算して
- その結果を棒グラフ(出現頻度の平均) with エラーバー(相対誤差)で描画したい
という状況を考える。ややこしいですね。
サンプルデータを上に倣って適当に作ると
x <- data.frame(VALUE=sample(letters[1:15], 100, replace=TRUE), GROUP=sample(1:10, 100, replace=TRUE))
な感じ。以下のようなデータになっている。
> head(x, 10) VALUE GROUP 1 l 10 2 d 2 3 f 10 4 m 10 5 h 3 6 d 3 7 d 1 8 i 1 9 l 3 10 a 6
好きな文字(A-O)を100個選んで、それを適当に10(GROUPのMAX値)個のグループに分けたデータということだ。
んで、上記の内容を一発でChain(%>%)するために以下のようなコードを書いた。
キモは
- prop.tableでtableの結果を頻度に倒せる
- geom_barの引数のstat="identity"は必須で、デフォルトでは"bin"になっており、これはデータのカウントに相当
としてる所だろうか。特にprop.tableは初めて知った。頻度出すのにはこれかー。
もっといいやり方はあると思うので、誰か頼む。
x %>% group_by(GROUP) %>% table %>% prop.table(., 2) %>% data.frame %>% group_by(VALUE) %>% summarize(MEAN=mean(Freq), SE=sd(Freq)/sqrt(n())) %>% ggplot(data=., aes(x=VALUE, y=MEAN)) + geom_bar(aes(fill=VALUE), stat="identity") + geom_errorbar(aes(ymin=MEAN-SE, ymax=MEAN+SE), width=.5, size=2)
参考
パッケージなしでエラーバー描く関数の話。
シミュレーション結果(散布図)の正解線重ね描き〜エラーバーを添えて〜 - My Life as a Mock Quant