Rでデータを可視化する

1ページ 2ページ

6日間の血圧データをグラフにする

患者Aさんの収縮期血圧を、月曜日から土曜日までの6日間、歩行練習の前後に測定したとします。ここでは架空のデータを使い、グラフの描き方と読み取り方を練習します。血圧の単位はmmHgです。

月曜日, AM, 屋外歩行の前後で測定
火曜日, PM, 屋内歩行の前後で測定
水曜日, AM, 屋内歩行の前後で測定
木曜日, AM, 屋内歩行の前後で測定
金曜日, PM, 屋外歩行の前後で測定
土曜日, PM, 屋内歩行の前後で測定

グラフにすると、数値の一覧だけでは気付きにくい変化や違いを確認できます。この例は同じ患者さんの6日分の記録です。ただし、グラフから見える違いだけで、歩行練習や場所の効果を判断することはできません。

・練習前と練習後で、血圧はどのように変化しているでしょうか。
・日ごとの血圧には、どの程度の違いがあるでしょうか。
・時間帯や場所と合わせて見ると、どのような特徴に気付くでしょうか。

まずデータを入力し、簡単な散布図を描きます。その後、棒グラフや折れ線グラフなどで表示方法の違いを確認しましょう。コードは上から順に実行してください。必要なパッケージの追加はありません。

データセットの作成

以下のコードをRに貼り付けて実行してください。preは練習前、postは練習後の血圧です。dayは曜日、timeは時間帯(AM:午前、PM:午後)、placeは場所を表します。各ベクトルの値は、月曜日から土曜日の順に対応しています。data.frame()で、1行が1日分の記録となる表を作ります。

R
pre <- c(112, 138, 124, 120, 136, 142)
post <- c(138, 139, 136, 130, 143, 140)
day <- c("月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日")
time <- c("AM", "PM", "AM", "AM", "PM", "PM")
place <- c("屋外", "室内", "室内", "室内", "屋外", "室内")
data <- data.frame(pre, post, day, time, place)
print(data)
> print(data)
  pre post    day time place
1 112  138 月曜日   AM  屋外
2 138  139 火曜日   PM  室内
3 124  136 水曜日   AM  室内
4 120  130 木曜日   AM  室内
5 136  143 金曜日   PM  屋外
6 142  140 土曜日   PM  室内

散布図は、二つの数値の関係を点で表すグラフです。まずは次の1行を実行してください。横軸が練習前、縦軸が練習後の血圧となり、一つの点が1日分の記録を表します。

R
plot(data$pre, data$post)

plot()には、横軸にするデータ、縦軸にするデータの順に指定します。data$preは、表dataからpre列を取り出す書き方です。

グラフで練習前後を比べる

各曜日の前後比較

棒グラフでは、曜日ごとに練習前(pre)と練習後(post)の血圧を並べます。rbind()で二つのベクトルをまとめ、beside = TRUEで棒を横に並べます。colは色、mainはタイトル、xlabとylabは軸の名前です。legend()で色の説明(凡例)を追加します。par()は余白の設定です。まずはコード全体を実行して、図を確認してください。

R
# 描画領域を調整
par(mar = c(5, 4, 4, 6))  # 右側の余白を広げる (右側が8)

# preとpostを比較する棒グラフを作成
barplot(rbind(pre, post),
        beside = TRUE,
        names.arg = day,
        col = c("lightblue", "pink"),
        main = "preとpostの比較",
        xlab = "曜日",
        ylab = "値")

# 凡例を右外に配置
legend("topright", 
       legend = c("pre", "post"),
       fill = c("lightblue", "pink"),
       xpd = TRUE,          # 描画領域外に凡例を描く
       inset = c(-0.2, 0.2))  # insetで右外に移動

par(mar = c(5.1, 4.1, 4.1, 2.1))

経時変化

折れ線グラフでは、日ごとの推移を確認できます。1:6は1から6までの数値です。plot()で練習前の線を描き、lines()で練習後の線を重ねます。type = “o”は点と線を表示する指定です。axis()で横軸に曜日を表示し、ylimで縦軸の範囲を指定します。

R
# 折れ線グラフの作成
plot(
  1:6, pre, type = "o", col = "blue", pch = 16, 
  ylim = c(min(pre, post) - 10, max(pre, post) + 10),
  xaxt = "n", xlab = "曜日", ylab = "値", 
  main = "preとpostの比較 (折れ線グラフ)")
  
lines(1:6, post, type = "o", col = "red", pch = 16)

# x軸のラベルを追加
axis(1, at = 1:6, labels = day)

# 凡例を追加
legend(
  "bottomright", legend = c("pre", "post"), 
  col = c("blue", "red"), pch = 16, lty = 1)

前後比較

箱ひげ図では、データの中心やばらつきを確認できます。箱の中央の線は中央値、箱の下端と上端は第1・第3四分位数に対応します。赤い点は、points()で追加した平均値です。この図だけでは、同じ日の練習前後の対応は分かりません。

R
par(mar = c(5, 4, 4, 2)) 
# preとpostを比較する箱ひげ図の作成
# 箱ひげ図の作成
boxplot(pre, post,
        names = c("pre", "post"),
        col = c("lightblue", "pink"),
        main = "preとpostの比較 (箱ひげ図)",
        ylab = "値")

# 平均値を計算
pre_mean <- mean(pre)
post_mean <- mean(post)

# 平均値を箱ひげ図に追加 (赤い点)
points(1, pre_mean, col = "red", pch = 19)  # preの平均
points(2, post_mean, col = "red", pch = 19) # postの平均

par(mar = c(5.1, 4.1, 4.1, 2.1))

【発展】各曜日の前後比較

ここからは発展課題です。同じ日の練習前後を1本の線で結び、変化の方向を確認します。右上がりなら血圧が上がり、右下がりなら下がっています。forは同じ操作を繰り返す書き方で、pre[i]はpreのi番目の値を取り出します。まず図の読み取りを優先し、繰り返し処理の詳細は後から確認しても構いません。

R
#余白調整
par(mar = c(5, 4, 4, 8)) 
# グラフの描画領域を設定
plot(c(1, 2), range(c(pre, post)), type = "n", 
     xlab = "歩行練習前後", ylab = "値", 
     main = "各曜日のpreとpostの比較", 
     xaxt = "n")

# x軸のラベルを設定
axis(1, at = c(1, 2), labels = c("pre", "post"))

# パステルカラーの設定
colors <- c("#FFB3BA", "#FFDFBA", "#FFC3FF", "#BAFFC9", "#BAE1FF", "#DABFFF")   # パステルカラー

# 各曜日のデータを描画
for (i in 1:length(day)) {
  lines(c(1, 2), c(pre[i], post[i]), col = colors[i], lwd = 2)  # preとpostを線で結ぶ
  points(c(1, 2), c(pre[i], post[i]), col = colors[i], pch = 16)  # 点を追加
}


# 凡例を追加
legend(
  "topright",
  legend = day, col = colors,
  lty = 1, pch = 16,
  lwd = 2,
  xpd = TRUE, # 描画領域外に凡例を描く
  inset = c(-0.2, 0.2)
)

par(mar = c(5.1, 4.1, 4.1, 2.1))

【発展】dayとplaceを考慮した比較

発展課題:場所を色、曜日を点の形で区別します。青は屋外、赤は室内です。ifelse()で条件に応じた色を選びます。表示された違いは、この患者さんの記録の特徴であり、場所による効果を示すものではありません。

JavaScript
#余白調整
par(mar = c(5, 4, 4, 9)) 
# グラフの描画領域を設定
plot(c(1, 2), range(c(pre, post)), type = "n", 
     xlab = "歩行練習前後", ylab = "値", 
     main = "屋内と屋外でのpreとpostの比較", 
     xaxt = "n")

# x軸のラベルを設定
axis(1, at = c(1, 2), labels = c("pre", "post"))

# 色分けの設定 (屋外と屋内)
colors <- c("blue", "red")  # 屋外を青、室内を赤
color_map <- ifelse(place == "屋外", colors[1], colors[2])  # 各データの色を決定

# 各曜日に対応するポイントの形状を設定
shapes <- c(16, 15, 17, 18, 19, 4)  # 丸、四角、三角などの形状
shape_map <- setNames(shapes, day)  # 曜日と形状を対応付け

# 各曜日のデータを描画
for (i in 1:length(day)) {
  col <- color_map[i]  # 屋外か屋内で色を選択
  pch <- shape_map[day[i]]  # 曜日に対応する形状を取得
  lines(c(1, 2), c(pre[i], post[i]), col = col, lwd = 2)  # preとpostを線で結ぶ
  points(c(1, 2), c(pre[i], post[i]), col = col, pch = pch)  # 点を追加
}

# 凡例用ラベルを作成 (曜日と場所を組み合わせる)
legend_labels <- paste(day, "(", place, ")", sep = "")
# 凡例を追加
legend(
  "topright",
  legend = legend_labels, col = color_map,
  lty = 1, pch = shapes,
  lwd = 2,
  xpd = TRUE, # 描画領域外に凡例を描く
  inset = c(-0.35, 0.2)
)

par(mar = c(5.1, 4.1, 4.1, 2.1))
タイトルとURLをコピーしました