K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

バーコードタイムラインで頻度を瞬時に把握

中級

06.7.16

バーコードタイムラインで頻度を瞬時に把握

最終更新 2020-08-26 読了時間 2 分
まとめ
バーコードタイムラインは、イベントが起きた日付だけを 1 本ずつの縦線で描き、線の密度で「いつ集中して起きたか」を見せる図です。値の大きさは捨てて発生の有無だけを残すので、アラートやデプロイ、障害の記録のように「件数より時期の偏り」が重要なデータに向いています。描画は ax.vlines(dates, ymin=0, ymax=1) の 1 行で済み、Y 軸の目盛りと枠線を消すことで細長いバーコードの見た目になります。読み終えると、15 件のアラート日付から 2 月と 3 月の集中を読み取り、線幅 linewidth や期間の切り方を自分のログデータに合わせて調整できるようになります。

直感 #

サーバーの重要アラートが 1 月から 5 月までに 15 回鳴ったとします。日付を表に並べても「2 月上旬と 3 月上旬に固まっている」とは気づきにくいものです。そこで日付を時間軸に置き、1 件を 1 本の縦線に変えます。線が詰まって黒く見える区間が集中期間、白く空く区間が静かな期間になり、バーコードを眺めるだけで偏りが読めます。棒グラフのように件数を集計しないので、1 日に 2 件起きた日も線が重なって 1 本に見える点だけは覚えておく必要があります。

Python で描く #

次のコードは、15 件のアラート発生日を pd.to_datetime で日付型に変換し、ax.vlines で高さ 1 の縦線として並べます。図の高さを 1.8 インチに抑え、左右の枠線と Y 軸目盛りを消して「線の並び」だけが目に入るようにしています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import pandas as pd
import matplotlib.pyplot as plt

dates = pd.to_datetime(
    [
        "2024-01-05",
        "2024-01-08",
        "2024-01-12",
        "2024-01-20",
        "2024-02-02",
        "2024-02-07",
        "2024-02-08",
        "2024-02-17",
        "2024-03-01",
        "2024-03-09",
        "2024-03-10",
        "2024-03-24",
        "2024-04-02",
        "2024-04-18",
        "2024-05-01",
    ]
)

fig, ax = plt.subplots(figsize=(6.4, 1.8))
ax.vlines(dates, ymin=0, ymax=1, color="#0f172a", linewidth=2)
ax.set_ylim(0, 1)
ax.set_yticks([])
ax.set_title("重要アラート発生日のバーコードタイムライン")
ax.set_xlabel("日付")
ax.set_xlim(dates.min() - pd.Timedelta(days=3), dates.max() + pd.Timedelta(days=3))

ax.tick_params(axis="x", rotation=45)
ax.spines[["left", "top", "right"]].set_visible(False)

fig.tight_layout()

plt.show()

期間の偏りや集中がひと目で分かりますの図

実行結果の読み方 #

線が詰まっている区間がイベントの集中期間です。この例では 2 月 7 日と 8 日が隣り合い、3 月 9 日と 10 日も隣り合うので、月初めに連続して鳴る傾向が見えます。4 月以降は線が 2 本しかなく、間隔も 2 週間以上空いているので落ち着いた時期と読めます。線の色や高さを変えればアラートの種類を区別できますが、まず 1 色で密度を読むのが基本です。

使いどころと落とし穴 #

バーコードタイムラインが向くのは、イベント数が十数件から数百件で、発生時期の偏りを伝えたいときです。1 日に数十件も起きるようなログでは線が塗りつぶされて黒い帯になるので、その場合は週ごとに resample("W").count() で集計してヒストグラムか折れ線に切り替えます。線の太さは期間に合わせて決めるもので、4 か月に linewidth=2 が目安、1 年なら 1、2 週間なら 4 程度まで太くできます。種類の違うイベントを同じ色で重ねると区別がつかないので、color を種類ごとに変えるか、系列ごとに行を分けて plt.subplots(nrows=...) で積みます。