17
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ElixirAdvent Calendar 2022

Day 5

Livebook に散布図と回帰直線を表示する

Last updated at Posted at 2022-11-22

はじめに

Livebook でデータ分析したい!

データの傾向を見るために散布図が見たい!

ついでに回帰直線も見たい!

という人向けの記事です

動作環境

以下のリポジトリーのコンテナ上で Livebook を動かしています

セットアップ

Livebook でグラフを扱うため、 Kino.VegaLite をインストールします

Mix.install([
  {:kino_vega_lite, "~> 0.1"}
])

エイリアスをつけます

alias VegaLite, as: Vl

データの準備

可視化したいデータを用意します

本記事では、以下のようなデータを使います

x = [1, 2, 3, 4, 5, 6, 7]
y = [0.9, 1.8, 3.3, 3.7, 4.5, 6.1, 7.2]

散布図の表示

xy の散布図は以下の様にして表示します

# グラフのサイズを指定
Vl.new(width: 300, height: 300)
# データを x と y から取得する
|> Vl.data_from_values(x: x, y: y)
# x は連続する数値データで 0 から 8 の範囲を表示する
|> Vl.encode_field(:x, "x",
  type: :quantitative,
  scale: [domain: [0, 8]]
)
# y は連続する数値データで 0 から 8 の範囲を表示する
|> Vl.encode_field(:y, "y",
  type: :quantitative,
  scale: [domain: [0, 8]]
)
# 散布図を表示する
|> Vl.mark(:point)

スクリーンショット 2022-11-22 15.21.29.png

回帰直線の表示

x と y の線グラフは以下のようにして表示します

# グラフのサイズを指定
Vl.new(width: 300, height: 300)
# データを x と y から取得する
|> Vl.data_from_values(x: x, y: y)
# x は連続する数値データで 0 から 8 の範囲を表示する
|> Vl.encode_field(:x, "x",
  type: :quantitative,
  scale: [domain: [0, 8]]
)
# y は連続する数値データで 0 から 8 の範囲を表示する
|> Vl.encode_field(:y, "y",
  type: :quantitative,
  scale: [domain: [0, 8]]
)
# 線グラフを表示する
|> Vl.mark(:line)

スクリーンショット 2022-11-22 15.25.13.png

最後に Vl.transform(regression: "x", on: "y") を追加することで回帰直線になります

# グラフのサイズを指定
Vl.new(width: 300, height: 300)
# データを x と y から取得する
|> Vl.data_from_values(x: x, y: y)
# x は連続する数値データで 0 から 8 の範囲を表示する
|> Vl.encode_field(:x, "x",
  type: :quantitative,
  scale: [domain: [0, 8]]
)
# y は連続する数値データで 0 から 8 の範囲を表示する
|> Vl.encode_field(:y, "y",
  type: :quantitative,
  scale: [domain: [0, 8]]
)
# 線グラフを表示する
|> Vl.mark(:line)
# 回帰直線に変換する
|> Vl.transform(regression: "x", on: "y")

スクリーンショット 2022-11-22 15.25.34.png

散布図と回帰直線を重ねて表示する

複数のグラフを レイヤーとして重ねて表示することが可能です

共通部分はレイヤーの外、個別部分をレイヤーの中で定義します

# グラフのサイズを指定
Vl.new(width: 300, height: 300)
# データを x と y から取得する
|> Vl.data_from_values(x: x, y: y)
# x は連続する数値データで 0 から 8 の範囲を表示する
|> Vl.encode_field(:x, "x",
  type: :quantitative,
  scale: [domain: [0, 8]]
)
# y は連続する数値データで 0 から 8 の範囲を表示する
|> Vl.encode_field(:y, "y",
  type: :quantitative,
  scale: [domain: [0, 8]]
)
|> Vl.layers([
  # 散布図を表示する
  Vl.new()
  |> Vl.mark(:point),
  Vl.new()
  # 線グラフを表示する
  |> Vl.mark(:line)
  # 回帰直線に変換する
  |> Vl.transform(regression: "x", on: "y")
])

スクリーンショット 2022-11-22 15.29.29.png

まとめ

VegaLite は便利でキレイですね

17
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?