所属グループの平均を上回るデータだけを取り出すには?
各記録を所属グループの平均と比較します。先にグループ別の平均表を作り、その平均を元の明細に付けてから、平均を上回る行だけを残します。
各データを所属グループの平均と比べたいときは、まずグループ別の平均表を作ります。それを元の明細に結合し、値と平均の差が正の行だけを残します。たとえばBの平均が6なら、Bにある値8は対象になります。全体の平均だけで判断すると、このような行を見落とすことがあります。
比較基準はグループごとに異なる
架空のRecords全体の平均は10.4ですが、グループ別ではA=15、B=6、C=10です。Meansは最初の集計で作って保存する平均表です。比較する行自身も平均の計算に含め、平均と同じ値の行は残しません。
Records
| Group | Record | Value |
|---|---|---|
| A | R1 | 12 |
| A | R2 | 18 |
| B | R3 | 4 |
| B | R4 | 8 |
| C | R5 | 10 |
Means
| Group | Mean |
|---|---|
| A | 15 |
| B | 6 |
| C | 10 |
平均を保存・再結合して差で絞る
- Recordsだけを読み込みます。「結果を整理」を開いて「集計」を追加し、Groupごとにまとめ、Valueの「平均」をMeanという項目名で作成します。「適用」を押し、A=15、B=6、C=10の3行を確認します。
- 各記録に所属グループの平均を付けるため、この結果をExcelに保存します。新しい作業で元のRecordsと保存した平均表Meansを読み込み、Group同士を「一致する行のみ」で結びます。Meansがグループごとに1行なら、Recordsの各行に平均が1つずつ付きます。
- Means側のGroupだけを非表示にし、Meanは残します。「結果を整理」→「計算」で「引き算 · A − B」を選び、A=Value、B=Mean、結果の名前=Excessにします。
- 計算の下に「絞り込み」を追加し、Excessが0「より大きい」と設定します。計算、絞り込みの順で適用します。
- R2とR4だけが残ることを確認します。Cの唯一の行R5は自分の平均と等しいため除かれます。
全体平均では拾えない行
R4の値8は全体平均10.4より小さくても、Bの平均6を超えるため含まれます。結果の1行は元の記録1件のままで、グループの集計行ではありません。
| Group | Record | Value | Mean | Excess |
|---|---|---|---|---|
| A | R2 | 18 | 15 | 3 |
| B | R4 | 8 | 6 | 2 |
平均を求める対象を先に決める
平均を求める前に元表を絞ると、平均の対象も変わります。比較したい行と平均に含めたい行が異なる場合は、それぞれの対象範囲を決めてください。空欄や数値でない値は平均・差の計算から除外され、数値の0は平均に含まれます。
この方法では集計結果を手動で保存して結合します。SQLのウィンドウ関数を使う方法とは異なり、元の値を更新しても保存済みの平均表は変わりません。
自分のファイルで始めましょう
JOIN SHEETを使ってみる ↗Excel・CSVの作業はPCでご利用ください。
新しいタブで開くため、作業中のデータは置き換わりません。
サンプルの検証日:
出典
How to select students who got above average? (Stack Overflow)
原文はExcelではなくSQLの質問で、所属グループの平均点を超える学生行の取得方法を尋ねています。ここでは同じデータ処理を手動の保存・再読込・結合で扱います。 上の表と手順は、この質問を参考に別途作成した架空の例です。質問者の実データや製品の利用体験ではありません。