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

実践的データサイエンス演習 データサイエンティストの開発技術@神奈川大学 (2025年度)

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

実践的データサイエンス演習 データサイエンティストの開発技術@神奈川大学 (2025年度)

神奈川大学「実践的データサイエンス演習」(2025年度)の第09回講義資料です。
Python の型ヒント、PEP 8、`mypy`、`flake8`、`black`、`isort`、`pytest` を題材に、実務で最低限必要になるソフトウェアエンジニアリングの基礎を扱います。

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

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. 実際に起こった(起こり得る)問題 データサイエンティストのエンジニアリング不足によって、以下のよ うな問題が起こります。 • 機械学習モデルのPoC (Proof of Concept)のコードが汚くてITエン ジニアが解読困難 •

    開発スケジュールがタイトで、PoCのコードをほぼそのまま使う必要 が出てくる • データサイエンティストがシステムのコアな部分を担当しても、品質 が低くバグが多発 10
  3. Pythonの特徴 Pythonは動的型付けの言語であり、変数に型を明示的に宣言する必要があ りません。 • メリット • 軽快にコーディングでき、以下の用途に向いている • プロトタイピング •

    データ解析のような探索的作業 • デメリット • 読みづらいコードになる • 変数の型がわからず、読み手が理解しづらい • IDEや静的解析ツールの補助が弱くなる • 実行時エラーになりやすい • 型の不一致がコンパイル時には検出されなく、実行して初めてエラーとして気づく Pythonはすぐに動くが、長期的には読みづらく壊れやすい → 実は本格的な開発には工夫が必要です。 13
  4. 型ヒント導入のメリット 実際の開発で役立つたくさんのメリットがあります。開発はもちろん のこと、分析・実験・検証用コードでも必須レベル • 読み手のコード理解を助ける • 自分も後で見返す時助かります • コードエディタの補完に役立つ •

    静的解析ツールを使うことで、実行前にエラーに気づける 学生の皆さんは、研究の実験で使う場合、そのコードにも積極的に書 いて慣れておくことをお勧めします。 16
  5. 色々な型ヒント (2) • dict (辞書型, 連想配列) 括弧 [] でキーとバリューを指定します。 •

    複数(または)の型 | (パイプ)で「または」の値、という表現ができます。 以下の例は、返り値が float か str のいずれかです。 18
  6. コーディング規約 コーディング規約とは、プログラムを書くときのルールや約束事をま とめたものです。 目的 • チーム全体で統一感のあるコードを書くため • 可読性を高め、レビューや保守を楽にするため • バグを減らし、品質を安定させるため

    代表的な内容 • インデントの幅(Pythonはスペース4つが基本) • 変数や関数の名前の付け方(スネークケース my_variable など) • 行の長さ(PEP8では1行79文字が推奨) • 空行やコメントの書き方 • インポート文の並び順 21
  7. 代表的なコーディング規約 PEP8 事実上のスタンダードであるコーディング規約に、PEP8 (Python Enhancement Proposal 8)というものがあります。 • Python公式が推奨するコーディング規約 •

    Pythonコードを「読みやすく」「統一的に」書くためのルールをま とめた文書 • Pythonを作った Guido van Rossum が執筆(2001年)し、その後も メンテナンスされてきた 22
  8. PEP8の代表的なルール PEP8のルールを以下に抜粋して紹介します。 • インデント: スペース4つ (タブは使わない) • 行の長さ: 1行79文字 •

    スペース: =, +, - などの前後にスペースを入れる • 空行: • 関数やクラス定義の前は2行空ける • 関数内では関連する処理を区切るために1行空ける • 名前付け • 変数・関数名はスネークケース (例 user_name) • クラス名はキャメルケース (例 UserProfile) • 定数は 全て大文字 (例 MAX_RETRY) • インポート • 標準ライブラリ → サードパーティ → 自作モジュールの順でまとめる • 1行に複数の import を書かない 他にもたくさんあります! 23
  9. コードの品質を高めるツール コードの品質を高めるツールとして、以下の3つがあります。 • 静的型チェッカー 型ヒントに基づいてコードの「意味的な正しさ」を検証する • 代表例 mypy • リンター

    (Linter) コードの規約違反や潜在的なバグを検出するツール • 代表例: flake8 • フォーマッター (Formatter) コードの見た目を自動整形するツール • 代表例: black, isort 26
  10. isortの紹介 import 文を自動でソート・整形してくれるフォーマッター • PEP8準拠 • アルファベット順に並び替え • import の種類ごとにグループ分け

    • 標準ライブラリ • サードパーティライブラリ(pip でインストールしたもの) • 自作モジュール • 余分なスペースや順序の乱れも修正 35
  11. 実践的なツールの使い方 コードを一通り書いた後に、以下の流れを実行するのが鉄板 • Black と isort を適用して整える • flake8 と

    mypyでチェックし、指摘があれば修正する これでかなり他の人にとっても読みやすいコードになる。 37
  12. テストコードの種類 大きく分けて以下の3種類のテストがあります • 単体テスト (Unit Test) • 最小の部品(関数・クラス)を対象 • 狙い:

    小さなバグを早期に発見 • 結合テスト (Integration Test) • 複数の部品を組み合わせた処理を対象 • 狙い: モジュール間のやりとりが正しいか確認 • E2Eテスト (End-toEnd Test) • ソフトウェア・システム全体を通して動かすテスト • ユーザ視点で全体が期待通りか確認 47
  13. 単体テスト 結合テスト テスト・ピラミッド 48 E2E テスト テスト・ケースの数 エンド・ユーザの 観点の近さ 単体テスト〜E2Eテストの関係を示すと、単体テストほどテスト・

    ケースの数が多くフィードバックが迅速、E2Eテストはエンド・ユー ザに近く、エラーへの保護能力が高い エラーへの保護 迅速なフィードバック
  14. 使うテストフレームワーク: pytest pytestとは 最も普及しているPythonのテストフレームワークです。 • シンプル: ただ関数を書いて assert するだけ •

    自動検出: test_ で始まる関数やファイルを自動で見つける • 豊富な機能 • 複数ケースを一気にテスト • 前処理・後処理を簡単に共通化 • 一時フォルダの利用も簡単 • エラーメッセージがわかりやすい 51
  15. pytestのルール: フォルダ構造 pytestでは、以下のフォルダ構造を基本とします。ここでは、 mypackageというモジュール名で、その中に、mathutils.pyという本 体コードがある前提とします • mypackage/ • mathutils.py •

    tests/ • test_mathutils.py • __init__.py フォルダのルートにtestsディレクトリを置き、本体とは完全に独立さ せることがポイント 52 本体コード テストコード • ファイル名や関数名の規則に従ってpytestがテストであることを自 動検出する • __init__.py はおまじない
  16. pytestの実行例 –実行- 54 以下の動作実行例では、 • add関数の動作はOK • sub関数の動作はNG • 3-2=1の値となることをテストケースでは期待している

    • しかし、sub関数の中身にバグがあり、6が返ってきている コードのバグをテスト失敗 として検出
  17. pytestの基本ルール pytestでは、実行時に以下のルールで全てのコードからテストを自動 で検出し、assert で判定を行う。 テストコードの検出 • test_*.pyまたは *_test.py というファイル名 •

    これらの中の test_ で始まる関数を自動実行 • クラスの場合は Test で始まるクラスの中の test_* メソッドを実行 テストの判定 • assert で真偽値判定 (Trueなら成功, Falseなら 失敗) • assert 自体は pythonの標準機能(デバッグ・テスト用) • pytest以外で assert が Falseの時は AssertionError という例外をあげる 55
  18. 単体テストの基本的な考え方 前提となるインプット(引数)と期待するアウトプット(返り値)の ペアを用意しておき、実装した関数の結果と比較して正しいかを確認 する。 先の例だと、以下の考えをコードとして書いている。 • 「add 関数の場合は、3 と 2を引数とすると

    5が返るはず」 • 「sub 関数の場合は、3 と 2を引数とすると 1が返るはず」 テストコードを書かないとき、皆さんも関数の動作確認をするときに 同様に考えているはずです。それをそのままコードで実行できるよう にします。 56
  19. そのほかのpytestの便利な機能 • conftest.py • プロジェクト全体で共有するfixtureや設定を書く特別ファイル • import なしで自動的に認識される • 組み込みfixture

    (デフォルトで備わっているfixture) • tmp_path/tmpdir: 毎回クリーンな一時ディレクトリを提供 • capsys/cafd: stdout/stderrの出力をキャプチャ • monkeypatch: 環境変数や属性を一時的に変更 • マーカー機能: タグ付けのような機能 • 実行時に特定のマーカーだけついたテストだけ実行のような使い方 • 例外のテスト • プラグイン機能 調べると大抵の機能はあります。 60
  20. おすすめ参考書籍 • リーダブルコード―より良いコードを書くためのシンプルで実践的なテクニック • Dustin Boswell、Trevor Foucher 著、角 征典 訳

    • オライリー • ロングセラー。薄くて読みやすい。1回は目を通すこと • 単体テストの考え方/使い方 プロジェクトの持続可能な成長を実現するための戦略 • Vladimir Khorikov 著、須田 智之 訳 • マイナビブックス • 単体テストだけじゃなくて、テストの考え方が よくわかる 63
  21. 演習・課題 コードの修正とテストコードの作成にチャレンジしてもらいます。 • 提出方法: WebClassのレポート機能 • 締め切り: 11/27木 17:09 (次回講義の開始まで)

    • 課題の内容 WebClassからZipファイル (class09_exercise.zip)をダウンロードし、 その中にあるコードを、以降のスライドの演習内容に応じて編集して 保存し、提出すること。 • 備考 • 作業はZipファイルを展開してできたフォルダ内で行う • 最終的にはできたコードは、データやログとまとめてzipに圧縮して保存・提 出すること 64
  22. 課題用コードの実行方法 以下の手順で実行できます。 • Zipファイルを展開し、作成されるフォルダに移動 • `unzip class09_exercise.zip -d class09_exercise` •

    `cd class09_exercise` • `python -m venv .venv_class09`を実行 • `source .venv_class09/bin/activate`を実行 • `pip install -r requirements.txt` を実行 これで、flake8, mypy, pytestが実行可能になる。 65
  23. 演習1-2 68 exercise_1_2.py import math, sys def discounted(price, rate =

    0.1): if rate<0 or rate>1:print("invalid") return price*(1-rate)
  24. 演習1-3 69 import math, sys def parse_prices(prices): result = {}

    for k,v in prices.items(): try: if isinstance(v,str): x=float(v) else: x=float(v) except Exception as e: x=0.0 result[k]=x return result def stats(nums): n=len(nums); if n==0: return {"count":0,"mean":0.0,"stdev":0.0} mean=sum(nums)/n s=0.0 for x in nums: s+= (x-mean)**2 stdev= math.sqrt(s/n) if n>1 else 0.0 return {"count":n,"mean":mean,"stdev":stdev} class User: def __init__(self,name,scores:list[float]): self.name=name; self.scores=scores def avg(self): if not self.scores: return 0.0 return sum(self.scores)/len(self.scores) exercise_1_3.py
  25. 演習2-1: 偶奇判定関数 関数 is_evalをテストするコード、test_is_evenを以下の条件で完成させよ。 • is_even関数は、与えられた整数値が偶数ならTrueを、奇数ならFalseを返す関数 • 例えば 2なら True,

    1ならFalseを返す • parametrizeを使って複数の整数入力に対して正しい結果になるか確認すること • 正の数・負の数・0なども含めること 確認用コマンド pytest exercise_2_1_test.py 71 def is_even(n: int) -> bool: return n % 2 == 0 def test_is_even(...) -> None: ... exercise_2_1_test.py
  26. 演習2-2: 文字列の反転 関数 reverse_stringをテストするコード、test_reverse_stringを以下の条件で完成させよ。 • reverse_stringは、与えられた文字列(str)を反転して返す関数 • 例えば “ABCD”を与えられたなら、”DCBA”を返す •

    parametrize を使い、空文字・1文字・複数文字を含む複数のケースを網羅すること。 確認用コマンド pytest exercise_2_1_test.py 72 def reverse_string(s: str) -> str: return s[::-1] def test_reverse_string(...) -> None: ... exercise_2_2_test.py
  27. 演習2-3: テキストファイルの行数カウント 関数 count_linesをテストするコード、test_count_linesを以下の条件で完成させよ。 • テキストファイルはテストコードの中で作成・保存し、テスト完了後に削除すること • わかる人は組み込みfixtureのtmp_pathかtmpdir を使うと簡単 •

    最低限、以下の3種類のテキストファイルをテストすること • 空のテキストファイル • 1行だけのテキストファイル • 2行以上のテキストファイル 確認用コマンド pytest exercise_2_1_test.py 73 def count_lines(path: str) -> int: with open(path, "r", encoding="utf-8") as f: return sum(1 for _ in f) def test_count_lines(...) -> None: ... exercise_2_3_test.py
  28. まとめ これまでに学んだは、データサイエンティストの実践的なノウハウで す。 • ドキュメント・コミュニケーション • 分析・実験・検証の管理手法 • コーディング規約・テストコード 適切に分析・実験・検証を行うことで知見を積み上げ、正しく伝わる

    ドキュメントをまとめ社内外の他者に繋げる、信頼できるソフトウェ ア・システムを作るための必須ノウハウです。 データサイエンティストになる人にとって、就職後にこれまで学んだ ことが少しでも活きると幸いです 74