Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実践的データサイエンス演習 分析・実験・検証の実践的管理方法@神奈川大学 (2025年度)

実践的データサイエンス演習 分析・実験・検証の実践的管理方法@神奈川大学 (2025年度)

神奈川大学「実践的データサイエンス演習」(2025年度)の第08回講義資料です。CRISP-DM、EDA と実験の位置づけ、Jupyter Notebook の長所と限界、実験コードを再現性・追跡性・再利用性の観点からどう改善していくかを扱います。

演習やサンプルコードは以下のページからダウンロード可能です。
https://github.com/HidetoshiKawaguchi/practical-data-scientist-lecture/tree/main/2025/08-experiment-management

2025年度講義資料一覧
・06 ITベンダーにおけるデータサイエンティスト
https://speakerdeck.com/hidetoshikawaguchi/shi-jian-de-detasaiensuyan-xi-itbendaniokerudetasaienteisuto-at-shen-nai-chuan-da-xue-2025nian-du

・07 ドキュメント・コミュニケーション
https://speakerdeck.com/hidetoshikawaguchi/shi-jian-de-detasaiensuyan-xi-dokiyumentokomiyunikesiyon-at-shen-nai-chuan-da-xue-2025nian-du

・08 分析・実験・検証の実践的管理方法
https://speakerdeck.com/hidetoshikawaguchi/shi-jian-de-detasaiensuyan-xi-fen-xi-shi-yan-jian-zheng-noshi-jian-de-guan-li-fang-fa-at-shen-nai-chuan-da-xue-2025nian-du

・09 データサイエンティストの開発技術
https://speakerdeck.com/hidetoshikawaguchi/shi-jian-de-detasaiensuyan-xi-detasaienteisutonokai-fa-ji-shu-at-shen-nai-chuan-da-xue-2025nian-du

※ 01-05や10以降は、別の講師の方が担当しております。

Avatar for Hidetoshi Kawaguchi

Hidetoshi Kawaguchi

March 25, 2026
Tweet

More Decks by Hidetoshi Kawaguchi

Other Decks in Education

Transcript

  1. 自己紹介 • 講師名: 川口 英俊 (かわぐち ひでとし) • 所属: •

    日本IBMシステムズエンジニアリング(株) DXセンター データサイエンスラボ(Experienced Data Scientist) • 情報処理学会 論文誌ジャーナル編集委員会 知能グループ(編集委員, メタ査読者) • 神奈川大学 情報学部 システム数理学科(非常勤講師) • 学位: 博士(情報科学) • 経歴 • 2010年-2014年 広島工業大学 情報学部 知的情報システム学科 (学士) • 2014年-2016年 東京工業大学 総合理工学研究科 知能システム科学専攻博士前期課程 (修士) • 2016年-2023年 日本電信電話株式会社(現: NTT株式会社) • 在籍中2019年-2023年: 北陸先端科学技術大学院大学 先端科学技術研究科 先端情報科学プログラム 博士後期課程(博士) • 2023年 7月より現職 • 専門: 機械学習, データ分析, 自然言語処理, ソフトウェア開発, AWS • 代表的な仕事: • IPSのシグネチャ設定を支援する機械学習の応用研究 • 生成AIと機械学習を利用したVoC (Voice of Customers) 分析パイプライン処理の開発 2 github.com/HidetoshiKawaguchi | 𝕏 @Hidetoshi_RM | in linkedin.com/in/hidetoshi-kawaguchi-380a93281
  2. CRISP-DMとは (1): 概要 CRISP-DMとは、Cross-Industry Standard Process For Data Mining の略称で、データ分析プロセスのフレームワークです。

    7 1.ビジネス理解 2.データ理解 3.データ準備 4.モデリング 5.評価 6.デプロイメント データ
  3. CRISP-DMとは (2): 各フェーズの説明 1. ビジネス理解 解決すべき課題や目的を整理し、データ分析のゴールを明確にする。 2. データ理解 入手したデータを確認し、品質や特徴を把握して分析に使える状態かを判 断する。

    3. データ準備 必要なデータを収集・加工・クレンジングして、モデリングに適した形に 整える。 4. モデリング 機械学習や統計的手法を用いて、目的に合った モデルを構築する。 5. 評価 モデルの性能を評価し、ビジネス課題の 解決に十分かどうかを確認する。 6. デプロイメント 実運用に組み込むための開発作業 8 1.ビジネス理解 2.データ理解 3.データ準備 4.モデリング 5.評価 6.デプロイメント データ
  4. 管理手法の紹介 以下の3ステップに分けて、管理手法を紹介します。 • 前置き・共通事項 • Jupyter Notebookの紹介 • Jupyter Notebookの弱点

    • 残念な管理例 • 管理ルールを作っておくことの意義 • Notebook VS Pythonコード • EDAの管理方法 • コツ(ボリューム小) • 実験の管理方法 • Jupyter Notebookを使わない方法(ボリューム大) 22
  5. 管理手法の紹介 以下の3ステップに分けて、管理手法を紹介します。 • 前置き・共通事項 • Jupyter Notebookの紹介 • Jupyter Notebookの弱点

    • 残念な管理例 • 管理ルールを作っておくことの意義 • Notebook VS Pythonコード • EDAの管理方法 • コツ(ボリューム小) • 実験の管理方法 • Jupyter Notebookを使わない方法(ボリューム大) 23
  6. Jupyter Notebookの弱点 (2) 3. チーム開発に向かない Notebookは差分が表示しづらいため、Git等を使ったバージョン管理が 難しく、チームでの共同開発に向きません。 また、特定のソフトがないと開けないので閲覧も面倒です。 4. 大規模な実験に向かない

    大規模な実験をする場合、複数の計算機を使用して実験することもあり ます。しかし、Notebook単体だとそういった制御ができず、単一マシン 上での実行しかできません。 5. ドキュメントのストーリーの質も低くなりがち コードが混在するため、慣れないうちはストーリーをうまく構築できな 傾向があり、ドキュメントとしての質を確保するのが難しいです。 30
  7. 残念な管理例 最も残念な管理例は、各々のパソコンに以下のようなフォルダ・ Jupyter Notebookのファイルがあることでしょうか • 小売店Aのアンケート分析結果(フォルダ) • B支店のアンケート結果EDAとアンケート分類モデルの実験.ipynb • 電力企業Bの金融分析(フォルダ)

    • EDAと需要予測モデルの実験.ipynb これの問題点 • 各々のパソコンに保存されているので、他の人が閲覧できない • EDAと実験が同じファイル内で行われており、それぞれの品質が低く なりがち 32
  8. Notebook と Pythonコードの特性 NotebookとPythonコードという2つの手段がありますが、それぞれの 特性は以下のとおりです。 • Notebook アドホックな集計や可視化、試行錯誤を繰り返す必要がある初期段階 で活用することに適している。 •

    Pythonコード 大規模な実験・チームでの共有や継続的なメンテナンスが必要な、最 終的なアウトプットの作成に向いています。 ざっくりというと、分析序盤は Notebook, 後半に行くにつれてピュア なPythonコードが向いている、ということになります。 35
  9. 観点 Notebook Pythonコード 再現性 セルの実行順序に依存するため、再現性が保 てない可能性がある。 スクリプト全体が一貫して実行されるため、 再現性が高い コラボレーション 変更点の追跡が難しく、Gitなどでのバージョ

    ン管理が難しい 変更点の追跡が容易で、Gitなどのバージョ ン管理システムで管理がしやすい 構造化 関数やクラスをNotebook内に定義することが 多く、コード全体の見通しが悪くなる事が多 い 関数やクラスとして外部ファイルに分割で きるため、コード全体の構造化や再利用が 可能 試行錯誤 インタラクティブな開発が可能で、試行錯誤 を繰り返しやすい スクリプト全体を実行する必要があり、試 行錯誤が難しい(デバッグツールを活用す ることで緩和できる) 適した段階 試行錯誤を繰り返す必要がある初期段階の作 業に適している チームでの開発や継続的なメンテナンスが 求められる最終アウトプットに適している 適した用途 データ探索、データ可視化 データ前処理、機械学習モデルの開発、プ ロトタイプ開発 Notebook VS Pythonコード 36 ※ 書籍『先輩データサイエンティストからの指南書―実務で生き抜くためのエンジニアリングスキル』に記載されている表をかなり参考にしています。
  10. EDAの管理ルール(2) • ビギナーのうちは自分がやったことを全部説明したくなる → 身近な先輩であれば良いかもですが、お客さんに説明するときは 我慢して、伝えるべきことを厳選しましょう • Notebook はレビューが難しい →

    マークダウン形式のドキュメントにすることで、Github等を使え ばレビューしやすくなります。Wordとかであれば、コメントを残す 機能もあります。 • 実験の報告と分けるべきか? → 実験の結果報告とまとめたドキュメントを作るでもOKです 38
  11. 実験の管理を意識しないと・・・ 気をつけないと以下の恐ろしいことが起きます • お客さんへの説明資料を作成しているときに、実験コードのバグに気 付く。しかもそれが締め切り直前 • コードが複雑過ぎて解読不能になる • 実験結果はあるが何の実験の結果かわからなくなる。 •

    自分のコードを信じられなくなる • コードを継ぎ足していった結果、過去の実験を再現できなくなる。 • そもそも実験結果がデータとして残っていない • 中間処理のコードを書き換えてしまったため、再検証ができない • 数日実行していたプログアムが結果を吐かずにエラーで停止 41
  12. 実験の管理ルール ー手順ー 実験は、以下のステップを1回分として、ID管理をします。 1. 実験の目的をテキストファイルに書く 2. 実験用のコードを書く (Pythonコード) 3. 実験用のコードを実行する

    4. 実施事項や実行した結果の考察等、実験に関するすべてのことをテ キストファイルに書く 5. 実験の改善があればそのこともテキストファイルに書く とにかくテキストファイルに書いておくことが大事です。 書いていないことはやらなかった、くらいに思いましょう。 42
  13. 実験の管理ルール ー原則ー 手順に加えて、以下の原則を守ります。 • 順序を守る 実験用のコードを実行したときは、再実行の前に実験結果のファイル をすべて破棄しましょう。違う処理を得た実験結果のファイルを混ぜ ないためです。 • 完了した実験のコード・データは修正しない

    どんな些細な修正でも、それは別の実験として実施する。このとき過 去のコードはコピペしてOK。ただしこれは、ソフトウェアエンジニ アリングにおいてはNGな行為であり、データサイエンティスト特有 のこととして理解してください。再利用できるコードを書く方が望ま しいです。 43
  14. README.mdの中身 各実験用フォルダの中のREADME.mdに、その実験に関する様々な事 項を書きます。例えば、以下のことです。 • 実験の背景 • 自身が実施した作業や分析の概要 • 実験の再現方法 •

    データのダウンロード方法 • 環境構築方法(仮想環境等) • 実験コードやスクリプトの実行方法 • 実験を通じて得た知見(結論) 書かないよりは書いておきましょう。 45
  15. 残念な実験コードの改善 • 乱数で実行のたびに違う結果になる → Level1: 乱数シードを設定する • ログが標準出力のみでどこにも残らない → Level2:

    ロガーを使ってログを残す • 実験結果が取り出しやすい形で残っていない → Level3: JSON等の構造化された形式で結果を保存する • パラメータを変更・保存できない → Level4: パラメータを管理・保存する • 大量のパラメータに対応できていない → Level5: 色々なパターンのパラメータで大量に実行する • コードの再利用性が考慮されていない → Level6: 処理の一部を関数化する 59
  16. サンプルコードと解説 これから、段階的に実際の コードを見せながら、実装例 を示していきます。 フォルダ構成は右のように なっており、実行の前提とし てください。 60 • README.md

    • exp001 (フォルダ) • level_0.py • level_1.py • level_2.py • level_3.py • level_4.py • level_5_.py • level_5_exp.py • level_6.py • level_6_lib.py • level_6_exp.py • exp002(フォルダ) • exp002.py • svr_exp.py
  17. Level6: 処理の一部を関数化する 再利用する用の関数を別のファイルとする(level_6_lib.py)。 例えば今回だと、以下の関数を作成 • experiment_loggers 実験で使うロガーを返す • init_random_seed 乱数シードを初期化する

    • load_Xy データセットを取得する • evaluate 正解データと予測結果から評価結果を算出する • save_out_json 出力結果をJSONとして保存する 88
  18. 残念な実験コードの改善(再掲) • 乱数で実行のたびに違う結果になる → Level1: 乱数シードを設定する • ログが標準出力のみでどこにも残らない → Level2:

    ロガーを使ってログを残す • 実験結果が取り出しやすい形で残っていない → Level3: JSON等の構造化された形式で結果を保存する • パラメータを変更・保存できない → Level4: パラメータを管理・保存する • 大量のパラメータに対応できていない → Level5: 色々なパターンのパラメータで大量に実行する • コードの再利用性が考慮されていない → Level6: 処理の一部を関数化する 95
  19. 演習・課題 今回の演習では、実験用コードの改善にチャレンジしてもらいます。 • 提出方法: WebClassのレポート機能 • 締め切り: 11/20木 17:09 (次回講義の開始まで)

    • 課題の内容 WebClassからZipファイル (class08_exercise.zip)をダウンロードし、その中にあ るlevel_0.py のコードを、以下の段階に分けて改善して別ファイルとして保存し、 提出すること。 • 備考 • 最低でも1.の提出を義務とする • 作業はZipファイルを展開してできたフォルダ内で行う • 最終的にはできたコードは、データやログとまとめてzipに圧縮して保存・提出すること 1. 乱数シードを設定することで、何度実行しても同じ結果となるように修正して、 level_1.pyとして保存すること。 2. すべての標準出力(print)をログファイルとして残すようにlevel_1_.pyを修正し て、level_2.pyとして保存すること。 98
  20. 課題 3. 実験結果を、JSON等の構造化された形式の結果ファイルとして残すよう に、level_2.pyを修正して、level_3.pyとして保存すること。 4. 実行時にMLPRegressorのハイパーパラメータを設定できるように、 level_3.pyを修正して、level_4.pyとして保存すること 5. level_4.pyで以下のハイパーパラメータの組み合わせを総当たり実行する プログラムを書き、level_5.pyとして保存すること

    • learning_rate_init: 0.001, 0.01, 0.1 • hidden_layer_sizes: (100,), (1000, 100), (10,) • activation: “relu”, “tanh”, “logistic”, “identity” 6. 5.までで作成されたプログラムを対象に、処理の一部を再利用できる関 数として同様の処理をできるようにすること。最低2つ以上の関数を作成 するものとする。ファイル名はlevel_6.pyとして保存すること。この時、 関数は別ファイルにしても良いが同じファイル内に入れるでも良い 99
  21. 課題 3. 実験結果を、JSON等の構造化された形式の結果ファイルとして残すよう に、level_2.pyを修正して、level_3.pyとして保存すること。 4. 実行時にMLPRegressorのハイパーパラメータを設定できるように、 level_3.pyを修正して、level_4.pyとして保存すること 5. level_4.pyで以下のハイパーパラメータの組み合わせを総当たり実行する プログラムを書き、level_5.pyとして保存すること

    • learning_rate_init: 0.001, 0.01, 0.1 • hidden_layer_sizes: (100,), (1000, 100), (10,) • activation: “relu”, “tanh”, “logistic”, “identity” 6. 5.までで作成されたプログラムを対象に、処理の一部を再利用できる関 数として同様の処理をできるようにすること。最低2つ以上の関数を作成 するものとする。ファイル名はlevel_6.pyとして保存すること。この時、 関数は別ファイルにしても良いが同じファイル内に入れるでも良い 100
  22. 101 from pathlib import Path import pandas as pd from

    sklearn.metrics import mean_absolute_error, r2_score, root_mean_squared_error from sklearn.model_selection import train_test_split from sklearn.neural_network import MLPRegressor from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler # データの準備 print("Data preparation...") csv_path = Path(__file__).parent / "data" / "wine+quality" / "winequality-red.csv" df = pd.read_csv(csv_path, sep=";") X = df.drop(columns=["quality"]) y = df["quality"].astype(float) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # モデルの準備・学習 print("Model preparation and training...") pipe_list = [ ("scaler", StandardScaler()), ( "mlp", MLPRegressor( learning_rate_init=0.001, hidden_layer_sizes=(100,), # 1層100ノード activation="relu", ), ), ] pipe = Pipeline(pipe_list) pipe.fit(X_train, y_train) # 予測と評価 print("Prediction and evaluation...") pred = pipe.predict(X_test) print(f"RMSE: {root_mean_squared_error(y_test, pred):.4f}") print(f"MAE : {mean_absolute_error(y_test, pred):.4f}") print(f"R^2 : {r2_score(y_test, pred):.4f}") level_0.py
  23. level_0.pyの実行方法 以下の手順で実行できます。 • Zipファイルを展開し、作成されるフォルダに移動 • `unzip class08_exercise.zip -d class08_exercise` •

    `cd class08_exercise` • `python -m venv .venv_class08`を実行 • `source .venv_class08/bin/activate`を実行 • `pip install -r requirements.txt` を実行 • `python level_0.py`を実行 102