指標と分析単位|課題設定・分析計画
このページはプロモーション(広告)を含みます。
課題設定・分析計画(初級・読む30分+演習35分)
この授業のゴール
- 指標を「名前・分子・分母・期間・対象と除外・分析単位・データの出どころ」で定義し、他の人が同じ数字を再計算できる形に書ける
- 分析単位(来店・顧客・店舗×日など)を変えると同じ名前の指標でも値が変わることを、小さな表で計算して示せる
- 複数のグループの率を合算するとき、率の単純平均ではなく分子の合計÷分母の合計で計算できる
- 分母が0の場合を0%ではなく算出不能(欠損)として扱い、変化をパーセントとパーセントポイントで区別して報告できる
仕事でどう使うか
L03で「工事の日は来店者が少ない」という証拠を作りました。この「来店者数」「購入率」といった数字を、誰が計算しても同じ値になるように定義するのがこの授業の内容です。定義が曖昧だと、同じ「購入率」でも人によって値が違い、会議が数字の食い違いの話で終わってしまいます。
| 路線 | この授業の使いどころ(成果物・意思決定) |
|---|---|
| DS(データサイエンティスト) | 分析計画書の指標定義欄を書き、SQLやPythonの集計がその定義どおりかを確認する |
| ML(機械学習エンジニア) | 予測の単位(顧客ごとか、注文ごとか、店舗×日か)と評価指標の分母を決める。単位を誤ると学習データと運用がずれる |
| DX(DX推進・AI企画) | ダッシュボードのKPI(Key Performance Indicator:重要業績評価指標)の定義書を作り、部署間で数字をそろえる |
| RS(研究者) | 観測の単位(個人・学校・地域)を明確にし、データの数え方と主張の対象をそろえる |
指標とKPIの体系的な設計は KPI・ファネル・コホート(有料版) で扱います。ここでは、分析の問いと仮説に必要な指標を1つずつ正確に定義することに集中します。
前提
次の考え方を使います。
- 1行の単位(その表の1行が何を表すか)→ 行と列と1行の単位
- 比率・割合・パーセントポイント → 比率・割合・パーセントポイント
- 測定単位と定義 → 測定単位と定義
- 仮説と証拠マトリクス → 仮説と必要証拠
- 0と欠損(NULL/NaN)の違い:0は「0という値を観測した」、欠損は「値がない・計算できない」。
Pythonの NaN(Not a Number:数値でない値)は、pandasで欠損や計算不能を表す特別な値です。平均を取るとき、pandas は NaN を自動的に除いて計算します。
身近な状況:同じ「購入率」なのに、本部と店で数字が違う
さくら雑貨の月例会議で、次のやり取りがありました。
本部:「駅前店の今月の購入率は43%でした。」
店長:「え? うちの集計では50%ですよ。」
調べてみると、2人は同じ記録から、違う数え方をしていました。今月の来店記録の一部(7回の来店、顧客4人)を見てみます。
| 来店 | 顧客 | 買ったか |
|---|---|---|
| 1 | c1 | 買った |
| 2 | c1 | 買わない |
| 3 | c2 | 買わない |
| 4 | c2 | 買わない |
| 5 | c3 | 買った |
| 6 | c3 | 買った |
| 7 | c4 | 買わない |
- 本部:1回の来店を単位に数えた。購入があった来店3回 ÷ 来店7回 = 約43%
- 店長:1人の顧客を単位に数えた。今月1回でも買った顧客2人(c1, c3)÷ 来店した顧客4人 = 50%
どちらも計算は正しく、どちらも「購入率」と呼んでいるのが問題です。分子と分母の「1つ」が何を指すか(分析単位)が違うと、同じ名前の指標でも値が変わります。
さらに、どちらが正しいかは問いによって決まります。L03の仮説「欠品で買えなかった」を調べるなら、来店1回ごとに欲しい物があったかが問題なので、来店単位が自然です。「月に1回は買ってくれる顧客を増やしたい」という判断なら、顧客単位が自然です。
直感的な説明:指標は「数え方の約束」、分析単位は「1つと数えるもの」
指標は、料理のレシピのようなものです。「塩少々」と書かれたレシピでは、人によって味が変わります。「塩小さじ1(5g)」と書けば、誰が作っても同じ味になります。
指標も同じで、「購入率」とだけ書くのは「塩少々」です。次の点まで書いて初めて、誰が計算しても同じ値になります。
- 何を1つと数えるか(来店1回か、顧客1人か、店舗の1日か)
- 分子は何を数えるか(購入があった来店。返品された購入は含めるか)
- 分母は何を数えるか(すべての来店。スタッフや業者の出入りは除くか)
- 期間はいつからいつまでか(暦月か、直近30日か)
そして、分析単位は判断の単位と合わせるのが原則です。チラシは地区ごとに配るので、チラシの効果を見るなら「地区×週」の単位で比べるのが自然です。来店1回ごとの単位で何万行も集めても、配った地区が2つしかなければ、比べられるのは実質2つです。データの行数が多いことと、比べられる単位の数が多いことは別のことです。
正確な定義:指標定義の7項目、率の合算、変化の表し方
指標(metric)とは、関心のある状態を数値で表すための計算方法の約束です。次の7項目で定義します。
| 項目 | 駅前店の「来店購入率」の例 |
|---|---|
| 名前 | 来店購入率 |
| 分子 | 購入(レシート発行)があった来店の数。後日の返品があっても数える |
| 分母 | 入口センサーで数えた来店の数。開店前・閉店後の出入りは除く |
| 期間 | 暦月(1日0時〜月末24時) |
| 対象と除外 | 駅前店の店舗売場のみ。催事売場とネット注文は除く |
| 分析単位 | 来店1回(1行=1回の来店) |
| データの出どころと責任者 | POSのレシート記録と入口センサー。店長 |
分析単位(unit of analysis)とは、分析で1つと数え、比較や集計の基本になる対象のことです。表の1行の単位(粒度)と一致することが多いですが、来店記録(1行=来店1回)を顧客単位に集計し直すように、分析の目的に合わせて変えることがあります。
率の合算:複数のグループの率を1つにまとめるときは、率の単純平均ではなく、分子の合計を分母の合計で割ります。
$$\text{全体の率} = \frac{\sum_{i} \text{分子}_i}{\sum_{i} \text{分母}_i}$$
ここで $i$ はグループ(店舗など)の番号です。例えば、駅前店が来店800回中160回購入(20%)、公園前店が来店200回中60回購入(30%)なら、
$$\frac{160 + 60}{800 + 200} = \frac{220}{1000} = 22\%$$
です。率の単純平均 $(20\% + 30\%) \div 2 = 25\%$ は、来店の少ない公園前店を駅前店と同じ重さで扱ってしまうため、全体の率としては誤りです。
変化の表し方:率が20%から22%に変わったとき、
- 差:$22 - 20 = 2$ パーセントポイント(%pt)
- 相対的な変化率:$22 \div 20 - 1 = 0.10$、つまり 10%増
「2%増えた」と書くと、どちらの意味か分からなくなります。報告では両者を区別して書きます。
分母が0の場合:休業日のように来店が0回の日の購入率は、$0 \div 0$ で計算できません。これを0%とすると「来た人が誰も買わなかった」という意味になり、事実と違います。算出不能(欠損)として扱い、平均などの計算から除きます。
段階付き例題:仮説ごとに指標と分析単位を決める
入力:L03で残った仮説と、L02の判断(来月チラシを配るか)。
| 仮説 | 調べたいこと |
|---|---|
| A:工事で来店が減った | 工事の日に来店が少ないか |
| X:欠品で買えなかった | 欠品の日に購入率が下がるか |
ステップ1:判断の単位を確認する。チラシは駅前店の商圏の地区ごとに、週単位で配ります。工事も日単位で行われます。
ステップ2:仮説ごとに分析単位を決める。
- 仮説A:工事は日ごとに有無が決まるので、店舗×日(1行=ある店舗のある1日)。
- 仮説X:欠品も日ごと(商品ごと)に起きるので、店舗×日。来店1回ごとのデータがあれば、来店単位でも見られる。
ステップ3:指標を7項目で定義する(仮説Aの例)。
| 項目 | 内容 |
|---|---|
| 名前 | 1日当たり来店者数 |
| 分子 | 入口センサーの入店カウント(スタッフ用入口は除く) |
| 分母 | なし(日ごとの件数。比べるときは営業日数で平均する) |
| 期間 | 先月1日〜今月末日 |
| 対象と除外 | 駅前店・公園前店。休業日・営業時間を短縮した日は除外 |
| 分析単位 | 店舗×日 |
| 出どころ・責任者 | 入口センサー。各店長 |
ステップ4:除外の影響を確認する。休業日を「来店0人」として平均に含めると、平均が不当に下がります。例えば営業日6日の来店合計が240人、休業日1日がある週では、休業日を除くと $240 \div 6 = 40$ 人、含めると $240 \div 7 \approx 34.3$ 人です。休業日は欠損(営業していない)であって、0人の営業日ではありません。
出力:仮説ごとに「指標名・7項目・分析単位」を書いた定義表。
意味:この定義表があると、別の担当者がSQLやPythonで集計しても同じ数字になり、L03の比較を誰でも再現できます。
操作して理解する:分析単位と合算方法を変えて値を比べる
次のコードは、冒頭の7回の来店記録から、来店単位と顧客単位の購入率を計算します。さらに、2店舗の率を合算する2つの方法を比べます。
import pandas as pd
# 1行 = 来店1回
visits = pd.DataFrame({
"customer": ["c1", "c1", "c2", "c2", "c3", "c3", "c4"],
"bought": [1, 0, 0, 0, 1, 1, 0], # 1=購入あり
})
visit_rate = visits["bought"].mean() # 来店単位
per_customer = visits.groupby("customer")["bought"].max() # 顧客ごとに「1回でも買ったか」
customer_rate = per_customer.mean() # 顧客単位
print(f"来店単位の購入率: {visit_rate:.1%}")
print(f"顧客単位の購入率: {customer_rate:.1%}")
# 1行 = 店舗の1か月
stores = pd.DataFrame({"store": ["駅前", "公園前"],
"visitors": [800, 200], "buyers": [160, 60]})
stores["rate"] = stores["buyers"] / stores["visitors"]
print(f"率の単純平均(誤り): {stores['rate'].mean():.1%}")
print(f"分子合計÷分母合計: {stores['buyers'].sum() / stores['visitors'].sum():.1%}")
出力:
来店単位の購入率: 42.9%
顧客単位の購入率: 50.0%
率の単純平均(誤り): 25.0%
分子合計÷分母合計: 22.0%
groupby("customer")["bought"].max() は、顧客ごとに bought の最大値を取る操作です。1回でも買っていれば1、一度も買っていなければ0になるので、「その月に1回でも買ったか」を表します。
試してほしい変更:
- 公園前店の
visitorsを 2000、buyersを 600 にする(率は30%のまま)。単純平均は25%のまま変わりませんが、合計からの率は $(160+600) \div (800+2000) \approx 27.1\%$ に上がります。来店の多い店舗の率に、全体の率が近づくことを確かめましょう。 - c4 の来店を1回追加して買ったことにする(
"c4"と1を追加)。来店単位は 4/8=50.0%、顧客単位は 3/4=75.0% になります。
発展:合算で傾向が逆転する場合と、分析単位の限界
合算で傾向が逆転する例(シンプソンのパラドックス):2つの店舗それぞれで「チラシを受け取った客の購入率の方が高い」のに、2店舗を合算すると「チラシを受け取った客の購入率の方が低い」と逆転することがあります。
| 店舗 | チラシあり(購入/来店) | チラシなし(購入/来店) |
|---|---|---|
| 駅前 | 30/100=30% | 200/800=25% |
| 公園前 | 72/900=8% | 6/100=6% |
| 合算 | 102/1000=10.2% | 206/900≈22.9% |
どちらの店舗でも「あり」の方が高いのに、合算すると、あり $(30+72) \div 1000 = 10.2\%$、なし $(200+6) \div 900 \approx 22.9\%$ で逆転します。原因は、チラシの多くが購入率の低い公園前店で配られたことです。合算した率を比べるときは、グループの構成が比較対象の間でそろっているかを確認します。
分析単位と主張の対象:店舗単位のデータで「来店者の多い店ほど購入率が低い」と分かっても、「1人の客は混んでいると買わない」とは言えません。店舗単位の関係を個人に当てはめる誤り(生態学的誤謬)です。主張したい対象(個人か店舗か)とデータの分析単位をそろえます。
比べられる単位の数:チラシを2地区で配り2地区で配らない比較では、来店記録が何万行あっても、実質的に比べているのは4地区です。地区ごとの違い(もともとの客層)が結果に大きく効くので、結論の確からしさは行数ではなく地区の数に左右されます。このような設計の考え方は 「実験の問いと割付」(有料版) で扱います。
よくある失敗
失敗1:率の単純平均を全体の率として報告する
誤った計算:
| 店舗 | 来店 | 購入 | 購入率 |
|---|---|---|---|
| 駅前 | 800 | 160 | 20% |
| 公園前 | 200 | 60 | 30% |
| 全体(誤り) | (20+30)÷2=25% | ||
| 全体(正しい) | 1,000 | 220 | 220÷1,000=22% |
なぜ誤りか:単純平均は、来店200回の公園前店を来店800回の駅前店と同じ重さで扱います。全体の来店1,000回のうち、実際に購入があったのは220回なので、全体の率は22%です。
直し方:率を合算するときは、各グループの分子と分母を合計してから割ります。各店舗の率を並べて見せたい場合は、店舗ごとの分母(来店数)も一緒に表示します。
失敗2:分母が0の日や休業日を0%として扱う
誤った計算:4日間の購入率を平均する。2日目は休業で来店0人。
| 日 | 来店 | 購入 | 購入率(誤り) | 購入率(正しい) |
|---|---|---|---|---|
| 1 | 50 | 10 | 20% | 20% |
| 2 | 0 | 0 | 0% | 算出不能(欠損) |
| 3 | 100 | 30 | 30% | 30% |
| 4 | 50 | 5 | 10% | 10% |
| 日別の平均 | (20+0+30+10)÷4=15% | (20+30+10)÷3=20% |
なぜ誤りか:休業日の0%は「来た客が誰も買わなかった」ことを意味してしまい、事実(客が来ていない)と違います。平均が5パーセントポイントも下がります。
直し方:分母が0の率は欠損(NaN)にし、平均から除きます。また、「日別の率の平均(20%)」と「期間全体の率」($45 \div 200 = 22.5\%$)も別の量です。どちらを使うかを定義書に書きます。
失敗3:パーセントとパーセントポイントを混同して効果を誇張する
誤った報告:「チラシを配った週は購入率が20%から22%に上がり、購入率が10%改善しました。」
なぜ誤りか:上昇幅は2パーセントポイントです。「10%改善」は相対的な変化率(22÷20−1)としては正しいのですが、聞き手の多くは「20%が30%になった」と受け取ります。
| 書き方 | 意味 | 誤解の危険 |
|---|---|---|
| 2パーセントポイント上昇 | 20%→22% | 少ない |
| 相対的に10%上昇 | 22÷20=1.10倍 | 「30%になった」と誤解されやすい |
| 「10%改善」とだけ書く | 不明 | 大きい |
直し方:率の変化は「20%→22%(+2ポイント、相対+10%)」のように、元の値・新しい値・差・相対変化をそろえて書きます。
まとめ
- 指標は、名前・分子・分母・期間・対象と除外・分析単位・データの出どころの7項目で定義する。
- 分析単位が違うと、同じ名前の指標でも値が変わる。分析単位は問いと判断の単位に合わせる。
- 率の合算は、分子の合計÷分母の合計。率の単純平均は全体の率ではない。構成の変化にも注意する。
- 分母が0の率は0%ではなく欠損。率の変化はパーセントポイントと相対変化を区別して書く。
用語
- 指標(metric)
関心のある状態を数値で表すための計算方法の約束。分子・分母・期間などで定義する。
- 分析単位(unit of analysis)
分析で1つと数え、比較や集計の基本にする対象(来店1回、顧客1人、店舗×日など)。
- パーセントポイント(percentage point)
割合どうしの差を表す単位。20%から22%への変化は2パーセントポイント。
- NaN(Not a Number)
数値でない値。pandasでは欠損や0÷0などの計算不能を表し、平均の計算からは除かれる。
- シンプソンのパラドックス(Simpson's paradox)
グループ別に見た傾向と、合算した傾向が逆になる現象。グループの構成の違いが原因で起きる。
よくある質問
なぜ指標をここまで細かく定義する必要があるのですか?
定義が曖昧だと、担当者ごとに違う数字が出て、会議が「どの数字が正しいか」の議論で終わるからです。7項目を書くと、別の人がSQLで集計しても同じ値になり、数字の信頼が生まれます。
分析単位と粒度は同じものですか?
粒度は「表の1行が何を表すか」というデータの性質、分析単位は「分析で1つと数えて比べる対象」という分析の選択です。来店記録(粒度=来店1回)を顧客ごとに集計して、顧客を分析単位にすることもあります。
日別の率の平均と、期間全体の率はどちらを使えばよいですか?
問いによります。「普段の1日の購入率」を知りたいなら日別の平均、「期間中の来店のうち何割が買ったか」なら期間全体の率です。来店の多い日の影響を反映したいなら期間全体の率が適します。どちらを使うかを定義書に書き、混ぜないようにします。
条件が変わって定義を変える必要が出たら?
例えばセンサーを交換したら、変更日、変更内容、新旧の値の対応(同じ期間を両方で計測した比較など)を記録します。変更前後の数字を何も注記せずに1本のグラフにつなぐと、計測の変化を店の変化と誤解します。
合算の率が上がっていれば、全店で改善したと言えますか?
言えません。guided の例のように、各店の率が下がっていても、率の高い店の比重が増えると合算の率は上がります。合算の値と一緒に、グループ別の値と構成(来店の内訳)を確認します。
仕事でどの指標を主に見るかは、どう決めますか?
L02の判断基準とつながる指標を主に見ます。チラシの判断なら来店数(地区×週)が主で、購入率や1人当たり売上は、チラシ目当ての客が買わないなどの副作用を見張る指標として添えます。主な指標と見張りの指標の組み立ては 「KPIと指標ツリー」(有料版) で扱います。
確認問題
問1 本部は「購入のあった来店÷全来店」、店長は「1回でも買った顧客÷来店した顧客」で購入率を計算し、値が違った。根本的な原因はどれか。
- ① どちらかの計算ミス
- ② 分析単位(来店か顧客か)が違う
- ③ データが壊れている
- ④ 期間が違う
解答と解説
正解:②
分子と分母の「1つ」が来店か顧客かで違うため、同じ名前の指標でも値が変わります。定義書で分析単位を明記します。
問2 駅前店(来店800・購入160)と公園前店(来店200・購入60)の合算の購入率はどれか。
- ① 25%
- ② 20%
- ③ 30%
- ④ 22%
解答と解説
正解:④
(160+60)÷(800+200)=22%。率の単純平均25%は、来店数の違いを無視しています。
問3 休業日(来店0人)の購入率の扱いとして正しいのはどれか。
- ① 0%とする
- ② 100%とする
- ③ 算出不能(欠損)として平均から除く
- ④ 前日の値で埋める
解答と解説
正解:③
0÷0は計算できません。0%にすると「来た客が誰も買わなかった」という事実と違う意味になります。
問4 購入率が20%から22%になった。正しい報告はどれか。
- ① 20%→22%(+2ポイント、相対+10%)
- ② 2%改善した
- ③ 22%改善した
- ④ 10ポイント改善した
解答と解説
正解:①
差は2パーセントポイント、相対変化は22÷20−1=10%です。元の値と新しい値も添えて区別して書きます。
問5 チラシの効果を調べたい。チラシは地区ごとに配る。分析単位として最も自然なのはどれか。
- ① 来店1回
- ② 商品1点
- ③ 地区×週
- ④ レシートの1行
解答と解説
正解:③
施策が割り当てられる単位(地区)と時間の単位(週)に合わせると、判断と比較がそろいます。来店単位で行数を増やしても、比べられる地区の数は増えません。
問6 指標の定義書に書く7項目に含まれないものはどれか。
- ① 分子と分母
- ② 期間と対象・除外
- ③ 分析単位とデータの出どころ
- ④ 望ましい分析結果
解答と解説
正解:④
定義書は計算方法の約束で、望ましい結果は含めません。結果を先に決めると、定義を結果に合わせて動かす危険があります。
次に学ぶこと
次は 分析計画と制約 で、ここまでの問い・判断・仮説・指標を、担当・期限・制約を含む分析計画書にまとめます。
指標の体系(KPIツリー、定義書の運用)は 「KPIと指標ツリー」(有料版) と 「指標の定義書」(有料版) で、SQLでの集計は 集計・GROUP BY・HAVING(有料版) で扱います。割合とパーセントポイントの基本は 比率・割合・パーセントポイント に戻って確認できます。
キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。
アプリを無料で開く有料版と無料版の違い