第70回 打率ランキング:規定打席条件を組み込む

関数・自動化

前回はINDEX・MATCHで上位N件の数値に対応する選手名を自動表示できるようになりました。打点・本塁打・盗塁ランキングはこれで完成形に近いのですが、打率ランキングには1つ特有の問題があります。今回はその問題を解決する「規定打席条件の組み込み」を解説します。

「また新しい関数?」と思った方、ご安心ください。今回登場する考え方はすでに第51・52・53回で学んだ「規定打席」の話です。あのときの知識をランキングシートに応用するだけです。

打率ランキング特有の問題:未出場選手の「0」が混入する

打点・本塁打・盗塁なら「0点は0点」で正しい成績です。しかし打率は違います。

⚠️ 打率ランキングで起きる2つの問題
問題① 未出場選手の打率「0」がランキングに入る

SASAKIさんやHARAさんなど、試合に出ていない選手の打率は 0 です。LARGEはこの 0 も数値として扱うため、上位5件を取り出そうとすると選手が10人以下のチームでは下位に 0 が並んでしまいます。

問題② 1打席だけの選手が1.000でランキング1位になる

1打席で1安打なら打率は 1.000(10割)です。試合に1回しか出ていない選手が打率ランキングのトップに来るのは、チームの実情を正しく反映していません。

実際のデータで確認してみましょう。年間(野手)シートには打席数 0 の選手が複数います。

選手名 試合数 打席数 打率 問題
SASAKI 0 0 0 未出場なのに打率 0 としてリストに残る
HARA 0 0 0 同上
YAMADA 2 5 .400 打席数が少なく、規定打席(約18)に未達
SUZUKI 9 30 .636 規定打席クリア → ランキング対象 ✅

このままLARGEを使うと、打席数5のYAMADAさん(打率.400)が規定打席をクリアした選手よりも上位に来てしまいます。これを防ぐのが「規定打席条件の組み込み」です。

規定打席の復習:試合数 × 1.8

第51・52回で解説した規定打席の考え方を確認しておきます。

📝 規定打席とは

チームの消化試合数 × 1.8 で計算した打席数以上を記録した選手のみを、打率などの規定が必要な指標のランキング対象とするルール。

たとえばチームが10試合を消化していれば、規定打席は 10 × 1.8 = 18打席。18打席以上の選手だけが打率ランキングの対象になります。

この「10」はチームシートの試合数から自動参照する設計にしておくと、試合が増えるたびに自動更新されます(第52回参照)。ここでは説明のため 10試合=規定打席18 を例として使います。

解決策:LARGE の範囲を「条件付きの列」に変える

アイデアはシンプルです。打率列をそのままLARGEに渡すのではなく、「規定打席を満たしていない選手の打率を無視した列」をLARGEに渡します。

この「条件を満たせば元の値、満たさなければ無視」を作るのにIF関数を使います。

📝 IF関数の復習
=IF(条件, 条件が真のときの値, 条件が偽のときの値)

「打席数が規定打席以上なら打率を返す、そうでなければ空欄(””)を返す」と書けます。

配列数式で「条件付き打率列」をLARGEに渡す

通常のIF関数は1つのセルに対して判定します。しかし今回は「打率列全体」に対してまとめて条件判定し、その結果をLARGEに渡す必要があります。これを配列数式と呼びます。

書き方はこうなります。

✅ 規定打席条件付き打率ランキングの完成式

打率1位(規定打席クリア選手のみ対象)

=IFERROR(LARGE(IF('年間(野手)'!E2:E50>=$H$1, '年間(野手)'!D2:D50), A3), "")

式の読み方を分解します。

  • '年間(野手)'!E2:E50:打席数の列(E列)の範囲
  • >=$H$1:打席数が規定打席(H1セルに入力した値)以上かどうかを判定
  • '年間(野手)'!D2:D50:条件を満たした行の打率(D列)だけをLARGEに渡す
  • A3:順位番号(1位ならA3=1、2位ならA4=2…)
  • IFERROR(…, ""):データが足りなくてエラーになった場合に空欄を返す

⚠️ Googleスプレッドシートでの入力方法

この式を入力したらCtrl+Shift+Enter(Macは Command+Shift+Enter)で確定してください。通常のEnterで確定すると配列として動作せず正しい結果が得られません。確定後、数式バーの式が {=IFERROR(…)} のように波括弧で囲まれれば成功です。

⚠️ 列全体(D:D)ではなく範囲指定(D2:D50)を使う理由

配列数式の中でIF関数を使う場合、D:D(列全体)ではなく D2:D50 のような有限の範囲を指定する必要があります。列全体を使うと処理が極端に重くなったり、エラーが出たりすることがあります。選手が増えてもカバーできるよう、余裕を持った行数(50行程度)を指定しておきましょう。

「規定打席」のセルをどこに置くか

式の中の $H$1 は「規定打席の値が入ったセル」です。2通りの管理方法があります。

方法①:チームシートの試合数から自動計算する(推奨)
=IFERROR(LARGE(IF('年間(野手)'!E2:E50>='チーム成績'!B2*1.8, '年間(野手)'!D2:D50), A3), "")

チーム成績シートのB2に試合数が入っているとして、B2*1.8 が規定打席になります。試合数が増えるたびに規定打席も自動更新されるので、メンテナンス不要です。

方法②:ランキングシートのどこかに規定打席を手入力する(シンプル)
=IFERROR(LARGE(IF('年間(野手)'!E2:E50>=$H$1, '年間(野手)'!D2:D50), A3), "")

ランキングシートのH1セルに規定打席(例:18)を直接入力しておく方法です。試合が増えたら手動で更新する必要がありますが、式がシンプルで理解しやすくなります。$H$1 と絶対参照にしておくと、式を下にコピーしても参照先がずれません。

実際のデータで結果を確認する

チームの消化試合数は現時点で10試合なので、規定打席は 10 × 1.8 = 18打席 です。これで絞り込んだ結果を見てみましょう。

選手名 打席数 規定打席(18)クリア? 打率
SUZUKI 30 ✅ クリア .636
TANAKA 24 ✅ クリア .368
ITO 23 ✅ クリア .368
YAMAMOTO 28 ✅ クリア .357
YAMAOKA 27 ✅ クリア .318
YAMADA 5 ❌ 未達 .400(除外)
SASAKI(未出場) 0 ❌ 未達 0(除外)

規定打席(18打席)をクリアしたのは SUZUKI・TANAKA・ITO・YAMAMOTO・YAMAOKA の5選手です。YAMADAさんの打率.400(5打席)と未出場選手の 0 はIFの条件で除外されます。

✅ 規定打席条件を組み込んだ打率ランキングの結果
順位 選手名 打率 打席数
1位 SUZUKI .636 30
2位 TANAKA .368 24
3位 ITO .368 23
4位 YAMAMOTO .357 28
5位 YAMAOKA .318 27

打席数5のYAMADAさん(.400)が除外され、実態に即したランキングになりました。2位・3位の同率問題(TANAKAとITO)は第72回で対処します。

選手名の取り出し方も同じ構造で書く

選手名列(INDEX・MATCH)の式も、MATCH の検索範囲を同じ配列で統一します。

✅ 規定打席条件付き・選手名の完成式

打率1位の選手名(ランキングシートのB3セル)

=IFERROR(INDEX('年間(野手)'!B2:B50, MATCH(C3, IF('年間(野手)'!E2:E50>=$H$1, '年間(野手)'!D2:D50), 0)), "")

ポイントは MATCHの検索範囲にもIFで絞った配列を使うことです。C3に入っている「規定打席クリア選手の打率1位の値」を、IF配列の中から探して行番号を返します。この式も Ctrl+Shift+Enter で確定してください。

打点・本塁打との使い分けを整理する

打率と打点・本塁打でLARGEの書き方がどう違うかを並べて確認しておきましょう。

📝 指標によってLARGEの書き方が変わる
指標 LARGEの書き方 理由
打率 LARGE(IF(打席列>=規定, 打率列), 順位) 未出場の0・少打席の極端値を除外するため規定打席条件が必要
打点 LARGE(打点列, 順位) 「0打点」は正しい実績。条件なしでそのままランキングしてよい
本塁打 LARGE(本塁打列, 順位) 同上
盗塁 LARGE(盗塁列, 順位) 同上

規定打席条件が必要なのは打率(と後々対応するなら出塁率・長打率・OPS)だけ。数を積み上げていく指標(打点・本塁打・盗塁・安打)は条件なしでOKです。

✅ この記事のまとめ
  • 打率ランキングには「未出場者の 0」と「少打席の極端値」が混入する問題がある——打点や本塁打にはない打率特有の問題
  • 解決策は LARGE(IF(打席列>=規定打席, 打率列), 順位) という配列数式で、規定打席をクリアした選手の打率だけをLARGEに渡すこと
  • Googleスプレッドシートでは Ctrl+Shift+Enter で確定する(波括弧 {} が付けば成功)
  • 配列数式では列全体(D:D)ではなく有限の範囲(D2:D50など)を指定する
  • 規定打席の値はチーム成績シートの試合数から自動計算するか、ランキングシートに手入力して絶対参照($H$1)で参照する
  • 打点・本塁打・盗塁はこの条件が不要——規定打席条件が必要なのは打率(と関連指標)のみ
  • 次回は本塁打・打点・安打・盗塁の各ランキングをまとめて作る

次回予告

次回は「本塁打・打点・安打・盗塁ランキングを作る」。打率ランキングで学んだ LARGE・INDEX・MATCH の構造をそのまま応用して、各部門のランキングシートを一気に仕上げます。打率と違って条件なしでOKな指標ばかりなので、思ったよりもスムーズに進みます。

▶︎ 次回:【第71回】本塁打・打点・安打・盗塁ランキングを作る

コメント

タイトルとURLをコピーしました