📈 Pandasの時系列データ処理と可視化
Pandasは、データの読み込みや加工だけでなく、時系列データの処理においても強力な機能を提供しています。
データ分析において、時間の流れに基づいたパターンの把握や予測は非常に重要です。
本記事では、Pandasを活用した時系列データ処理と可視化について、以下の5つのテーマに分けて詳しく解説します。
- 時系列データの作成と管理
- リサンプリングとシフト
- 移動平均と平滑化
- PandasとMatplotlibを活用したデータ可視化
- 時系列データ分析の実践例
1️⃣ 時系列データの作成と管理
Pandasでは、date_range() を用いて日付データを簡単に作成できます。
時系列データは、DatetimeIndex として管理することで、フィルタリングやリサンプリングが効率的に行えます。
🔹 date_range() での日付データ作成
import pandas as pd
# 日付データの生成
date_range = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D')
print(date_range)
🖥️ 実行結果
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
'2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08',
'2023-01-09', '2023-01-10'],
dtype='datetime64[ns]', freq='D')
🔹 日付データをインデックスにする
# 売上データの作成
data = {'売上': [300, 350, 400, 450, 420, 380, 410, 390, 360, 370]}
df = pd.DataFrame(data, index=date_range)
print(df)
🖥️ 実行結果
売上
2023-01-01 300
2023-01-02 350
2023-01-03 400
2023-01-04 450
2023-01-05 420
2023-01-06 380
2023-01-07 410
2023-01-08 390
2023-01-09 360
2023-01-10 370
🔹 日付データのフィルタリング
# 2023年1月3日以降のデータ
print(df['2023-01-03':])
🖥️ 実行結果
売上
2023-01-03 400
2023-01-04 450
2023-01-05 420
2023-01-06 380
2023-01-07 410
2023-01-08 390
2023-01-09 360
2023-01-10 370
2️⃣ リサンプリングとシフト
リサンプリング (Resampling) とシフト (Shift) は、時系列データの分析で重要なテクニックです。
🔹 リサンプリング
データを指定した期間ごとに集計できます。
# 月ごとの合計
print(df.resample('M').sum())
🖥️ 実行結果
売上
2023-01-31 3830
🔹 シフト (Shift)
データを前後にずらすことで、過去データや未来データを活用できます。
# 1日前のデータを取得
df['前日'] = df['売上'].shift(1)
print(df)
🖥️ 実行結果
売上 前日
2023-01-01 300 NaN
2023-01-02 350 300.0
2023-01-03 400 350.0
2023-01-04 450 400.0
2023-01-05 420 450.0
2023-01-06 380 420.0
2023-01-07 410 380.0
2023-01-08 390 410.0
2023-01-09 360 390.0
2023-01-10 370 360.0
3️⃣ 移動平均と平滑化
時系列データでは、変動が激しい場合に移動平均を用いてデータの傾向を把握するのが一般的です。
# 3日間の移動平均
df['移動平均'] = df['売上'].rolling(window=3).mean()
print(df)
🖥️ 実行結果
売上 前日 移動平均
2023-01-01 300 NaN NaN
2023-01-02 350 300.0 NaN
2023-01-03 400 350.0 350.000000
2023-01-04 450 400.0 400.000000
2023-01-05 420 450.0 423.333333
2023-01-06 380 420.0 416.666667
2023-01-07 410 380.0 403.333333
2023-01-08 390 410.0 393.333333
2023-01-09 360 390.0 386.666667
2023-01-10 370 360.0 373.333333
🔹 .ewm() での指数平滑
指数平滑は、直近のデータに重点を置き、過去のデータの影響を減らした移動平均手法です。
# 指数平滑の計算
df['指数平滑'] = df['売上'].ewm(span=3, adjust=False).mean()
print(df)
🖥️ 実行結果
売上 前日 移動平均 指数平滑
2023-01-01 300 NaN NaN 300.000000
2023-01-02 350 300.0 NaN 325.000000
2023-01-03 400 350.0 350.000000 362.500000
2023-01-04 450 400.0 400.000000 406.250000
2023-01-05 420 450.0 423.333333 413.125000
2023-01-06 380 420.0 416.666667 396.562500
2023-01-07 410 380.0 403.333333 403.281250
2023-01-08 390 410.0 393.333333 396.640625
2023-01-09 360 390.0 386.666667 378.320312
2023-01-10 370 360.0 373.333333 374.160156
4️⃣ PandasとMatplotlibを活用したデータ可視化
データの可視化は、時系列データのトレンドやパターンを理解する上で非常に重要です。
import matplotlib.pyplot as plt
df['売上'].plot(label='売上', marker='o')
df['移動平均'].plot(label='移動平均', linestyle='--')
plt.title('売上と移動平均')
plt.xlabel('日付')
plt.ylabel('売上')
plt.legend()
plt.show()
🖥️ 実行結果
➡️ 売上データと移動平均が同時に表示され、傾向が視覚的に理解できます。
5️⃣ 時系列データ分析の実践例
最後に、これまでのテクニックを活用して、実践的なデータ分析の流れを紹介します。
🔹 売上データの分析フロー
# データの読み込み
data = pd.read_csv('sales_data.csv', index_col='日付', parse_dates=True)
# データの可視化
data['売上'].plot(title='売上データの推移')
plt.show()
# 移動平均の計算
data['移動平均'] = data['売上'].rolling(window=7).mean()
# リサンプリング
monthly_sales = data['売上'].resample('M').sum()
print(monthly_sales)
sales_data.csv
日付,売上
2023-01-01,300
2023-01-02,350
2023-01-03,400
2023-01-04,450
2023-01-05,420
2023-01-06,380
2023-01-07,410
2023-01-08,390
2023-01-09,360
2023-01-10,370
2023-01-11,390
2023-01-12,420
2023-01-13,430
2023-01-14,400
2023-01-15,410
2023-01-16,450
2023-01-17,470
2023-01-18,490
2023-01-19,500
2023-01-20,480
🖥️ 実行結果
🎯 まとめ
本記事では、Pandasを活用した時系列データ処理と可視化について、以下の内容を詳しく解説しました。
✅ 日付データの作成と管理
✅ データのリサンプリングとシフト
✅ 移動平均と指数平滑
✅ PandasとMatplotlibを活用したデータ可視化
✅ 実践的なデータ分析フロー
これらのテクニックを活用することで、データのトレンドや変化をより深く理解し、正確な意思決定に役立てることができます。
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion