LoginSignup
8
10

More than 5 years have passed since last update.

Rでクロス集計して属性ごとの割合グラフを描く

Posted at

アンケート集計などを行うときに、ある質問への回答の結果で、他の質問の回答の結果の割合が変わるかをみたいときがあります。

例えば、年齢層ごとに満足率が異なるかをみたい、といった場合です。

それをグラフできるコードを書いてみました。

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"
);

実行すると以下のグラフが出力されます。

20150724132454.png

これで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")
);

表示されるグラフはこのようになります。

20150724140522.png

TEST_Aがaの群とbの群で分けたときに各テストで1と0のどちらが多いか視覚化することができました。

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10