この度は、本書『Streamlit入門 Pythonで学ぶデータ可視化&アプリ開発ガイド』を手に取っていただき、誠にありがとうございます。
本書は、Streamlitを活用してデータ可視化アプリケーションを作成するための手順や方法を、丁寧かつ詳細に解説することを目的としています。Streamlitは、Pythonベースのオープンソースフレームワークであり、データサイエンスや機械学習の分野でプロトタイピングやデータ可視化を手軽に実現する強力なツールです。そのシンプルで直感的な設計により、技術者だけでなく、これからプログラミングを学習したい方にとっても非常に有用な技術だと考えています。
本書では、Streamlitの基本的な機能や使い方からスタートし、読者がフレームワークを理解し、実際に手を動かしてアプリケーションを構築できるようにサポートします。Streamlitは、データの可視化やインタラクティブなアプリケーションの構築に役立つ多くの機能を提供します。本書では、これらの機能を最大限に活用する方法や、データの効果的な可視化方法、アプリケーションの設計パターンなど、実践的なベストプラクティスについて詳細に解説します。これらの目的を達成するために、実践的な例を多数提供し、読者がStreamlitを効果的に活用できるようにサポートします。
Streamlitの基本的な使い方から始め、業務において実際に直面するニーズを反映したデータ可視化アプリケーションの構築、そしてその公開や共有まで、実践的な内容を網羅的に取り上げています。また、Streamlitで作成したデータカタログの紹介や、SnowflakeのLLM(大規模言語モデル)を導入したチャットボットの開発方法といった、より高度で応用的なトピックについても解説します。
自分自身、Streamlitを利用してデータ可視化アプリやデータカタログを業務で開発する中で、その使いやすさに感銘を受けました。しかし、日本ではまだStreamlitに関する情報が限られており、英語のドキュメントや記事を参照する必要がありました。そんな中で、日本語圏の開発者にとってのハードルを下げ、Streamlit活用を促進したいという思いで執筆しました。多くの方々のお役に立てると幸いです。
本書は次のような人を対象としています。
・データ分析者
・データエンジニア
・Python開発者
・その他データに興味のある人々
データを可視化し、インタラクティブなアプリケーションを構築したい方々にとって有益な書籍になるよう執筆しました。
本書では、プログラミング初学者の方にもお使いいただけるように丁寧に解説しましたが、基本的にはPythonプログラミングの基礎知識を前提としています。また、データの基本的な概念や操作方法についての理解があると、よりスムーズに進められ、深い理解が得られるかと思いますが、必須の条件ではありません。
本書の執筆にあたり、小宮山紘平氏(著書: ゼロからのデータ基盤 Snowflake実践ガイド 技術の泉シリーズ, X: @kommy_jp)、本橋峰明氏(X: @mmotohas)、檜山徹氏(X: @toru_data)にレビューしていただきました。この場を借りてお礼申し上げます。誠にありがとうございました。
データの重要性がますます高まる中、データの分析や可視化を行うためのツールやフレームワークも、ますます注目されています。その中でも、StreamlitはPythonベースのオープンソースフレームワークとして、データの可視化や分析アプリケーションの構築をすばやく簡単に行うことができることで広く知られています。本章では、Streamlitとは何か、その特徴や利点について紹介します。Streamlitの概要や基本的な使い方を理解することで、データの可視化や分析における効率性を高めることができます。さらに、本章では、Streamlitを使用するメリットや実際の使用例についても解説します。データの可視化や分析に興味のある方にとって、Streamlitは強力なツールであり、Streamlitでアプリケーションを作成するにあたって基本的な理解は非常に有用です。
Streamlitは、データサイエンスや機械学習の分野でのアプリケーション開発を効率化するために設計されたPythonベースのオープンソースフレームワークです。データ可視化や分析のためのウェブアプリケーションをすばやく構築することができ、そのシンプルな構文と豊富な機能が特徴です。
Streamlitの主な特徴のひとつは、ウェブアプリケーションの作成を簡単かつ迅速に行えることです。データサイエンティストや開発者は、WEB開発の知識がなくてもデータ分析の結果を可視化し、インタラクティブなダッシュボードを構築することができます。データサイエンティストが作ったモデル、UIを使用することで、エンジニアでない人がUI上でパラメータを変更するだけで、機械学習を実践することもできます。
アプリケーション上でデータを操作して、データウェアハウス(以下DWH)のテーブルを即座に変更することも可能です。これにより、アプリケーション使用者はデータの変化をリアルタイムに編集し、DWH内のデータと手入力したデータを組み合わせたデータ可視化やデータ分析、マスタデータの更新なども可能です。さらに、Streamlitは豊富なウィジェットを提供しており、アプリケーション使用者に対してデータの操作や、フィルタリングなどをするためのインタラクティブなインターフェースを構築することができます。スライダーやチェックボックス、テキスト入力などのウィジェットを組み合わせることで、高度なデータ分析や可視化を行うことができます。Streamlitの最新バージョンは、公式ドキュメント1で確認可能です。
データドリブンな事業運営のためにはデータ活用のためのツールが必要であり、Redash2などのBIツールの機能の範囲を超えるツールを提供したい場合には別途開発チームを組んで開発するなど、時間のかかる作業が必要でした。さらに運用が日々変化すると、それに合わせたツールの改修も、再び開発者を介して行う必要がありました。
ここで、Streamlitによりデータ系のエンジニアのみでツール開発を行えるようになれば、ツールの提供は飛躍的に簡単になります。このような展望を見据え、データクラウドサービスのSnowflakeを提供するSnowflake Inc.3はStreamlitを買収し4、連携を強化しました。
また昨今、Streamlit Forumに新たに日本語専用のカテゴリー5が誕生しました。これにより、日本語で気軽に質問を投稿したり、アプリケーションの事例、ブログ記事、さらにはイベント情報をシェアすることが可能になりました。日本語での交流を通じて、より多くの方々がStreamlitを活用できるよう、ぜひご活用ください。日本におけるStreamlitコミュニティーの発展を一緒に盛り上げていきましょう。
Snowflakeは、クラウドベースのデータプラットフォームであり、データの保管、処理、分析を効率的に行うことができるサービスです。Snowflakeは、データウェアハウスとしての機能を提供し、さまざまなデータソースからのデータの集約、クエリの実行、レポーティングなどを可能にします。また、スケーラビリティー、セキュリティー、およびパフォーマンスに優れており、多くの企業がビッグデータの処理や分析に利用しています。
Snowflakeの特徴のひとつは、自動的にマイクロパーティション6を作成する機能、および自動クラスタリング機能です。これにより、パーティションのメンテナンスが不要となり、データ管理が大幅に簡素化されます。また、Secure Data Sharing7機能により、テーブルを他のSnowflakeアカウントと安全に共有することが可能です。さらに、Snowpark Container Service8を利用することで、開発者はさまざまなプログラミング言語(たとえばJava、Scala、Python)を使って、Snowflake内でアプリケーションのデプロイや管理、スケーリングを行うことができます。
そして何より、Streamlitを使ってアプリケーション開発を行っているエンジニアにとっては、Snowflake上でStreamlitアプリケーションを使用・共有できる「Streamlit in Snowflake」9は非常に便利です。この機能により、データ駆動型アプリケーションの開発と展開が一層簡単になります。
また、Snowflakeには「SnowVillage」10という活発なコミュニティーが存在し、ここから多くの知識やノウハウを学ぶことができます。このコミュニティーは、StreamlitやSnowflakeの利用者にとって貴重なリソースとなっています。誰でも気軽に参加できるコミュニティーで、筆者も参加しており、日々非常に多くのことを学ばせていただいております。
Streamlit in Snowflakeは、Snowflakeのデータクラウド上でStreamlitアプリケーションを簡単に構築・共有することができる機能です。SnowflakeのWEBコンソールから作成することができます。(図1.1)
「Streamlit in Snowflake」を使用することで、AWSなどのクラウドサービスを使ってインフラを構築・運用する手間を大幅に軽減することができます。また、Streamlitで作成したアプリケーションも、アプリケーションで使用するデータも全てSnowflake上で管理できるところも魅力です。一方で、「Streamlit in Snowflake」ではサポートされていないStreamlitの関数などもありますので、開発前にその制限事項を確認することが重要です。
本書では、Streamlitで作成したアプリケーションをStreamlit in Snowflake上へデプロイする方法も紹介します。そのため、Streamlit in Snowflakeを使用する上で知っておいた方がいい機能をこちらで解説します。
Streamlit in Snowflakeでは、制限事項やサポートされていない機能が存在します。知っておくと役立つものをいくつか紹介します。制限事項やサポートされていない機能はありますが、改良されて少しずつなくなっていっています。そのため、ドキュメントは常に最新のものを参照して確認するようにして下さい。11
1.アカウントの制限:SnowflakeアカウントがAWSまたは、Azure、GCPのリージョンに配置されている必要があります。GCPは2024年5月14日時点でサポートが開始しました。12
2.データ量の制限:Streamlit in Snowflakeで実行されているアプリケーション上では、ひとつのクエリで取り出すことができるデータ量は32MBまでです。
3.マルチページの制限:SQLコマンドを使用してのみ作成することができます。CREATE STREAMLIT文13があるので、そちらを使いましょう。
4.Snowflakeの一部の関数の使用制限:「CURRENT_USER」などの「CURRENT_*」から始まる関数が、空またはNoneで値を返します。「CURRENT_USER」を使用する場合は、「st.experimental_user」を代わりに使用する必要があります。
5.Streamlitの関数の使用制限:一部のStreamlit関数は、Streamlit in Snowflakeでサポートされていない場合があります。具体的には、公式ドキュメントでサポートされている機能とサポートされていない機能を確認することが重要です。
Streamlit in Snowflakeでは、Streamlitの最新バージョンが公開された後、後追いでそのバージョンが使用可能になることが多いです。また、Streamlit in Snowflakeで使用するStreamlitライブラリーのバージョンは、「environment.yml」ファイルで選択するか、Snowsight14上で選択できます。バージョンを指定しない場合、利用可能な最新バージョンが自動的に使用されますが、新しいバージョンがリリースされた際に、Streamlit in Snowflakeがそのバージョンに更新されることで不具合が発生する可能性があります。そのため、バージョンを明示的に指定しておくことが推奨されています。
Streamlit in Snowflakeはデフォルトで「Python」、「Streamlit」、および「Snowpark」をインポートしています。外部パッケージをインポートすることも可能で、以下のふたつの方法が利用できます。
・SnowsightでのGUI管理: Snowsightのインターフェースを使用して、外部パッケージをインポート・管理する方法
・「environment.yml」を使ったコマンド管理: コマンドラインから「environment.yml」ファイルを用いてパッケージを管理する方法
Streamlit in Snowflakeは、稼働しているSnowflakeのウェアハウスとSQLに対して料金が発生します。Streamlitでアプリケーションを動かす際に、アプリケーションの実行とクエリの実行を担うウェアハウスを選択する必要があります。そのウェアハウスの料金が、Streamlit in Snowflakeを使用する料金となります。
デフォルト設定では、ウェアハウスはアプリケーションに接続している間と、アプリケーションの使用終了後に15分間動作し続けます。しかし、「config.toml」ファイル内でカスタムスリープタイマー機能を使うことで、アプリケーションが未使用の際にウェアハウスを停止するまでの時間を設定できます。15
ウェアハウスはできるだけ小さいものを使用して、アプリケーションの作業負荷に合わせてサイズを調整することが推奨されています。また、Streamlit専用のウェアハウスを作成して使用することが推奨されています。コストの管理を容易にし、他の処理の影響を受けないようにするためです。
Streamlitで作成したアプリケーションは、クライアントサーバー構造になっています。16クライアントサーバー構造では、サーバー(バックエンド)とクライアント(フロントエンド)のふたつの役割があります。機能やサービスを提供するサーバーがアプリケーションのバックエンドの処理を行い、クライアントはその処理結果をブラウザーで表示する役割を持っていて、分離して処理をします。そして、サーバーとクライアント間の一連の処理の間で通信をしてセッションを張ることで接続します。Streamlitでは、ローカルで開発する場合はコンピューターがサーバーとクライアントの両方を実行します。しかし、アプリケーション使用者がアプリケーションにオンラインでアクセスする場合は、サーバーとクライアントは別々のマシンで実行されるようになっています。
Streamlitで開発したアプリケーションは、「streamlit run *.py」コマンドを実行すると動きます。「streamlit run」コマンドを実行すると、コンピューターはPythonを使用してStreamlitサーバーを起動します。このサーバーが、アプリケーション使用者が実行した計算処理などを全て行います。たとえば、AWS EC2で「streamlit run」を実行してアプリケーションを起動したとします。そのアクセスした10のアプリケーション使用者がアプリケーションを同時に操作すれば、10人分の操作をAWS EC2上のひとつのStreamlitサーバーが全ての処理を捌くことになります。
ブラウザーでアプリケーションを見る人の端末は、Streamlitのクライアントということになります。動作のイメージを説明します。Streamlitでは、「streamlit run」というコマンドでアプリケーションの実行を行います。「streamlit run」を実行しているコンピューター上にて、アプリケーションの閲覧をする場合は、サーバーとクライアントが同じマシンで動作することになります。しかし、「streamlit run」を実行しているコンピューターとは別のコンピューターからローカルネットワークやインターネット経由でアプリケーションを見る場合、クライアントはサーバーとは別のマシンで動作することになります。(図1.2)
前述したクライアントサーバー構造がアプリケーションに与える影響がいくつか存在するため、アプリケーション設計時にいくつか注意する必要があります。データ可視化アプリケーションを作成するときは、以下に注意すれば問題ないかと思います。
まずは、コンピューターの性能についてです。アプリケーションを実行するコンピューターは、同時にアプリケーションを使用する人数や処理を考慮して適切なサイズに設定する必要があります。Streamlit in Snowflakeでアプリケーションを動かす場合は、Snowflakeの仮想ウェアハウスの性能、AWS EC2で動かす場合はインスタンスの性能を考慮する必要があります。ちなみに、Streamlit in Snowflakeの仮想ウェアハウスは小さいものから使用して、不便が生じたら徐々に大きくしていくことが推奨されています。
次は、サーバーはアプリケーション使用者のデバイスにアクセスできないという点です。クライアントサーバー構造ではサーバー側とクライアント側の処理が分離され、それらの処理をネットワーク通信で接続します。これにより、サーバーはアプリケーション使用者のデバイスにアクセスすることができないため、Streamlitからアプリケーション使用者のファイルやディレクトリー、またはOSにアクセスすることができないといったことが起きます。「st.file_uploader」17などのウィジェットを介してアプリケーション使用者が特定のファイルをアップロードすることで、アプリケーションにファイルを直接提供して対処する必要があります。
Streamlitの大きな特徴として、アプリケーションで操作や変更がある度にPythonスクリプト全体を再実行するといった点があります。たとえば、チェックボックスをひとつだけ変更した場合でも、スクリプト全体が再実行されます。これにより、常に最新の情報が反映されますが、同時に計算コストがかかります。
しかし、Streamlitにはこの再実行の負荷を軽減するための機能があります。第2章にて解説する「st.cache_data」と「st.cache_resource」を使うと、関数の結果をキャッシュに保存しておくことができます。これにより、同じ関数を何度も実行する必要がなくなり、アプリケーションのパフォーマンスが向上します。さらに、「st.session_state」を使うと、セッション間で変数を保持できます。これにより、アプリケーション使用者の操作やデータの状態をセッション間で維持し、アプリケーションの動作をより柔軟に制御できます。
また、2024年4月には部分的にページのリフレッシュを行うfragment機能18がリリースされました。この機能により、アプリケーション上の数値の変更に関係のある部分のみを更新することで、パフォーマンスの向上を図ることができます。第2章にて、fragmentを使用した簡単なアプリケーションの作成も実施します。
Streamlitの魅力のひとつとして、持続的なアップデートがあると考えています。StreamlitのGitHubリポジトリーにはissuesとして、様々な不具合やアップグレードのためのアイデアが挙げられています。19そして、それらが頻繁に反映されてリリースノートとして発表されています。今後も更なるアップグレードが期待でき、開発の幅が広がっていくのではないかと考えています。実際毎月のように新しいバージョンが公開され、どんどん実装できる機能が拡張されています。
また、BIツールやデータカタログを無料かつ、自由度高く開発できるところも魅力だと考えています。市場にあるBIツールやデータカタログは非常に便利なものも多いですが、同時に高額なものが多いです。そこでStreamlitを使用することで、それらのツールを少ないコードかつ無料で自作することができます。そして、市場のツールには自分が使わない機能が含まれていることや、痒い所に手が届かないといったこともあるかと思います。Streamlitを使用することで、自分が欲しい機能だけを拡張できるところも魅力です。
さらに、インフラの知識がなくても、Streamlit in Snowflakeに簡単にデプロイができる点も見逃せません。これにより、データサイエンティストや分析担当者が簡単に自分のアプリケーションをクラウドに展開し、共有できるようになります。インフラの専門知識が不要なため、より多くの人々が手軽にデプロイ作業を行うことができます。
加えて、WEB開発の知識がなくても、簡単にアプリケーションを作成できる点も大きな強みです。Streamlitはシンプルで直感的なAPIを提供しており、Pythonの基本的な知識さえあれば誰でも美しいインタラクティブなウェブアプリケーションを作成することができます。これにより、高度なアプリケーションでも迅速に開発し、共有することが可能となります。
さらに、Snowflakeとの連携をすることで、Snowflake Cortex20を使ったアプリケーション開発でLLM(大規模言語モデル)をアプリケーションに導入できることも大きな利点です。これにより、自然言語処理や生成AIを活用した高度なアプリケーションを手軽に構築でき、さまざまなビジネスニーズに対応することができます。データのインサイトを得るだけでなく、それを即座に実行に移すための強力なツールとして、Streamlitの可能性はますます広がっていくことでしょう。
これらの点を踏まえると、Streamlitは今後ますます進化し、データサイエンスやアプリケーション開発の現場で欠かせないツールとしての地位を確立していくことが予想されます。
以上がStreamlitやSnowflakeについての概要や基礎知識、魅力や将来性です。これらの基礎知識をしっかりと理解しておくことで、Streamlitを使ったアプリケーションの開発をより効率的に行うことができます。次章からは、更に踏み込んだStreamlitの基本的な機能を解説して参ります。