世界的には環境に優しい電気自動車(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自動処理の教科書(マイナビ出版)」など。