FishCast

サイエンス

スコアの仕組み
7 要因の科学

FishCast の釣果予測スコアは、海洋学・気象学・行動生態学の知見をもとに 7 つの要因を重み付けし、0〜100 点で表現します。アルゴリズムの根拠と各要因の重み・データソースを公開します。

/

7 つの要因

潮汐 (Tide)

重み 30.4%重要度: 高

大潮・中潮・小潮・長潮・若潮の潮回りと、満潮・干潮の差 (潮位差)、そして「いま潮が動いているか」(潮位の変化の速さ) を評価。潮が動くほど海水とプランクトンが動き、小魚とフィッシュイーターの捕食スイッチが入りやすくなります。

水温 (Water Temperature)

重み 17.5%重要度: 高

魚種ごとに適水温が異なるため、対応魚種それぞれの最適レンジに対する近さで評価。海面水温データをもとに、季節変化と短期変動を組み合わせて判定します。

気圧 (Pressure)

重み 13.8%重要度: 中

低気圧接近時に魚の浮き袋が膨張し、表層〜中層に浮きやすくなる現象を考慮。絶対値より「気圧変化速度」を重視し、急激な低下局面で高スコアになります。台風前の荒食いはこの効果。

時間帯 (Time of Day)

重み 12.0%重要度: 中

朝マズメ (日の出前後 1 時間) と夕マズメ (日没前後 1 時間) を最高評価。日中は魚種により評価が分かれます (タチウオ・アナゴは夜行性で夜間高評価)。緯度と季節に応じて自動調整。

天候 (Weather)

重み 9.2%重要度: 中

風速・降水量・雲量を総合評価。曇天・適度な風 (2〜4m/s) は魚に警戒心を解かせ高評価、暴風・豪雨・ピーカン無風は低評価。

地形 (Terrain)

重み 9.2%重要度: 低〜中

堤防・磯・砂浜・河口の地形タイプを地点情報から判定。魚種と地形の相性 (例: クロダイ⇔磯、キス⇔砂浜) を加味してスコアを微調整します。

酸素環境 (Dissolved Oxygen)

重み 8.0%重要度: 低〜中

水温・風・潮の流れ・地形から、魚にとっての酸素環境を推定して反映します (実測値ではなく推定値)。高水温・無風・流れの弱い停滞した状況では酸素が乏しくなり、活性が落ちやすくなります。

7 要因の重み付け (実数値)

以下はモバイルアプリ実装 (apps/mobile/lib/core/constants/app_constants.dart) のデフォルト重みです。魚種を指定すると、魚種別の重み (FishSpeciesConfig) が動的に適用されます。Remote Config 経由で本番値を遠隔チューニングできる構造です。

要因重み区分
潮汐 (Tide)30.4%
水温 (Water Temperature)17.5%
気圧 (Pressure)13.8%
時間帯 (Time of Day)12.0%
天候 (Weather)9.2%
地形 (Terrain)9.2%低〜中
酸素環境 (Dissolved Oxygen)8.0%低〜中
合計100%

注: 上記は全魚種共通のデフォルト値です。魚種別に重みが動的に調整されます (アプリの予測対応は全 76 魚種)。端数処理のため、表示上の合計は 100.0% ちょうどにならない場合があります。

データソース

各要因のスコアは、第三者が検証可能な公開 API または自前の天文計算をもとに算出しています。コスト保護のためインメモリ TTL キャッシュを段階的に設定しています。

要因データソースエンドポイントキャッシュ
潮汐WorldTides API

FishCast のサーバー経由でプロキシ。heights / extremes を取得、TideType は旧暦日から算出

www.worldtides.info/12 時間 (当日中は潮位予測が変わらないため)
気圧Open-Meteo Forecast API

hourly=surface_pressure を使用。前時刻との差分から気圧変化速度を算出

api.open-meteo.com/v1/forecast10 分 (座標は小数 2 桁丸めでキー化、1 画面あたり API 4 → 1 回に削減)
水温Open-Meteo Marine API

hourly=sea_surface_temperature,ocean_current_velocity を使用。失敗時は気温 × 0.7 + 5.0 で推定値にフォールバック

marine-api.open-meteo.com/v1/marine30 分 (水温は変化が遅いため長め)
天候Open-Meteo Forecast API

hourly=weather_code (WMO Code), wind_speed_10m, temperature_2m, relative_humidity_2m を取得

api.open-meteo.com/v1/forecast10 分 (気圧と同一エンドポイント・同一キャッシュ)
時間帯デバイス時刻 + 緯度経度

端末ローカル時刻から hour (0-23) を取得。緯度経度から日の出/日の入りを天文計算で導出

リアルタイム (外部 API 不使用)
地形Firestore (spots コレクション)

ユーザー登録スポットの spotType (堤防 / 磯 / サーフ / 河口 / 漁港 / 砂浜 / テトラ / 岩場 / その他)。Phase 0 で構造化属性を追加予定

Firestore 即時読み込み
酸素環境 (推定)推定値 (FishCast 算出)

水温・風速・潮流・地形の組み合わせから酸素環境を推定。溶存酸素の実測値ではない

他要因のデータに従属 (追加の外部 API なし)

外部 API リファレンス: WorldTides (worldtides.info) / Open-Meteo Forecast (open-meteo.com/en/docs) / Open-Meteo Marine (open-meteo.com/en/docs/marine-weather-api)

スコア帯の 5 段階

算出された 0〜100 点は、釣果期待度に応じて 5 段階の帯で表示されます。色はモバイル版・Web 版で共通です。

81-100絶好

全要因が噛み合う最高条件。釣行を強く推奨。

61-80良好

複数の要因が好条件。釣果期待度は十分。

41-60普通

平均的な条件。腕と魚種選びで結果が変わる。

21-40やや厳しい

複数の要因が逆風。ポイント選びで勝負。

0-20厳しい

条件が揃わない日。安全第一で見送りも選択肢。

答え合わせの実測

スコアが当たっているかどうかは、私たちが決めることではありません。アプリの「答え合わせ」で 実際に釣行した人が報告した結果を、スコア帯ごとに集計して公開しています。 期間は 2026-03-142026-08-26105 件 (57 人 / 52 釣り場) です。

スコア70以上の日は 83% 釣れています(n=23)

スコア帯実際に釣れた割合答え合わせ件数
80以上件数が少ないため割合は出していません2
70〜7981%21
60〜6972%29
40〜5957%40
0〜3977%13

この数字の読み方と限界

・訪問した釣行のうち実際に釣れた割合 (全体) は 69.5% です。 スコア帯ごとの割合は、この土台と比べて意味があります。

・「スコア60以上なら釣れる / 60未満なら釣れない」を的中とみなした場合の的中率は 57.1% です。 全体で 69.5% 釣れている以上、この決め方では下側が構造的に外れるため、 スコアの実力を測る指標としては採用していません。

・0〜39 の帯だけ上の帯より高く出ています。件数が少ないうえ、 低スコアでも出かけた釣行に何らかの偏りがある可能性があり、まだ説明がついていません。 都合が悪いので伏せる、ということはしません。

・答え合わせに回答した釣行だけが対象です。釣れた日のほうが報告されやすい偏りがあります。 件数が増えたら、この数字は変わります。

・「行っていない」と回答された 102 件は、外れではなく観測が無いため 分母から除いています。スコアが記録されないまま投稿された 11 件も除いています。

重み付けの考え方

7 要因は等価ではありません。観測データと一般的な釣り知見をもとに、潮汐 30.4%を最上位の主要因子、水温・気圧・時間帯を準主要因子、天候・地形・酸素環境を補正因子として扱っています。

2026 年 7 月の見直しでは、月齢ベースの理論値 (ソルナー理論) を計算から外しました。潮汐とソルナーで似た要素を二重に数えており、実測でも両者の相関が高かったためです (詳しい経緯)。かわりに潮位の変化の速さを潮汐要因に組み込み、新たに酸素環境 (推定) を追加しています。将来的には、ユーザーが投稿した実釣果データを学習し、係数を継続的にチューニングする方針です (現状の重みは静的デフォルト + Remote Config 遠隔上書きの構成)。

関連ガイド