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

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

言語 JA

注目期間をハイライトする

中級

06.4.6

注目期間をハイライトする

最終更新 2020-04-08 読了時間 2 分
まとめ
注目期間のハイライトは、通常の折れ線の背景に ax.axvspan(start, end) で縦の帯を塗り、「この区間で何が起きたか」を線と同じ図の中で示す手法です。帯は alpha=0.2 程度の淡い色にして、折れ線より手前に出ないようにします。この章では 2024 年 4 月の 30 日分の日次セッション数に、4 月 10 日から 18 日のキャンペーン期間を黄色の帯で重ねます。読み終えると、日付軸の図に pd.Timestamp で区間を指定する方法と、帯を 1〜2 本に絞る理由、帯の色を線と離す理由が分かります。

先に 複数ラインの推移比較 で ax.plot の基本を見ておくと、ここで足すのが背景の帯 1 本だけだと分かります。

直感 #

日次のセッション数を 30 日ぶん折れ線にすると、4 月中旬に山があるのは見えても、それが「キャンペーンを打った期間」と一致しているかどうかは、日付を数えなければ分かりません。そこで 4 月 10 日から 18 日の背景だけを淡い黄色で塗ります。線は何も変えていないのに、「帯の中で線が上がり、帯を出ると下がる」という対応が一目で読めるようになります。帯は説明のための背景なので、alpha=0.2 程度に抑えて線より目立たせないのが鉄則です。

何が起きているか(ステップで見る) #

コードを読む前に、この手法が図の上で何をしているかを追ってみましょう。「再生」を押すか、スライダーを動かすと 1 手順ずつ進みます。

見るポイント:折れ線でも軸の始点で印象が変わる。傾向を見たいなら移動平均を重ね、元データは薄く残す。

Python で描く #

次のコードは、2024 年 4 月 1 日から 30 日分の日付を pd.date_range で作り、平均 500 のポアソン乱数に 0 から 80 への上昇トレンドを足したセッション数を折れ線にします。その上で pd.Timestamp で区切った 4 月 10 日から 18 日の区間を ax.axvspan で塗っています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

dates = pd.date_range("2024-04-01", periods=30, freq="D")
sessions = np.random.poisson(lam=500, size=len(dates)) + np.linspace(0, 80, len(dates))

fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(dates, sessions, color="#6366f1", linewidth=2)

campaign_start = pd.Timestamp("2024-04-10")
campaign_end = pd.Timestamp("2024-04-18")
ax.axvspan(campaign_start, campaign_end, color="#fbbf24", alpha=0.2, label="キャンペーン")

ax.set_ylabel("セッション数")
ax.set_title("日次セッションとキャンペーン期間")
ax.legend(loc="upper left")
ax.grid(alpha=0.3)

fig.tight_layout()

plt.show()

大型キャンペーン期間などに便利ですの図

実行結果の読み方 #

紫の線は 500 前後で揺れながら 30 日かけて 80 ほど上がり、黄色の帯が 4 月 10 日から 18 日の 9 日間を示します。この例のデータはキャンペーンの効果を含めずに作っているので、帯の中で線が特別に跳ねるわけではありません。実データで同じ図を描いたとき、帯の中だけ線が上に外れていればキャンペーンの効果、帯を出ても高いままなら効果の持続、帯の中でも変化がなければ効果なし、と読み分けます。

使いどころと落とし穴 #

この手法が向くのは、キャンペーン期間や繁忙期、システム障害の期間のように「開始日と終了日が決まっている出来事」と折れ線の動きを対応させたい場面です。効果を数値で比べたいなら axvspan の図だけでは足りません。帯の中と外の平均を sessions[mask].mean() で計算して本文に書くか、ダイバージングバーで差を描きます。落とし穴の 1 つ目は帯の本数です。3 本も 4 本も塗るとどこが重要か分からなくなるため、本当に見せたい 1〜2 区間に絞ります。2 つ目は色で、線と同じ紫系で帯を塗ると区間の境界が線に溶けるので、線と色相の離れた淡い色を alpha 0.2 前後で使います。帯に ax.annotate でイベント名を添えておくと、図がそのまま分析メモになります。