Exploratory アワー #822 - カスタムチャート: 箱ヒゲ図: 行数をチャート上に表示したい

Exploratoryのバージョン15から利用できるようになった「カスタムチャート」を使うと、UIのメニューだけでは対応していないチャートの表現を、Rのスクリプトを書くことで柔軟に実現できます。今回はその一例として、箱ヒゲ図の各カテゴリに、そのカテゴリに含まれる行数(n数)を表示する方法を紹介します。

役立つ人

箱ヒゲ図でカテゴリごとの分布を確認している方や、各カテゴリのサンプルサイズ(件数)も同時に把握したい方にお役立ていただける内容です。

問題

箱ヒゲ図でカテゴリごとの分布のばらつきを確認するとき、各箱にそもそも何件(何人)のデータが含まれているのかを、チャート上で一緒に確認したいことがあります。

ただし、現状のExploratoryではUIのオプションとして各カテゴリの行数を箱ヒゲ図上に表示する機能はサポートされていません。

解決方法

箱ヒゲ図は、カテゴリごとのデータの分布を確認するときによく使われるチャートです。箱の中には全体の50%(下位25%から上位75%まで)のデータが含まれ、箱の上下に伸びるヒゲの先端で最大値・最小値を確認できます。

箱が長ければデータのばらつきが大きい、ヒゲが長ければ特定の方向に値が広く分布している、といったことが読み取れます。

一方で、各箱に何件のデータが含まれているのか(n数)は、箱ヒゲ図の見た目だけでは分かりません。

この行数を箱ヒゲ図上に表示するオプションは現状のExploratoryのUIにはありませんが、バージョン15から追加された「カスタムチャート」を使えば、今開いているデータフレームに対してRのスクリプトを書き、思い通りのチャートを作成できます。

利用データ

今回は、1行が1人の従業員を表し、列には年齢・性別・職種・給料(月給)などの情報を持つ「従業員データ」を利用します。この従業員データを使って、職種ごとの給料のばらつきを箱ヒゲ図で可視化し、各職種に何人の従業員がいるのかを一緒に表示していきます。

Exploratoryの操作方法

カスタム(R)チャートで箱ヒゲ図を作成する

まずは、職種ごとの給料の分布を箱ヒゲ図で可視化し、そこに行数(n数)を表示するためのチャートを作成します。

新しいチャートを追加し、チャートのタイプから、「カスタム(R)コード」を選択します。

カスタム(R コード)を選択すると、Rのスクリプトを直接記述してチャートを描画できる入力欄が表示されます。なお、カスタム(R コード)をでは、今自分が開いているチャートのデータフレームのみを利用できるという制約があります。

このデータフレームを指定するときには、通常のRスクリプトとは異なり、${DATA} という特別な記法を使う必要があります。これが「現在開いているアクティブなデータフレーム」を指す書き方になります。

今回は、職種ごとの行数を add_count() で集計し、その件数をX軸ラベルとホバーテキストに埋め込む以下のコードを入力欄に貼り付けます。

library(plotly)

# ▼ n数表示のオン/オフ切り替え用フラグ
show_n_in_axis  <- TRUE   # 軸ラベルに (n=◯◯) を表示するか
show_n_in_hover <- TRUE   # ホバー時のツールチップに (n=◯◯) を表示するか

# ▼ n数表示の文字列フォーマット(「n=」の部分を変えたい場合はここを書き換える)
n_label_prefix <- "人数="

# 職種ごとの行数(n)を付与し、X軸ラベルを「職種 (人数=行数)」の形にする
df <- ${DATA} %>%                                       # ${DATA} … Exploratoryのアクティブなデータフレーム
  add_count(職種, name = "n") %>%                       # 職種ごとの行数を n 列として追加
  mutate(
    職種ラベル = if (show_n_in_axis) paste0(職種, "\n(", n_label_prefix, n, ")") else 職種,
    職種ホバー用 = if (show_n_in_hover) paste0(職種, " (", n_label_prefix, n, ")") else 職種
  )

# 箱ヒゲ図を作成
df %>%
  plot_ly(
    x = ~職種ラベル,          # X軸: 職種(n数の有無を show_n_in_axis で制御)
    y = ~給料,                # Y軸: 給料(この分布を箱ヒゲで表示)
    type = "box",             # チャートの種類: 箱ヒゲ図
    boxpoints = FALSE,        # 点の表示: FALSE=非表示 / "outliers"=外れ値のみ / "all"=全点
    hovertext = ~職種ホバー用,
    hovertemplate = paste0(
      "%{hovertext}<br>",
      "%{y}<extra></extra>"
    )
  ) %>%
  layout(
    xaxis = list(
      title = "職種",
      # 箱の並び順。"median descending"=給料の中央値が高い順(おすすめ)など
      categoryorder = "median descending"
    ),
    yaxis = list(
      title = "給料",
      zeroline = TRUE,            # y=0の線をX軸線として表示
      zerolinecolor = "#c0c0c0",
      zerolinewidth = 1
    ),
    showlegend = FALSE
  ) %>%
  config(displayModeBar = FALSE)

これで、箱ヒゲ図を描画するためのカスタム(R)コードを記述できました。

チャートを表示してn数を確認する

続いて、記述したコードが実際にどのようなチャートになるのかを確認します。

「ビュー」をクリックしてチャートを描画します。

すると、UIで作成した箱ヒゲ図とほぼ同じ見た目ながら、各職種のラベルの下に「人数=102」のようにその職種の従業員数が表示された箱ヒゲ図が描画されます。箱にマウスカーソルを合わせると、ホバーにも「人数=102」のように行数が表示されます。

これで、UIのオプションではサポートされていない、各カテゴリの行数(n数)を箱ヒゲ図上に表示することができました。

表示するテキストをカスタマイズする

最後に、チャートに表示するn数のラベルは自由に変更できるため、その方法を確認します。

コードの冒頭にある n_label_prefix の値が、ラベルに表示される接頭辞になっています。

ここを「人数=」から「N=」や「件数=」などに書き換えます。

再度ビューで表示すると、箱ヒゲ図に表示されるn数のラベルが指定した文言に変わります。

ビデオ

参考情報

  • カスタム (R)チャートの作り方 - リンク
  • Rスクリプトを使ったチャートとアナリティクスの作成 - リンク
  • 従業員データ - リンク
Export Chart Image
Output Format
PNG SVG
Background
Set background transparent
Size
Width (Pixel)
Height (Pixel)
Pixel Ratio