複合スコアと算出ロジック
データソース
- Yahoo! ショッピング API — 本ジャンル (categoryId=10002) を「Python」「機械学習」等のキーワードで
sort=-sold(売れ筋順) 取得。jan_code (ISBN-13) で 完全名寄せ。 - openBD (版元ドットコム + カーリル + 国立国会図書館) — ISBN から著者・出版社・発売日・カバー画像を補完。商用利用可、無料。
- 楽天Books / Amazon — Phase 2 で追加予定。 ISBN 完全マッチで同一書を複数モール横断比較し、最安・複数モール出品を可視化。
スコア計算 (0-100 正規化)
各サブスコアを以下のように算出し、ジャンル毎に設定した重みで合算します。
- sales_score — 楽天Books 売上順位の対数減衰。 ランク 1 → 100、最大ランク → ~0。未取得は 50 (中位) で固定。
- review_score —
avg_rating × 20 × log1p(review_count) / log1p(200)。 評価 4.0 × 100 件 → 約 65 点、評価 5.0 × 200 件以上 → 100 点。 - freshness_score —
100 × exp(-days_since_publication / 730)。 発売 1 年で 約 60 点、2 年で約 37 点、3 年で約 22 点。古典本は他軸で底上げ。 - value_score — ジャンル内中央価格 / 自身価格を 0.3-2.0 に クランプして 50 中心の 0-100 化。半額なら 75 点、倍額なら 25 点。
重み配分 (ジャンル既定)
sales 0.40 / review 0.25 / freshness 0.20 / value 0.15。 ジャンルごとに book_genres.weight_* で調整可能。 売上を最重視しつつ、新刊と価格の評価も加味する設計です。
複数モール採用ボーナス
同一 ISBN で楽天/Yahoo の両方に出品があれば 複数モール タグを付与し、 価格は最安採用、レビューは多い方を採用 (将来 Amazon 追加時も同様)。
更新頻度
週次 火曜 03:00 JST に orchestrator のバッチが 12 ジャンル × Yahoo Shopping を巡回 (技術書は日次変動が小さいため週次で十分)。 ローカルスケジューラなので障害時は手動で --once 実行で復旧。
限界・透明性
- 中古本や Kindle 単行本が一覧に混入する場合があります (Phase 2 で除外)。
- レビュー件数は Yahoo!のみの値なので、Amazon 集中レビューは反映されません。
- 発売日が openBD に登録されていない書誌は freshness=30 (不明) で評価します。