見出し画像

Histogram_with_ggplot2 -ggplot2によるヒストグラムの書き方-

自己紹介

分析屋の堀井です。 今回はTidyverseというRを語るうえで欠かせないパッケージ群の中からggplot2を用いたヒストグラムの書き方を紹介しようと思います。
普段はライフサイエンス部で機械学習・深層学習を用いて人による判断の自動化を行っています。
弊社の技術ブログでは勝手にRを解説するシリーズを投稿して、社内にRの良さを布教することを画策しています。

使用するパッケージ一覧

library("tidyverse")

使用するデータ

カリフォルニアの住宅価格のデータセットを使用します。 様々なオープンデータを紹介しているサイトの「housez.zip」をcsv形式にしたものを使用します。 中身は以下の通りです。

data <- read_csv("data/California_Housing.csv")

ヒストグラムとは

横軸は連続変数であり、いくつかの区間に分け、その区間内に属するケース数を可視化したグラフをヒストグラムと呼びます。
使用するデータがどれだけ分散しているかを確認するときに使用します。
また、目的変数に多峰性が見られるときに様々なカテゴリカル変数で色分けすることで、目的変数にどのような傾向があるかを読み取ることが可能になります。

とりあえず、書いてみる

とりあえず、ヒストグラムを書いてみます。
ggplot2の書き方のパターンは以下のようになっています

  1. 「データセット」「変数」を選択

  2. 「グラフの種類」を選択し、オブションを設定する

  3. 各コードは”+“で繋ぐ

data %>% 
  ggplot(aes(x = target)) + # 「データセット」「変数」を選択
  geom_histogram()# 「グラフの種類」を選択し、オブションを設定する

ヒストグラムでよく使うオプションとして、階級の数の設定というのがあります。

data %>% 
  ggplot(aes(x = target)) + 
  geom_histogram(bins = 60) # bins = で変更可能

また、階級幅を変えることも良くあります。

data %>% 
  ggplot(aes(x = target)) + 
  geom_histogram(binwidth = 0.5) # binwidth = で変更可能

以上のようにヒストグラムを調整することができます。
良く知らないデータを可視化する際はしっかりと各変数の特徴を確認してから可視化しましょう。
さらに言えば、スタージェスの公式と呼ばれる階級数の決定方法もあるので、活用しましょう

# スタージェスの公式: k (階級の数) = 1 + log₂n (n = データ数)
bins <- round(1 + log2(count(data)), 0) %>% as.integer()

data %>% 
  ggplot(aes(x = target)) + 
  geom_histogram(bins = bins) 

x軸とy軸の名前を変更する

簡単にヒストグラムの書き方を説明しましたが、軸ラベルが変数名そのままだとお客様に出すとき困りますよね?
安心してください。簡単に任意のラベルを変更可能です。

bins <- round(1 + log2(count(data)), 0) %>% as.integer()

data %>% 
  ggplot(aes(x = target)) + 
  geom_histogram(bins = bins) +
  labs(x = "各地域における住宅価格の平均値", # X軸ラベル
       y = "度数", # Y軸ラベル
       title = "各地域における住宅価格の平均値") # 図のタイトル

グラフに色を付ける

geom_histogram()の中でヒストグラムのオプションを設定することで、binに色を付けることが可能になります。

data %>% 
  ggplot(aes(x = target)) + 
  geom_histogram(fill = "orange", 
                 # binの中の色を変える
                 color = "black"
                 # binの枠の色を変える

グラフを層化して描画する

層化して色を付けることで、その変数についての理解を深めることもできます。 築年数で層化するために築年数を一定の期間で括り、色を付けてみる。 mutate()を用いて新しい変数を作成しながら、その変数を用いてグラフの描画をする。
パイプ演算子とmutate()を用いたこの方法の利点はグラフの描画にしか使用しない変数をデータセットに残さないことです。

data %>% 
  mutate(HouseAge_band = case_when(HouseAge >= 0 & HouseAge <= 5 ~ "0~5",  
                                   HouseAge >= 6 & HouseAge <= 10 ~ "6~10", 
                                   HouseAge >= 11 & HouseAge <= 20 ~ "11~20", 
                                   HouseAge >= 21 & HouseAge <= 30 ~ "21~30", 
                                   HouseAge >= 31 & HouseAge <= 40 ~ "31~40",
                                   HouseAge >= 41 & HouseAge <= 50 ~ "41~50",
                                   HouseAge >= 51 ~ "51~"
                                   )) %>%                                   
  ggplot(aes(x = target, fill = HouseAge_band)) + 
  # `aes()`の中で`fill = `を設定し、どの変数で色分けするか決める
  geom_histogram() 

色々重なって視認性が悪いので、色の濃度を下げてみましょう

data %>% 
  mutate(HouseAge_band = case_when(HouseAge >= 0  & HouseAge <= 5  ~  "0~5",  
                                   HouseAge >= 6  & HouseAge <= 10"6~10", 
                                   HouseAge >= 11 & HouseAge <= 20 ~ "11~20", 
                                   HouseAge >= 21 & HouseAge <= 30 ~ "21~30", 
                                   HouseAge >= 31 & HouseAge <= 40 ~ "31~40",
                                   HouseAge >= 41 & HouseAge <= 50 ~ "41~50",
                                   HouseAge >= 51                  ~ "51~"
                                   )) %>%                                   
  ggplot(aes(x = target, fill = HouseAge_band, alpha = 0.3)) + # `alpha =`で色の濃度を設定する
  geom_histogram() 

そもそも重なっているのが悪いなら、個別に出力しましょう!

data %>% 
  mutate(HouseAge_band = case_when(HouseAge >= 0  & HouseAge <= 5  ~  "0~5",  
                                   HouseAge >= 6  & HouseAge <= 10"6~10", 
                                   HouseAge >= 11 & HouseAge <= 20 ~ "11~20", 
                                   HouseAge >= 21 & HouseAge <= 30 ~ "21~30", 
                                   HouseAge >= 31 & HouseAge <= 40 ~ "31~40",
                                   HouseAge >= 41 & HouseAge <= 50 ~ "41~50",
                                   HouseAge >= 51                  ~ "51~"
                                   )) %>%                                   
  ggplot(aes(x = target, fill = HouseAge_band)) + 
  geom_histogram() + 
  facet_wrap(~HouseAge_band) # `facet_wrap()`を使って個別にグラフを描画する。

さらにラベルも任意のものにしてみましょう。

data %>% 
  mutate(HouseAge_band = case_when(HouseAge >= 0  & HouseAge <= 5  ~  "0~5",  
                                   HouseAge >= 6  & HouseAge <= 10"6~10", 
                                   HouseAge >= 11 & HouseAge <= 20 ~ "11~20", 
                                   HouseAge >= 21 & HouseAge <= 30 ~ "21~30", 
                                   HouseAge >= 31 & HouseAge <= 40 ~ "31~40",
                                   HouseAge >= 41 & HouseAge <= 50 ~ "41~50",
                                   HouseAge >= 51                  ~ "51~"
                                   )) %>%                                   
  ggplot(aes(x = target, fill = HouseAge_band)) + 
  geom_histogram() + 
  facet_wrap(~HouseAge_band) + 
  labs(x = "住宅価格の中央値",
       y = "度数",
       title = "築年数で層化した住宅価格の中央値のヒストグラム",
       fill = "築年数")

まとめ

今回はggplot2を用いたヒストグラムの書き方を説明しました。
ggplot2はユーザーのノンプログラマーにもわかりやすく積み上げ式でコードを記述するため、記述量は長くなりますが、非常に理解は簡単な構造になっているかと思います。
また、ggplot2とデータの抽出をパイプ演算子を用いて組み合わせることで、グラフ作成時にしか使用しないような変数をデータフレーム内に作らず計算することができます。
次回は棒グラフの書き方を説明します。


ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

晴れてシリーズ化となりました。これまでの記事はこちらから!

株式会社分析屋について

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!
【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。
【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。
【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。
【SES】
SESサービスも行っております。