Skip to content

Conversation

@tak-ka3
Copy link
Collaborator

@tak-ka3 tak-ka3 commented Oct 9, 2025

背景

具体的にどのようなことができるかを想起できる形の応用的なチュートリアルの作成を行った。

チケット

https://www.notion.so/acompany-ac/23f269d85586808fb8bcd7d564cd6d82

Summary by CodeRabbit

  • 動作確認

    • チュートリアル変更を基本版へ適用後、E2Eを実行し問題ないことを確認済み。
  • ドキュメント

    • 高度なAPCクロステーブルのチュートリアルを追加。銀行と高級時計企業のデータを題材に、背景・データ説明・期待結果を解説。
    • IDベースの安全な照合手順、クロスタブ生成の実行例と出力解釈、読みやすさ向上オプション、他ドメインへの応用例を収録。

@tak-ka3 tak-ka3 requested a review from a team as a code owner October 9, 2025 11:12
@coderabbitai
Copy link

coderabbitai bot commented Oct 9, 2025

Walkthrough

銀行データと高級時計データのIDベース安全マッチング(セーフジョイン)とその後の集計によるクロス表生成を説明する新規Jupyter Notebookを追加。

Changes

Cohort / File(s) Summary of Changes
Advanced APC Cross-Table Tutorial
notebooks/tutorial/advanced_apc_cli_tutorial_cross_table.ipynb
新規Notebook追加。背景、両データセットのスキーマ、IDベースの安全なマッチング(セーフジョイン)アルゴリズム、CLI実行手順(パス・ハンドラ調整含む)、例出力と解釈、代替適用領域を記載。公開API宣言の変更なし。

Sequence Diagram(s)

sequenceDiagram
    autonumber
    actor U as User
    participant CLI as APC CLI
    participant L as Data Loader
    participant N as Normalizer
    participant M as ID Matcher
    participant SJ as Safe Join
    participant C as Counter
    participant O as Output (Cross-Table)

    U->>CLI: 実行(入力パス・ハンドラ指定)
    CLI->>L: 銀行データ/時計データ読み込み
    L-->>N: 生データ
    N-->>CLI: 正規化済みデータ
    CLI->>M: レコードIDマッチング要求
    M-->>CLI: マッチ結果(リンク情報のみ)
    CLI->>SJ: セーフジョイン(最小限公開データ)
    SJ-->>CLI: 結合済み集計データ
    CLI->>C: 集計・クロスタブ生成
    C-->>O: クロス表(例出力)
    O-->>U: 表と解釈提示

    rect rgba(200,230,255,0.25)
    note over M,SJ: 変更箇所:プライバシー重視のIDマッチング→セーフジョイン→集計フローを明示
    end
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

ぴょんと跳んでデータを繋ぐよ、
銀行と時計、そっと指を絡め。
IDは秘密、でも表は開く🔐
行と列が出会って答えを歌う。
にんじん片手に解析お祝い🥕✨

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed PRタイトル「[CC-795] 応用チュートリアルの追加」は、変更セットの主要な目的を正確に反映しています。生ファイルサマリーと目的説明から、このPRは新しいノートブック(応用チュートリアル)の追加という単一の明確な変更を行っていることが確認できます。タイトルは簡潔で、チケット参照を含みながらも、具体的な内容(応用チュートリアルの追加)を明確に伝えており、チームメンバーが履歴をスキャンする際に主要な変更を理解できます。
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/hiraoka/CC-795/create-advanced-docs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@sakamoto-souta sakamoto-souta left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

概ね良いと思いますが、分析結果の考察が急に出てくるのには難しさを感じる場合もあると思います
クロステーブル→分析結果 の作成のところで、「例えば最近なら LLM にこの表を食わせることで簡単にこのような図や分析結果を得ることができます」みたいなクッションがあると嬉しいです

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
notebooks/tutorial/advanced_apc_cli_tutorial_cross_table.ipynb (1)

1-214: 実行可能なコードセルの追加を検討してください(任意)。

このノートブックは現在すべてマークダウンセルで構成されており、実行可能なコードは含まれていません。基本チュートリアルを参照する設計は理解できますが、以下を追加することでユーザーエクスペリエンスが向上する可能性があります:

  • 環境変数設定の例を示すコードセル
  • 結果の可視化やLLM分析のサンプルコード
  • パスの検証を行う簡単なスクリプト

ただし、基本チュートリアルで実行方法を既に説明している場合は、現在の構成でも問題ありません。

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 9bc96f3 and 0cfc9e6.

📒 Files selected for processing (1)
  • notebooks/tutorial/advanced_apc_cli_tutorial_cross_table.ipynb (1 hunks)
🔇 Additional comments (5)
notebooks/tutorial/advanced_apc_cli_tutorial_cross_table.ipynb (5)

29-52: LGTM!

データスキーマの説明は明確で、銀行データと高級時計会社データの両方の属性が適切に記載されています。期待される分析結果も具体的で理解しやすい構成です。


104-143: LGTM!

クロス集計結果の例示と解釈が明確で、number_of_rows と各カラムのプレフィックス(0: は銀行データ、1: は高級時計会社データ)の説明が分かりやすいです。具体的な行の解釈例も理解を助けます。


144-205: LGTM!

分析結果の考察セクションは非常に充実しており、以下の点が優れています:

  • LLMを活用した分析の提案が実用的
  • 4つの具体的な顧客セグメントとアクション例が明確
  • 5つの他業界での応用例が多様で参考になる

各ユースケースに対して「目的」「例」「得られる知見」が構造化されており、読者が自身のビジネスに応用しやすい内容です。


65-65: 画像ファイルのパスは正しく、ファイルが存在することを確認しました。

スクリプト実行結果から、参照されている画像ファイル (../img/cross_table_overview.svg) は notebooks/tutorial/ ディレクトリからの相対パスで正しく解決され、実際のファイルが ./notebooks/img/cross_table_overview.svg に存在することが確認されました。このため、ファイルパスは正確かつ有効です。


11-11: 基本チュートリアルファイルの存在確認済み
参照されている basic_apc_cli_tutorial.ipynbnotebooks/tutorial/ に存在することを確認しました。

Comment on lines +80 to +95
"- **関数のパス**: `FUNCTION_SOURCE_PATH=../../functions/cross_table`\n",
"- **入力データのパス**:\n",
" - `INPUT_1_PATH=../../functions/cross_table/inputs/bank_input`(銀行データ)\n",
" - `INPUT_2_PATH=../../functions/cross_table/inputs/luxury_watch_input`(高級時計会社データ)\n",
"- **handler.pyで読み込むファイル名**: `functions/cross_table/function/handler.py`内の入力ファイル名を以下のように変更:\n",
" ```python\n",
" # 変更前\n",
" df_cross_table = cross_table_data(\n",
" f\"{INPUT_1_DIR}/input_1.csv\", f\"{INPUT_2_DIR}/input_2.csv\"\n",
" )\n",
" \n",
" # 変更後\n",
" df_cross_table = cross_table_data(\n",
" f\"{INPUT_1_DIR}/data.csv\", f\"{INPUT_2_DIR}/data.csv\"\n",
" )\n",
" ```\n",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

handler.pyのパスとファイル名の変更が正しいか確認してください。

functions/cross_table/function/handler.py のファイルパスと、その中での入力ファイル名の変更(input_1.csv/input_2.csv から data.csv へ)が正しいことを確認してください。

以下のスクリプトを実行して、handler.pyの存在と現在の実装を確認してください:


🏁 Script executed:

#!/bin/bash
# handler.pyの存在確認と内容の確認
if [ -f "functions/cross_table/function/handler.py" ]; then
  echo "=== handler.py found ==="
  # 入力ファイル名の使用箇所を確認
  rg -n "input_[12]\.csv|data\.csv" functions/cross_table/function/handler.py
else
  echo "handler.py not found at expected path"
fi

# 入力データファイルの存在も確認
echo "=== Checking input data files ==="
fd -t f "data.csv" functions/cross_table/inputs/

Length of output: 238


handler.pyの入力ファイル名をdata.csvに更新
functions/cross_table/function/handler.pyの72行目で、input_1.csv/input_2.csvをそれぞれdata.csvに置換してください。

🤖 Prompt for AI Agents
In notebooks/tutorial/advanced_apc_cli_tutorial_cross_table.ipynb around lines
80 to 95, update the referenced input filenames used by the cross_table_data
call in functions/cross_table/function/handler.py: locate line 72 in
functions/cross_table/function/handler.py and replace the two occurrences of
"input_1.csv" and "input_2.csv" with "data.csv" so the call reads
cross_table_data(f"{INPUT_1_DIR}/data.csv", f"{INPUT_2_DIR}/data.csv"); keep the
directory variables unchanged.

@tak-ka3
Copy link
Collaborator Author

tak-ka3 commented Oct 16, 2025

@sakamoto-souta

分析のヒント: 最近では、このようなクロス集計表をLLM(大規模言語モデル)に入力することで、簡単に傾向分析や顧客セグメントの可視化を行うことができます。例えば、CSV形式の結果をChatGPTやClaudeに貼り付けて「この顧客データから得られる知見をまとめてください」と尋ねるだけで、以下のような分析結果が得られます。

という文章を加えました。なぜかJupyterNotebookのJSON構造も変化しており(JupyterNotebook上のUIに変化はない)、それも差分に含まれてしまっていたため、ここで追加した文章の差分について言及しています。

@tak-ka3 tak-ka3 requested review from a team and sakamoto-souta October 16, 2025 04:38
@tak-ka3 tak-ka3 requested a review from a team October 17, 2025 05:12
@tak-ka3
Copy link
Collaborator Author

tak-ka3 commented Oct 20, 2025

@sakamoto-souta
FB反映しました。
1b0462e

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
notebooks/tutorial/advanced_apc_cli_tutorial_cross_table.ipynb (1)

148-184: 分析の考察が実務的で有用です。

クロス集計表から得られる4つの知見とそれぞれのアクション例が具体的で、マーケティング施策に直結する内容となっています。

任意の改善提案: PRコメントで言及されている「LLMを使った分析のヒント」をこのセクションに追加することで、ユーザーがより深い洞察を得やすくなります。例:「このCSV結果をChatGPTやClaudeに入力して追加の分析を依頼することも可能です」といった一文を追加することを検討してください。

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 773520c and 1b0462e.

⛔ Files ignored due to path filters (1)
  • notebooks/img/cross_table_overview.svg is excluded by !**/*.svg
📒 Files selected for processing (1)
  • notebooks/tutorial/advanced_apc_cli_tutorial_cross_table.ipynb (1 hunks)
🔇 Additional comments (6)
notebooks/tutorial/advanced_apc_cli_tutorial_cross_table.ipynb (6)

33-50: データスキーマの説明が明確です。

銀行データと高級時計会社データの各フィールドが適切に説明されており、期待される分析結果も具体的で理解しやすいです。


114-141: 結果例とその解説が分かりやすいです。

CSV形式の出力例が具体的で、各列の意味(0: が銀行データ、1: が高級時計会社データ)が明確に説明されています。具体的な行の解釈例も理解を助けます。


193-240: 他の応用ユースケースの提示が効果的です。

5つの異なるドメインでの応用例が具体的に示されており、クロス集計分析の汎用性と価値が明確に伝わります。各ユースケースが「目的」「例」「得られる知見」の形式で統一されており、理解しやすい構成です。


245-252: Notebookメタデータは適切です。

標準的なJupyter Notebookのメタデータ構造で、問題ありません。


65-65: 画像ファイルは正常に存在しています。

スクリプトの実行結果により、参照されている ../img/cross_table_overview.svg ファイルが正常に存在することが確認されました。ノートブックの場所(notebooks/tutorial/)から相対パスで指定された ../img/cross_table_overview.svg は、notebooks/img/cross_table_overview.svg に正しく解決されており、ファイルは実際に存在します。このため、画像参照に関する問題は発生していません。


11-11: 基本チュートリアルファイルの確認完了 - 参照されているファイルは存在しています。

検証により、./basic_apc_cli_tutorial.ipynb の存在が確認されました。相対パス(./)の使用は Jupyter Notebook のベストプラクティスであり、このノートブックの参照方法は適切です。

Comment on lines +84 to +95
"- **handler.pyで読み込むファイル名**: `functions/cross_table/function/handler.py`内の入力ファイル名を以下のように変更:\n",
" ```python\n",
" # 変更前\n",
" df_cross_table = cross_table_data(\n",
" f\"{INPUT_1_DIR}/input_1.csv\", f\"{INPUT_2_DIR}/input_2.csv\"\n",
" )\n",
" \n",
" # 変更後\n",
" df_cross_table = cross_table_data(\n",
" f\"{INPUT_1_DIR}/data.csv\", f\"{INPUT_2_DIR}/data.csv\"\n",
" )\n",
" ```\n",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

ソースコードの手動変更をユーザーに求めるのは避けるべきです。

チュートリアルでユーザーに handler.py の直接編集を求めていますが、これは保守性と再現性の観点から問題があります。以下のいずれかの改善を検討してください:

  1. 推奨: handler.py 自体を data.csv を読み込むように更新する
  2. 環境変数や設定ファイルで入力ファイル名を制御できるようにする
  3. このチュートリアル専用の別のハンドラーファイルを用意する

過去のレビューコメントでも同様の指摘がされており、リポジトリ側での対応が望ましいです。

以下のスクリプトを実行して、handler.pyの現在の実装を確認してください:


🏁 Script executed:

#!/bin/bash
# handler.pyの存在確認と入力ファイル名の使用状況を確認
if [ -f "functions/cross_table/function/handler.py" ]; then
  echo "=== handler.py の内容確認 ==="
  rg -n "input_[12]\.csv|data\.csv" functions/cross_table/function/handler.py
else
  echo "✗ handler.py が見つかりません"
fi

# 入力データディレクトリの確認
echo ""
echo "=== 入力データディレクトリの確認 ==="
fd -t d "bank_input|luxury_watch_input" functions/cross_table/inputs/ 2>/dev/null || echo "入力ディレクトリが見つかりません"

# data.csvの存在確認
echo ""
echo "=== data.csv の存在確認 ==="
fd -t f "data.csv" functions/cross_table/inputs/

Length of output: 342



---

🏁 Script executed:

```shell
#!/bin/bash
# Get more context around line 72 in handler.py
echo "=== handler.py context around line 72 ==="
sed -n '60,85p' functions/cross_table/function/handler.py

# Check what INPUT_1_DIR and INPUT_2_DIR are set to
echo ""
echo "=== INPUT directory variable definitions ==="
rg -n "INPUT_[12]_DIR\s*=" functions/cross_table/function/handler.py -A1 -B1

# Check if there's any input_1.csv or input_2.csv anywhere
echo ""
echo "=== Search for input_1.csv or input_2.csv files ==="
fd -t f "input_[12]\.csv" functions/cross_table/

Length of output: 1177



---

🏁 Script executed:

```shell
#!/bin/bash
# Check the full directory structure
echo "=== Complete input directory structure ==="
find functions/cross_table/inputs/ -type f -name "*.csv" | sort

# Check if bank_input/luxury_watch_input directories are new or modified
echo ""
echo "=== Check git status for input directories ==="
git status functions/cross_table/inputs/ 2>/dev/null || echo "Git not available"

# Check for any references to bank_input or luxury_watch_input in handler.py
echo ""
echo "=== References to bank_input/luxury_watch_input in codebase ==="
rg "bank_input|luxury_watch_input" functions/cross_table/function/handler.py

Length of output: 421


チュートリアルの指示は不完全で実行時エラーが発生します。

検証結果により、以下の問題が確認されました:

問題の詳細:

  • handler.py は現在 input_1/input_1.csvinput_2/input_2.csv を参照しています
  • チュートリアルでは data.csv への変更のみを指示していますが、実際のデータ.csvファイルは bank_input/data.csvluxury_watch_input/data.csv にあります
  • ユーザーが指示通りに変更しても、input_1/data.csv を探すことになり、ファイルが見つからずエラーになります

必要な対応:
functions/cross_table/function/handler.py の以下を更新してください:

  • INPUT_1_DIRf"{INPUT_DIR}/bank_input" に変更
  • INPUT_2_DIRf"{INPUT_DIR}/luxury_watch_input" に変更
  • ファイル参照を data.csv に更新

これにより、handler.py がチュートリアルの新しい入力ディレクトリ構造に対応し、ユーザーは手動編集なくチュートリアルを進められます。

🤖 Prompt for AI Agents
In notebooks/tutorial/advanced_apc_cli_tutorial_cross_table.ipynb around lines
84 to 95, the tutorial instructions leave handler.py pointing at incorrect input
paths causing runtime file-not-found errors; update
functions/cross_table/function/handler.py so INPUT_1_DIR is set to
f"{INPUT_DIR}/bank_input" and INPUT_2_DIR is set to
f"{INPUT_DIR}/luxury_watch_input", and change any file references that still
point to input_1.csv/input_2.csv (or input_1/data.csv, input_2/data.csv) to use
data.csv (i.e., read f"{INPUT_1_DIR}/data.csv" and f"{INPUT_2_DIR}/data.csv") so
the handler matches the actual directory layout.

@tak-ka3 tak-ka3 requested a review from a team October 20, 2025 09:07
@sakamoto-souta sakamoto-souta merged commit e294557 into main Oct 20, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants