はじめに
ここでは、人工知能(AI)や機械学習の手法を用いて、公開されているデータを分析する方法を紹介します。Pythonを使用した線形回帰モデルを例に、データから洞察を引き出し、未来の傾向を予測する手法を解説します。今回取り上げるのは、NHKが公開している岸田内閣の支持率データです。ここでの分析は技術的な目的で行われており、いかなる政治的評価を意図したものではありません。
データ分析は多くの分野で応用されており、政治的な支持率の追跡もその一つです。しかし、政治的な予測や評価はとても複雑であり、多くの要因に影響されます。本記事での分析結果を、政治的な意味合いでの予測と解釈されないようお願いいたします。本記事の目的は、データ分析の基本的な手法を紹介します。Pythonを使ってどのようにデータから傾向を読み取り、予測を立てるかを紹介します。
岸田内閣の現在の支持率
これまでの支持率をグラフ化する
まず、これまでの岸田内閣の支持率と不支持率の推移をPythonで視覚化します。以下のPythonコードは、NHKの公開データを使用して2021年10月から2023年10月までの岸田内閣の支持率と不支持率をグラフ化しています。コード内の matplotlib と scipy ライブラリを用いて、実際のデータ点に基づいてなめらかな曲線を描画するスプライン補間を実行しています。これにより、視覚的にわかりやすいトレンドを表示できます。
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime
from scipy.interpolate import make_interp_spline
import matplotlib.dates as mdates
# データの設定
dates = ["2021年10月", "2022年7月", "2023年1月", "2023年7月", "2023年10月"]
approval_rates = np.array([49, 59, 33, 38, 36])
disapproval_rates = np.array([24, 21, 45, 41, 44])
# (引用元:https://www.nhk.or.jp/senkyo/shijiritsu/)
# 日付をmatplotlibが認識できる形式に変換
dates_mpl = [mdates.date2num(datetime.strptime(date, '%Y年%m月')) for date in dates]
# スプライン曲線のための細かい日付の配列を生成
dates_mpl_new = np.linspace(min(dates_mpl), max(dates_mpl), 300)
# スプライン補間を使ってなめらかな曲線を生成
spl_approval = make_interp_spline(dates_mpl, approval_rates, k=2) # 二次のスプライン曲線
spl_disapproval = make_interp_spline(dates_mpl, disapproval_rates, k=2) # 二次のスプライン曲線
smooth_approval = spl_approval(dates_mpl_new)
smooth_disapproval = spl_disapproval(dates_mpl_new)
# グラフの描画
plt.figure(figsize=(10, 5))
plt.plot(dates_mpl, approval_rates, 'bx', label='Approval Rate (%)')
plt.plot(dates_mpl, disapproval_rates, 'rx', label='Disapproval Rate (%)')
plt.plot(dates_mpl_new, smooth_approval, 'b-', linewidth=2)
plt.plot(dates_mpl_new, smooth_disapproval, 'r-', linewidth=2)
# グラフのフォーマット
plt.title('Approval and Disapproval Rates of Kishida Cabinet')
plt.xlabel('Date')
plt.ylabel('Rate (%)')
plt.legend()
plt.grid(True)
# 日付フォーマットの設定
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m'))
plt.gca().xaxis.set_major_locator(mdates.YearLocator())
plt.gca().xaxis.set_minor_locator(mdates.MonthLocator())
# 日付のラベルを斜めにして読みやすくする
plt.gcf().autofmt_xdate()
# グラフを表示
plt.show()
岸田内閣の支持率が0%になる日を予測
予測コードと解説
政治的な支持率の予測は、多くの変数に左右される複雑なタスクですす。線形回帰モデルを使うことで、既存のデータから未来の傾向を読み解くことができます。下記のコードでは、sklearn ライブラリの線形回帰機能を使用して、岸田内閣の支持率が0%になるであろう日を予測しています。線形回帰は最も基本的な予測モデルの一つで、データの線形関係に基づいて将来の値を推測します。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from datetime import datetime, timedelta
import matplotlib.dates as mdates
# Data
dates = ["2021年10月", "2022年7月", "2023年1月", "2023年7月", "2023年10月"]
approval_rates = np.array([49, 59, 33, 38, 36])
# Helper function to convert dates to days
def convert_date_to_days(date_str):
date_obj = datetime.strptime(date_str, '%Y年%m月')
base_date = datetime.strptime('2022年1月', '%Y年%m月')
return (date_obj - base_date).days
# Convert dates to days
days = np.array(list(map(convert_date_to_days, dates)))
# Convert days back to dates for plotting
dates_for_plotting = [datetime.strptime('2022年1月', '%Y年%m月') + timedelta(days=int(day)) for day in days]
# Linear Regression Model
model = LinearRegression()
model.fit(days.reshape(-1, 1), approval_rates)
# Prediction for 0% approval
days_until_zero_approval = -model.intercept_ / model.coef_[0]
zero_approval_date = datetime.strptime('2022年1月', '%Y年%m月') + timedelta(days=int(days_until_zero_approval))
# Plotting the data and the regression line
plt.figure(figsize=(10, 5))
plt.scatter(dates_for_plotting, approval_rates, color='blue', label='Approval Rates')
plt.plot(dates_for_plotting, model.predict(days.reshape(-1, 1)), color='red', label='Regression Line')
# Formatting the plot
plt.title('Cabinet Approval Rating Over Time')
plt.xlabel('Date')
plt.ylabel('Approval Rating (%)')
plt.legend()
plt.grid(True)
# Setting the x-axis to display dates properly
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m'))
plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=3))
plt.gcf().autofmt_xdate() # Rotate date labels to fit them nicely
# Show plot
plt.show()
# Print the predicted zero approval date
predicted_date_str = zero_approval_date.strftime('%Y年%m月')
print(f'岸田内閣の支持率が0%になる日は「{predicted_date_str}」と予測されます。')
岸田内閣の支持率が0%になる日は「2027年08月」と予測されます。
岸田内閣の支持率が29%になる日を予測
内閣支持率の危険水域は29%以下
支持率が一定の水準を下回ると、政府にとって危険信号とされます。多くの政治アナリストは、29%以下の支持率を内閣の存続にとっての危険水域とみなしています。以下のPythonコードは、岸田内閣の支持率がこの危険水域に達するであろう日を予測しています。この予測には前述の線形回帰分析が用いられており、実際の支持率のデータポイントから将来の支持率が29%を下回る日を予測しています。なお、一部の世論調査では、2023年11月の時点ですでに岸田内閣の支持率は29%を大きく下回っています。
予測コードと解説
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from sklearn.linear_model import LinearRegression
from datetime import datetime, timedelta
# Data
dates = ["2021年10月", "2022年7月", "2023年1月", "2023年7月", "2023年10月"]
approval_rates = np.array([49, 59, 33, 38, 36])
# Helper function to convert dates to datetime objects
def convert_str_to_datetime(date_str):
return datetime.strptime(date_str, '%Y年%m月')
# Convert date strings to datetime objects
date_objects = np.array(list(map(convert_str_to_datetime, dates)))
# Use the date2num function to convert datetime objects to Matplotlib dates
dates_mpl = mdates.date2num(date_objects)
# Linear Regression Model
model = LinearRegression()
model.fit(dates_mpl.reshape(-1, 1), approval_rates)
# Prediction for when approval drops below 29%
target_approval_rate = 29
days_until_target_approval = (target_approval_rate - model.intercept_) / model.coef_[0]
target_approval_date = mdates.num2date(days_until_target_approval)
# Plotting the data and the regression line
plt.figure(figsize=(10, 5))
plt.scatter(dates_mpl, approval_rates, color='blue', label='Approval Rates')
plt.plot(dates_mpl, model.predict(dates_mpl.reshape(-1, 1)), color='red', label='Regression Line')
# Add a line for the target approval rate prediction
plt.axhline(y=target_approval_rate, color='green', linestyle='--', label='29% Approval Rate')
plt.axvline(x=days_until_target_approval, color='green', linestyle='--')
# Formatting the plot
plt.title('Cabinet Approval Rating Over Time')
plt.xlabel('Date')
plt.ylabel('Approval Rating (%)')
plt.legend()
plt.grid(True)
# Use DateFormatter to format the x-axis dates
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m'))
plt.gca().xaxis.set_major_locator(mdates.YearLocator())
plt.gca().xaxis.set_minor_locator(mdates.MonthLocator())
# Rotate date labels for better readability
plt.gcf().autofmt_xdate()
# Show plot with English annotations
plt.show()
# Print the predicted date for when approval drops below 29%
target_approval_date.strftime('岸田内閣の支持率が29%以下になる日は「%Y年%m月」と予測されます。')
岸田内閣の支持率が29%以下になる日は「2024年06月」と予測されます。
▼AIを使った副業・起業アイデアを紹介♪