Advanced Data Analysis(旧Code Interpreter)で外部ライブラリを利用して地図を描いてみた
Code Interpreter(CI)はネットにアクセスできないため、通常は、CIが最初から採用していないライブラリを使用することはできません。
しかし、ユーザーが自分でライブラリのファイルなどをアップロードすることにより、これらを使用する方法があるという情報をSNSで見つけたので、地図を描くライブラリで試してみました。
1.Code Interpreterのライブラリを利用した地図の作成
最初に、外部ライブラリを使用せずに、CIがどのくらいの地図が描けるのか試してみました。
(1) 世界地図
最初に世界地図を描いてもらいました。
CIが最初からサポートしているPythonの地理情報ライブラリのgeopandasを使用しています。
コードインタープリタで世界地図を描いてください。
【CIが生成したコード】
import geopandas as gpd
import matplotlib.pyplot as plt
# Load the world map data
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
# Plot the world map
world.plot()
# Display the plot
plt.show()
(2) 日本地図
次に日本地図を描いてもらいました。
少し粗いですが、日本地図も描けます。
日本地図を描いてください。
【CIが生成したコード】
# Filter the world map data to include only Japan
japan = world[world['name'] == 'Japan']
# Plot the map of Japan
japan.plot()
# Display the plot
plt.show()
(3) 日本地図に政令指定都市をプロット
(2)で生成した日本地図に政令指定都市の位置をプロットしてみました。
日本の政令指定都市とその緯度・経度の一覧表を作成してください。
この一覧表を利用して、先程の日本地図に政令指定都市の位置を表示してください。
地図のタイトルやラベルは英語にしてください。
【CIが生成したコード】
fig, ax = plt.subplots(1, 1)
# Plot the map of Japan
japan.plot(ax=ax, color='white', edgecolor='black')
# Plot the locations of the designated cities
plt.scatter(df['Longitude'], df['Latitude'], color='red')
# Label the cities
for x, y, label in zip(df['Longitude'], df['Latitude'], df['City']):
plt.text(x, y, label, fontsize=8)
# Set the title and labels
plt.title('Designated Cities in Japan')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
# Display the plot
plt.show()
都市名が重なってしまいましたが、政令指定都市の位置をプロットすることができました。
2.外部ライブラリを利用した地図の作成
(1) japanmapライブラリのファイル入手
Pythonライブラリのファイルは、以下のPython Package Index(PyPI)のサイトから入手できます。
検索窓にライブラリの名前などを入力することにより、必要なライブラリのファイルを簡単に見つけることができます。
今回は、都道府県別に日本地図を塗り分けることができるPythonライブラリのjapanmapを使用します。
japanmap 0.3.0のページで「ファイルをダウンロード」をクリックして、
japanmap-0.3.0-py3-none-any.whl(170.6 kB)をダウンロードし、自分のパソコンに保存してください。
(2) ファイルのアップロードとプログラムの実行
まず、CIをセットしたChatGPTの入力欄で、「+」ボタンをクリックして、先程ダウンロードしたjapanmap-0.3.0-py3-none-any.whlファイルをアップロードし、ファイルの解凍とパスの設定を指示しました。
CIがファイルの解凍とパスの設定のために生成したコードは以下のとおりです。
import zipfile
import os
import sys
# File path
wheel_file_path = '/mnt/data/japanmap-0.3.0-py3-none-any.whl'
# Extract the wheel file
with zipfile.ZipFile(wheel_file_path, 'r') as zip_ref:
zip_ref.extractall('/mnt/data/japanmap')
# Add the extracted directory to the system path
sys.path.append('/mnt/data/japanmap')
# Check if the path is added successfully
'/mnt/data/japanmap' in sys.path
次に、日本地図を描くように指示します。
以下がCIが描いた日本地図です。
CIが日本地図を描くために生成したコードは以下のとおりです。
from japanmap import picture
# Create a color dictionary
colors = {"東京都": "red"}
# Generate the picture
img = picture(colors)
# Create a figure
fig = plt.figure(figsize=(8, 8))
# Remove the axes
ax = plt.Axes(fig, [0., 0., 1., 1.], )
ax.set_axis_off()
fig.add_axes(ax)
# Display the picture
plt.imshow(img)
plt.show()
「私の環境では外部のパッケージをインストールすることはできない」と言って、ChatGPTがプログラムの実行を拒否してくることもありますが、「失敗しても構わないので必ず実行してください」と何度も強くお願いすれば、実行してくれることがあります。
Newchatでのやり直しも含め、あきらめずに何度も依頼してみましょう。
注)その後、さらに外部ライブラリの利用が厳しくなっているようで、インポートに失敗することが増えました。
3.データを基に都道府県を塗り分けた日本地図を作成
以下の都道府県市区町村のWebサイトのデータを利用して、都道府県を塗り分けた日本地図を作成してみます。
(1) 人口の増減率
上記サイトの人口の増減率に関するデータを利用して、都道府県を塗り分けた日本地図(コロプレスマップ)を作成してもらいました。
この地図を作成するために筆者が入力したプロンプトは以下のとおりです。
以下がCIが描いた人口増減率で塗り分けた日本地図です。
【CIが生成したコード】
# Prepare the dictionary for population growth rate
pref_pop_growth_rate = {
'沖縄県': 0.08,
'東京都': -0.04,
'神奈川県': -0.04,
'埼玉県': -0.10,
'千葉県': -0.14,
'滋賀県': -0.29,
'福岡県': -0.33,
'大阪府': -0.56,
'愛知県': -0.59,
'茨城県': -0.90,
'宮城県': -0.97,
'山梨県': -1.03,
'京都府': -1.07,
'兵庫県': -1.11,
'熊本県': -1.18,
'栃木県': -1.28,
'石川県': -1.29,
'群馬県': -1.33,
'長野県': -1.34,
'佐賀県': -1.34,
'奈良県': -1.39,
'岡山県': -1.39,
'静岡県': -1.40,
'広島県': -1.42,
'三重県': -1.55,
'大分県': -1.56,
'北海道': -1.62,
'鹿児島県': -1.63,
'宮崎県': -1.66,
'岐阜県': -1.68,
'香川県': -1.73,
'鳥取県': -1.76,
'富山県': -1.78,
'福井県': -1.81,
'島根県': -1.97,
'和歌山県': -2.10,
'愛媛県': -2.14,
'山口県': -2.16,
'徳島県': -2.19,
'新潟県': -2.20,
'長崎県': -2.26,
'高知県': -2.28,
'福島県': -2.39,
'岩手県': -2.48,
'山形県': -2.53,
'青森県': -2.71,
'秋田県': -3.08
}
# Prepare the dictionary for population growth rate to color
growth_rate_to_color = {
range(0, int(0.5 * 100)): 'red',
range(-int(0.5 * 100), 0): 'orange',
range(-int(1.0 * 100), -int(0.5 * 100)): 'yellow',
range(-int(1.5 * 100), -int(1.0 * 100)): 'green',
range(-int(2.0 * 100), -int(1.5 * 100)): 'blue',
range(-int(2.5 * 100), -int(2.0 * 100)): 'navy',
range(-int(3.0 * 100), -int(2.5 * 100)): 'purple',
range(int(-3.0 * 100 - 1), -int(3.0 * 100)): 'white',
}
# Prepare the dictionary for prefecture to color
pref_to_color = {}
for pref, growth_rate in pref_pop_growth_rate.items():
for r, color in growth_rate_to_color.items():
if int(growth_rate * 100) in r:
pref_to_color[pref] = color
break
# Plot the map
pct = picture(pref_to_color)
plt.figure(figsize=(10, 10))
plt.imshow(pct)
plt.axis('off')
plt.show()
(2) マイナンバーカードの普及率
上記サイトのマイナンバーカードの普及率に関するデータを利用して、都道府県を塗り分けた日本地図を作成してもらいました。
この地図を作成するために筆者が入力したプロンプトは以下のとおりです。
以下がCIが描いたマイナンバーカードの普及率で塗り分けた日本地図です。
【CIが生成したコード】
# Prepare the dictionary for My Number card diffusion rate
pref_mynumber_rate = {
'宮崎県': 79.2,
'鹿児島県': 75.7,
'佐賀県': 75.0,
'鳥取県': 74.6,
'山口県': 74.4,
'岐阜県': 74.3,
'広島県': 74.3,
'愛媛県': 74.0,
'秋田県': 73.8,
'富山県': 73.3,
'福井県': 73.2,
'山形県': 73.1,
'石川県': 73.1,
'島根県': 72.7,
'静岡県': 72.5,
'和歌山県': 72.5,
'滋賀県': 72.3,
'熊本県': 72.3,
'大分県': 72.3,
'奈良県': 72.2,
'岡山県': 71.6,
'香川県': 71.4,
'長崎県': 71.4,
'新潟県': 70.9,
'兵庫県': 70.9,
'福岡県': 70.8,
'愛知県': 70.6,
'青森県': 70.3,
'福島県': 70.3,
'山梨県': 70.3,
'宮城県': 70.2,
'岩手県': 70.1,
'千葉県': 70.0,
'栃木県': 69.9,
'茨城県': 69.7,
'三重県': 69.4,
'群馬県': 69.2,
'北海道': 68.9,
'神奈川県': 68.8,
'徳島県': 68.8,
'大阪府': 68.6,
'長野県': 68.1,
'埼玉県': 67.9,
'京都府': 67.8,
'高知県': 67.1,
'東京都': 66.8,
'沖縄県': 58.0
}
# Prepare the dictionary for diffusion rate to color
diffusion_rate_to_color = {
range(int(77.5), int(100)): 'red',
range(int(75.0), int(77.5)): 'orange',
range(int(72.5), int(75.0)): 'yellow',
range(int(70.0), int(72.5)): 'green',
range(int(67.5), int(70.0)): 'blue',
range(int(65.0), int(67.5)): 'navy',
range(int(0), int(65.0)): 'purple',
}
# Prepare the dictionary for prefecture to color
pref_to_color = {}
for pref, diffusion_rate in pref_mynumber_rate.items():
for r, color in diffusion_rate_to_color.items():
if int(diffusion_rate) in r:
pref_to_color[pref] = color
break
# Plot the map
pct = picture(pref_to_color)
plt.figure(figsize=(10, 10))
plt.imshow(pct)
plt.axis('off')
plt.show()
以上のように、japanmapのライブラリのファイルをアップロードした後、CIで都道府県を塗り分けた様々な日本地図を作成することができます。
(3) 都道府県の人口密度のコロプレスマップ
教育用標準データセット(SSDSE)をアップロードして、人口密度のコロプレスマップを描いてもらいました。
(4) 都道府県の医療の充実度のコロプレスマップ
次に、都道府県の医療の充実度のコロプレスマップを作成してもらいました。
医療の充実度のコロプレスマップを作成してください。
それぞれ人口一人当たりに修正した、一般病院数、一般診療所数、歯科診療所数、医師数を使用してください。
4.歴史上の人物にゆかりの都道府県を答える
japanmapライブラリを利用して、以下のようなことを試してみました。
あなたは私に、好きな歴史上の人物の名前を聞きます。
私が人物の名前を答えたら、その人物に関係のある都道府県を着色し、その人物との関係を説明してください。
5.都道府県名当てゲーム
次は、地図の表示から都道府県の名前を当てるゲームを作成してみました。
あなたは、都道府県を一つ選んで着色し、それがどの都道府県か私に質問してください。
私が都道府県の名前を回答したら、正解のときは「ピンポン」、不正解のときは「ブー」と答え、正解の都道府県の特徴、観光名所、名物について説明してください。
このゲームの作成は、以下のnote記事を参考にしました。
6.foliumによる詳細地図の表示
foliumは、JavaScriptで拡大縮小できる地図データをHTMLファイルで出力するPythonライブラリで、CIが最初からサポートしており、地図上にマーカーを表示することもできます。
(1) 東京ディズニーランド付近の地図の作成
import folium
# 東京ディズニーランドの座標
latitude = 35.632896
longitude = 139.880394
# 地図の初期設定
map = folium.Map(location=[latitude, longitude], zoom_start=15)
# マーカーを追加
folium.Marker([latitude, longitude], popup='Tokyo Disneyland').add_to(map)
# HTMLファイルとして出力
map.save('tokyo_disneyland_map.html')
HTMLファイルは以下からダウンロードできます。地図はマウスで拡大縮小することができます。
最初は、現在の環境ではできないと拒否しますが、再度、プログラムの実行をお願いすれば、地図を出力してくれました。
(2) 文京区の公衆無線LAN設置場所の表示
東京オープンデータカタログサイトの以下のページから文京区の公衆無線LAN設置場所のデータをダウンロードして、foliumにその設置場所を表示させてみました。
HTMLファイルは以下からダウンロードできます。地図上のマーカーをクリックすると設置場所の名称が表示されます。
【EXCELファイルからデータを読み取るためにCIが生成したコード】
import pandas as pd
import folium
# Load data from the provided excel file
data = pd.read_excel("/mnt/data/kosyumusenlan.xlsx")
# Check the data
data.head()
【地図上に設置場所をプロットするためにCIが生成したコード】
# Drop rows with missing values
data_clean = data.dropna()
# Create a map centered around Bunkyo Ward, Tokyo
bunkyo_map = folium.Map(location=[35.7188100, 139.744732], zoom_start=13)
# Add a marker for each location in the cleaned data
for _, row in data_clean.iterrows():
folium.Marker(location=[row["緯度"], row["経度"]],
popup=row["名称"],
icon=folium.Icon(icon="cloud")).add_to(bunkyo_map)
# Save the map as an html file
bunkyo_map.save("/mnt/data/bunkyo_wifi_map_clean.html")
この記事が気に入ったらサポートをしてみませんか?