見出し画像

LinePlot_with_ggplot2 - ggplot2による線グラフの書き方

自己紹介

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




使用するパッケージ一覧

library("tidyverse")
library("ggrepel")


使用するデータ

線グラフは良い感じのオープンソースが無いので、
Rの基本パッケージを使用していきます。
ToothGrowthデータセットは、モルモットの歯の成長に関する実験データを含んでいます。
具体的には以下の情報が含まれています。

  1. len: 歯の長さ (数値)

  2. supp: ビタミンCの投与方法 (2つの因子レベル)
    1. OJ: オレンジジュース
    2. VC: アスコルビン酸

  3. dose: ビタミンCの1日の投与量 (3つのレベル: 0.5, 1, 2 mg)

このデータセットは、ビタミンCの投与方法と投与量がモルモットの歯の成長にどのような影響を与えるかを調査するために使用されました。

data("ToothGrowth")
class(ToothGrowth)
## [1] "data.frame"
head(ToothGrowth)
##    len supp dose
## 1  4.2   VC  0.5
## 2 11.5   VC  0.5
## 3  7.3   VC  0.5
## 4  5.8   VC  0.5
## 5  6.4   VC  0.5
## 6 10.0   VC  0.5


線グラフとは

データの時系列的変化や傾向を視覚的に表現するためのグラフです。
X軸とY軸があり、通常はX軸に時間や順序を取り、Y軸は変化を見たい指標を取ります。


とりあえず、書いてみる

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

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

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

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

おっと、これでは線グラフとしての仕事をしていません。
データをもらって、何も気にせず線グラフを作ると良くわからないオブジェクトが生成させるので気をつけましょう。

ToothGrowth %>% 
  ggplot(aes(x = dose, y = len)) +
  geom_point() +
  geom_line() 


可視化したいものを考えてから可視化する

素のデータセットだと2種類の投与方法でモルモットの歯の成長を記録しています。
そのため、可視化したい投与方法を定めましょう。
今回は投与量とオレンジジュースによる歯の成長の違いを可視化しましょう。
絞り込みにはdplyrさんを使います。

ToothGrowth %>% 
  filter(supp == "OJ") %>% # ここで投与方法を絞り込む
  group_by(dose, supp) %>% # 投与量と投与方法でグルーピングして
  summarise(len = mean(len)) %>% # 歯の成長の平均値を計算します
  ggplot(aes(x = dose, y = len, color = supp, group = supp)) +
  geom_point() +
  geom_line() 


投与方法で比較してみる

でも、この実験って、投与方法の違いを比較したいのでは?
と考えた貴方は大正解です。比較する線グラフを描いてみましょう。

ToothGrowth %>% 
  # filter(supp == "OJ") %>% # ここを消すだけ
  group_by(dose, supp) %>%
  summarise(len = mean(len)) %>%
  ggplot(aes(x = dose, y = len, color = supp, group = supp)) +
  geom_point() +
  geom_line() 


デザインで比較を顕著に見せたい!

まずはpointの形状を変えてみましょう。
supp毎に形状を変えます。

ToothGrowth %>% 
  group_by(dose, supp) %>%
  summarise(len = mean(len)) %>%
  ggplot(aes(x = dose, y = len, color = supp, group = supp)) +
  geom_point(aes(shape = supp), size = 4) + # shapeにsuppを渡す。sizeで大きさを調整
  geom_line() 

pointを変えられるならlineも変えられます。

ToothGrowth %>% 
  group_by(dose, supp) %>%
  summarise(len = mean(len)) %>%
  ggplot(aes(x = dose, y = len, color = supp, group = supp)) +
  geom_point() + 
  geom_line(aes(linetype = supp),linewidth=1) # linetypeにsuppを渡す。linewidthで太さを調整


このままでも良いけど…

お客さんにグラグを見せたとき、pointの値を見たいと言われることが良くあります。
なので、数値を表示しましょう。ggrepelというライブラリを使います。

ToothGrowth %>% 
  group_by(dose, supp) %>%
  summarise(len = mean(len)) %>%
  ggplot(aes(x = dose, y = len, color = supp, group = supp)) +
  geom_point() +
  geom_line() +
  geom_text_repel(aes(label = len), show.legend = F)

X軸を見てみると、存在しない1.5mgの投与が見えていますね。
面倒くさい人はこれを指摘してきます。
良い感じにするにはas.factor()で連続変数ではなく、因子型と指定しましょう。
ついでに単位も付けちゃいましょう

ToothGrowth %>% 
  group_by(dose, supp) %>%
  summarise(len = mean(len)) %>%
  mutate(dose = paste(as.factor(dose), "mg", sep = "")) %>% 
  ggplot(aes(x = dose, y = len, color = supp, group = supp)) +
  geom_point() +
  geom_line() +
  geom_text_repel(aes(label = len), show.legend = F)


まとめ

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




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


株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

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

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