導入: なぜ今、MEDIAN関数の挙動を再確認すべきか
基幹システムにおけるデータ分析や統計処理で、平均値(MEAN)ではなく中央値(MEDIAN)を求めるケースが増えています。特に外れ値の影響を受けやすい売上データや、レスポンスタイムの分析において中央値は非常に有効です。しかし、実務現場において「同じ値が複数ある場合、どう計算されるのか?」という疑問は、予期せぬ帳票出力や計算不整合を招くリスクがあります。今回は、COBOLの組込関数であるMEDIAN関数の正確な挙動と、現場で安全に使うための知見を解説します。
基礎知識: MEDIAN関数と「同値」の仕組み
COBOLのMEDIAN関数は、指定された引数のリストを昇順に並べ替えた際の中央にある値を返します。ここで重要なのは、同値(同じ値)も「個別の要素」として厳密にカウントされるという点です。例えば「10, 20, 20, 30」というデータがある場合、要素数は4つであり、中央の2つの値を足して2で割る(平均をとる)という計算が行われます。分布の偏りを無視せず、すべてのデータを個別の存在として扱うのがCOBOLの統計関数の基本仕様です。
実装/解決策: 確実な中央値算出のロジック
実務では、データ件数が偶数の場合と奇数の場合で、結果の型(整数か小数か)が変わることに注意が必要です。MEDIAN関数は、引数の型に応じて適切に値を返しますが、受け取る側のデータ項目定義が不適切だと精度が落ちる可能性があります。計算結果を格納する変数は、必ず十分な桁数と小数部を持たせるのが定石です。
サンプルプログラム: 同値を含むデータの中央値算出
以下に、同値が含まれる配列に対してMEDIAN関数を適用するサンプルコードを記述します。
IDENTIFICATION DIVISION.
PROGRAM-ID. MEDIAN-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TBL-DATA.
05 VAL PIC S9(5) OCCURS 4 TIMES INDEXED BY I.
01 RESULT-VAL PIC S9(5)V99.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
- データ設定: 10, 20, 20, 30 (20が同値で存在)
- MEDIAN関数で中央値を算出
- データが偶数件(4件)なので、(20+20)/2 = 20.00 が返る
応用・注意点: 現場で陥りやすいバグの回避
実務で最も注意すべきは「NULL値や初期値の扱い」です。配列の一部が初期化されていない(ゼロが入っている)状態でMEDIAN関数を呼び出すと、そのゼロも「0という値」として計算に含まれてしまいます。
1. 空データの排除: 計算対象外のデータには、あらかじめ非常に大きな値を入れるか、有効フラグを用いて計算対象のみを切り出す前処理を行ってください。
2. 精度の確認: データが偶数件で、中央の2つの値が整数同士であっても、平均をとる過程で小数が発生する可能性があります。受け皿となる項目は必ず小数部を確保してください。
これらの基本を押さえることで、統計処理の信頼性は飛躍的に向上します。ぜひ、保守対象のプログラムで見直しを行ってみてください。

コメント