アンケート集計などを行うときに、ある質問への回答の結果で、他の質問の回答の結果の割合が変わるかをみたいときがあります。
例えば、年齢層ごとに満足率が異なるかをみたい、といった場合です。
それをグラフできるコードを書いてみました。
TEST_Aがaの群とbの群で分けたときに、TEST_Bの結果(x, y, z, w)の割合をグラフ化するコードです。
# サンプルデータ生成
sample_data <- data.frame(
TEST_A=c("a", "a", "b", "b", "a"),
TEST_B=c("x", "y", "z", "w", "w")
)
summary(sample_data)
# クロス集計して割合グラフを描く関数
draw_percent_bar <- function(d, x, y){
par(mar=c(4, 4, 2, 7))
tmp_table <- table(d[[y]],d[[x]])
barplot(prop.table(tmp_table,2)*100,
legend=rownames(tmp_table),
col=topo.colors(nrow(tmp_table)),
ylim=c(0,100),
ylab="percentage(%)",
args.legend=list(x="topright", ncol=1, bty="n", inset=c(-0.3,0.1)))
}
# TEST_Aの結果で分けた時のTEST_Bの割合をグラフにする
draw_percent_bar(
sample_data,
"TEST_A",
"TEST_B"
);
実行すると以下のグラフが出力されます。
これでTEST_Aがaの群とbの群で分けたときに、TEST_Bの結果の割合が異なるかをグラフで確認できました。
次は、TEST_Aがaの群とbの群で分けたときに、TEST_B, TEST_C, TEST_Dで1と答えた割合をグラフ化するコードです。
# サンプルデータ生成
sample_data <- data.frame(
TEST_A=c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b"),
TEST_B=c(1, 0, 0, 0, 0, 0, 0, 1, 1, 1),
TEST_C=c(0, 0, 1, 1, 1, 1, 0, 0, 0, 1),
TEST_D=c(1, 0, 0, 0, 1, 1, 0, 0, 0, 1)
)
summary(sample_data)
# クロス集計して割合グラフを描く関数
draw_bar_cross_ratio <- function(data, cross_row, cross_cols){
vals <- sort(unique(data[[cross_row]]))
tmp <- t(sapply(vals, function(x){
colSums(data[data[[cross_row]]==x,][,cross_cols])/nrow(data[data[[cross_row]]==x,]) * 100
}))
rownames(tmp) <- vals
colnames(tmp) <- cross_cols
par(ps=9, mgp=c(2.0,0.8,0), mar=c(14, 4, 2, 2))
barplot(tmp,
las=2,
beside=T,
ylim=c(0,100),
ylab="percentage(%)",
col=rainbow(length(vals)))
legend(8, 120, vals, col=rainbow(length(vals)), pch=15, ncol=5, bty="n")
}
# TEST_Aの結果で分けた時のTEST_B, TEST_C, TEST_Dの割合をグラフにする
draw_bar_cross_ratio(
sample_data,
"TEST_A",
c("TEST_B", "TEST_C", "TEST_D")
);
表示されるグラフはこのようになります。
TEST_Aがaの群とbの群で分けたときに各テストで1と0のどちらが多いか視覚化することができました。