fc2ブログ

ChatGPT4を使う(8)

 前回の続きです。クレジットカードで決済をした場合の月毎の支出を集計する話です。前回、集計に用いるデータセットの作成まで終わりましたので、今回はデータの可視化と分析です。今回もChatGPT4にプログラムを書いてもらい、マイナー修正して使える形にしました。

2.データの可視化
 前回作成したデータセットを添付して、以下のプロンプトを投げました。ChatGPT4のData Analysisを用いました。dataVisualization1_231203.png結果は以下の通りで、グラフは表示してくれましたが、日本語フォントが文字化けしました。dataVisualization2_231203.png再度、トライをしてくれたみたいですが、結局文字化けは解消されませんでした。「グラフの内容自体は正しく表現されています。」と開き直られていますが・・。dataVisualization3_231203.png 以前も日本語の情報の入ったデータをData Analysisで処理した際に、エラーを吐いたことがあります。現時点(23/12/03)でGPT4のData Analysisでは日本語を使わない方が良いかもしれませんね。
 日本語表記に対応するため、結局、自身のローカルPC(Mac Mini)のPython環境で、今回GPT4が作成してくれたコードを動かしました。コードは19行目の日本語フォントの設定を20行目に修正するだけで他に修正する箇所はありませんでした。すごいですね。
import pandas as pd
import matplotlib.pyplot as plt

# Load the data from the uploaded CSV file
file_path = 'Card_statement.csv' # CSVファイルのパスを適宜変更してください
card_data = pd.read_csv(file_path)

# Convert the '利用日' column to datetime
card_data['利用日'] = pd.to_datetime(card_data['利用日'])

# Extract year and month for grouping
card_data['年月'] = card_data['利用日'].dt.to_period('M')

# Group by year-month and user, and sum the amounts
monthly_usage = card_data.groupby(['年月', '利用者'])['利用金額'].sum().unstack(fill_value=0)

# Set the font to support Japanese characters
# Note: The font setting may need to be adjusted based on your environment
#plt.rcParams['font.family'] = 'IPAexGothic'
plt.rcParams['font.family'] = 'Hiragino Sans'

# Create a stacked bar plot
plt.figure(figsize=(12, 6))
monthly_usage.plot(kind='bar', stacked=True, ax=plt.gca())
plt.title('月別利用金額(利用者別積み上げ)')
plt.xlabel('月')
plt.ylabel('利用金額')
plt.xticks(rotation=45)
plt.legend(title='利用者')
plt.tight_layout()

# Show the plot
plt.show()
描画結果は以下の通りで、楽にグラフを作成することができました。dataVisualization4_231203.png
3.データの分析
 次に同じデータセットについて、以下の質問を投げかけました。一つ目のプロンプトは「本人」の利用額ベスト10の質問です。dataAnalysis1-1_231203.png回答は以下の通りです。モザイクで数字を隠していますが、問題なく、利用額の多い順番に表示されました。dataAnalysis1-2_231203.png二つ目のプロンプトは利用者毎の月別の集計の質問です。dataAnalysis2-1_231203.png結果、これもモザイクで数字を隠していますが、正しく出力されました。dataAnalysis2-2_231203.png三つ目のプロンプトは同じ「利用店名・商品名」毎の集計の質問です。dataAnalysis3_231203.pngこれも正しい結果でした。生成AIは勝手に数字を当てはめているイメージがありましたが、Data AnalysisでバックグラウンドのPythonが正しく計算した上で、正確な回答を出してくれていることが分かりました。これは使えそうですね。

 ちなみに、同じ内容をPandasAIで行わせても結果は同じでした。OpenAIのGPT4用APIのアカウントを私自身、所持していないので、おそらくGPT3.5でもPandasAIで正しい回答が導き出せているのでしょうね。PandasAIのプログラムは以下の通りです。
import pandas as pd
from pandasai import PandasAI
from pandasai.llm.openai import OpenAI

# Instantiate a LLM
OPENAI_API_KEY = "my openai key"
llm = OpenAI(api_token=OPENAI_API_KEY)
pandas_ai = PandasAI(llm)

df = pd.read_csv('Card_statement.csv') # dataset read
column_names = df.columns.tolist()
print(column_names)

# 利用者が「本人」のデータについて、利用額が多い順に10件出力してください。
pandas_ai(df, prompt='利用者が「本人」のデータについて、利用額が多い順に10件出力してください。')

# 利用金額を本人、家族、ETCに分けて月単位で集計し出力してください。
pandas_ai(df, prompt='利用金額を本人、家族、ETCに分けて月単位で集計し出力してください。')

# 利用金額を「利用店名・商品名」毎に集計して、利用金額が多い順に10件出力してください。
pandas_ai(df, prompt='利用金額を「利用店名・商品名」毎に集計して、利用金額が多い順に10件出力してください。')
15行目の回答はこんな感じです。GPT4のData Analysisのものと同じ回答でした。PandasAI_Result1_231203.png
 最後に、Bing ChatとGoogle Bardも試しましたが、双方NGでした。
Bing Chat: 文字数4000文字制限で、添付データすべてを読み込めずにNG。土俵に上がれず・・。
Google Bard: プロンプトは受け付けたので、文字数制限はパスしたが、得られた回答がデタラメで使えない。

 今回、ChatGPT4のData Analysisでデータセットを食わせて、可視化や分析ができることがよく分かりました。どれだけ、高度のことができるのか、今後さらに触って確認してみようと思いました。
スポンサーサイト



ChatGPT4を使う(7)

 先日、会社主催の定年後の生活に関するセミナーがありました。その中で今後の必要なお金を考える上で、直近の支出を把握する所がありました。前日に奥さんに確認しつつ、大雑把に数字を把握していたのですが、支出額を低く見積もり過ぎた感があり、改めて正確に出す必要があるなと思いました。

 支出の基本は、①クレジットカードで自動決済した場合、②金融機関から自動で引き落とされる場合、③金融機関から手動で引き出して現金化する場合の3つです。②③は通帳を見れば把握できますので、取り急ぎ、①を集計しようと思いました。

集計までの手順は以下の通りです。
 1.データセットの作成
 2.データの可視化
 3.データの分析(集計含む)

面倒なデータの前処理や可視化は極力、楽をしたいので、Pythonでコーディングしましたが、さらに楽をしたいので、生成AI(GPT4)を使ってコーディングまでやってもらいました。

1.データセットの作成
 クレジットカードは主に楽天カードを使っているので、その利用ログファイルをダウンロードする所からスタートです。当月分の請求(先月分の利用)を含め、過去15か月分のデータがダウンロードできました。これだけあれば、毎月の平均的な支出が把握できそうです。

例えば、2023年2月請求のログファイルは「enavi202302(6388).csv」というファイル名で、中身はこんな感じです。
"利用日","利用店名・商品名","利用者","支払方法","利用金額","支払手数料","支払総額","2月支払金額","3月繰越残高","新規サイン"
"2023/01/31","*********","本人","1回払い","3700","0","3700","3700","0","*"
"2023/01/25","*********","本人","1回払い","13025","0","13025","13025","0","*"
・・・
"2023/01/15","*********","家族","1回払い","1400","0","1400","1400","0","*"
・・・
"2023/01/07","ETCカード売上","ETC","1回払い","850","0","850","850","0","*"
・・・
"2023/01/01","*********","本人","1回払い","4277","0","4277","4277","0","*"
データから、本人や家族が利用した案件に加え、ETC利用も含まれていることが分かりました。
 分析を行う上で面倒なのは、①月毎にファイルが作成される点、②最新のデータが一番上で過去データが下にあり、時系列が逆になっている点です。前処理でその部分を一括で変換して、1つのファイルにしようと思います。

 ChatGPT4に添付ファイルを付けて、以下のプロンプトを「Data Analysis」で実行させました。添付ファイルは10個までの制限がありましたので、最終プログラムでは手作業で15ファイル対応にしました。dataset1_231126.pngGPT4からの回答は以下の通りです。「結合されたカード利用明細のダウンロード」をクリックすると、指示通り10ファイルの結合と時系列の並べ替えが完了していました。便利ですね!dataset2_231126.pngPythonプログラムを出力してもらいましょう。dataset3_231126.pngdataset4_231126.pngこの原型プログラムを修正して、15ファイルに対応したプログラムに修正しました。修正箇所は、ファイルパスのリストの数を10から15に拡張した程度です。完成したプログラムは以下の通りです。
import pandas as pd
import os

def combine_csv_files(file_paths, output_path):
all_data = pd.DataFrame()

for file_path in file_paths:
try:
# CSVファイルを読み込む
data = pd.read_csv(file_path, encoding='utf-8')

# 結合したDataFrameに追加
all_data = pd.concat([all_data, data])
except Exception as e:
print(f"Error reading {os.path.basename(file_path)}: {e}")

# 日付によってデータを並べ替える(最初のカラムが日付であると仮定)
all_data.sort_values(by=all_data.columns[0], inplace=True)

# インデックスをリセット
all_data.reset_index(drop=True, inplace=True)

# 結合されたデータをCSVファイルとして保存
all_data.to_csv(output_path, index=False)

return output_path

# ファイルパスのリスト
file_paths = [
'./enavi202209(6388).csv',
'./enavi202210(6388).csv',
'./enavi202211(6388).csv',
'./enavi202212(6388).csv',
'./enavi202301(6388).csv',
'./enavi202302(6388).csv',
'./enavi202303(6388).csv',
'./enavi202304(6388).csv',
'./enavi202305(6388).csv',
'./enavi202306(6388).csv',
'./enavi202307(6388).csv',
'./enavi202308(6388).csv',
'./enavi202309(6388).csv',
'./enavi202310(6388).csv',
'./enavi202311(6388).csv',
]

# 出力ファイルのパス
output_path = './Card_statement.csv'

# 関数を呼び出してCSVファイルを結合
combine_csv_files(file_paths, output_path)
最終的には必要なデータ項目のみを抽出して以下のデータセットに仕上げました。
利用日,利用店名・商品名,利用者,利用金額
2022/07/27,*******,家族,5160
2022/07/28,*******,本人,8534
・・・
2023/01/07,ETCカード売上,ETC,1060
・・・
ここまでのデータセットの作成について、生成AIを利用してあっという間に、サクサクと進めることができました。生成AIを用いない場合はPythonでコーディング・デバッグをしながらなので、感覚的に10倍ぐらいの労力がかかったかもしれません。
 2.データの可視化と3.データの分析については次回にお話しします。

ブログアクセスログをスクレイピングする(3)

 久々にブログのアクセスログを集計してみようと思い立ち(いつもの思いつき・・)、2年ほど前のブログを参考にプログラムを動かしてみました。結論から言うと、以前Pythonプログラムから操作できていたWebページがセキュリティ強化のためか?動かず・・。万事休すの備忘録です。

 このブログ記事はブラウザにFirefoxを使いましたが、今回はChromeを使いました。ChromeDriverはブラウザバージョンに対応したものをネットから取得し、以下のプログラムと同じフォルダ内に保存しました。
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time
import csv

driver = webdriver.Chrome('./chromedriver')

username = "xxxxx@outlook.com"
password = "my password"

# Login Page
driver.get('https://fc2.com/ja/login.php?ref=blog')

login_username = driver.find_element(By.ID,"id")
login_username.clear()
login_username.send_keys(username)

login_password = driver.find_element(By.ID,"pass")
login_password.clear()
login_password.send_keys(password)

driver.find_element(By.CLASS_NAME, 'sh_login_ja').click() # Login button click
time.sleep(2)

login_password.submit()
time.sleep(3)
13行目を実行すると、Chromeがテストモードで立ち上がります。Chrome_auto_231126.pngその後、21行目まで実行すると、「メールアドレス/ブログID」と「パスワード」に必要事項が入力されました。Login_231126.png23行目の「ログイン」の画像ボタンを押すと、問題なければ管理画面にページが飛ぶのですが、「メールアドレス/ブログID」と「パスワード」のテキストボックスの入力内容がクリアされ、ログインできない結果でした。
 何度やっても結果は同じでした。また、ログインボタンを押す操作だけ、手動でやっても、管理画面にログインできませんでした。セキュリティが変わったのか、自動でログインできなくなったのかなと思いながらも、念のため、ブラウザをEdgeに変更して再トライしました。

 Edgeのdriver(Mac用のmsedgedriver)もネットから取得し、以下のプログラムと同じフォルダ内に保存しました。Edge_driver_231126.png
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time
import csv

driver = webdriver.Edge('./msedgedriver')

username = "xxxxx@outlook.com"
password = "my password"

# Login Page
driver.get('https://fc2.com/ja/login.php?ref=blog')

login_username = driver.find_element(By.ID,"id")
login_username.clear()
login_username.send_keys(username)

login_password = driver.find_element(By.ID,"pass")
login_password.clear()
login_password.send_keys(password)

driver.find_element(By.CLASS_NAME, 'sh_login_ja').click() # Login button click
time.sleep(2)

login_password.submit()
time.sleep(3)
13行目を実行すると、Edgeがテストモードで立ち上がりました。Edge_auto_231126.png Chromeの場合と同様に、「メールアドレス/ブログID」と「パスワード」に必要事項が入力されましたが、結果は同じで、管理画面へログインできませんでした。手動でボタンを押しても同様でした。

 ブラウザを変えても同じ結果なので、ブラウザの問題ではなさそうです。手動でログインボタンを押してもNGなので、そもそもテストモードで管理画面にログインできないような仕様に変更になったのでしょう・・。以前は問題なく動いていたので・・。
 セキュリティ強化のために、自動でWebサイトを操作することが難しくなっていますね。個人的に利用するだけなのですが・・。頭を冷やして別の方法を検討しようと思います。

ChatGPT4を使う(6)

 前回の続きです。今回はChatGPT4のプラグイン機能のお話をしようと思いましたが、先に「Advanced Data Analysis」を味見したので、そのお話をします。

 Advanced Data Analysisは以前、Code Interpreterと呼ばれていたものですね。Code Interpreter自身は使ったことがなかったので、何とも言えませんが、データ(数値、画像)をChatGPTに食わせて、データ分析をするためのプログラムを書いてくれるもののようです。

 今回味見をしたのは2023/08/12のブログで画像を読み込ませて、BingとBardに画像処理をさせようとしてうまく行かなかった案件です。
 早速、Advanced Data Analysisを使う準備ですが、GPT-4から「Advanced Data ... Beta」を選択しました。AdvancedDataAnalysis_231105.png 画像をGPT-4に読み込ませて、カラー画像をモノクロ画像にするようにプロンプトを書きました。Prompt1_231105.png結果、手順を示した後に、結果のグレー(モノクロ)画像が出力されました。Answer1-1_231105.png「コードの詳細を表示」をクリックするとPythonのコードが表示されました。Answer1-2_231105.pngこのプログラムを別環境(VS code)から動作させても正常に動きました。Python_gray_run_231105.png 念のため、今現在のBingが賢くなっているかもしれませんので確認してみましたが、回答は以前と同様に希望したものではありませんでした。bing_231105.png
 画像をGPT-4に食わせて、画像処理ができることが分かったので、追加の確認(色抽出)を行いました。まずは、白いチューリップです。プロンプトは以下の通りで、Prompt2_231105.png結果は以下の通りです。やや黄色っぽいものやピンク色っぽいものもありますが、賢く選別できているようです。Answer2_231105.png別環境(VS Code)でもGPT-4で生成されたプログラムは、ほぼ修正なしで動作しました。Python_white_run_231105.png 次は、黄色のチューリップで、Prompt3_231105.pngその次は、赤色のチューリップです。Prompt4_231105.pngこの白色、黄色、赤色の識別についてですが、プログラム上で画像をHSV変換して、各色の範囲の画像領域を抽出していました。Hueの値はネット情報を参考に以下の関係があります。Hue_231105.png実際のプログラムで書かれていた色の定義は以下の通りです。自動で判断してパラメータも設定してくれたようですね。素晴らしい!!
# 白色の範囲を定義するための閾値
# HSVでの白色は、高い明度(Value)と低い彩度(Saturation)を持つ
lower_white = np.array([0, 0, 200])
upper_white = np.array([180, 55, 255])

# 黄色の範囲を定義するためのHSV閾値
# HSVでの黄色は、色相が約30から60度
lower_yellow = np.array([20, 100, 100])
upper_yellow = np.array([30, 255, 255])

# 赤色の範囲を定義するためのHSV閾値
# HSVでの赤色は色相が0付近または180付近
lower_red1 = np.array([0, 120, 70])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 120, 70])
upper_red2 = np.array([180, 255, 255])
 GPT-4では簡単な画像処理ならば、自然言語の指令だけで目的のプログラムを作成して、その場で確認してくれることが分かりました。今後、有効に活用していこうと思います。

爪水虫、治る

 今回も技術ネタではありません・・。(最近、技術ネタの投稿が少ない、考えていないエンジニア!)
【ご注意】衛生上よろしくないお話なので、それをご理解の上、先にお進みください。

 この直近の1年間、自律神経のバランスが良くないのか、体の到る所にダメージがあります。日々の忙しさで、体を日頃から労っていないからかもしれません。

 その中の放置していた案件として、左足の親指の爪が変色していた問題がありました。痛くも痒くもないので、半年以上そのまま放置していました。爪が伸びて切ると元通りになるのではないかと、非科学的なことを思っていたのですが、ますます酷くなってきたので、ネットで調べると「爪水虫」の症状に似ていたので、皮膚科に行きました。
 結果、予測通り「爪水虫」でした。初めてかかる症状でした。いつも靴を履いていて、足の指あたりに汗をかいていたせいなのか、あるいは実家の父親が水虫なのでそれが移ったのでしょうか??(後者が有力??)

 治療なのですが、テルビナフィンという抗真菌薬を数ヶ月飲むと治るとのこと。へぇ〜!。効能として、白癬(水虫ですね)、爪白癬、手・足白癬、生毛部白癬、頭部白癬、ケルスス禿瘡、白癬性毛瘡、生毛部急性深在性白癬、硬毛部急性深在性白癬に効くようです。

 6月中旬から薬を飲み続けて、3か月経つ頃に急激に変化が現れてきました。爪水虫9月末にはほぼ爪水虫の面影はなく、その1か月を過ぎた今でも再発していません。

 歳をとるにつれて、悪くなる所が増えていきますが、今回のように悪い所が治るということはあまりないので、些細なことながら嬉しい出来事でした。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: