Konwinski Prize コンペティション分析ノート

## はじめに
このノートブックでは、KaggleのKonwinski Prize コンペティションのデータ分析と基本的な理解を目指します。

### コンペティションの概要
- GitHubの新規Issueの90%を解決できるAIの開発が目標
- 賞金総額: $1,225,000
- オープンソースコードとオープンウェイトモデルのみが対象
- 評価期間: 2024年12月11日 - 2025年3月12日
<!-- #endregion -->

```python _uuid="215a124c-1197-4e7e-8043-10a1f870a6f8" _cell_guid="cc49fd5c-d0cc-4d7f-966c-6bbc0b73a999" jupyter={"outputs_hidden": false}
# 必要なライブラリのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.io as pio
import plotly.graph_objs as go
import plotly.offline as py
import plotly.express as px
import warnings
warnings.filterwarnings('ignore')
```

<!-- #region _uuid="f260fa3e-6bef-41fa-bd11-86275bef9a95" _cell_guid="a091bcbe-fd6e-40f2-bf8d-79709ee2af8d" jupyter={"outputs_hidden": false} -->
## データの読み込みと確認
まずは提供されているデータを読み込み、その構造を確認します。
<!-- #endregion -->

```python _uuid="959e39fe-8f96-4f6f-8944-1017817368ca" _cell_guid="806c68d2-b8a1-4df9-acf7-ac60a1aad3a7" jupyter={"outputs_hidden": false}
# ZIPファイルの展開とデータの読み込み
!unzip -n ../input/konwinski-prize/data.a_zip
import zipfile
konwinski = zipfile.ZipFile('../input/konwinski-prize/data.a_zip')
konwinski.extractall()
train_data = pd.read_parquet("data/data.parquet")

# データの基本情報を表示
print("データセットの基本情報:")
print(train_data.info())
```

<!-- #region _uuid="93554685-f648-4698-a6a4-a46a5266e73c" _cell_guid="9aba330d-d32e-4f64-9e7f-64e256f47139" jupyter={"outputs_hidden": false} -->
## データの構造
提供されているデータには以下の主要な列が含まれています：

- instance_id: Issue固有の識別子
- repo: 対象のGitHubリポジトリ
- problem_statement: 問題の説明
- patch: 解決用パッチ（トレーニングセットのみ）
- test_patch: テスト用パッチ（トレーニングセットのみ）
<!-- #endregion -->

```python _uuid="5eb2099c-fed6-43da-aea2-c753590bf0bd" _cell_guid="e52420a6-0966-4adf-b5fa-61334e1eca8c" jupyter={"outputs_hidden": false}
# リポジトリの分布を可視化
repo = train_data['repo'].value_counts()
plt.figure(figsize=(10, 6))
plt.pie(repo.values,
        labels=repo.index,
        autopct='%1.1f%%')
plt.title('Distribution of GitHub repositories')
plt.show()
```

<!-- #region _uuid="e1d18f22-9b4d-460f-a6a4-f4eb4f480133" _cell_guid="bf89d53f-1869-417c-84e0-bdd80a22b016" jupyter={"outputs_hidden": false} -->
## 評価指標の説明

スコアは以下の式で計算されます：
```
score = (a - b) / (a + b + c)
```

ここで：
- a: 正しく解決されたIssueの数
- b: 失敗したIssueの数
- c: スキップされたIssueの数
<!-- #endregion -->

<!-- #region _uuid="69347f6a-234b-4081-95ed-89befc6eaf1f" _cell_guid="7220c1d4-c56a-484f-a5a9-a418c89b1cdd" jupyter={"outputs_hidden": false} -->
## SWE-benchデータセットの分析

SWE-benchは、GitHubの実際のソフトウェア課題に対する大規模言語モデルの評価ベンチマークです。
12の人気Pythonリポジトリから集められた2,294のソフトウェアエンジニアリング問題で構成されています。
<!-- #endregion -->

```python _uuid="d2935609-cd0a-4c45-bca4-017b5e522452" _cell_guid="d13d4ffc-d63a-4050-97d3-58e4b18921f9" jupyter={"outputs_hidden": false}
# SWE-benchデータセットの読み込み
from datasets import load_dataset
swebench = load_dataset('princeton-nlp/SWE-bench', split='test')
```

<!-- #region _uuid="03616497-e353-483e-aefb-03e1606a28a7" _cell_guid="4c85b78b-d2be-44d6-857a-74ba4c2dddcd" jupyter={"outputs_hidden": false} -->
## 問題文（Problem Statement）の分析

各Issueの問題文にどのような特徴があるのか、テキスト分析を行います。
<!-- #endregion -->

```python _uuid="7ab04862-2001-4936-b773-c5765a2a5dc9" _cell_guid="c8dbffb2-2dee-49ad-8836-3d647cbbfb42" jupyter={"outputs_hidden": false}
# ワードクラウドの作成
from wordcloud import WordCloud, STOPWORDS

def plot_wordcloud(text, title=""):
    stopwords = set(STOPWORDS)
    more_stopwords = {'one', 'br', 'Po', 'th', 'sayi', 'fo', 'Unknown'}
    stopwords = stopwords.union(more_stopwords)

    wordcloud = WordCloud(
        background_color='white',
        stopwords=stopwords,
        max_words=200,
        max_font_size=100,
        width=800,
        height=400
    ).generate(str(text))
    
    plt.figure(figsize=(24.0, 16.0))
    plt.imshow(wordcloud)
    plt.title(title, fontsize=40)
    plt.axis('off')
    plt.tight_layout()

# 問題文のワードクラウドを表示
plot_wordcloud(train_data["problem_statement"], "Frequently occurring words included in issue sentences")
```

<!-- #region _uuid="f31afcea-adc6-4c70-a906-954ab0163459" _cell_guid="fab4f7f9-8010-4892-bbb3-0d6ca29b67ca" jupyter={"outputs_hidden": false} -->
## Fail to Pass テストの分析

SWE-benchでは、各サンプルに対して2種類のテストが実行されます：

1. FAIL_TO_PASS: 解決前は失敗し、解決後に成功するべきテスト
2. PASS_TO_PASS: 解決前後とも成功するべきテスト

これらのテストは、提案された修正が：
- 問題を実際に解決しているか
- 他の機能を壊していないか
を確認するために使用されます。
<!-- #endregion -->

```python _uuid="97ecd300-43d2-4caf-bac7-039a8246c716" _cell_guid="482c3b5c-e565-4410-96f6-946e5bcc75ff" jupyter={"outputs_hidden": false}
# Fail to Passテストの単語分析
from collections import defaultdict

def generate_ngrams(text, n_gram=1):
    """テキストからn-gramを生成する関数"""
    text = str(text)
    token = [token for token in text.lower().split(" ") 
            if token != "" and token not in STOPWORDS]
    ngrams = zip(*[token[i:] for i in range(n_gram)])
    return [" ".join(ngram) for ngram in ngrams]

# 単語の頻度カウント
freq_dict = defaultdict(int)
for sent in train_data["FAIL_TO_PASS"]:
    for word in generate_ngrams(sent):
        freq_dict[word] += 1

# 頻度順にソート
fd_sorted = pd.DataFrame(sorted(freq_dict.items(), key=lambda x: x[1])[::-1])
fd_sorted.columns = ["word", "wordcount"]

# 上位20単語を表示
plt.figure(figsize=(12, 6))
sns.barplot(data=fd_sorted.head(20), x='wordcount', y='word')
plt.title('Top 20 most frequent words in the FAIL_TO_PASS test')
plt.show()
```

<!-- #region _uuid="3356c93d-61ce-4a28-b3a7-2cfa548821b7" _cell_guid="43fd3b53-2883-44c2-b176-6ebaa77761e4" jupyter={"outputs_hidden": false} -->
## コンペティションの特徴と戦略

### 主要なポイント
1. オープンソース要件
   - 使用するコードとモデルはオープンソースである必要があります
   - 商用モデルは使用できません

2. 評価の特徴
   - 悪いパッチを提出するよりもスキップする方が良い評価となります
   - 90%のスコアで100万ドルの賞金が設定されています

3. 実行環境
   - L4x4マシン（96GB GPU メモリ）が利用可能
   - インターネットアクセスは無効化する必要があります
   - 実行時間は最大9時間（予測フェーズでは24時間）
<!-- #endregion -->

<!-- #region _uuid="286c1e4e-bc2a-4bcd-9e2d-201e0403a781" _cell_guid="90984891-89df-4f05-a6d6-4f02ddee1282" jupyter={"outputs_hidden": false} -->
## まとめと今後の方向性

1. データの特徴
   - 多様なGitHubリポジトリからの実際の問題が含まれています
   - テスト駆動の評価システムが採用されています

2. 取り組むべき課題
   - オープンソースモデルの選定と最適化
   - 効率的なテスト実行の仕組みの構築
   - 問題の自動分類とスキップ戦略の確立

3. 次のステップ
   - ベースラインモデルの構築
   - テストケースの詳細分析
   - 効率的な問題解決パイプラインの開発
<!-- #endregion -->

<!-- #region _uuid="60fb3648-baa1-4408-925f-b9144904b0f2" _cell_guid="286455d3-88bf-4534-a5e6-e26000f03a31" jupyter={"outputs_hidden": false} -->
### 謝辞
- SRK氏のノートブック（https://www.kaggle.com/code/sudalairajkumar/simple-exploration-notebook-qiqc）を参考にさせていただきました
- Prata, Marília のノートブック（https://www.kaggle.com/code/makimakiai/konwinski-metadata-zip-files/）を参考にさせていただきました
- SWE-benchのデータセットを提供していただいたPrinceton NLPチームに感謝いたします
<!-- #endregion -->

## 📒ノートブック

https://www.kaggle.com/code/makimakiai/konwinski-prize