Day 088 — コンペ選定基準 — 自分に合ったコンペの見つけ方

2026-07-08 水 / Phase 3 戦略 コンペ選定 / メダル戦略 / Kaggle API / スコアリング

📚 背景知識(読んでから問題へ)

🧭
Day 087 で Kaggle API による自動化を学びました。今日は Phase 3 の締めに向けて「どのコンペに参加するか」の意思決定を扱います。Grandmaster への最短ルートは、片っ端から全部やることではなく「勝てる・伸びるコンペを選ぶこと」から始まります。

Kaggle には常時 10〜30 個のコンペが同時開催されています。コンペ選びは就活の「企業選び」に似ています。自分のスキル・使える時間・目的に合わないコンペを選ぶと、3ヶ月かけて何も残らずに終わります。

💡
Expert への境界線: 「参加者中規模の Tabular コンペ」を見極めて選べるようになると、メダル獲得率が一気に上がります。強いモデルより先に「勝てる土俵選び」を身につけましょう。

🗂️ コンペの4カテゴリ(メダルの有無)

カテゴリメダル特徴初心者向き
Featured✅ あり企業スポンサー・賞金あり・激戦△(学び多い/上位は難)
Research✅ あり学術的・新規性が問われる
Playground❌ なし ※練習用・合成データ・毎月開催◎(練習に最適)
Getting Started❌ なしTitanic 等・常設・入門◎(最初の一歩)

※ Playground はメダル対象外だが、上位ノートブックの特徴量工学・アンサンブルの型を学ぶ最高の教材

📊 参加チーム数とメダル難易度

Gold の「絶対順位」は参加者数で激変する。中規模コンペが狙い目。

Expert 志望者への「参加チーム数」推奨度

〜100 チーム(過疎)
△ 学び少
推奨 40%
100〜500 チーム
○ やや少
推奨 70%
500〜1500 チーム(理想)
◎ 好バランス
推奨 100%
3000+ チーム(激戦)
△ Master/GMだらけ
推奨 35%
参加チーム数BronzeSilverGold
0〜99上位40%上位20%上位10%
100〜249上位40%上位20%上位10%
250〜999上位100位上位50位上位20位
1000+上位10%上位5%上位10位 + 0.2%

🎯 問題

⚠️
あなたは Kaggle Expert を目指す学習者です。「どのコンペに参加すべきか」を、理論・コード両面から判断してください。

タスク1: コンペ選定チェックリストの作成

1
検討中のコンペを評価する10項目のチェックリストを作る
各項目に「なぜ見るべきか」を1行添える

タスク2: Kaggle API でコンペを取得・スコアリング

1
開催中コンペ一覧を API で取得する
締切残り日数・参加チーム数・データサイズ・種別を見る
2
各コンペに 0〜100 点の「自分への適合スコア」を付けて上位を提示する

タスク3: 意思決定シナリオ

A
賞金 $50,000・参加 4,200 チーム・締切まで残り 5 日・画像データ 200GB
B
Playground Series・参加 800 チーム・締切まで 25 日・Tabular データ 50MB
C
Research コンペ・参加 90 チーム・締切まで 60 日・独自フォーマットの時系列

🗺️ コンペ選定「3軸」フレームワーク

3つすべて◎でなくてよいが、2つが×のコンペは避けるのが鉄則。

🏆 勝てるか メダル可能性 参加数 × 実力 × 📈 学べるか 成長できるか 上位NB・技術トレンド × ⏱️ 終わるか 時間内に完了 締切・データ量・資源 この3軸で1つに絞る → 掛け持ちしない 「終わるか」を軽視した途中放棄が最も多い失敗

💡 ヒント

ヒント1 方向性

「勝てるか」だけでなく「学べるか」「時間内に終わるか」の3軸で考える。Expert を目指す段階ではメダル獲得率が高い Tabular の中規模コンペ(参加 500〜1500 チーム)が狙い目。画像・NLP は計算資源が必要なので優先度が下がる。

ヒント2 アプローチ
  • 一覧取得: kaggle competitions list --csv --sort-by latestDeadline
  • メタ情報: deadline / teamCount / reward / category
  • 締切日数: (deadline - today).days
  • スコアリング: 「残り14〜45日」「参加500〜1500」「Tabular」に高得点を与える重み付け関数
ヒント3 コード骨格
import subprocess, io
import pandas as pd
from datetime import datetime

# コンペ一覧を CSV で取得
result = subprocess.run(
    ['kaggle', 'competitions', 'list', '--csv'],
    capture_output=True, text=True)
df = pd.read_csv(io.StringIO(result.stdout))

def score(days_left, team, data_gb, is_tabular):
    s = 0
    if 14 <= days_left <= 45: s += 30
    if 500 <= team <= 1500: s += 30
    if data_gb <= 10: s += 20
    if is_tabular: s += 20
    return s

模範解答

タスク1: コンペ選定チェックリスト(10項目)

#チェック項目なぜ見るべきか
1メダル対象かPlayground・Getting Started はメダルにならない
2締切まで 14〜45 日あるか短すぎると間に合わず、長すぎると中だるみ
3参加チーム 500〜1500 かメダルの絶対順位と競争のバランスが良い
4Tabular かExpert 段階では GBDT で戦える Tabular が有利
5データサイズは扱えるか100GB 級の画像は Colab 無料枠では厳しい
6評価指標を理解しているか最適化方法が分かる指標(AUC/RMSE 等)を選ぶ
7上位ノートブックがあるか学習リソースが豊富だと成長できる
8リーク・品質問題がないかDiscussion で既知の落とし穴を確認
9自分の時間と合うか平日夜だけなら軽量コンペを選ぶ
10目的に合うか(メダル/学習)学習目的なら激戦コンペでも参加価値あり

タスク2: 選定スコアリングスクリプト

import subprocess, io
import pandas as pd
from datetime import datetime

# 1. コンペ一覧を CSV で取得
result = subprocess.run(
    ['kaggle', 'competitions', 'list', '--csv',
     '--sort-by', 'latestDeadline', '--category', 'all'],
    capture_output=True, text=True)
df = pd.read_csv(io.StringIO(result.stdout))
# 主なカラム: ref, deadline, category, reward, teamCount, userHasEntered

# 2. スコアリング関数
def score_competition(row, today):
    s, reasons = 0, []
    try:
        deadline = pd.to_datetime(row['deadline']).tz_localize(None)
        days_left = (deadline - today).days
    except Exception:
        days_left = 999

    # 締切残り日数
    if 14 <= days_left <= 45:
        s += 30; reasons.append(f"締切{days_left}日=理想(+30)")
    elif days_left < 7:
        reasons.append(f"締切{days_left}日=短すぎ(+0)")
    else:
        s += 10; reasons.append(f"締切{days_left}日(+10)")

    # 参加チーム数
    team = row.get('teamCount', 0)
    if 500 <= team <= 1500:
        s += 30; reasons.append(f"{team}チーム=好バランス(+30)")
    elif team > 1500:
        s += 10; reasons.append(f"{team}チーム=激戦(+10)")

    # メダル対象か
    cat = str(row.get('category', '')).lower()
    if cat in ('featured', 'research'):
        s += 25; reasons.append(f"{cat}=メダル対象(+25)")
    elif cat == 'playground':
        s += 15; reasons.append("playground=練習向き(+15)")

    # 既参加は減点
    if row.get('userHasEntered', False):
        s -= 20; reasons.append("既参加(-20)")

    return s, days_left, reasons

# 3. 全コンペにスコア付与
today = datetime.now().replace(tzinfo=None)
rows = []
for _, row in df.iterrows():
    sc, days_left, reasons = score_competition(row, today)
    rows.append({'ref': row['ref'], 'score': sc,
                 'days_left': days_left, 'reasons': ' / '.join(reasons)})

ranked = pd.DataFrame(rows).sort_values('score', ascending=False)
print(ranked.head(5))

タスク3: 意思決定シナリオの判断

シナリオ判断理由
A
$50k / 4200チーム / 残5日 / 画像200GB
❌ 見送り 締切5日は着手に短すぎ。画像200GBは無料資源で扱えない。4200チームで Gold は上位10位相当=非現実的
B
Playground / 800チーム / 25日 / Tabular 50MB
✅ 参加 残り日数・データサイズ・種別すべて理想的。メダルは出ないが特徴量工学と GBDT の型を学ぶのに最適。上位NBも豊富
C
Research / 90チーム / 60日 / 独自時系列
△ 条件付き 90チームなら Gold は上位10位=メダル現実的。独自フォーマット理解に時間がかかる。時系列の学習目的があるなら価値大
🎯
結論: この段階では シナリオB を最優先、時間があれば シナリオC も学習目的で並行。シナリオA は資源・時間の面で見送り。

🪜 Step-by-Step 解説

1コンペ選びは「3軸」で考える

勝てるか × 学べるか × 終わるか。3つすべてが◎である必要はないが、2つが×のコンペは避ける。特に「終わるか」を軽視した途中放棄が最も多い失敗。

2--csv でメタ情報を機械処理可能にする

$ kaggle competitions list --csv --sort-by latestDeadline
📄
なぜ --csv か? → デフォルトの表形式は目視用。--csv なら pd.read_csv でそのまま DataFrame 化でき、スコアリングを自動化できる。

3締切日数「14〜45日」が理想の理由

残り日数問題
14日未満環境構築・EDA・特徴量工学・チューニングを回す時間が足りない
14〜45日一通りの試行錯誤を回せる理想的な期間
45日超モチベ維持が難しく、中だるみで終盤に慌てる

4参加チーム数とメダルの関係

参加チーム数特徴Expert 志望者への推奨
〜100過疎・メダルは易しいが学び少
500〜1500競争と学習のバランスが良い
3000+激戦・上位は Master/GM だらけ△(学び目的なら○)

5「メダル vs 学習」の目的を明確にする

💡
メダルが目的 → 参加者中規模・Tabular・得意分野を選ぶ。学習が目的 → 激戦コンペでも上位NBを写経して技術を吸収する。両者は矛盾せず、Expert までは「メダル寄り」、Master 以降は「難コンペで技術を磨く」に軸を移すのが定石。

🧮「上位10%」を絶対順位に直す(文系向け)

📐
Gold の条件「上位10%」は参加者数によって難易度が激変します。参加者が増えるほど「割合」ではなく「絶対順位」で評価されるため、大規模コンペの Gold は桁違いに難しくなります。
# 参加者数ごとの Gold ライン
参加  100 チーム → 上位10% = 10位以内
参加 1000 チーム → 「上位10位 + 0.2%」に切替
                → 10 + (1000 × 0.002) = 12位以内が Gold

参加者数 vs Gold に必要な絶対順位(少人数コンペほど有利)

参加チーム数 Gold 必要順位 10位 100 12位 1000 16位 3000 20位 5000

※ 中規模コンペは「割合枠」が効くため相対的に Gold が取りやすい局面がある。これが「中規模を狙う」戦略の数学的根拠。

🏆 Kaggleでの実践的な使い方

コンペ選定の実務フロー

📋 一覧取得 list --csv 📊 スコアリング 上位抽出 📖 精読 Overview/Data/Disc 🔍 指標確認 最適化できるか 🎯 1つに集中 掛け持ち禁止

Expert を最短で取るための現実的な戦略

戦略内容
Playground で型を作る毎月の Playground Series で特徴量工学・アンサンブルを高速反復
メダルは中規模 Featured参加 500〜1500 の Tabular Featured を狙う
1つに集中掛け持ちせず、1コンペを最後まで走り切る
Discussion を毎日読む上位の考え方・リーク情報・トレンドを吸収

⚠️ よくある誤解・ミス

誤解・ミスなぜ起こるか正しい理解
賞金額でコンペを選ぶ 「高額=良コンペ」と思う 賞金が高いほど激戦。メダルは逆に取りにくい
全コンペに登録して掛け持ち 「多く出れば1つは当たる」 分散すると全て中途半端。1つに集中が鉄則
締切間際のコンペに飛び込む 「今すぐ何か始めたい」焦り 環境構築だけで締切が来る。14日以上残るものを選ぶ
Playground をメダル目的で頑張る メダル対象と勘違い Playground はメダル対象外。学習リソースとして使う
画像/NLP を無料枠で始める 得意分野を無視して流行を追う 資源不足で途中挫折。Expert までは Tabular 優先

🚀 次のステップ

  • 発展: 実際に kaggle competitions list --csv を実行し、今開催中のコンペにスコアを付けて「自分が参加すべき1つ」を選んでみる
  • 次回予告: Phase 3 総復習「Kaggleコンペに参加し、Bronzeメダル圏内を目指す」(Day 089)— いよいよ Phase 4(青帯・GBDT)への橋渡し

📝 自己評価(解いた後に記入)

自分の回答・気づき・メモ: