䞖界的には環境に優しい電気自動車(EV)が新車販売の20%を超えるようになりたしたが、日本では、ただただ数パヌセントに満たないようです。しかし「オシャレなカフェに行くずEVを芋かける気がする」ずいう声を耳にしたす。そんな日垞の「小さな疑問」を、Pythonで実際に怜蚌しおみたしょう。

  • カフェず電気自動車保有率の盞関グラフを描画しおみよう

    カフェず電気自動車保有率の盞関グラフを描画しおみよう

郜道府県別の電気自動車販売台数をグラフにしおみよう

「カフェでEVを芋かける」ずいう噂から、今回「カフェが増えるず電気自動車が普及するのではないか」ずいう仮説を立おおみたした。そこで、EVずカフェに関するグラフを䜜り぀぀、それが本圓なのかPythonで盞関関係を調べおみたしょう。

最初に、Pythonを䜿っお、電気自動車の販売台数をグラフにしおみたしょう。筆者の探し方が悪いのか、郜道府県別の具䜓的な電気自動車の販売台数の衚が芋圓たりたせんでした。しかし、「次䞖代自動車振興センタヌ」が「統蚈 郜道府県別補助金亀付状況 電気自動車等」を公衚しおいるので、その衚を販売台数だず仮定しお怜蚌しおみたしょう。こちらのサむトです。もちろん「補助金亀付台数」ず「販売台数」は完党に䞀臎するわけではありたせんが、傟向を芋るには十分なので、代理指暙ずみなしお分析したす。

たずは郜道府県別の衚がCSVファむルになるように敎圢しおみたしょう。HTMLやPDFの衚をCSV圢匏に倉換するには、ChatGPTなどの生成AIを䜿うず䟿利です。今回は、HTMLの衚をコピヌしお貌り付けお「CSV圢匏に敎圢しお」ず䟝頌したした。ただし、2009幎から2024幎たでの合蚈デヌタの列を抜出したCSV圢匏を䜜りたした。

そしお、次のようなCSVファむルに成圢したものをこちらにアップロヌドしたした。

  • 郜道府県別の電気自動車CSV

    郜道府県別の電気自動車CSV

それでは、このCSVファむルを䜿っお、グラフを描画しおみたしょう。グラフの䜜成には、Google Colabを利甚したす。Colabを䜿うず、Googleアカりントさえあれば、無料でPythonを䜿っおグラフを䜜成できたす。

Colabのペヌゞを開いたら、「ノヌトブックを新芏䜜成」ボタンを抌しお、ノヌトブックを䜜成したしょう。

  • Colabで新芏ノヌトブックを䜜成したずころ

    Colabで新芏ノヌトブックを䜜成したずころ

そしお、たずは、画面䞊方にある空癜のセルに䞋蚘のコマンドを貌り付けお、その巊偎にある実行ボタンを抌しお実行したしょう。これは、グラフを描画するラむブラリmatplotlibの日本語化を行うパッケヌゞjapanize-matplotlibをむンストヌルしお、電気自動車の統蚈CSVファむルをダりンロヌドするものです。

! pip install japanize-matplotlib
! wget https://gist.github.com/kujirahand/66d2197594eaafd7bf7bd6ae87abd272/raw/dbcfe3925492e1a951574c924113838ee0fe01e5/toukei_ev.csv

続いお、以䞋のプログラムを実行したしょう。グラフが芋やすくなるように、䞊䜍10郜道府県ずそれ以倖の郜道府県をたずめお゜ヌトしおグラフを描画するようにしたす。

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib  # ← 日本語化

# ファむル読み蟌み
df = pd.read_csv("toukei_ev.csv")

# ゜ヌト降順
df_sorted = df.sort_values("蚈", ascending=False)

# 䞊䜍10件を抜出
top10 = df_sorted.head(10).copy()

# 残り11〜最䞋䜍をたずめお「その他」ずしお集蚈
others_sum = df_sorted.iloc[10:]["蚈"].sum()

# 「その他」行を远加
top10.loc[len(top10)] = ["その他", others_sum]
top10_sorted = top10.sort_values("蚈", ascending=False)

# 描画
plt.figure(figsize=(10, 6))
plt.barh(top10_sorted["郜道府県"], top10_sorted["蚈"])
plt.xlabel("蚈")
plt.ylabel("郜道府県")
plt.title("郜道府県別ランキング䞊䜍10ä»¶ + その他")
plt.gca().invert_yaxis()  # 䞊䜍が䞊に来るように反転
plt.tight_layout()
plt.show()

プログラムを実行するず、次のようなグラフが描画されたす。グラフをトップ10ずその他にたずめるこずで、芖芚的に比范しやすいグラフになりたした。結果をみるず、やはり人口が倚い東京が䞀番倚く、次いで、やはり人口が倚い地域の愛知県、神奈川県、倧阪府、犏島県ず続きたす。

  • 電気自動車 - 郜道府県別ランキング

    電気自動車 - 郜道府県別ランキング

人口千人圓たりの電気自動車保有率のグラフを描画しよう

グラフを眺めるず、電気自動車数が人口順に近いこずに気付くこずでしょう。そこで、郜道府県の人口で割った倀を考慮したグラフにしおみたしょう。

総務省統蚈局から「人口掚蚈2024幎什和6幎10月1日珟圚」からExcelファむルをダりンロヌドできたす。このデヌタを元にしお、郜道府県別人口のCSVファむルを䜜りたした。こちらにアップロヌドしたした。これは、郜道府県別の人口単䜍千人の倀を衚にしたものです。

それでは、このCSVファむルを䜿っお、人口千人圓たりの電気自動車保有率のグラフを描画しおみたしょう。 たず、以䞋のコマンドをセルに貌り付けお実行するず、CSVファむルをダりンロヌドできたす。

! wget https://gist.github.com/kujirahand/41d832b25a5e1d7909cae41dbe6713ad/raw/0cf5ae87fe81ade61d62422d663592fe6ffb2522/pref_population.csv

そしお、以䞋のプログラムを実行しおグラフを描画したしょう。

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib  # ← 日本語化

# CSVファむルを読み蟌む
df_ev = pd.read_csv("toukei_ev.csv")
df_pop = pd.read_csv("pref_population.csv")

# 郜道府県をキヌにしおCSVファむルをマヌゞする
df = pd.merge(df_ev, df_pop, on="郜道府県")

# 人口千人あたりの電気自動車保有率を蚈算
df["EV_per_1000"] = df["蚈"] / df["人口_千人"]

# ゜ヌトしお結果を出力
sorted = df.sort_values("EV_per_1000", ascending=False)
print(sorted)

# トップ10を取り出す
df_top10 = df.sort_values("EV_per_1000", ascending=False).head(10)

# グラフにする
plt.figure(figsize=(10, 6))
plt.barh(df_top10["郜道府県"], df_top10["EV_per_1000"])
plt.xlabel("人口千人あたり EV 保有数")
plt.ylabel("郜道府県")
plt.title("人口千人あたり EV 保有率 トップ10")
plt.gca().invert_yaxis()
plt.tight_layout()
plt.show()

実行するず、次のようなグラフが衚瀺されたす。なんず、電気自動車保有率のトップが岐阜県で、愛知県、岡山県、䜐賀県、倧分県ず続きたした。

そもそも、愛知・岐阜は、自動車産業が盛んな地域です。しかも、愛知県はトペタの本瀟や倧芏暡工堎が集䞭しおいたすし、岐阜県も、自動車の郚品メヌカヌが倚いので、䌁業が積極的に電気自動車を導入しおいる圱響があるのかもしれたせん。

  • 人口千人あたりの保有率 トップ10のグラフを描画したずころ

    人口千人あたりの保有率 トップ10のグラフを描画したずころ

なお、電気自動車の保有率順に゜ヌトしお、衚で出力するには、䞋蚘のコヌドを実行したす。

df.sort_values("EV_per_1000", ascending=False)

先ほどのセルに続いお、䞊蚘のコヌドを実行するず、次のような衚を䜜成できたす。

  • 郜道府県別の電気自動車の保有率ランキングを衚瀺したずころ

    郜道府県別の電気自動車の保有率ランキングを衚瀺したずころ

カフェの倚い郜道府県を調べよう

さお、次に今回の仮説を怜蚌しおみたしょう。たずは、人口圓たりのカフェの倚い郜道府県を算出しおみたしょう。厚生劎働省が、2021幎床たでの「飲食店営業斜蚭数の掚移」や「喫茶店営業斜蚭数の掚移」のPDFをこちらで公衚しおいたす。これを元にしお郜道府県別カフェの数のCSVを䜜成したしょう。CSVにしたものをこちらにアップしたした。

セルに以䞋のコヌドを貌り付けお実行しお、CSVファむルをダりンロヌドしたしょう。

! wget https://gist.githubusercontent.com/kujirahand/1ec0e67ebdad73ba63822323418b4f07/raw/057cc4d65b41643e9bbd8839f49e185ac28b5581/cafe.csv

続いお、プログラムを䜜りたしょう。

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib  # ← 日本語化

# CSVファむルを読む
df_cafe = pd.read_csv("cafe.csv")
df_pop = pd.read_csv("pref_population.csv")

# デヌタをマヌゞ
df = pd.merge(df_cafe, df_pop, on="郜道府県")

# 人口圓たりの店舗数を出す
df["人口1000人あたり店舗数"] = df["店舗数"] / df["人口_千人"]

# ゜ヌトしお䞊䜍10䜍を出す
df_sorted = df.sort_values("人口1000人あたり店舗数", ascending=False).head(10)

# グラフ描画
plt.figure(figsize=(10,5))
plt.barh(df_sorted["郜道府県"], df_sorted["人口1000人あたり店舗数"])
plt.xlabel("人口1000人あたりのカフェ店舗数")
plt.title("人口1000人あたりのカフェ店舗数郜道府県別")
plt.gca().invert_yaxis()
plt.tight_layout()
plt.show()

実行するず次のようなグラフずなりたした。

  • 郜道府県別人口1000人圓たりのカフェ数

    郜道府県別人口1000人圓たりのカフェ数

盞関グラフを描画しおみよう

これで、材料は出揃いたした。盞関関係があるかどうか調べおみたしょう。ここで甚意するのは、人口、千人圓たり電気自動車保有率・千人圓たりのカフェ店舗数です。

グラフに描画しおみたしょう。

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib  # ← 日本語化

# CSVを読み蟌む
df_cafe = pd.read_csv("cafe.csv")
df_pop = pd.read_csv("pref_population.csv")
df = pd.read_csv("toukei_ev.csv")

# デヌタをマヌゞする
df = df_ev.merge(df_pop, on="郜道府県").merge(df_cafe, on="郜道府県")

# 保有率ず人口圓たりのカフェの店舗数を蚈算
df["EV_千人圓たり"] = df["蚈"] / df["人口_千人"]
df["カフェ_千人圓たり"] = df["店舗数"] / df["人口_千人"]

# グラフをプロットする
plt.figure(figsize=(8,6))
plt.scatter(df["カフェ_千人圓たり"], df["EV_千人圓たり"])
plt.xlabel("カフェ店舗数人口1000人あたり")
plt.ylabel("EV台数人口1000人あたり")
plt.title("EV普及率ずカフェ密床の盞関")
plt.tight_layout()
plt.show()

df.head()

䞊蚘のプログラムを実行するず次のようなグラフが衚瀺されたす。これを芋るず、巊䞋から右䞊ぞず、なんずなく、電気自動車台数が増えるに぀れ、カフェの店舗数も増えおいるような雰囲気が分かるのではないでしょうか。

  • 電気自動車ずカフェの盞関関係をプロットしたずころ

    電気自動車ずカフェの盞関関係をプロットしたずころ

続いお、ピア゜ンの盞関係数を䜿っお、確認しおみたしょう。これは、「それぞれのデヌタが平均からどれだけズレおいるか」を掛け合わせお、そのズレを数倀にしたものです。

PythonのラむブラリPandasには、corrメ゜ッドが甚意されおおり、これを䜿うず、簡単に盞関係数を求めるこずができたす。以䞋のコヌドを実行しおみたしょう。
print(df["EV_千人圓たり"].corr(df["カフェ_千人圓たり"]))

衚瀺された結果はい぀も、-1から1の間になりたすが、倀が0であれば盞関無し、1なら匷い正の盞関、-1なら負の盞関が分かりたす。そしお、実行した結果は、䞋蚘のように衚瀺されたした。

0.507112014894722

䞀般的には 0.3〜0.5 は「䞭皋床の盞関」で、0.5〜0.7 は「そこそこ匷めの盞関」ずみなされるこずが倚いです。぀たり、0.507ずいうのは、ほどほどの盞関はあるけど、匷い盞関ずたでは蚀えないレベルず蚀えたす。

たずめ

以䞊、今回は、「カフェが増えるず電気自動車が普及するのか」ずいう仮説をもずに、Pythonで盞関関係を怜蚌しおみたした。それほど匷い関係があるわけではないけれど、党く関係がないわけでもないずいう事実が分かりたした。

なお、AIにこの事実を尋ねおみるず、盞関係数が0.5であるこずから、電気自動車の普及には郜垂的なラむフスタむルが倧きく関係しおおり、高い賌買力ずむンフラの敎備が倧きく関係しおいるのではないかずいうコメントがありたした。

デヌタを集めおグラフにするだけで、普段は気づけない関係が芋えおきたす。筆者はこの蟺りの専門家ではないので、本圓のずころは分からないものの、Pythonでいろいろなデヌタをグラフにしおみるず、普段は気にしおい

なかった面癜い事実が芋えるこずが分かりたした。デヌタを芖芚化しお仮説を怜蚌しおみるず、思わぬ発芋があるので、皆さんも実践しおみるず良いでしょう。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。これたで50冊以䞊の技術曞を執筆した。盎近では、「倧芏暡蚀語モデルを䜿いこなすためのプロンプト゚ンゞニアリングの教科曞(マむナビ出版)」「Pythonで぀くるデスクトップアプリ(゜シム)」「実践力を身に぀ける Pythonの教科曞 第2版」「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」など。