はじめに
ビジネスの世界で「先を読む」ことの重要性は言うまでもありません。売上予測、需要予測、株価分析など、時系列データを扱う機会は非常に多いですよね。しかし、時系列データの分析は一筋縄ではいきません。トレンド、季節性、外部要因など、考慮すべき要素が多岐にわたります。
そこで本記事では、Pythonを使って時系列データを効果的に分析する方法をご紹介します。特に、データサイエンティストの強い味方であるpandasライブラリの時系列機能と、FacebookのAIチームが開発した予測ライブラリProphetに焦点を当てます。
これらのツールを使いこなせば、複雑な時系列データでも、まるで未来を見通すかのように分析できるようになります。さあ、一緒にPythonで時を操る魔法を学んでいきましょう!
1. pandasを使った基本的な時系列データ操作
1.1 データの読み込みと前処理
まず、時系列データを読み込み、適切な形式に整形します。
import pandas as pd
import matplotlib.pyplot as plt
# 固定データの作成
data = {
'date': [
'2022-01-03', '2022-01-04', '2022-01-05', '2022-01-06', '2022-01-07',
'2022-01-10', '2022-01-11', '2022-01-12', '2022-01-13', '2022-01-14'
],
'close': [
117.64, 104.00, 109.78, 122.41, 118.68,
115.00, 112.34, 120.45, 119.88, 121.34
]
}
# データフレームの作成
df = pd.DataFrame(data)
# 日付列をdatetime型に変換
df['date'] = pd.to_datetime(df['date'])
# インデックスを日付に設定
df.set_index('date', inplace=True)
# データの表示
print(df.head())
# データの可視化
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['close'])
plt.title('Stock Price Trend')
plt.xlabel('Date')
plt.ylabel('Close Price')
plt.grid(True)
plt.show()
このコードを実行すると、株価の推移を示すグラフが表示されます。グラフは2022年1月から始まり、時間の経過とともに株価の変動を示しています。全体的なトレンドや大きな変動点を視覚的に確認することができます。
1.2 基本的な時系列操作
pandasは時系列データを扱うための便利な機能を提供しています。
import pandas as pd
import matplotlib.pyplot as plt
# 固定データの作成
data = {
'date': [
'2022-01-03', '2022-01-04', '2022-01-05', '2022-01-06', '2022-01-07',
'2022-01-10', '2022-01-11', '2022-01-12', '2022-01-13', '2022-01-14'
],
'close': [
117.64, 104.00, 109.78, 122.41, 118.68,
115.00, 112.34, 120.45, 119.88, 121.34
]
}
# データフレームの作成
df = pd.DataFrame(data)
# 日付列をdatetime型に変換
df['date'] = pd.to_datetime(df['date'])
# インデックスを日付に設定
df.set_index('date', inplace=True)
# 日次データを月次データにリサンプリング
monthly_data = df['close'].resample('M').mean()
# 移動平均の計算
# データが不足している部分はデータ範囲外の値を使わないようにするためmin_periodsを設定
df['MA7'] = df['close'].rolling(window=7, min_periods=1).mean()
df['MA30'] = df['close'].rolling(window=30, min_periods=1).mean()
# 結果の可視化
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['close'], label='Close Price')
plt.plot(df.index, df['MA7'], label='7-Day MA')
plt.plot(df.index, df['MA30'], label='30-Day MA')
plt.title('Stock Price and Moving Averages')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid(True)
plt.show()
# 特定の期間のデータ抽出
# 今回のデータセットは2022年のデータのみなので、適切な期間に調整します。
subset = df['2022-01-01':'2022-12-31']
print(subset.head())
実行結果:
このコードを実行すると、株価の終値と7日移動平均、30日移動平均を重ねて表示するグラフが生成されます。グラフでは、日々の株価変動(終値)に加えて、短期トレンド(7日移動平均)と中期トレンド(30日移動平均)を同時に確認できます。これにより、株価の短期的な変動と全体的なトレンドを同時に把握することが可能になります。
2. Prophetを使った時系列予測
FacebookのProphetライブラリは、複雑な時系列予測を簡単に行うことができます。
2.1 Prophetのインストールと基本的な使用方法
!pip install prophet
from prophet import Prophet
# Prophet用にデータフレームを準備
prophet_df = df.reset_index().rename(columns={'date': 'ds', 'close': 'y'})
# モデルの作成と学習
model = Prophet()
model.fit(prophet_df)
# 将来の日付範囲を作成
future_dates = model.make_future_dataframe(periods=365)
# 予測の実行
forecast = model.predict(future_dates)
# 結果のプロット
fig = model.plot(forecast)
plt.show()
このコードを実行すると、Prophetモデルによる予測結果がグラフとして表示されます。グラフには、過去のデータポイント、予測値、そして予測の信頼区間が示されます。これにより、将来の株価トレンドを視覚的に理解することができます。
2.2 季節性と休日の考慮
Prophetは季節性や休日の影響を考慮した予測も可能です。
# 年次、週次、日次の季節性を考慮したモデル
model = Prophet(yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=True)
# 休日の影響を追加
model.add_country_holidays(country_name='JP')
model.fit(prophet_df)
forecast = model.predict(future_dates)
# 季節性の可視化
fig = model.plot_components(forecast)
plt.show()
このコードを実行すると、Prophetモデルによる季節性分析結果がグラフとして表示されます。グラフには、トレンド、年次季節性、週次季節性、および休日の影響が個別に示されます。これにより、株価変動に影響を与える様々な周期的要因を詳細に分析することができます。
まとめ
本記事では、Pythonを使った時系列データ分析の基本的な方法を紹介しました。pandasの時系列機能を使用してデータの前処理や基本的な分析を行い、Prophetを使用してより高度な予測を行うことができます。これらのツールを組み合わせることで、様々な時系列データに対して効果的な分析が可能となります。
時系列データ分析は、ビジネスインサイトの抽出や将来予測において非常に重要な役割を果たします。本記事で紹介した手法は、その入り口に過ぎません。さらに深い分析や、より複雑なモデルの適用にも挑戦してみてください。データが語る「未来」の物語を、あなたの手で紐解いていけることでしょう。
参考文献
- pandas documentation: https://pandas.pydata.org/docs/
- Prophet documentation: https://facebook.github.io/prophet/
時系列データ分析は奥が深いトピックです。この記事で紹介した基本的な手法を足がかりに、より高度な分析手法にも挑戦してみてください。そして、あなたのビジネスや研究に、新たな洞察をもたらすことを期待しています。