サイエンス
スコアの仕組み
— 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/forecast | 10 分 (座標は小数 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/marine | 30 分 (水温は変化が遅いため長め) |
| 天候 | Open-Meteo Forecast API hourly=weather_code (WMO Code), wind_speed_10m, temperature_2m, relative_humidity_2m を取得 | api.open-meteo.com/v1/forecast | 10 分 (気圧と同一エンドポイント・同一キャッシュ) |
| 時間帯 | デバイス時刻 + 緯度経度 端末ローカル時刻から 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 版で共通です。
全要因が噛み合う最高条件。釣行を強く推奨。
複数の要因が好条件。釣果期待度は十分。
平均的な条件。腕と魚種選びで結果が変わる。
複数の要因が逆風。ポイント選びで勝負。
条件が揃わない日。安全第一で見送りも選択肢。
答え合わせの実測
スコアが当たっているかどうかは、私たちが決めることではありません。アプリの「答え合わせ」で 実際に釣行した人が報告した結果を、スコア帯ごとに集計して公開しています。 期間は 2026-03-14 〜 2026-08-26、105 件 (57 人 / 52 釣り場) です。
スコア70以上の日は 83% 釣れています(n=23)
| スコア帯 | 実際に釣れた割合 | 答え合わせ件数 |
|---|---|---|
| 80以上 | 件数が少ないため割合は出していません | 2 |
| 70〜79 | 81% | 21 |
| 60〜69 | 72% | 29 |
| 40〜59 | 57% | 40 |
| 0〜39 | 77% | 13 |
この数字の読み方と限界
・訪問した釣行のうち実際に釣れた割合 (全体) は 69.5% です。 スコア帯ごとの割合は、この土台と比べて意味があります。
・「スコア60以上なら釣れる / 60未満なら釣れない」を的中とみなした場合の的中率は 57.1% です。 全体で 69.5% 釣れている以上、この決め方では下側が構造的に外れるため、 スコアの実力を測る指標としては採用していません。
・0〜39 の帯だけ上の帯より高く出ています。件数が少ないうえ、 低スコアでも出かけた釣行に何らかの偏りがある可能性があり、まだ説明がついていません。 都合が悪いので伏せる、ということはしません。
・答え合わせに回答した釣行だけが対象です。釣れた日のほうが報告されやすい偏りがあります。 件数が増えたら、この数字は変わります。
・「行っていない」と回答された 102 件は、外れではなく観測が無いため 分母から除いています。スコアが記録されないまま投稿された 11 件も除いています。
重み付けの考え方
7 要因は等価ではありません。観測データと一般的な釣り知見をもとに、潮汐 30.4%を最上位の主要因子、水温・気圧・時間帯を準主要因子、天候・地形・酸素環境を補正因子として扱っています。
2026 年 7 月の見直しでは、月齢ベースの理論値 (ソルナー理論) を計算から外しました。潮汐とソルナーで似た要素を二重に数えており、実測でも両者の相関が高かったためです (詳しい経緯)。かわりに潮位の変化の速さを潮汐要因に組み込み、新たに酸素環境 (推定) を追加しています。将来的には、ユーザーが投稿した実釣果データを学習し、係数を継続的にチューニングする方針です (現状の重みは静的デフォルト + Remote Config 遠隔上書きの構成)。