DSの仕事を小例で体験|データ・AI・4つの仕事を知る
このページはプロモーション(広告)を含みます。
データ・AI・4つの仕事を知る(初級・読む20分+演習30分)
この授業のゴール
- 売上を「来店者数×購入率×客単価」に分け、増減の内訳を計算できる
- 内訳の計算結果から、言えること・言えないことを分けて分析メモに書ける
- 内訳の順序によって寄与の大きさが変わることを数値で示し、報告に条件を添えられる
- 分析の次に確認すべき事項(定義・期間・原因の候補)を依頼者に提案できる
仕事でどう使うか
データサイエンティスト(DS)の中心的な成果物は、意思決定者が読める分析メモです。難しい手法より先に、「問いを1文にする」「指標を分ける」「言えることと言えないことを分ける」という基本動作が評価されます。
| 路線 | この授業の使いどころ |
|---|---|
| DS(データサイエンティスト) | 売上減少を要因に分解し、集客・転換・単価のどこに手を打つかを提案する(分析メモ) |
| ML(機械学習エンジニア) | 予測モデルの入力候補(来店者数・購入率など)を、分解で洗い出す |
| DX(DX推進・AI企画) | 会議で使うKPIを、分解して「誰が動かせる指標か」に結びつける |
| RS(研究者) | 全体の変化を要素に分けて、どの要素に仮説を立てるかを決める |
実際の職場では、DSという肩書でも、データ基盤の整備や業務の改善提案まで担当する人がいます。肩書だけで担当範囲を決めつけず、成果物と意思決定で仕事を捉えることがこの授業の姿勢です。
前提
- データ・情報・判断の区別 → データ・情報・判断の違い
- 分析と予測と生成の区別 → 分析と予測と生成の違い
- 割合とパーセントポイント、客単価などの割り算 → 比率・割合・パーセントポイント
- 単位の確認 → 単位と桁と丸め
Pythonでは、関数(def 名前(引数): で定義する、入力を受け取り結果を返すまとまり)を使います。引数と戻り値は本文で説明します。
身近な状況:「売上が下がった。何とかして」
雑貨店「ことり堂」(架空)の店長から、DS担当者に依頼が来ました。
「今月の売上が先月より下がった。原因を調べて、来週からの対策を決めたい。」
まず、売上の定義を依頼者と揃えます。ここでは「税込、暦月、返品差引後」と確認できたとします。次に、手元の表です。
| 項目 | 先月 | 今月 |
|---|---|---|
| 来店者数(人) | 1,000 | 800 |
| 購入率(購入者÷来店者) | 20.0% | 22.5% |
| 客単価(売上÷購入者、円/人) | 2,500 | 2,400 |
| 売上(円) | 500,000 | 432,000 |
売上は68,000円(13.6%)減りました。しかし「減った」という一言では、対策が決まりません。どの部分が減ったのかを分ける必要があります。DSの最初の仕事は、この分け方を決めることです。
直感的な説明:売上を3つの掛け算に分ける
売上は、次の3つの掛け算で表せます。
売上 = 来店者数 × 購入率 × 客単価
ことり堂の先月を代入します。来店者1,000人のうち20%の200人が購入し、1人あたり2,500円使ったので、$1000 \times 0.20 \times 2500 = 500{,}000$ 円です。
この形のよいところは、3つの要素が別の対策に結びつくことです。
| 要素 | 動かす施策の例 | 主に動かす人 |
|---|---|---|
| 来店者数 | チラシ、SNS、立地、営業時間 | 店長、販促担当 |
| 購入率 | 店内の見せ方、接客、品ぞろえ | 店長、売り場担当 |
| 客単価 | セット販売、価格帯、関連商品の提案 | 商品担当 |
売上が下がったとき、どの要素が下がったかが分かれば、手を打つ先が決まります。反対に、分けずに「売上を上げよう」と言うと、何もかもに少しずつ手を出して成果が見えなくなります。
正確な定義:要素分解と寄与(順次置換法)
記号を定義します。
- $V$:来店者数(人)。
- $r$:購入率(購入者数÷来店者数。0以上1以下の小数、単位なし)。
- $p$:客単価(円/人)。購入者1人あたりの売上。
- $S$:売上(円)。$S = V \times r \times p$。
- 添字0は先月、添字1は今月。
売上の変化 $\Delta S = S_1 - S_0$ を、3要素の寄与に分けます。ここでは順次置換法を使います。先月の値から出発して、要素を1つずつ今月の値に置き換え、そのたびの売上の変化を寄与とします。
$$\text{来店者数の寄与} = (V_1 - V_0)\, r_0\, p_0$$
$$\text{購入率の寄与} = V_1\, (r_1 - r_0)\, p_0$$
$$\text{客単価の寄与} = V_1\, r_1\, (p_1 - p_0)$$
この3つを足すと、必ず $\Delta S$ に一致します(途中の項が打ち消し合うため)。
ことり堂の数値を代入します。$V_0=1000$、$r_0=0.20$、$p_0=2500$、$V_1=800$、$r_1=0.225$、$p_1=2400$ です。
- 来店者数の寄与:$(800-1000) \times 0.20 \times 2500 = -100{,}000$ 円
- 購入率の寄与:$800 \times (0.225-0.20) \times 2500 = +50{,}000$ 円
- 客単価の寄与:$800 \times 0.225 \times (2400-2500) = -18{,}000$ 円
合計は $-100{,}000+50{,}000-18{,}000=-68{,}000$ 円で、実際の変化と一致します。
注意:この分解は「この順序で置き換えたときの寄与」です。順序を変えると数字が変わります(発展で確認します)。また、寄与の大きさは、原因の大きさを証明するものではありません。来店者数が減った理由は、この計算からは分かりません。
段階付き例題:分析メモを1枚書く
ステップ1:問いを1文にする。「今月の売上減(−68,000円)は、来店者数・購入率・客単価のどれが主因か。」
ステップ2:定義と範囲を書く。売上は税込、暦月、返品差引後。対象は店舗全体。チャネル別(店舗・オンライン)は今回の対象外。
ステップ3:分解を実行する。次のコードで、寄与を計算して全体と照合します。
def decompose(v0, r0, p0, v1, r1, p1):
# 売上 = 来店者数 v × 購入率 r × 客単価 p の変化を、順次置換法で3つの寄与に分ける
# 引数: v(人), r(0〜1の小数), p(円/人)。0が先月、1が今月
# 戻り値: (来店者数の寄与, 購入率の寄与, 客単価の寄与) 単位は円
effect_v = (v1 - v0) * r0 * p0
effect_r = v1 * (r1 - r0) * p0
effect_p = v1 * r1 * (p1 - p0)
return effect_v, effect_r, effect_p
ev, er, ep = decompose(1000, 0.20, 2500, 800, 0.225, 2400)
total = 800 * 0.225 * 2400 - 1000 * 0.20 * 2500
print("来店者数", round(ev), "購入率", round(er), "客単価", round(ep))
print("合計", round(ev + er + ep), "実際の変化", round(total))
出力は「来店者数 -100000 購入率 50000 客単価 -18000」「合計 -68000 実際の変化 -68000」です。
ステップ4:結果を読む。来店者数の減少が−100,000円と、全体の減少(−68,000円)より大きい。購入率の改善(+50,000円)が減少の一部を打ち消し、客単価の低下(−18,000円)が少し重なっている。
ステップ5:言えること/言えないこと。
| 言えること | 言えないこと |
|---|---|
| 売上減は、来店者数の減少が最大の要素である | 来店者数が減った原因(天候、競合、営業日数など) |
| 購入率は改善している | 購入率の改善が施策の成果かどうか |
| 客単価の低下は小さいが無視できない | 低下が値引き商品の増加によるものか |
ステップ6:次の確認と提案を書く。来店者数の減少の理由を調べるため、(a)営業日数と曜日の並び、(b)近隣の動き、(c)曜日別の来店者数を確認する。そのうえで、集客施策を小さく試す案を出す。費用と担当、確認指標(2週間後の来店者数)を添える。
操作して理解する:数字を変えて寄与の動きを見る
同じ decompose 関数に、別の値を入れて結果を予想してから確認します。まず、関数を使う前に結果を紙に書いてみてください。
def decompose(v0, r0, p0, v1, r1, p1):
return ((v1 - v0) * r0 * p0, v1 * (r1 - r0) * p0, v1 * r1 * (p1 - p0))
# (1) 来店者数だけ減る場合
print(decompose(1000, 0.20, 2500, 800, 0.20, 2500))
# (2) 購入率だけ下がる場合
print(decompose(1000, 0.20, 2500, 1000, 0.15, 2500))
# (3) すべて変わらない場合
print(decompose(1000, 0.20, 2500, 1000, 0.20, 2500))
# (4) 来店者数が減り、購入率と単価が上がる場合
print(decompose(1000, 0.20, 2500, 800, 0.25, 2600))
予想と答え:
- (1) 来店者数だけが変わる。寄与は $(-200) \times 0.2 \times 2500 = -100{,}000$ 円で、他は0。出力は
(-100000.0, 0.0, 0.0)。 - (2) 購入率だけが変わる。$1000 \times (-0.05) \times 2500 = -125{,}000$ 円。他は0。
- (3) すべて変わらない。3つとも0。
- (4) 来店者数 $-100{,}000$、購入率 $800 \times 0.05 \times 2500 = +100{,}000$、客単価 $800 \times 0.25 \times 100 = +20{,}000$。合計は+20,000円。来店者が減っても、売上が増えることがある。
発展的な問い:(4)で、売上は増えていますが、来店者数は20%減っています。このとき「売上が増えたから問題なし」でよいでしょうか。来店者数は将来の売上の土台です。短期の売上と、来店者数という先行指標は、別に見る必要があります。
発展:分解の順序で寄与が変わる
順次置換法は、要素を置き換える順序で寄与が変わります。ことり堂で、順序を「客単価 → 購入率 → 来店者数」に変えてみます。
v0, r0, p0 = 1000, 0.20, 2500
v1, r1, p1 = 800, 0.225, 2400
# 客単価 → 購入率 → 来店者数 の順に置き換える
s_a = v0 * r0 * p0 # 先月
s_b = v0 * r0 * p1 # 単価だけ今月
s_c = v0 * r1 * p1 # 単価と購入率が今月
s_d = v1 * r1 * p1 # すべて今月
print("客単価の寄与", round(s_b - s_a))
print("購入率の寄与", round(s_c - s_b))
print("来店者数の寄与", round(s_d - s_c))
出力は、客単価 −20,000、購入率 +60,000、来店者数 −108,000 です。本文の順序(−100,000、+50,000、−18,000)とは異なります。合計は、どちらも −68,000円です。
どちらが「正しい」わけではありません。要素が掛け算で結びついているため、同時に変わった分(たとえば来店者数の減少と購入率の上昇が重なる部分)をどちらの要素に割り当てるかで差が出ます。実務では、(1)順序を決めて資料に明記する、(2)順序を変えても結論(来店者数の減少が最大)が変わらないことを確認する、のどちらかを行います。ほかに、各要素の対数の変化で配分する方法もあります。いずれも「寄与」の定義であり、因果の大きさではありません。
もう1つの注意は、母集団の混合です。店舗とオンラインを合計した客単価と、別々の客単価では、構成比が変わると合計の値が動きます。合計だけで分解した結果が、チャネル別の結果と逆の傾向になることがあります(シンプソンのパラドックス)。チャネル別の確認は、演習で行います。
よくある失敗
失敗1:購入率を「購入件数÷来店者数」と取り違える
購入率の分子を、購入者数(人)ではなく購入件数(件)にすると、1人が複数回買ったとき、分子が増えて率が大きく見えます。
visitors = 800
buyers = 180 # 購入した人数(人)
orders = 216 # 購入件数(件)。1人が複数回買う場合がある
print("人ベース", buyers / visitors)
print("件ベース", orders / visitors)
出力は 0.225 と 0.27 です。同じ表なのに4.5ポイントも違います。「人」と「件」は別の単位です。
直し方:分析の最初に、分母と分子の単位(人か、件か)を書きます。「購入率=購入者数(人)÷来店者数(人)」のように、式で確定します。
失敗2:寄与の大きさを「原因の大きさ」として報告する
誤った報告:「来店者数が−100,000円の原因で、これは近くの競合店のせいです。」
分解から分かるのはどの要素が動いたかだけです。なぜ動いたかは、別の確認が必要です。たとえば、今月が先月より営業日が5日少なければ、来店者数が減るのは当然の結果かもしれません。
# 営業日数をそろえて比べる(1日あたりの来店者数)
v0, days0 = 1000, 25
v1, days1 = 800, 20
print("先月 1日あたり", v0 / days0, "人")
print("今月 1日あたり", v1 / days1, "人")
出力は 40.0 人と 40.0 人です。営業日数が違う場合、1日あたりでは来店者数は変わっていなかったことになります(この数値は説明のための仮の例です)。
直し方:分解の後に、期間・営業日数・曜日・イベントなどの条件をそろえて再確認し、原因の候補は「確認が必要な仮説」として書きます。
失敗3:購入率の分子と分母の期間がずれている
購入率は購入者数÷来店者数です。ここで、来店者数を「その月に来た延べ人数」、購入者数を「その月に購入した人数(来店は前月でもよい)」で数えると、率の意味が変わります。
# 同じ月の中で、来店と購入を結びつけた場合
visitors = 800
buyers_same_month = 180
# 購入者の中に、前月に来店して今月購入した人が20人含まれていた場合
buyers_with_prev = 180
buyers_matched = buyers_with_prev - 20
print("来店と同じ月の購入率", buyers_matched / visitors)
print("期間がずれた購入率", buyers_with_prev / visitors)
出力は 0.2 と 0.225 です。定義の期間が揃っていないために、率が2.5ポイント過大になります(仮の例)。
直し方:分母と分子は、同じ対象・同じ期間で数えます。結びつけられない場合は、その制約を分析メモの「限界」欄に書きます。
まとめ
- 売上は来店者数×購入率×客単価に分けられ、要素ごとに対策先が異なる。
- 順次置換法の寄与は、3つの合計が売上の変化に一致する。順序で値が変わるので、順序を明記する。
- 寄与は「どの要素が動いたか」を示す。「なぜ動いたか」は別の確認が必要。
- 購入率の分子・分母は、単位(人か件か)と期間を揃える。
- 分析メモは、問い・定義・結果・言えること・言えないこと・次の確認・提案をまとめた1枚にする。
用語
- 要素分解(decomposition)
全体の量を、掛け算や足し算で、より小さな要素に分けること。
- 寄与(contribution)
全体の変化のうち、ある要素の変化に割り当てられる部分。原因の大きさとは限らない。
- 客単価(average spend per buyer)
売上を購入者数で割った値。購入者1人あたりの売上(円/人)。
- 順次置換法(sequential substitution)
要素を1つずつ今月の値に置き換え、そのたびの変化を寄与とする分解法。順序によって寄与が変わる。
よくある質問
DSは、機械学習を使わない仕事もしますか?
多くのDSの日常は、集計・分解・可視化・報告です。機械学習は手段の一つです。問いに答えるのに必要な最小の手法を選ぶのが基本です。職場によっては機械学習の運用まで担当する人もいて、肩書で範囲は決まりません。
なぜ最初に売上の定義を揃えるのですか?
税込・税抜、返品、期間、計上日で数字が変わるためです。定義が揃っていないまま分析すると、会議で「その数字は何ですか」と議論が止まり、分析の価値が下がります。
寄与は順序で変わるのに、使ってよいのですか?
使えます。ただし、順序を明記し、結論が順序で変わらないことを確認します。要素の掛け算を足し算に直す別の方法(対数を使う方法)もあります。目的は正確な分割ではなく、対策先の優先順位をつけることです。
分解して原因が分かったら、次は何をしますか?
原因の候補(営業日数、天候、競合など)を仮説として挙げ、確認する方法を決めます。確認できたものから対策案を作り、費用・担当・期限・確認指標を付けて提案します。
売上が増えているのに、来店者数が減っているのは問題ですか?
短期の売上だけを見ると問題なく見えますが、来店者数は将来の売上の土台です。単価の引き上げで売上を保っている場合、客離れが進んでいる可能性があります。複数の指標を並べて見ます。
分析メモには何を書けばよいですか?
問い(1文)、定義と範囲、結果(表1つ)、言えること、言えないこと、次の確認、提案(費用・担当・期限・確認指標)です。1枚に収め、数字には単位と期間を付けます。
確認問題
問1 売上を「来店者数×購入率×客単価」に分けると、どんな利点があるか。
- ① 売上を必ず増やせる
- ② 原因が確定する
- ③ どの要素が動いたかが分かり、対策先を絞れる
- ④ 来店者数が不要になる
解答と解説
正解:③
要素ごとに対策が異なるので、動いた要素が分かれば手を打つ先を絞れます。
問2 ことり堂の数値で、来店者数の寄与が −100,000円だった。この結果から言えることはどれか。
- ① 来店者数の減少が、売上減の最大の要素である
- ② 競合店が来店者を奪った
- ③ 来店者数を増やせば必ず売上が戻る
- ④ 客単価は変わっていない
解答と解説
正解:①
寄与は、どの要素が動いたかを表すもので、原因の説明ではありません。
問3 分解で求めた3つの寄与の合計は、何と一致するはずか。
- ① 先月の売上
- ② 今月の売上
- ③ 客単価の変化
- ④ 売上の変化(今月−先月)
解答と解説
正解:④
順次置換法では、途中の項が打ち消し合い、寄与の合計は売上の変化に一致します。
問4 分解の順序を変えたら、各要素の寄与の値が変わった。どう扱うべきか。
- ① 計算ミスなので、やり直す
- ② 合計は変わらないので、順序を資料に明記し、結論が順序で変わらないか確認する
- ③ 一番大きい値を採用する
- ④ 分解は使えないので諦める
解答と解説
正解:②
要素が掛け算で結びつくため、同時に変わった分の割り当て方で差が出ます。順序の明記と、結論の頑健性の確認が基本です。
問5 購入率を「購入件数÷来店者数」で計算すると、何が起きるか。
- ① 購入率が小さくなる
- ② 何も変わらない
- ③ 1人が複数回購入すると、率が大きく見える
- ④ 来店者数が減る
解答と解説
正解:③
購入者数(人)と購入件数(件)は別の単位です。件数を使うと、リピート購入のぶん率が大きく見えます。
問6 チャネル別に見ると、店舗の減少が全体の減少の188%になった。この説明として正しいものはどれか。
- ① 計算が間違っている
- ② 全体は増えている
- ③ 店舗だけが原因で、他は関係ない
- ④ 他のチャネルの増加が、店舗の減少を一部打ち消しているため、100%を超える
解答と解説
正解:④
寄与に符号が混ざるときは、1つの寄与が全体の変化を超えることがあります。
次に学ぶこと
次は MLの仕事を小例で体験 で、機械学習(ML)の仕事を、翌週の需要予測の小例で体験します。分解で見つけた要素(来店者数など)は、予測の入力候補になります。数値の扱いに不安があれば 平均・合計・中央値を手計算 に戻ってください。
この授業の確認問題だけで習得とはしません。ON03 の総合テストと、自力課題で判定します。
キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。
アプリを無料で開く有料版と無料版の違い