データに関する堅牢性と可読性を向上させるpydanticとpanderaの活用方法の提案
10/15, 15:10–15:40 (Asia/Tokyo), pyconjp_1
言語: 日本語

Pythonで実装される機械学習やデータ分析などのプログラミングでは、扱うデータがドメインに基づくことがとても重要です。そこでは、Pythonが動的型付け言語であるため、扱うデータに対して「意図しないデータの格納を許してしまう」という課題があります。また、扱うデータが複雑だった場合、「ソースコードからデータの仕様を理解できない」という課題もあります。特に、ドメインが重要となるデータを扱う場面ではこれらの課題が顕著に現れます。本発表では、課題を解決するために、扱うデータに対して「堅牢性」と「可読性」を向上させる2つのライブラリ、pydanticとpanderaの活用方法を提案します。また、2つのライブラリを同時に利用する利点を紹介します。さらに、導入という意思決定において把握が必要なリスクについても紹介します。多くの方に課題解決の機会を提供します。


Pythonによって機械学習やデータ分析を活用した、データが重要になるプログラミングが実施されています。そこでは、すべてのデータがドメインに基づいていることが理想です。しかし、理想の実現を目指すにあたって、その担保が難しいことが問題です。その要因を分解すると、以下のような課題が挙げられます。

  • 「堅牢性」に関する課題
    • ドメインに基づくことが重要であろうデータに対して「意図しないデータの格納を許してしまう」
  • 「可読性」に関する課題
    • 扱うデータのドメインおよび仕様が複雑だった場合、「ソースコードからデータの仕様を理解できない」

「堅牢性」については、Pythonが動的型付け言語であるがゆえに注意が必要です。それに加えて、ドメインに詳しくない開発者が、ドメインに基づく異常な値が格納されてしまっていることに気づけない可能性もあります。特に近年では、例えば機械学習の説明可能性について議論がなされており、扱っているデータがドメインに基づいていることの重要性が高まっています。

「可読性」については、扱うデータが豊富で複雑であるほど、有識者やソースコードの実装者に対して属人化してしまう恐れがあります。特にpandasなどが提供するデータフレームを扱う場合、ソースコードからスキーマ(定義)を読み取れないと、複数人による協調作業が困難になり、意図しない処理が実装されてしまう可能性もあります。ソースコードを扱う人が単独であっても、管理するとなると、将来的に「属人化した知識に基づくスキーマ」に関する知識を忘れてしまえば、同様の問題が生じる可能性があります。

上記の課題の対策として、2種のライブラリを紹介します。

  • スキーマの定義に基づきデータのバリデーションを実現するライブラリ“pydantic”
  • スキーマの定義に基づきデータフレームのバリデーションを実現するライブラリ“pandera”

pydanticはデータのスキーマをクラスとして定義し、インスタンスを生成する際のバリデーションを実現するライブラリです。これにより、扱うデータの堅牢性が向上します。それに加え、扱うデータの要件をクラスの要素として定義するため、ドメインに基づいて扱うべきデータがどうあるべきかをコードから読み取ることが可能となるという点で、可読性が向上します。

panderaはデータフレームのバリデーションを実現するライブラリです。カラムの要件をデータフレームのスキーマとして定義します。pydanticと同様の理由で堅牢性と可読性が向上します。panderaのスキーマを定義するためのクラスであるSchemaModelはpydanticを参考に開発されていることもあり、表現方法が類似しています。それゆえ、一方を使うことで他方の導入が簡単になります。特に、panderaはpydanticに依存しており、panderaを導入していれば、既にpydanticの導入における障壁のいくつかを通過していると言えます。また、両ライブラリは完全に互換性があり、相乗効果が期待されます。つまり、これらを同時に使うことが利点に成り得ます。ここまでの内容をソースコードや活用場面を交つつ紹介し、これらライブラリの活用方法を提案します。

さらに、pydanticとpanderaの導入という意思決定において把握しておくべきリスクについても紹介します。新しいものを導入するにあたってリスクが発生します。ここでのリスクとは、例えば、許容する必要のある欠点(パフォーマンス)、各種コスト(学習コスト、リファクタリングコスト)、ライブラリの容量などを意味します。特に、ビジネスにおける要件が定まっていたり、複数人で開発するような場面では、リスクの把握はとても重要です。発表では、導入という意思決定をサポートする目的で、「どれだけのリスクの許容が必要か」、「どのような対応が必要なのか」などについて紹介します。

本発表の構成とタイムラインは以下を予定しています。発表の時間枠について、26分〜30分を見込んでいます。

  • 導入(5min)
    • 自己紹介
    • 背景:機械学習やデータ分析などドメインに基づくデータを扱うプログラミングの共有
    • 課題:背景における「堅牢性」と「可読性」についての課題感の共有
      • 理想の共有
      • 問題(理想と現実のギャップ)の共有
      • 課題(問題を解決するため着目点)として「堅牢性」と「可読性」について、どうあると良いかの共有
    • 提案(導入):pydanticとpanderaの活用の提案
  • 提案(1):スキーマの定義に基づきデータのバリデーションを実現するライブラリ“pydantic”の活用方法の紹介(5min)
    • pydanticの紹介
    • 活用方法の紹介
  • 提案(2):スキーマの定義に基づきデータフレームのバリデーションを実現するライブラリ“pydantic”の活用方法の紹介(5min)
    • pydanticの紹介
    • 活用方法の紹介
  • 提案(3):pydanticとpanderaを同時に利用するにあたっての利点の紹介(5min)
    • 利点・ユースケースの紹介
  • 付録:導入に伴い発生するリスクとその対応の紹介(5min)
    • 導入に伴い発生するリスク(例:許容する必要のある欠点、各種コスト、容量など)
    • 導入に伴い発生するリスクへの対応
  • まとめ (1min)

大学、大学院にて情報工学を専攻する。社会の課題に対するデータ活用について研究をする。福祉、自動運転、ソフトウェア工学など様々なドメインに関わる。2019年、新卒入社し、入社当時からデータ活用について検討、提案をする、2021年より機械学習エンジニアとしてデータ活用に基づくプロダクト開発、データ分析に従事する。機械学習と現実世界のハードルが課題だと考え、機械学習の説明可能性、AutoML、意思決定の支援に活用できそうなこと(論理学など)、そのためのPythonによる開発(ドメインに基づくデータの扱いを実現する開発プロセス)などを学習中である。業務の傍ら、社外でしか得られない情報や経験を得ることを目的として、アウトプットやOSSのコントリビュートなどの活動を実施している。