見出し画像

調達、購買部門向け生成AI、Python活用(取引先一覧を地図へ表示、災害時の影響範囲確認)

BCP対策できてますか?
地震などの災害が起きたときに、対象のサプライヤを感ピュータで調査したり、各個人のサプライヤリストから都道府県などから抽出してませんか?
私の部門も災害時の対象サプライヤの抽出に苦労していたのですが、Pythonを使って以下を実施することで、早期に対象サプライヤを抽出できるように対策しました。
①サプライヤリストを一元管理
②住所から緯度経度を取得し、地図上で見える化できるファイルを作成
③地震などの災害時は、震源地(災害発生地域)から近い順のリスト作成
地震発生時は、①②のファイルを関係者に配布することで、短期間で影響有無を確認できるようになりました。(今はシステムを導入済みです)
以降で、やり方を説明していきますが、この記事内容を実施する場合の前提条件として、Jupyter上でPythonを実行できるようになっていることを前提としています。

PythonとJupyterの導入は、記事をググっていただくか、以下のChatGPT回答方法でも、インストールと起動はできると思うので、そこまではご自身で対応お願いします。

(参考)Python、Jupyter labのインストール方法


①サプライヤリストを一元管理
エクセルでいいので、1つのファイルにまとめてください。住所は分割する必要はなく、1つの列にすべての住所が記載されていてOKです。(県、市などでセルを分けると使いにくい)

②住所から緯度経度を取得し、地図上で見える化できるファイルを作成
ChatGPTにPythonコードを書いてもらい、取引先住所一覧から緯度経度を取得し、地図上に表示する方法を説明します。
Pythonで作成した地図ファイル(html)は他の人に送ることがきます。(表示にはネット環境が必要)
また、地震の発生時には、震源地からの半径を表示させて視覚的に位置関係を認識できるようになります。
また、一覧表を震源地からの距離を計算して計算値近い順に並べ替えることで、エクセル上での対象サプライヤ抽出も可能です。

緯度経度の取得
住所から緯度経度を取得するにはapiを使用します。
apiの種類としては、Google mapのapiが精度も高く、難しい住所を入れても、何かしら返してくれるので使いやすいです。
ただし、Google Cloud Platformでアカウントを取得し、カード情報も入れないとAPIを取得できませんが、月に$200までの無料枠があり、Geocoding APIは、1000回/$5のため、40,000回までの無料枠があります。
(無料枠として、地図表示1000回/$7で、28500回との記載からの推測)
他の無料apiだと町や丁目で止めないと検索されなかったり、海外が非対応だったり色々と制限があり、海外と取引がある会社では使いにくいと思います。
また、Google mapのAPIは、日本語、英語、中国語、タイ語、ベトナム語、何語で住所が書かれていても、99%くらいは何かしら返してくれるので非常に使いやすいのでおすすめです。有料apiというのが心配なら、使わないときは制限をかけると安心です。

一応、google map apiを使いたくない方用に国土地理院が提供しているAPIを使う方法も記載しています(ただし、海外は対象外)

また、地図表示で使っているOpenStreetMapも無料のapiがあり、海外も対象ですが、番地以降を含めた文字列にすると検索ができないため、事前に住所の加工が必要で手間がかかるので今回は使ってません。

これから地図を作成の手順に入っていきますが、まずは住所の元データを作ります。すでに手元にデータがある場合は、それを使うこともできます。
ただし、社内データをChatGPTにアップロードする場合は、社内規定やルールに従ってください


テスト住所データの作成’(住所データが手元にある場合は不要)
ChatGPTに日本の各都道府県で売上の一番大きな企業名と住所一覧を作成してもらおうとしましたが、理屈っぽいのか作成してくれませんでした。

GPT NG

こういうときは、別の生成AIも試してみます。Google Mapと連携している、GoogleのGemini(無料版)に聞いたことろ、一発で作成してくれましたが、住所は間違っているものが多くありました。。
サンプルデータですから、架空の住所として進めます。
※この住所は架空のものです(実際の住所は異なります)

Gemini

Google Map APIを使って緯度経度の取得
ChatGPTに戻ります。この住所データを使って緯度経度を求めたいと思います。ご自身のデータを使ってもかまいませんが、住所が記載してある列名を”住所”にしておいてください。

さっそく、以下のようにGhatGPTに、Python、geopy、google map geocoding apiを使って緯度経度を取得すること指示します。
指示はできるだけ具体的に書いたほうが求めたものに近い回答になります。回答結果をみて更に情報が不足していることに気がついた場合(よくある)、編集機能(鉛筆マーク)でプロンプトを修正して、再度回答を求めることもできます。

緯度経度作成依頼
Python geopyで緯度経度取得1
Python geopyで緯度経度取得2

上記のコードのみ記載します。

import pandas as pd
from geopy.geocoders import GoogleV3

# Google Maps Geocoding APIのAPIキーを設定
api_key = 'YOUR_GOOGLE_API_KEY'

# CSVファイルのパスを設定
csv_file_path = 'path/to/your/csvfile.csv'

# CSVデータをPandas DataFrameとして読み込む
df = pd.read_csv(csv_file_path)

# GoogleV3ジオコーダを初期化
geolocator = GoogleV3(api_key=api_key)

# 住所から緯度経度を取得する関数
def get_lat_lon(address):
    try:
        location = geolocator.geocode(address)
        if location:
            return location.latitude, location.longitude
    except Exception as e:
        print(f"Error geocoding {address}: {e}")
    return None, None

# 緯度経度を取得してDataFrameに追加
df['緯度'], df['経度'] = zip(*df['住所'].map(get_lat_lon))

# 結果を確認
print(df.head())

# 必要に応じて結果をCSVに保存
# df.to_csv('path/to/your/updated_csvfile.csv', index=False)

ChatGPT上の分析機能(Python実行)ではインターネットへ接続できないため、自身のPC上でJupyter、VScode、colaboratoryなどを使ってPythonを実行することで緯度経度が取得できます。

生成されたコードを、Jupyterに貼り付けて、以下の部分を修正します。
・api_keyは、自分で取得したapi keyに変更(コードにkeyを貼り付けるのはセキュリティー上良くないのですが、ここではそのままにしています、取り扱いご注意ください)
・csv_file_pathは、保存しているファイルのパスに変更
また、df = df.head(5)は、テスト用として最初の5行のみを抽出している部分なので、テストで緯度経度取得に成功したら、この行は削除して、すべての緯度経度を取得するようにします。
※この住所は架空のものです(実際の住所は異なります)

Python geopy google map api

Jupyter上で実行することで緯度経度が取得できたので、結果をcsvで保存します。

# 結果をcsvに保存(エクセルに保存の場合は、下側先頭の#を削除)
df.to_csv(r"C:\Users\*****\Downloads\都道府県_大手企業_緯度経度.csv", index=False)
#df.to_excel(r"C:\Users\*****\Downloads\都道府県_大手企業_緯度経度.xlsx", index=False)

国土地理院APIを使用(Google Map APIを使えない場合)
次に、google map apiを使えない方用に、国土地理院のapiを使った方法を説明します。ただ、国土地理院のサイトにapiの詳細が乗っていなかったため、ググった内容で、ChatGPTにurlなど補足情報を伝えて指示をしました。またapiを投げる間隔は1秒あけるよう指示しています。

国土地理院api
国土地理院api GPT1
国土地理院api GPT2

ChatGPTの回答コードに対して、以下内容で修正します。
・6行目にcsvのデータを読み込む行を追加(ファイルパスは修正必要)
・下から4行目の「関数を実行」下側コードの#を削除
・一番下の「結果を表示」をdfのみに
住所一覧に海外の住所がある場合は、国土地理院のapiでは緯度経度なし(nan)または、間違った緯度経度が返ってくるので、できれば削除しておいてください(無理ならそのままで)

import pandas as pd
import requests
import time

# 適切なファイルパスに置き換えてください
file_path = r"C:\Users\****\Downloads\都道府県_大手企業.csv"
df = pd.read_csv(file_path)

# 緯度経度を取得してデータフレームに追加する関数
def add_lat_lon_to_df(df):
    latitudes = []
    longitudes = []
    
    for address in df['住所']:
        # 国土地理院のAPI URLを生成
        api_url = f"https://msearch.gsi.go.jp/address-search/AddressSearch?q={address}"
        
        # APIを呼び出し
        response = requests.get(api_url)
        time.sleep(1)  # 1秒間隔をあける
        
        if response.status_code == 200:
            data = response.json()
            if data:  # 緯度経度情報があれば追加
                coordinates = data[0]['geometry']['coordinates']
                longitudes.append(coordinates[0])
                latitudes.append(coordinates[1])
            else:  # 情報がなければNoneを追加
                longitudes.append(None)
                latitudes.append(None)
        else:
            longitudes.append(None)
            latitudes.append(None)
    
    # 緯度経度の列をデータフレームに追加
    df['緯度'] = latitudes
    df['経度'] = longitudes

# 関数を実行
add_lat_lon_to_df(df)

# 結果を表示
df

国土地理院apiでも緯度経度取得できました。

国土地理院api 緯度経度取得結果

地図上へのプロット
次に、取得した緯度経度をもとに地図にプロットしていきます。
以下でChatGPTへPythonコード作成を指示。
ここではfoliumという地図を作成できるPythonライブラリを使用します。
指示はできるだけ具体的に。

ここから先は

5,798字 / 18画像

¥ 1,500

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?