比率・割合・パーセントポイント|表・単位・割合・グラフ
このページはプロモーション(広告)を含みます。
表・単位・割合・グラフ(初級・読む25分+演習30分)
この授業のゴール
- 割合を「分子÷分母」で計算し、分母を文章で定義して書ける
- 複数の店舗や期間の割合を、単純平均ではなく合算(加重平均)で求められる
- パーセントポイントと相対増加率(%)を区別して計算できる
- 分母が0の場合を「0%」ではなく「定義できない」として扱える
仕事でどう使うか
「購入率が上がった」「解約率が下がった」は、仕事で最もよく使う報告です。しかし、分母の決め方と変化の表し方を誤ると、成果を過大にも過小にも伝えてしまいます。
| 路線 | この授業の使いどころ |
|---|---|
| DS(データサイエンティスト) | 購入率や解約率の分母(来訪者か会員か)を定義して分析する。店舗別の率を合算して全体の率を出す |
| ML(機械学習エンジニア) | 正解率や適合率などの評価指標の分母を確認する。陽性が少ないデータで割合だけを見ると判断を誤る |
| DX(DX推進・AI企画) | 施策前後のKPI(Key Performance Indicator:重要業績評価指標)変化を、パーセントポイントと相対変化で併記して報告する |
| RS(研究者) | 実験群と対照群の割合を比べる。分母(被験者数)が違う群を、単純平均でまとめない |
この授業は、仕事のあらゆる場面で出てくる「割合」を、正しい分母で計算し、正しい言葉で伝える練習です。
前提
この授業は、割り算と小数・パーセント表記を前提にします。
- 1行の単位と、人数と件数の違い → 行と列と1行の単位
- 欠損と0の違い → 数値・カテゴリ・日時・欠損
- 単位を揃えて、最後に丸める → 単位と桁と丸め
- 分数・小数・比の基本 → 分数と小数と比
SQLで率を出す方法は 「分母をそろえた率」(有料版) にあります。この授業では電卓と画面内のPythonで計算します。
身近な状況:2店舗の購入率を平均すると?
ある会社が、2つの店舗で同じ日にキャンペーンを行いました。
| 店舗 | 来店者数(人) | 購入者数(人) |
|---|---|---|
| A店 | 40 | 8 |
| B店 | 200 | 20 |
A店の購入率は 8 ÷ 40 = 20%、B店は 20 ÷ 200 = 10% です。担当者は「2店舗の平均は (20% + 10%) ÷ 2 = 15%」と報告しました。
ところが、全体で見ると来店者は 240人、購入者は 28人で、購入率は 28 ÷ 240 ≒ 11.7% です。15%と11.7%では、3.3ポイント以上の差があります。
なぜずれたのでしょう。B店は来店者が200人で、A店の5倍です。B店の10%は、A店の20%よりずっと多くの人に基づいた値です。単純平均では、40人の店と200人の店を同じ重みで扱ってしまいます。
全体の割合を出すときは、割合どうしを平均するのではなく、分子の合計を分母の合計で割ります。この授業では、この考え方を土台に、割合の変化の伝え方まで学びます。
直感的な説明:割合は「全体のうち、どれだけ」
割合は、全体(分母)のうち、注目する部分(分子)がどれだけを占めるかを表します。
教室に40人いて、8人が眼鏡をかけていれば、眼鏡の割合は 8 ÷ 40 = 0.2 です。これを100倍して「20%」と書くと読みやすくなります。パーセント(%)は、割合を100倍して表した書き方です。
割合を使うときに、3つのことを確認します。
- 分子は何か:注目する部分(購入した人)。
- 分母は何か:その部分が起こりうる全体(来店した人)。
- 分母は人数か、件数か:同じ人が何度も購入することがあるため、人数と件数は別の数です。
割合の比較は、変化の「大きさ」にも2通りの見方があります。購入率が20%から25%になったとき、
- 5ポイント上がった(足し算での差)
- 25%増えた(もとの20%に対して、1.25倍になった)
のどちらも正しいのですが、別のことを言っています。前者はパーセントポイント、後者は相対増加率です。混同すると、「25%上がった」と「5ポイント上がった」を取り違えます。
正確な定義:率・合算・パーセントポイント・相対変化
率(比率)は次の式で定義します。
$$r = \frac{x}{n}$$
ここで $x$ は分子(購入者数、人)、$n$ は分母(来店者数、人)、$r$ は率(0から1の値。単位なし)です。たとえばA店では $x=8$、$n=40$ なので $r = 8 \div 40 = 0.2$、つまり20%です。
複数のグループの合算率は、分子の合計を分母の合計で割ります。
$$r_{\text{全体}} = \frac{\sum_i x_i}{\sum_i n_i}$$
ここで $\sum_i$ は「すべてのグループ $i$ について足す」記号、$x_i$ はグループ $i$ の分子、$n_i$ はグループ $i$ の分母です。2店舗では $(8+20)/(40+200) = 28/240 \approx 0.1167$(11.7%)です。
これは、各グループの率 $r_i = x_i / n_i$ を、分母 $n_i$ で重み付けして平均した加重平均と同じ値です。
$$r_{\text{全体}} = \frac{\sum_i n_i r_i}{\sum_i n_i} = \frac{40 \times 0.2 + 200 \times 0.1}{240} = \frac{28}{240}$$
重みを付けない単純平均 $(0.2+0.1)/2 = 0.15$ とは異なります。
パーセントポイント(pp)は、2つの割合の引き算での差です。
$$\text{変化(pp)} = (r_{\text{後}} - r_{\text{前}}) \times 100$$
相対増加率は、もとの値に対する変化の比です。
$$\text{相対増加率} = \frac{r_{\text{後}} - r_{\text{前}}}{r_{\text{前}}} \times 100\ [\%]$$
20%から25%なら、変化は $25-20=5$ pp、相対増加率は $(25-20)/20 = 25\%$ です。
分母が0の場合:来店者が0人の店の購入率は $0 \div 0$ で、定義できません。0%ではありません。0%は「来店者がいて、誰も買わなかった」という意味だからです。
分母の定義を文章で書く習慣をつけます。例:「購入率 = 期間内に購入した人数 ÷ 期間内に来店した人数(ともに重複を除く)」。
段階付き例題:キャンペーン前後の購入率を報告する
問題:ある店の購入率が、施策前20%から施策後25%になった。報告用の文章に必要な数字を出す。
ステップ1:分子と分母を確認する。購入率 = 購入者数 ÷ 来店者数。前後で定義が同じことを確かめる。
ステップ2:パーセントポイントを求める。25 − 20 = 5 pp。
ステップ3:相対増加率を求める。(25 − 20) ÷ 20 = 0.25、つまり 25%。
ステップ4:倍率で確認する。25 ÷ 20 = 1.25倍。1.25倍は「25%増」と同じ意味。
ステップ5:報告文を書く。「購入率は20%から25%に上昇した(5パーセントポイント増、相対では25%増)。」
次に、2店舗の合算で確認します。buyers は購入者数、visitors は来店者数の整数のリストです。zip は2つのリストを同時に取り出す関数、sum は合計を返す関数です。
visitors = [40, 200]
buyers = [8, 20]
rates = [b / v for b, v in zip(buyers, visitors)]
print('店舗別の率', rates)
print('単純平均', sum(rates) / len(rates))
print('合算(分子の合計÷分母の合計)', sum(buyers) / sum(visitors))
before, after = 0.20, 0.25
print('変化(pp)', round((after - before) * 100, 1))
print('相対増加率(%)', round((after - before) / before * 100, 1))
出力は、店舗別の率 [0.2, 0.1]、単純平均 0.15、合算 0.11666666666666667、変化 5.0、相対増加率 25.0 です。
ステップ6:結果を読む。2店舗全体の購入率は約11.7%、単純平均の15%は誤りです。施策の効果は「5ポイント」と「25%」の両方を書くと、読み手が誤解しません。
操作して理解する:分母が0の店を含めて計算する
開店初日で来店者が0人だったC店を加えます。このとき率をどう扱うかを確かめます。
関数 rate(buyers, visitors) は、購入者数と来店者数(ともに整数)を受け取り、率(小数)または None(定義できない)を返します。if visitors == 0: は、来店者が0かを調べる条件です。
def rate(buyers, visitors):
if visitors == 0:
return None
return buyers / visitors
stores = {'A': (8, 40), 'B': (20, 200), 'C': (0, 0)}
for name, (b, v) in stores.items():
print(name, rate(b, v))
defined = [rate(b, v) for b, v in stores.values() if v > 0]
print('定義できる店の単純平均', sum(defined) / len(defined))
total_b = sum(b for b, v in stores.values())
total_v = sum(v for b, v in stores.values())
print('合算', total_b / total_v)
出力は、A 0.2、B 0.1、C None、単純平均 0.15、合算 0.11666666666666667 です。
次の点を試してください。
rate(0, 0)を0を返すように書き換えると、C店が「購入率0%の店」に見えます。来店者がいない店と、来店者がいて誰も買わなかった店は別物です。- 合算では、C店の0人が分母にも分子にも入るので、結果は変わりません。合算の式は、分母が0の店があっても安全です。
storesのC店を(0, 30)に変えると、C店の率は0.0(0%)になります。これは「30人来て、誰も買わなかった」ことを意味します。
発展:合算と層別で結論が逆になる(シンプソンのパラドックス)
グループ別の割合の大小と、合算した割合の大小が逆転することがあります。これをシンプソンのパラドックスと呼びます。
ある広告ページの2つのデザイン(A案、B案)を、デバイス別に比べた架空の数字です。購入率は購入者数÷訪問者数です。
| デバイス | A案(購入/訪問) | A案の率 | B案(購入/訪問) | B案の率 |
|---|---|---|---|---|
| PC | 30 / 100 | 30% | 100 / 400 | 25% |
| スマホ | 40 / 400 | 10% | 5 / 100 | 5% |
| 合計 | 70 / 500 | 14% | 105 / 500 | 21% |
PCでもスマホでもA案が勝っていますが、合計ではB案が勝って見えます。原因は、B案がもともと購入率の高いPC利用者に多く配信され(400人)、A案はスマホ利用者に多く配信された(400人)という、訪問者の構成の違いです。
この例が教えることは、(1) 合算の割合は、構成の影響を受ける、(2) 割合の比較では、分母の内訳(誰が分母に入っているか)を確認する、ということです。実務では、A/Bテストでユーザーが無作為に割り当てられているかを確認し、必要なら層(デバイスなど)ごとに比べます。層別の考え方は 層別と集計の罠 でも扱います。
よくある失敗
失敗1:店舗ごとの率を単純平均して全体の率にする
誤った例:A店20%とB店10%の平均15%を全体の購入率として報告する。
a_b, a_v = 8, 40
b_b, b_v = 20, 200
print('誤:単純平均', (a_b / a_v + b_b / b_v) / 2)
print('正:合算', (a_b + b_b) / (a_v + b_v))
単純平均は0.15、正しい合算は約0.1167です。分母の大きさが違う2つの割合を、同じ重みで平均したのが誤りです。直し方:分子の合計を分母の合計で割る。店舗別の率は参考として併記する。
失敗2:パーセントポイントと相対増加率を取り違える
誤った例:購入率が20%から25%になったとき、「25%上がった」とだけ書く。
before, after = 20, 25
print('変化(pp)', after - before)
print('相対増加率(%)', (after - before) / before * 100)
出力は 5 と 25.0 です。「25%上がった」は相対増加率の意味ですが、読み手は「20%が45%になった」と受け取るかもしれません。逆に、「5%上がった」と書くと、20%が21%になったと読まれます。直し方:割合の変化は「5パーセントポイント」と書き、相対的な変化を示すときは「もとの1.25倍(25%増)」と明記する。
失敗3:来店者0人の店の率を0%として扱う
誤った例:来店者0人の店の購入率を0%として、平均に入れる。
rates_wrong = [0.20, 0.10, 0.0] # C店(来店0人)を0%とした
print('誤:C店を0%として単純平均', sum(rates_wrong) / len(rates_wrong))
print('正:C店は定義できないので除く、または合算で計算', 28 / 240)
誤った平均は約0.1、正しい合算は約0.1167です。C店は「買う人がゼロだった」のではなく、「そもそも来店者がいなかった」ので、購入率は定義できません。直し方:分母が0の行は欠損(定義できない)として扱い、合算の式で全体の率を出す。
失敗4:購入件数を来店者数で割って「購入率」にする
誤った例:購入者8人が合計12件の注文をした。購入率を 12 ÷ 40 とする。
visitors = 40
buyers = 8
orders = 12
print('誤:件数÷来店者(購入率ではない)', orders / visitors)
print('正:購入者÷来店者(購入率)', buyers / visitors)
print('1購入者あたりの件数', orders / buyers)
誤った値は0.30、正しい購入率は0.20です。12件には、同じ人の複数回の購入が含まれます。分子は人数、分母も人数に揃えます。件数を使いたいときは、「来店者あたり購入件数」と別の指標として名前を付けます。
まとめ
- 割合は分子÷分母。分母が何の人数・件数かを文章で定義する。
- 複数グループの全体の率は、分子の合計÷分母の合計。割合の単純平均は誤りになりやすい。
- 割合どうしの差はパーセントポイント、もとに対する比は相対増加率。両方を区別して書く。
- 分母が0の率は0%ではなく定義できない。人数と件数も混ぜない。
用語
- 割合(率)(ratio / rate)
分子を分母で割った値。分母は注目する全体を表す。
- パーセントポイント(percentage point)
2つの割合の差を表す単位。20%から25%への変化は5パーセントポイント。
- 相対増加率(relative increase)
変化の大きさをもとの値で割った割合。20%から25%への相対増加率は25%。
- 加重平均(weighted average)
各値に重み(分母の大きさなど)を掛けて求める平均。合算した率は、分母を重みにした加重平均と等しい。
- シンプソンのパラドックス(Simpson's paradox)
グループ別に見ると成り立つ大小関係が、合算すると逆になる現象。グループの構成の違いが原因。
よくある質問
なぜ分母を文章で定義する必要があるのですか。
同じ「購入率」でも、来店者を分母にする人と、会員数を分母にする人で値が変わるからです。定義を書いておけば、他の人が同じ数字を再現でき、期間を変えても比較できます。
パーセントポイントと相対増加率は、どう使い分けますか。
割合の水準が重要なときはパーセントポイントを使います。変化の勢いを示したいときは相対増加率を使います。迷ったら両方を書きます。たとえば0.1%から0.2%への変化は、0.1pp増でも相対では2倍です。
割合の平均を取ってよいのは、どんなときですか。
各グループの分母がほぼ同じとき、または各グループを同じ重みで評価したいときです。たとえば「店舗の平均的な成績」を店舗ごとに等しく見たい場合は、単純平均が目的に合います。ただし、その場合は「店舗平均」と呼び、全体の購入率とは区別します。
分子が0の割合は、何を意味しますか。
分母が正であれば、0%は「起こった件数が0」という意味の本物の値です。分母が0の場合は、定義できない欠損として扱います。
率が100%を超えることはありますか。
分子が分母の一部ならば、100%を超えません。ただし、分母と分子の対象が違うと超えます。たとえば購入件数÷来店者数は、1人が複数回買えば100%を超えることがあります。超えたら、分母と分子の定義を見直します。
サンプルが少ないとき、率はどう読むべきですか。
A店の「40人中8人」のように分母が小さい率は、1人の違いで大きく変わります。8人が9人になれば22.5%です。分母が小さい率は、人数も併記して慎重に比べます。
確認問題
問1 A店の購入率が20%(40人中8人)、B店が10%(200人中20人)のとき、2店舗全体の購入率として最も適切なのはどれか。
- ① 15%
- ② 約11.7%
- ③ 30%
- ④ 10%
解答と解説
正解:②
分子の合計28人を分母の合計240人で割った約11.7%が全体の率です。単純平均の15%は、人数の違いを無視しています。
問2 購入率が20%から25%になった。この変化を表す正しい説明はどれか。
- ① 25パーセントポイント上がった
- ② 5%下がった
- ③ 5%上がった(パーセントポイントのつもり)
- ④ 5パーセントポイント上がった。相対的には25%増えた
解答と解説
正解:④
割合どうしの差は5パーセントポイント。相対増加率は5÷20=25%です。
問3 来店者が0人の店の購入率の扱いとして正しいものはどれか。
- ① 定義できないものとして扱う
- ② 他の店と同じ率にする
- ③ 0%とする
- ④ 100%とする
解答と解説
正解:①
0÷0は定義できません。0%は「来店者がいて誰も買わなかった」ことを意味します。
問4 購入者8人が合計12件の注文をした店で、来店者が40人だった。「購入率」の正しい値はどれか。
- ① 30%
- ② 15%
- ③ 20%
- ④ 12%
解答と解説
正解:③
購入率は購入者数(人)÷来店者数(人)=8÷40=20%です。12÷40=30%は、件数を分子にした別の指標です。
問5 広告のA案がPC・スマホの両方でB案より購入率が高かったのに、合算ではB案の方が高かった。最も可能性の高い原因はどれか。
- ① 計算ミスだけが原因で、起こりえない
- ② デバイス別の訪問者の構成が案ごとに違っていた
- ③ パーセントポイントを使ったため
- ④ 購入率の定義が毎回変わったため
解答と解説
正解:②
購入率の高いデバイス(PC)の訪問者がB案に多く集まると、合算の率が構成の影響を受けて逆転します(シンプソンのパラドックス)。
問6 来店者の分母が違う3店舗の購入率を、全体の購入率として報告する方法のうち、最も適切なのはどれか。
- ① 最大の来店者数の店の率を選ぶ
- ② 3つの率を足して3で割る
- ③ 3つの率の中央の値を選ぶ
- ④ 3店舗の購入者数の合計を、来店者数の合計で割る
解答と解説
正解:④
分子と分母をそれぞれ合計して割れば、人数の重みが自然に反映されます。
次に学ぶこと
次は 平均・合計・中央値を手計算 で、平均・合計・中央値を手計算で求めます。ここで学んだ「重みを付けた平均」は、平均の授業でも出てきます。グラフでの割合の見せ方は 軸とグラフを読む で扱います。
この授業の確認問題だけで習得とはしません。ON04 の総合テストと自力課題で判定します。
キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。
アプリを無料で開く有料版と無料版の違い