平均パーセント計算機
平均パーセント計算機は、単純平均と、グループの大きさが異なる場合の加重平均を求めます。パーセントの平均計算機としても使え、パーセントを足し合わせる方法やまとめる方法も、六つの例題で扱います。
例の値が入力されています。ご自身の値に置き換えてください。
平均パーセント
75%
計算過程
- 2個のパーセントの合計 = 150
- 150 ÷ 2 = 75%
- パーセントの合計
- 150
- パーセントの個数
- 2
80%、90%、70%、85%という四回のテストの得点の平均は81.25%です。しかし、大きさの異なる集団のパーセントは、単純に足して割ることはできません。50人から得た割合は、20人から得た割合より重く扱うべきだからです。
このオンラインの平均パーセント計算機にパーセントのリストを入力すると、単純平均が求まります。標本の大きさや配点など、それぞれの重みを加えると、加重平均が求まり、二つの値が違ってくる理由もわかります。下には公式、六つの例題、成長率の平均についての短い解説があります。
パーセントの平均の求め方
結論: パーセントを足して、その個数で割ります。パーセントが大きさの異なる集団から来ている場合は、それぞれに重みを掛けて足し、重みの合計で割ります。
パーセントの単純平均
- すべてのパーセントを足します。
- 合計をパーセントの個数で割ります。
- パーセント記号を付けます。
これが相加平均です。すべてのパーセントを同じ重要度で扱うため、それぞれが同じ大きさの集団から来ている場合に適しています。たとえば、同じ満点で採点された四回のテストです。重みを指定しなければ、上のパーセント平均の計算機はこの計算を行い、単純モードのどのパーセント平均計算機も同様です。
パーセントの加重平均
加重平均は、各パーセントにその重みを掛けたものの和を、重みの和で割った値です。
加重平均 = (p1 × w1 + p2 × w2 + ... + pn × wn) ÷ (w1 + w2 + ... + wn)ここで、pは各パーセント、wはその重みです。重みには、標本の大きさ、配点、成績に占める割合などを使えます。負でなければよく、重みの合計が100になる必要はありません。各パーセントがどれだけ効くかは、重みで決まります。
単純平均が間違いになるのは、このためです。50人の合格率90%は、20人の合格率60%よりも全体の数字を大きく動かすべきですが、単純平均では同じ影響力になります。もとになるグループの大きさが違うときは、上の計算機を加重モードに切り替えます。重み付きの割合の計算機としても、重みつきの平均パーセント計算機としても使えます。
加重平均を順を追って計算する方法
- 各パーセントに重みを掛けます。
- それらの積を足します。
- 重みを足します。
- 積の和を重みの和で割ります。
85%の平常点で重みが40、70%の試験で重みが60の場合を考えます。積は3,400と4,200で、合計は7,600です。重みの合計は100なので、平均は76%です。重みが標本の大きさのとき、各積はそのグループの成功数の100倍になります。そのため、合格率の加重平均は、合算した合格率と等しくなります。
パーセントを足し合わせる
パーセントを足し合わせられるかどうかは、全体によって決まります。足せるのは、同じ全体に対する割合どうしのときだけです。一つの市場で25%、30%、12%のシェアを合わせると、その市場の67%になります。異なる全体のパーセントを足しても意味はありません。20人の50%と80人の25%を合わせても、誰かの75%にはなりません。
異なるグループのパーセントをまとめるには、それぞれを個数に直し、個数を足して、合計で割ります。これは、グループの大きさを重みとする加重平均であり、全体のパーセントが求まります。下の例題4で確認できます。各パーセントにグループの大きさを重みとして入力すれば、上の計算機はパーセントをまとめる計算機として働きます。
複数の期間にわたる平均変化率
成長率には、別の平均が必要です。ある数値が10%上がってから10%下がる場合、単純平均は0%ですが、数値は最終的に最初の1.1 × 0.9 = 0.99になり、1%の減少です。実際の結果を再現する平均は、倍率の相乗平均です。
平均変化率 = ((1 + r1) × (1 + r2) × ... × (1 + rn))^(1/n) − 110%の上昇のあとに10%の下落となる場合は、0.99の平方根から1を引いた値で、期間あたり-0.50%です。二つの値の間の変化だけを求めるなら変化率計算機を、一回の上昇なら増加率計算機を使います。
ExcelとGoogle Sheetsでの平均パーセント
単純平均を求めるには、パーセントをA2:A5に入れて =AVERAGE(A2:A5) と入力します。加重平均を求めるには、パーセントをA2:A4、重みをB2:B4に入れて =SUMPRODUCT(A2:A4,B2:B4)/SUM(B2:B4) と入力します。ほかの数式はExcelのパーセントのガイドで扱っています。
誤差率の平均
平均誤差率は別の計算です。まず誤差率計算機で各誤差率を求め、その結果を上のように平均します。
丸めと結果の確認
丸めるのは最後の平均だけにします。すでに丸めた数値を平均すると、その丸め誤差が結果に引き継がれるので、できるかぎり正確な値を保ちます。必要でなければ、小数点以下は一桁か二桁で示します。計算機は、平均の横に合計と個数(または重みの合計)を表示するので、割り算を自分で確かめられます。
平均パーセントの例
例題1:四回のテストの得点
条件
答え
例題2:大きさの異なる集団
条件
答え
| グループ | 合格率 | 生徒数 | 合格者数 |
|---|---|---|---|
| A | 60% | 20 | 12 |
| B | 80% | 30 | 24 |
| C | 90% | 50 | 45 |
| 合計 | 81% | 100 | 81 |
例題3:重み付きの科目の成績
条件
答え
例題4:異なる全体のパーセント
条件
答え
例題5:平均成長率
条件
手順 1
単純平均は20%です。
答え
例題6:満点の異なる得点
条件
手順 1
75%と70%の単純平均は72.5%です。
答え
平均パーセントのコード
どちらのバージョンも上の例題(81.25、81、76、76.67、19.72)を再現し、数値以外の入力を拒否し、個数の合わない重みやすべてゼロの重みも受け付けません。
JavaScript
function finite(name, v) { if (typeof v !== "number" || !Number.isFinite(v)) throw new TypeError(`${name} must be a finite number`);}function places(decimals) { if (!Number.isInteger(decimals) || decimals < 0 || decimals > 10) throw new RangeError("decimals must be a whole number from 0 to 10"); return decimals;}function list(name, values) { if (!Array.isArray(values) || values.length < 1) throw new TypeError(`${name} must be a non-empty array of numbers`); values.forEach((v) => finite(name, v));}// Simple average: [80, 90, 70, 85] -> 81.25export function averagePercent(values, decimals = 2) { list("values", values); const d = places(decimals); return Number((values.reduce((a, b) => a + b, 0) / values.length).toFixed(d));}// Weighted average: weights can be sample sizes, marks or any non-negative numbersexport function weightedAveragePercent(values, weights, decimals = 2) { list("values", values); list("weights", weights); if (values.length !== weights.length) throw new RangeError("values and weights must be the same length"); if (weights.some((w) => w < 0)) throw new RangeError("weights must not be negative"); const d = places(decimals); const total = weights.reduce((a, b) => a + b, 0); if (total === 0) throw new RangeError("the weights must not all be 0"); const sum = values.reduce((acc, v, i) => acc + v * weights[i], 0); return Number((sum / total).toFixed(d));}// Average percentage change per period over several periods (geometric mean)export function averageGrowth(ratesPercent, decimals = 2) { list("rates", ratesPercent); const d = places(decimals); let product = 1; for (const r of ratesPercent) { if (r <= -100) throw new RangeError("a rate of -100% or less cannot be averaged this way"); product *= 1 + r / 100; } return Number(((Math.pow(product, 1 / ratesPercent.length) - 1) * 100).toFixed(d));}Python
from decimal import Decimal, ROUND_HALF_UPfrom math import isfinitedef _num(name, v): if isinstance(v, bool) or not isinstance(v, (int, float, Decimal)) or not isfinite(float(v)): raise ValueError(f"{name} must be a finite number") return Decimal(str(v))def _round(x, decimals): if not isinstance(decimals, int) or isinstance(decimals, bool) or not 0 <= decimals <= 10: raise ValueError("decimals must be a whole number from 0 to 10") return x.quantize(Decimal(1).scaleb(-decimals), rounding=ROUND_HALF_UP)def _list(name, values): if not isinstance(values, (list, tuple)) or len(values) < 1: raise ValueError(f"{name} must be a non-empty list of numbers") return [_num(name, v) for v in values]def average_percent(values, decimals=2): nums = _list("values", values) return _round(sum(nums) / len(nums), decimals)def weighted_average_percent(values, weights, decimals=2): nums = _list("values", values) w = _list("weights", weights) if len(nums) != len(w): raise ValueError("values and weights must be the same length") if any(x < 0 for x in w): raise ValueError("weights must not be negative") total = sum(w) if total == 0: raise ValueError("the weights must not all be 0") return _round(sum(n * x for n, x in zip(nums, w)) / total, decimals)def average_growth(rates_percent, decimals=2): rates = _list("rates", rates_percent) product = Decimal(1) for r in rates: if r <= -100: raise ValueError("a rate of -100% or less cannot be averaged this way") product *= 1 + r / 100 return _round((product ** (Decimal(1) / len(rates)) - 1) * 100, decimals)weightedAveragePercent([60, 80, 90], [20, 30, 50]) は、グループの大きさの例である81を返し、averageGrowth([10, 20, 30]) は19.72を返します。丸めるのは表示のときだけにします。Python版は学校で一般的な四捨五入で丸め、Decimal の値を返すので、81は81.00と表示されます。
プライバシーと入力の安全性
- 値の計算はブラウザー内で行われます。入力した数値がサーバーに送られたり、保存されたりすることはありません。
- 入力欄は数値のみ受け付けます。パーセントには末尾に%記号を付けることもできます。文字、空欄、NaN、Infinityはメッセージを表示して拒否され、入力した内容がコードとして実行されることは一切ありません。
- パーセントがあって重みがない行は、加重モードでは重み1として扱われます。完全に空の行は無視されます。
- 重みは負であってはいけません。すべての重みが0の場合、合計がゼロになるので、計算機は正の重みを少なくとも一つ入力するよう求めます。
- 単純モードと加重モードでは、100より大きいパーセントや0より小さいパーセントも受け付けます。そうしたデータもあるからです。平均成長率では、-100%以下の率は拒否されます。数値がすべて消えてしまうからです。
- 小数点以下の桁数は、0から10までの整数に限られます。
- カンマの直後にちょうど3桁が続く場合は千の位の区切りとして読み、1,200 は 1200 になります。それ以外のカンマは小数点として扱うため、12,50 は 12.50 で、0 で始まる 0,500 のような数は小数として読みます。1.234,5 のような混在形式や 1,2,3 のようなあいまいな入力は、推測せずに拒否します。桁区切りの空白(改行されない空白を含む)は無視します。
- 非常に長い貼り付けでも、ページがフリーズすることはありません。
平均パーセントでよくある間違い
| 間違い | 何が起こるか | 計算機の動作 |
|---|---|---|
| 大きさの異なる集団に単純平均を使う | 20人、30人、50人の60%、80%、90%の平均は、81%ではなく76.67%になります | グループの大きさを重みとする加重モードを備えています |
| 異なる全体のパーセントを足す | 20人の50%と80人の25%を合わせても75%にはなりません | 個数を合算してから、合計で割ります |
| 成長率を単純平均で平均する | +10%のあとに-10%の平均は0%ですが、数値は最終的に1%下がります | 成長率には相乗平均を使います |
| リストから0%を外す | 80%と0%の平均は80%ではなく40%です | 値のあるすべての行を、0も含めて数えます |
| 小数とパーセントを混ぜる | 一つのリストに0.8と90を入れると、85ではなく45.4になります | すべての値をパーセントとして扱う |
| 重みを、合計が100になるパーセントでなければならないと考える | 標本の大きさ20、30、50は、何も調整しなくても使えます | 重みの合計で割ります |
| 重みがすべて0 | 合計がゼロなので、平均は定義されません | 正の重みを求めます |
| 平均する前に各パーセントを丸める | 早い段階で丸めると結果がずれます | 丸めるのは最終的な平均だけです |
どの平均を使うか
| 方法 | 使う場面 | 例 | 結果 |
|---|---|---|---|
| 単純平均 | すべてのパーセントが同じ大きさの集団から来ている | 80%、90%、70%、85% | 81.25% |
| 加重平均 | 集団の大きさが異なる、または項目ごとに重みが異なる | 20人、30人、50人の60%、80%、90% | 81% |
| パーセントの和 | パーセントが一つの全体に対する割合 | 一つの市場の25% + 30% + 12% | 67% |
| 個数から合成 | パーセントが異なる全体から来ていて、個数がわかっている | 20人中10人と80人中20人 | 30% |
| 相乗平均 | パーセントが連続する期間の成長率 | +10%と-10% | 期間あたり-0.50% |