OpenOfficeでFREQUENCY関数を使って度数分布表を作る

小学生も作れる度数分布表を大人も作ろうということで、今度はいかにも大人らしく、FREQUENCY関数を使って処理してみたいと思います。
FREQUENCY関数を使って作成する度数分布 ●COUNTIF関数を使って作成する度数分布 ●サンプルファイルと参考記事

送信者 OpenOffice

FREQUENCY関数を使って作成する度数分布
関数名:FREQUENCY関数
書式:=FREQUENCY(データ範囲;区間)
何ができる:該当する区間のデータの個数を返す
平たく書くと:{=FREQUENCY(C2:C18;E2:E9)} で、上の表のF列の結果が返されます。

  • F2セルでは、打点10以下のデータの個数がC列から数えられて返されています。
  • F3セルでは、打点が10より多く、25以下のデータの個数が返されています。
  • F10セルでは、打点が115を超えるデータの個数が返されています。
  • E10セルには数値が入力されていませんが、データの個数がC列のデータの個数の総和とF9列までに返されたデータの個数の総和が等しくならないと、自動的にF10セルに入力されます。

この関数の数式を入力するときにいくつかのルールがあります。

  1. この表の場合、F列に=FREQUENCY(C2:C18;E2:E9)を入力します。
  2. 入力したら、CtrlキーとShiftキーを押しながら、Enterキーを押して確定します。
  3. 自動的に、3行目以降にも数式が入力され、結果が返されます。
  4. 配列の一部だけを変更することができません。
  5. ほかの関数と、組み合わせて1つの数式を作ることができません。

という制限やルールのもとに生成された度数分布の結果がF列です。
えらそうに言う割には、小学生並みやないか、と思ってしまうのは僕だけでしょうか?

COUNTIF関数を使って作成する度数分布
そこで、見慣れた関数だけで同様の結果を得る方法を考えてみました。
それが、隣のG列の結果です。
F列の結果と見事に一致しています。
この数式のほうが、データが生成された因果関係を数式上から把握しやすいと思います。如何でしょうか?

この数式の構成:E列にある条件に沿って検索したC列のデータの個数を数えすでに検索されたデータの個数の総和を差し引く
G2セルの数式をを例にとると、=COUNTIF($C$2:$C$18;"<="&IF(E2="";MAX($C$2:$C$18);E2))-SUM($G$1:G1)になります。

この数式でのポイントは、
1:以上・以下より大きい・より小さいの設定の仕方
2:区間に設定した最大値を超えた値が存在するときにどうするか
です。

  • 以上 ">="&10 10以上
  • 以下 "<="&10 10以下
  • より大きい ">"&10 10より大きい、
  • より小さい "<"&10 10より小さい

以上以下より大きいより小さいの書き方は、上のとおりです。条件の等号・不等号を""(ダブルクォーテーション)でくくってその後に数値あるいは数値が入ったセルのアドレスを、&でつないで書きます。この書き方は、COUNTIF関数のほか、SUMIF関数でも共通です。
これで、COUNTIF($C$2:$C$18;"<="&E2)と数式を作ることができます。

ところが、実際は、=COUNTIF($C$2:$C$18;"<="&IF(E2="";MAX($C$2:$C$18);E2))となっています。
これは、最大の区間を越えたときの条件設定です。
上の例だと、115が最大の区間なのでそれより大きい値が登場するとカウントされません。そこで、それより大きい値が存在する(E列が空白)ときは、範囲全体のなかでの最大値を条件値とすることにします。IF(E2="";MAX($C$2:$C$18);E2)

さらに、すでにカウントしたデータの個数の合計SUM($G$1:G1)を引くと、完全にFREQUENCY関数と等しい結果が得られます。
SUM関数の集計の起点は、一番上のセルに固定(絶対参照)します。終点は、数式を書くひとつ上のセルにします。これによって、セルをそのままコピーして貼り付けたときも、常に一番上のセルから1つ上までのセルの合計が返されることになります。G2セルの場合、1つ上のセルには何も入力されていないので、引かれる値がないことになります。

サンプルファイルと参考記事

サンプルファイル:FREQUENCY関数を使って度数分布表を作るサンプルファイルは、スカイドライブからcalc087.odsをダウンロードしてください。

参考記事:
OpenOfficeで度数分布する