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

Re:PandasAI:生成AIがデータ分析業務にもたらすパラダイムシフト【増補改訂版】

negi111111
September 28, 2024

 Re:PandasAI:生成AIがデータ分析業務にもたらすパラダイムシフト【増補改訂版】

PyCon JP2024で登壇した内容に関する資料です。
URL:https://2024.pycon.jp/ja/talk/GF98CT
内容:
生成AIがデータ分析業務にもたらすパラダイムシフトとして「複雑な分析関連コードを書く代わりに、自然言語による対話的なデータ分析」を本セッションを通じて体験してみませんか?

本セッションでは、生成AIを利用したデータ分析の効率化と自動化に焦点を当て、特に、自然言語によるデータ分析機能を提供するPandasAIというライブラリの可能性を紹介します。実世界のデータ分析課題にPandasAIをどのように適用できるか、そのベストプラクティスを共有し、データ処理、クリーニング、可視化、および特徴量生成のプロセスを簡略化する方法を提示します。

negi111111

September 28, 2024
Tweet

More Decks by negi111111

Other Decks in Programming

Transcript

  1. 2 本日のゴール 
 動作イメージを理解し、原理も何となくわかる、レベル感を目指します 
 ❖ PandasAIがなにかわかる
 ❖ 動作原理について理解する(デモ有)
 ❖

    データ分析の雰囲気がわかる
 ❖ データ分析における生成AI事例を理解する
 
 ❖ 前提知識
 ➢ ChatGPTを知っている
 ➢ Pythonの基礎的な文法
 ➢ オブジェクト指向の考え方
 ▪ ライブラリが普通に使えればOK!
 ➢ OpenAI(Azure)でAPIキーが発行できる
 ▪ お試し程度なら無料枠で十分すぎます
 

  2. 3 本講演では取り上げない事項や注意事項 
 ❖ 細かな大規模言語モデル(LLM)に関する理論や個々のモデル、再学習やRAG等
 ➢ ローカルなモデルを利用する事も出来ますが、基本はAPI経由でLLMを利用する前提とします
 ➢ NTT版大規模言語モデル「tsuzumi」の話もしません
 ▪

    2024年3月25日に商用開始〜
 ➢ APIはOpenAI、Azure OpenAI Serviceを対象とします
 
 ❖ 今日の情報は明日には廃れる可能性があります
 ➢ 本生成AIは、日進月歩で進化し続けている分野
 ➢ 2024年9月27日までの情報に基づいています
 

  3. 4 自己紹介
 • 丹野 良介(@negi111111)
 ◦ NTTコミュニケーションズ株式会社 
 • イノベーションセンター

    テクノロジー部門 AIグループ
 • データ分析Webアプリケーション開発
 • データ分析コンサルティング
 • マルチメディア解析、ドラレコ解析、化学プラント
 • AI人材育成、産学連携(講義提供)
 
 
 • 最近のPyCon参加実績
 ◦ PyCon Kyusyu2024@鹿児島
 ◦ PyCon mini東海2024@名古屋 at 11/16
 • 時系列データ分析ハンズオンWS(1時間)
 URL:https://app.nodeai.io/ 後半のデモで本アプリを利用するので登録推奨 データ処理をカード化、 連結することで 分析フローを表現でき る コメントなどを Markdown形式 で記述できる 時系列データの分析に強 い(予測、異常検知、要因 ・因果分析、など) 発表スライド→ 

  4. 7 アジェンダ 
 • 導入(データ分析の基礎と可視化の役割)
 • PandasAI概要
 • PandasAI詳細
 •

    デモ(活用事例)
 • 知っておくと便利なTips(時間がある限り)
 • まとめ

  5. 9 データサイエンスとは? 
 
• データから有用な知見を得るための様々な理論や技術の集合 
 ◦ 何か特定の理論や技術を表すわけではない
 ◦ データ可視化、統計学、情報学あたりが主要な分野


    ◦ それらの中に統計的検定や教師あり/なし学習、次元削減などの様々な技術がある
 • 大きく三象限に分けて説明されることが多い
 
 
 Statistical Human Computational 出典 Science and data science:https://www.pnas.org/content/114/33/8689 確率的モデルによる複雑なデータの表現
 高次元データの縮約
 因果関係の推定
 言語: 数学や確率論
 最適化アルゴリズムの実装
 データ収集(サンプリング)
 分散コンピューティング
 言語: プログラミング
 問題領域の理解
 可視化、分析結果のレポート
 モデル/収集データの選択
 共通言語化されていない

  6. 10 データサイエンスとは? 
 
“Crucially, the data scientist solves the problem

    iteratively and collaboratively with the domain expert.”
 →重要なのは、データサイエンティストがドメインエキスパートと反復的かつ協調的に問題を解決するこ とである。
 出典 Science and data science:https://www.pnas.org/content/114/33/8689 Statistical Human Computational 確率的モデルによる複雑なデータの表現
 高次元データの縮約
 因果関係の推定
 言語: 数学や確率論
 最適化アルゴリズムの実装
 データ収集(サンプリング)
 分散コンピューティング
 言語: プログラミング
 問題領域の理解
 可視化、分析結果のレポート
 モデル/収集データの選択
 共通言語化されていない

  7. 11 データ分析の全体像 
 産業間共通データマイニング標準プロセス (CRISM-DM: Cross-Industry Standard Process for DataMining)→データマイニングのための方法論


    1. ビジネスの理解(分析目的と目標の設定) 
 2. データの理解(各項目の意味理解) 
 3. データの準備(データクレンジング&基礎集計) 
 4. モデル作成(アルゴリズム選定&モデル作成) 
 5. 評価(モデル評価&目的に対する結果評価) 
 6. 展開(施策設計/提案) 

  8. 12 可視化のモチベーション 
 • データ分析のプロセスの8割以上が前処理と言われる
 ◦ 実際にAIモデルを作る部分はこの中のどれでしょう?
 
 
 


    
 
 
 
 • 適切なモデルを決めるためにも可視化が大事 
 
 • 補足:ノーフリーランチ定理
 ◦ なんでも切れる万能なモデルはない
 ◦ データを眺めてモデルを選んでやる必要がある
 出典:https://papers.nips.cc/paper/5656-hidden-technical-debt-in-machine-learning-systems.pdf
  9. 14 Pandas 
 
 ❖ 表形式のデータ構造(=構造化データ)に関して効率的にデータ操作を行うことができる
 ➢ csvとかExcelとかで扱える様なデータならまずは初手 df: pd.DataFrame

    = pd.read_csv(“hoge.csv”)
 ➢ DataFrame オブジェクトを介して高速で効率的なデータ操作
 
 内部でMatplotlib の機能を使用して散布図、棒グラフ、 箱ひげ図,...などを .plot() だけで実現
 特定の行や列を選択またはフィルタリングなども抽出は 直感的に記述可能
 age_sex = titanic[["Age", "Sex"]]
 
 出典:https://pandas.pydata.org/docs/getting_started/index.html#getting-started
  10. 16 PandasAIとは 
 ❖ 自然言語を用いて検索、分析、可視化を行うことができる機能(Pandas+AI( ChatGPT ))
 ➢ 自然言語を利用してDataFrameから情報を抽出したり、グラフを描画したりできる
 ➢

    OSS公開されているのでOpenAI(Azure含む)でAPIキーがあれば無料で使える 
 ➢ SaaSとしても提供しているのでお金払えばAPIキーが無くても使える
 
 出典:https://pandas.pydata.org/docs/getting_started/index.html#getting-started 「生成 AI モデルを使って自然言語によるクエリを理解・解釈。Python コードや SQL クエリに変換。そのコードを使ってデータを操作し、結果 をユーザーに返却」まで、ラップしてくれるライブラリ 

  11. 17 PandasAIの特徴まとめ 
 ❖ 自然言語クエリ:自然言語でデータに質問
 ❖ データの可視化:グラフやチャートを作成してデータを視覚化
 ❖ データクレンジング:欠損値に対処してデータセットをクレンジング
 ❖

    特徴量生成:データ品質を向上
 ❖ データコネクタ:CSV、XLSX、PostgreSQL、MySQL、BigQuery、
         Databrick、Snowflakeなど、さまざまなデータソースに接続可能
 出典:https://pandas-ai.com/
  12. 18 自然言語を用いた対話的データ分析の何が嬉しいのか 
 
 課題1:
 DBにアクセスしてデータ探索 するためには、SQL等のスキ ルが必要
 課題2:
 データから必要な結果を導き

    出す為の加工するスキルが 必要(データ分析)
 出典:https://mindfulgeek.substack.com/p/enable-safe-chat-with-your-databases 課題3:
 結果を解釈するスキルが必 要
 ドメインエキスパートと 協力しながら解釈する ので今回は問題としな い
  13. 22 SmartDataframe 
 ❖ 単一のデータフレームを操作する場合
 import os import pandas as

    pd from pandasai import SmartDataframe # Sample DataFrame sales_by_country = pd.DataFrame({ "country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"], "sales": [5000, 3200, 2900, 4100, 2300, 2100, 2500, 2600, 4500, 7000] }) df = SmartDataframe(sales_by_country) df.chat('Which are the top 5 countries by sales?') # Output: China, United States, Japan, Germany, Australia
  14. 23 SmartDatalake 
 ❖ 複数のデータフレームを利用する場合
 import os import pandas as

    pd from pandasai import SmartDatalake employees_data = { 'EmployeeID': [1, 2, 3, 4, 5], 'Name': ['John', 'Emma', 'Liam', 'Olivia', 'William'], 'Department': ['HR', 'Sales', 'IT', 'Marketing', 'Finance'] } salaries_data = { 'EmployeeID': [1, 2, 3, 4, 5], 'Salary': [5000, 6000, 4500, 7000, 5500] } employees_df = pd.DataFrame(employees_data) salaries_df = pd.DataFrame(salaries_data) lake = SmartDatalake([employees_df, salaries_df]) lake.chat("Who gets paid the most?") # Output: Olivia gets paid the most データテーブルをライブラリ 側で結合してくれる

  15. 24 Agent 
 ❖ エージェントは会話の状態を追跡
 ➢ 複数ターンの会話に対応可能
 
 ❖ Clarification

    questions
 ➢ クエリに答えるのに十分な情報を
 持っていない場合、明確な質問を要求
 
 
 ❖ Explanation
 ➢ なぜその回答になったかの
 理由を説明してもらう
 
 
 ❖ Rephrase Question
 ➢ より正確な回答を得たい場合に
 LLM側に質問を言い換えてもらう
 from pandasai import Agent # Sample DataFrames sales_by_country = pd.DataFrame({ "country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"], "sales": [5000, 3200, 2900, 4100, 2300, 2100, 2500, 2600, 4500, 7000], "deals_opened": [142, 80, 70, 90, 60, 50, 40, 30, 110, 120], "deals_closed": [120, 70, 60, 80, 50, 40, 30, 20, 100, 110] }) agent = Agent(sales_by_country) agent.chat('Which are the top 5 countries by sales?') # Output: China, United States, Japan, Germany, Australia agent.chat('And which one has the most deals?') # Output: United States has the most deals
  16. 25 PandasAIによるPythonコード生成過程 
 PandasAIは、生成AIモデルを使って自然言語クエリを理解・解釈し、PythonやSQLクエリに変換その コードを使ってデータを操作し、結果をユーザーに返却
 内部の実行過程は以下
 
 ❖ 生成プロセスは以下の5段階(厳密には7段階)
 ❖

    PromptGeneration -> CodeGenerator -> CodeExecution -> 
            ResultValidation -> ResultParsing
 
 ➢ CacheLookup:データがキャッシュされているかどうかの確認
 ➢ PromptGeneration :プロンプトの生成
 ➢ CodeGenerator :プロンプトからコードを生成する
 ➢ CachePopulation:生成されたデータのキャッシュ
 ➢ CodeExecution :コードの実行
 ➢ ResultValidation :実行結果の検証
 ➢ ResultParsing :結果のパース
 

  17. 26 PandasAIによるPythonコード生成過程 
 
 Executing Pipeline: GenerateChatPipeline Executing Step 0:

    ValidatePipelineInput Executing Step 1: CacheLookup Executing Step 2: PromptGeneration # Using prompt: <dataframe> dfs[0]:17379x3 自転車の総利用台数,会員の自転車利用台数,非会員の自転車利用台数 425,504,12 734,468,129 968,520,202 </dataframe> # Update this initial code: ```python # TODO: import the required dependencies import pandas as pd # Write code here # Declare result var: type (must be "plot"), value must be string. Example: { "type": "plot", "value": "temp_chart.png" } ``` ### QUERY カラム事の時系列グラフを重ねて色を区別して見やすく表示せよ Variable `dfs: list[pd.DataFrame]` is already declared. At the end, declare "result" variable as a dictionary of type and value. If you are asked to plot a chart, use "matplotlib" for charts, save as png. Generate python code and return full updated code: LLMに入力するデータ情報 はテーブルデータの3行分の カラムとデータ値
 必要なモジュールのインポー トや制限、コードを指定の場 所に書くようにLLMへの出力 を制御
 今回のユーザのプロンプトは 「日本語」の部分だけで、そ れ以外はライブラリ側から勝 手に挿入される

  18. 27 PandasAIによるPythonコード生成過程 
 
 # Executing Step 3: CodeGenerator Prompt

    used: <dataframe> dfs[0]:17379x3 自転車の総利用台数,会員の自転車利用台数,非会員の自転車利用台数 425,504,12 734,468,129 968,520,202 </dataframe> Update this initial code: ```python # TODO: import the required dependencies import pandas as pd # Write code here # Declare result var: type (must be "plot"), value must be string. Example: { "type": "plot", "value": "temp_chart.png" } ``` ### QUERY カラム事の時系列グラフを重ねて色を区別して見やすく表示せよ Variable `dfs: list[pd.DataFrame]` is already declared. At the end, declare "result" variable as a dictionary of type and value. If you are asked to plot a chart, use "matplotlib" for charts, save as png. Generate python code and return full updated code: # Code generated: ``` # TODO: import the required dependencies import pandas as pd import matplotlib.pyplot as plt # Write code here fig, ax = plt.subplots() # Plotting the time series for each column ax.plot(dfs[0].index, dfs[0]['自転車の総利用台数'], label='自転車の総利用台数') ax.plot(dfs[0].index, dfs[0]['会員の自転車利用台数'], label='会員の自転車利用台数') ax.plot(dfs[0].index, dfs[0]['非会員の自転車利用台数'], label='非会員の自転車利用 台数') # Adding legend and labels ax.legend() ax.set_xlabel('Time') ax.set_ylabel('Number of Bicycles') # Save the plot as an image plt.savefig('time_series_plot.png') # Declare result var result = {"type": "plot", "value": "time_series_plot.png"} ``` Executing Step 4: CachePopulation Executing Step 5: CodeCleaning 左記のプロンプトをLLMに入 力を行い、Pythonの実行コー ドを得る

  19. 30 知っておくと便利なTips 
 本番導入する際に使った便利な設定 (詳しくは、公式マニュアルの「Advanced usage」を参照)
 
 ❖ ログを削除する方法
 ➢

    そのまま利用すると大量のlogが出る
 ➢ 本番環境に導入する際に不要なログは排除したい
 ➢ ライブラリ側ではログを抑制することは出来ないので、強制的にloggingを減らす必要がある
 
 ❖ ホワイトリスト化
 ➢ もし悪意のあるコードや脆弱性のあるコードが生成されてしまった場合はどうする?
 
 ❖ 出力の制御(Determinism)
 ➢ LLMの出力を一貫させたい(⇔毎回、変化させて創造的にしたい)
 
 ❖ データをLLMに送りたくない(enforce_privacy)
 ➢ データは送信せずカラム名だけ送る ➢ headをランダムシャッフルし特定されない状態でのデータが送られる 
 # INFOレベルでデータ詳細が出てしまうのでそれを非表示にする getLogger("pandasai").setLevel(WARNING)
  20. 31 悪意のあるコードが生成された場合は? 
 ❖ 例えば、環境変数を抜き出す様なコードを指示したり、内部でAPIをRequestするようなコードが生成 された場合
 ➢ 生成してほしくないライブラリも多くあるはず(os moduleは使ってほしくない、など)
 


    ❖ デフォルトでは、PandasAIはホワイトリストに登録されたモジュールを使用するコードのみを実行可 能
 ➢ 悪意のあるコードがサーバー上またはローカルで実行されるのを防ぐため
 
 ❖ ただし、カスタムモジュールをホワイトリストに追加することは可能
 ➢ custom_whitelisted_dependencies: List[str] = Field(default_factory=list) 
 
 from pandasai import SmartDataframe df = SmartDataframe("data.csv", config={ "custom_whitelisted_dependencies": ["any_module"] })
  21. 32 LLMには以下の2つの課題が存在する。
 
 参考:LLMの潜在的な課題 
 この問題に対応するためにLLMを特定のドメインに適用させ、 
 その知識を更新するためにLLMへの知識注入といった考え方が存在する 
 一般的に考えられる対処法

    
 1. ファインチューニング
 2. 検索拡張生成(RAG) 
 c
 c
 ❖ 正確性と信頼性に関する課題 
 ➢ 誤った情報を生成するリスクが存在する
 ❖ 剽窃に関する課題 
 ➢ 検出器を回避できるほど高品質なコ ンテンツを生成できるため剽窃が助 長される 今回はこちらに着目 ❖ LLMは膨大なデータセットによる事前学習により驚くべき知識レベルを発揮する 
 ❖ 一方で、LLMの表現可能な知識には次の2つの制限がある 
 ➢ 1. 新しい情報には対応できない
 ➢ 2. 特定の専門知識の情報が不足している
 よって、モデルの学習データ範囲を超えるクエリや最新の情報が必要な場合は顕著な制限を示す。
 

  22. 33 知っておくと便利なTips: 出力の制御(Determinism) 
 
LLMの出力を一貫させたい
 ⇔毎回、変化させて創造的にしたい
 • 再現性を担保したい
 ◦ 開発、デバッグ、テスト


    • 一貫性
 ◦ カスタマーサポート
 
 • temperature=0の役割
 ◦ 出力のランダム性を制御
 ◦ 高くする→応答の多様性と創造性が増加
 ◦ 低くする→モデルはより予測可能で保守的
 
 • seed値固定
 ◦ ※AzureOpenAIではまだ利用できない
 # ユーザ入力プロンプト prompt: str = card_config.get("prompt") llm_versions = { "gpt-4o": {"deployment_name": "gpt-4o", "api_version": "2023-05-15"}, } try: llm = AzureOpenAI( deployment_name=llm_versions["gpt-4o"]["deployment _name"], api_version=llm_versions["gpt-4o"]["api_version"], temperature=0, seed=26, )
  23. 34 知っておくと便利なTips: その他の設定 
 
 
 sdf_config = { "llm":

    llm, "save_logs": False, "save_charts": True, "save_charts_path": temp_dir, "open_charts": False, "verbose": False, "enable_cache": False, "max_retries": True, "enforce_privacy": True, # データは送信せずカラム名だけ送る(Falseの場合、 headをランダムシャッフルし特定されない状態でのデータが送られる) "custom_whitelisted_dependencies": [ "matplotlib", "matplotlib.pyplot", "pandas", "seaborn", ], } # 出力タイプをplotに指定することで内部的にはpngファイルを生成する様に制限 sdf = SmartDataframe(df, config=sdf_config) sdf.chat(prompt, output_type="plot") Jupyter等で対話的に実行す る場合は便利だけど、毎回 画像が自動で開かれる
 データの匿名性を高める
 利用するライブラリは制限し たい
 出力は画像に制限したい

  24. 35 本日のゴール(まとめ) 
 動作イメージを理解し、原理も何となくわかる、レベル感を目指します 
 ❖ PandasAIがなにかわかる
 ➢ 自然言語を用いて検索、分析、可視化を行うことが
 できる機能(Pandas+AI(ChatGPT))


    ❖ 動作原理について理解する(デモ有)
 ❖ データ分析の雰囲気がわかる
 ❖ データ分析における生成AI事例を理解する
 
 ❖ お題:業績が良い店舗のノウハウを他店舗 にも流用したい 
 ➢ 売上高が最大である店舗はどこだろう?
 ➢ 売上が大きく変動する店舗はどこだろう?
 ➢ 成長率が高いのはどの店舗はどこだろう? 

  25. 36 参考文献、お役立ちリンク集 
 ❖ Pandas公式ドキュメント
 ➢ Getting startedが丁寧でグラフィカルに説明してある
 ❖ PandasAI公式ドキュメント、PandasAI公式レポジトリ


    ➢ ライブラリはマニュアルこそ志向
 ❖ 日本語LLMまとめ情報
 ➢ 弊グループの同僚が非常に網羅的にまとめているLLM情報
 ➢ 日本語LLMに関して知りたければまずはココを参照
 ❖ Enable safe Chat with your Databases: with Malloy and PandasAI
 ➢ https://mindfulgeek.substack.com/p/enable-safe-chat-with-your-databases
 

  26. 37

  27. © NTT Communications Corporation All Rights Reserved. 38 c
 背景


    GPT-4の性能は人間のデータ分析者に匹敵
  (分析時間はほぼ10倍効率)
 1. 図のデータと情報は正しいか?
 2. 質問の要件と一致しているか? 
 3. 図は美的で、エラーがなく明確か?
 [1] What Is the Impact of ChatGPT on Education? A Rapid Review of the Literature. [2] AI-assisted Learning for Electronic Engineering Courses in High Education [3] ChatEd- A Chatbot Leveraging ChatGPT for an Enhanced Learning Experience in Higher Education [4] Is GPT-4 a Good Data Analyst? [5] What Should Data Science Education Do with Large Language Models? c
 ❖ 大規模言語モデル(LLM)の進化が教育分野に与える影響 
 ➢ LLMはインタラクティブな学習環境の提供可能
 ▪ 人間の様に反応を理解することができる
 ▪ 即座にフィードバックを行うことができる
 ➢ 教育方法論と学習体験の両面で重要な役割を果たす可能性を示唆[1]
 ➢ 実運用可能なレベルでの高品質な出力が可能なため
 アプリケーション利用が急速に拡大(ChatGPT)
 
 
 ❖ LLMによる学習支援 
 ➢ 教育と学習の改善を目的としたLLMの応用の拡大[2,3]
 ➢ 教育者視点:教材作成、カリキュラム考案、学生評価
 ➢ 学習者視点:回答作成、情報要約、文章作成補助
 
 
 ❖ データサイエンスへの応用 
 ➢ LLMによる分析パフォーマンスは人間に匹敵[4]
 ➢ 分析パイプラインの変化[5]
 ▪ 分析はLLMが行い、結果の評価と管理を人が行う
 など役割が変化すると示唆
 c

  28. © NTT Communications Corporation All Rights Reserved. 39 ❖ 入力クエリに関連する補助情報を与えることで、


    事前学習済みのLLMの性能を向上させることが可能
 c
 ❖ Step1: ベクトルストア構築 
 ➢ 補助知識に含まれる各文章に対して埋め込み表現を 生成し、ベクトルストアに格納
 ➢ 補助知識には以下の2つのデータセットを用意
 ▪ ノーコードツールの技術マニュアル
 ▪ データ分析関連ナレッジベース「ごちきか」
 c
 ❖ Step2: 関連文章の検索 
 ➢ クエリに関連する文章群をベクトルストアから検索
 ➢ 類似する関連文章の候補を作成
 c
 ❖ Step3: クエリの更新とモデルの応答 
 ➢ 関連文章の候補を元のクエリと結合
 ➢ 結合したクエリをLLMの入力とする
 ❖ 特定のドメインに特化した情報を要求するクエリや最新の 情報を必要とする場合に、より正確な出力を提供
 検索拡張生成 (Retrieval-Augmented Generation:RAG) 

  29. 40 社内事例:ノーコードAIモデル開発ツール 
 https://app.nodeai.io/ データ処理をカード化、連結 することで 分析フローを表現できる コメントなどを Markdown形式で記 述できる

    分析用キャンバスを ネット上で共有してコ ラボできる 時系列データの分析に強い (予測、異常検知、要因・因果 分析、など)