R_tidyverse

tidyverseでヒストグラムを作成する(2)作図

前回の続きです。ビニングを実施したら次はヒストグラム用のデータを作成してggplot2で作図します。

ビンの中点を算出する

今回はgeom_barを使ってヒストグラムを作成します。この時各ビンの中点の座標が必要ですが、cut_width関数では算出されませんのでマニュアルで算出します。ここではcut_width関数から出力された文字列から中点を算出するget_midpoint関数を定義しました。

library(tidyverse)

get_midpoint <- function(txt) {
  
  gsub('\\(|\\)|\\[|\\]', "", txt) %>%
  strsplit(split=",") %>%
  unlist() %>%
  as.numeric() %>%
  mean()
}


# 4.5と出力される
print(get_midpoint("[3.5, 5.5)"))

cut_interval関数で出力される文字列は「[ビンの左側境界, ビンの右側境界]」なので、境界値を取り出してその平均を計算すればビンの中点を取得できます。

gsub関数は文字列置換を実行する関数で、かっこを削除します。正規表現も利用できるので、想定されるかっこはすべて一つの正規表現でマッチさせています。なおメタ文字を識別するバックスラッシュはRではエスケープする必要があるため、バックスラッシュを2つ重ねる必要があります。

strsplit関数は区切り文字に基づき文字列を分割する関数です。ただしリストを返すのでunlist関数を併用してベクトルの形に変換しています。後は数値に型変換して2つの境界値の平均を算出すればOK。

上記の関数を使ってビンの中点を算出できるようにしたコードは以下の通りです。SASを使っていた人だと「mid=get_midpoint(bin)」と書きたくなると思います。(私はそうでした)。それだと行単位で関数が適用されませんので、map_dbl関数を使います。

map系関数は指定したカラムを引数として、関数を適用し値を返す関数です。通常のmap関数はリストを返しますが、今回は数値として返してほしいのでmap_dbl関数を使います。

bin.wk1 <- iris %>%
  #ビニング
  dplyr::mutate(
    bin=cut_width(Petal.Width,width=0.2, center=0.1)
  ) %>%
  
  #頻度集計
  dplyr::group_by(Species, bin) %>%
  dplyr::summarise(
    count=n(), .groups="keep"
  ) %>%
  
  #分母と割合の導出
  #ビンの中点を算出
  dplyr::group_by(Species) %>%
  dplyr::mutate(
    countT=sum(count),
    pct=count / countT * 100,
    mid=map_dbl(bin, get_midpoint)
    
  ) %>%
  dplyr::ungroup()

これで作図データができました。

作図

作成して作図データからヒストグラムを作成するのですが、geom_bar関数のwidth引数にビン幅を指定するのがポイントです。

bin.wk1 %>%
  ggplot(aes(x=mid, y=pct, fill=Species)) +
  geom_bar(stat="identity", width=0.2) +
  scale_x_continuous(name="Petal.Width")+
  scale_y_continuous(name="%")
頻度集計結果データセットからgeom_bar関数を使ってヒストグラムを作成した結果グラフ出力結果

 

実際の成果物として出力するなら体裁をもう少し整えなければなりませんが、大まかな流れはこれでOKでしょう。

RのパッケージはSASよりも手間がかからずお手軽にレポートを作成できますが、パッケージの処理内容と出力したい内容が合致しているかが検証しなければなりませんし、そのそもパッケージの信頼性も気にする必要が出てきます。

パッケージに頼らずに手動で計算できる箇所は極力マニュアルで導出してレポートを作成できるようにした方が後々役立つと思います。