比率・割合・パーセントポイント|表・単位・割合・グラフ

このページはプロモーション(広告)を含みます。

表・単位・割合・グラフ(初級・読む25分+演習30分)

この授業のゴール

仕事でどう使うか

「購入率が上がった」「解約率が下がった」は、仕事で最もよく使う報告です。しかし、分母の決め方と変化の表し方を誤ると、成果を過大にも過小にも伝えてしまいます。

路線 この授業の使いどころ
DS(データサイエンティスト) 購入率や解約率の分母(来訪者か会員か)を定義して分析する。店舗別の率を合算して全体の率を出す
ML(機械学習エンジニア) 正解率や適合率などの評価指標の分母を確認する。陽性が少ないデータで割合だけを見ると判断を誤る
DX(DX推進・AI企画) 施策前後のKPI(Key Performance Indicator:重要業績評価指標)変化を、パーセントポイントと相対変化で併記して報告する
RS(研究者) 実験群と対照群の割合を比べる。分母(被験者数)が違う群を、単純平均でまとめない

この授業は、仕事のあらゆる場面で出てくる「割合」を、正しい分母で計算し、正しい言葉で伝える練習です。

前提

この授業は、割り算と小数・パーセント表記を前提にします。

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つのことを確認します。

  1. 分子は何か:注目する部分(購入した人)。
  2. 分母は何か:その部分が起こりうる全体(来店した人)。
  3. 分母は人数か、件数か:同じ人が何度も購入することがあるため、人数と件数は別の数です。

割合の比較は、変化の「大きさ」にも2通りの見方があります。購入率が20%から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 です。

次の点を試してください。

発展:合算と層別で結論が逆になる(シンプソンのパラドックス)

グループ別の割合の大小と、合算した割合の大小が逆転することがあります。これをシンプソンのパラドックスと呼びます。

ある広告ページの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件には、同じ人の複数回の購入が含まれます。分子は人数、分母も人数に揃えます。件数を使いたいときは、「来店者あたり購入件数」と別の指標として名前を付けます。

まとめ

用語

割合(率)(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店舗全体の購入率として最も適切なのはどれか。

  1. ① 15%
  2. ② 約11.7%
  3. ③ 30%
  4. ④ 10%
解答と解説

正解:②

分子の合計28人を分母の合計240人で割った約11.7%が全体の率です。単純平均の15%は、人数の違いを無視しています。

問2 購入率が20%から25%になった。この変化を表す正しい説明はどれか。

  1. ① 25パーセントポイント上がった
  2. ② 5%下がった
  3. ③ 5%上がった(パーセントポイントのつもり)
  4. ④ 5パーセントポイント上がった。相対的には25%増えた
解答と解説

正解:④

割合どうしの差は5パーセントポイント。相対増加率は5÷20=25%です。

問3 来店者が0人の店の購入率の扱いとして正しいものはどれか。

  1. ① 定義できないものとして扱う
  2. ② 他の店と同じ率にする
  3. ③ 0%とする
  4. ④ 100%とする
解答と解説

正解:①

0÷0は定義できません。0%は「来店者がいて誰も買わなかった」ことを意味します。

問4 購入者8人が合計12件の注文をした店で、来店者が40人だった。「購入率」の正しい値はどれか。

  1. ① 30%
  2. ② 15%
  3. ③ 20%
  4. ④ 12%
解答と解説

正解:③

購入率は購入者数(人)÷来店者数(人)=8÷40=20%です。12÷40=30%は、件数を分子にした別の指標です。

問5 広告のA案がPC・スマホの両方でB案より購入率が高かったのに、合算ではB案の方が高かった。最も可能性の高い原因はどれか。

  1. ① 計算ミスだけが原因で、起こりえない
  2. ② デバイス別の訪問者の構成が案ごとに違っていた
  3. ③ パーセントポイントを使ったため
  4. ④ 購入率の定義が毎回変わったため
解答と解説

正解:②

購入率の高いデバイス(PC)の訪問者がB案に多く集まると、合算の率が構成の影響を受けて逆転します(シンプソンのパラドックス)。

問6 来店者の分母が違う3店舗の購入率を、全体の購入率として報告する方法のうち、最も適切なのはどれか。

  1. ① 最大の来店者数の店の率を選ぶ
  2. ② 3つの率を足して3で割る
  3. ③ 3つの率の中央の値を選ぶ
  4. ④ 3店舗の購入者数の合計を、来店者数の合計で割る
解答と解説

正解:④

分子と分母をそれぞれ合計して割れば、人数の重みが自然に反映されます。

次に学ぶこと

次は 平均・合計・中央値を手計算 で、平均・合計・中央値を手計算で求めます。ここで学んだ「重みを付けた平均」は、平均の授業でも出てきます。グラフでの割合の見せ方は 軸とグラフを読む で扱います。

この授業の確認問題だけで習得とはしません。ON04 の総合テストと自力課題で判定します。

キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。

アプリを無料で開く有料版と無料版の違い