盆暗の学習記録

データサイエンスを中心として,日々学んだことの備忘録としていく予定です。初心者であり独学なので内容には誤りが含まれる可能性が大いにあります。

使用を避けるべきグラフ

最近グラフつくってて思ったことをメモ

円グラフを使わない

「円グラフわかりにくいから,棒グラフを使え」という話です(人間は面積より長さのほうが大小関係を把握できるため)。

例えば以下の円グラフではgear = 3と gear = 4の差がパッと見にはわからないと思いますが,棒グラフではひと目で大小関係がわかります。

f:id:nigimitama:20190208224540p:plain

この主張は最近では色んな所で目にするようになり,データ分析に関わる人の間では大部分の人の合意がとれていそうに思います*1

帯グラフもあまり良くないかも

それに加えて最近私が思うのが,「帯グラフも棒グラフでいいんじゃね?」説です。

帯グラフのカテゴリが2つなら非常に有効だと思うのですが,カテゴリが3以上のものになると始点が異なり始めるので,それだったら棒グラフにして始点を統一したほうがいいのではないかな,と。

f:id:nigimitama:20190208224551p:plain

例えば,上の帯グラフでの「直列エンジンのgear = 4」と「V型エンジンのgear = 3」では,どちらの割合が大きいかがパッと見はわからないと思います。

でも,棒グラフにすれば始点が揃うので差がわかるようになります。

棒グラフのほうがちょっと面積はとってしまいますが,誠実なグラフ(トリックをしにくいグラフ)は棒グラフかなと思います。

参考:グラフづくり全般で参考になる記事

とくに後者の記事の方は本当に細かいポイントまでわかりやすくまとめられていていいです。

(参考)記事中のグラフのコード

せっかくコード書いたので載せておきます。

円グラフと棒グラフ

library(tidyverse)
library(RColorBrewer)
library(gridExtra)

pie <- ggplot(mtcars, aes(x = "", fill = factor(gear))) +
  geom_bar(width = 1)+
  coord_polar(theta = "y", direction = -1)+ # bar to pie
  scale_fill_brewer(palette = "Blues")+ # color
  theme(axis.text.x=element_blank())+ # 文字を消す
  labs(x = "", y = "", fill = "gear",
       title = "ギアの数")

bar <- ggplot(mtcars, aes(x = gear)) +
  geom_bar(fill = brewer.pal(3, "Blues")[3]) + 
  labs(title = "ギアの数")

grid.arrange(pie, bar, ncol = 2)

帯グラフと棒グラフ

# 集計
df <- mtcars %>% mutate(vs = case_when(vs == 0 ~ "V型エンジン", vs == 1 ~ "直列エンジン"),
                        gear = as.factor(gear))
df_m <- df %>% group_by(vs) %>% count() %>% rename(m = n)
table_df <- df %>% group_by(gear, vs) %>% count() %>% full_join(df_m) %>% mutate(p = n / m)

# plot
obi <- ggplot(table_df, aes(x = vs, y = p, fill = gear)) + 
  geom_bar(stat = "identity", position = "fill", color = "White") + 
  scale_fill_brewer(palette = "Blues") + 
  coord_flip() +
  labs(x = "", y = "")

bar <- ggplot(table_df, aes(x = vs, y = p, fill = gear)) + 
  geom_bar(stat = "identity", position = "dodge", color = "White") + 
  scale_fill_brewer(palette = "Blues") + 
  coord_flip() +
  labs(x = "", y = "")

grid.arrange(obi, bar)