- 問題
- 答え
- 解説
Python コード:
import numpy as np np.random.seed(52) time_series = np.random.randn(100) fourier_transform = np.fft.fft(time_series) magnitude = np.abs(fourier_transform) print(magnitude[:5])
回答の選択肢:
(A) フーリエ変換後の最初の5つの振幅
(B) フーリエ変換後の最初の5つのパワー
(C) フーリエ変換後の最初の5つの位相
(D) フーリエ変換後の最初の5つの周波数
[16.39750588 4.02301215 8.15247435 7.07636953 7.71180613]
正解: (A)
回答の選択肢:
(A) フーリエ変換後の最初の5つの振幅
(B) フーリエ変換後の最初の5つのパワー
(C) フーリエ変換後の最初の5つの位相
(D) フーリエ変換後の最初の5つの周波数
- コードの解説
-
このコードは、高速フーリエ変換(FFT)機能を利用して、時系列データからそのフーリエ変換を計算し、その結果のスペクトルの大きさであるマグニチュード(振幅)を表示しています。
import numpy as np np.random.seed(52) time_series = np.random.randn(100) fourier_transform = np.fft.fft(time_series) magnitude = np.abs(fourier_transform) print(magnitude[:5])
詳しく説明します。
まず、100要素からなるランダムな(正規分布に基づく)時系列データを生成します。
np.random.seed(52) time_series = np.random.randn(100)
time_series
に格納されているデータは次のようになっています。[ 0.51947584 -1.26875038 0.24042003 -0.80395743 0.0173441 0.39439383 1.27913226 0.65973637 -0.45538088 1.46578903 -0.41892673 1.4663059 0.21678252 0.50774249 0.97307206 -0.35664161 -0.78829462 -0.23257772 -0.84750125 -1.74825258 0.80807157 1.23979542 0.56063586 -0.54281703 -0.48414947 1.31982782 1.44554 0.05181732 1.62867942 -0.36600024 -0.02424209 -0.82656541 -1.55539836 -0.4018704 -0.60889302 -0.06615728 1.1521841 -0.00729803 0.69459216 -0.28570368 0.63856574 1.11261944 0.31480994 1.76593788 0.93362384 -0.06536397 0.50395687 -2.27594004 -0.66899817 1.74812183 1.17645246 1.72837976 0.83980736 -0.09234571 0.19120234 0.10865611 -0.32302086 0.70329441 -0.36807774 0.15855681 0.6502175 -0.86928995 -0.82855192 1.02044989 -1.12179161 -0.55718408 0.74392183 -0.10807164 -0.54755753 -1.66853504 1.15609407 -0.11340434 -0.0160876 0.34987742 1.48890981 0.19365202 -0.34550893 0.30697479 1.29676675 -1.0392325 -0.19243861 -1.34600589 0.08139469 1.65922592 -0.76977349 0.02639419 0.52159653 0.41910411 1.29409696 -0.4385991 -0.63196557 -0.7299288 0.18249191 -0.33291608 -0.19196907 -0.89275098 2.46510888 0.13277495 -0.19732602 2.6651442 ]
np.fft.fft()
関数を使用して、この時系列データのフーリエ変換を計算します。fourier_transform = np.fft.fft(time_series)
フーリエ変換は、信号(時系列データ)の時間領域表現(データの元の領域、つまり時間軸上での信号の表現)を周波数領域表現に変換します。つまり、各周波数成分が信号にどのくらい寄与しているかを計算します。
fourier_transform
に格納されているデータは次のようになっています。[ 1.63975059e+01+0.00000000e+00j 3.16519108e-02-4.02288764e+00j 7.91080833e+00+1.97026640e+00j -3.79527744e+00-5.97250993e+00j 7.70137809e+00-4.00910571e-01j -9.41193564e-01-2.26423012e+00j -1.07544048e+01-2.14060328e+00j 4.90263259e+00+1.51223551e+01j 1.47281024e+01+3.49800520e+00j -4.17433965e+00+1.06341935e+01j -1.71990498e+00+2.11386491e+00j -4.58791954e+00+5.39486007e+00j 1.99738700e+00-3.50775905e+00j -1.28944657e+01+1.39544619e+01j 1.43890347e+01+3.14850316e+00j -1.41582353e+00+1.33670043e+00j 4.00826845e+00-2.00026889e+00j -2.64360727e+00+1.40083891e-01j 8.31816602e+00+8.12031116e+00j -1.43639058e-02+6.07497304e+00j 2.49028289e+00-2.72983877e+00j -8.69527059e+00-7.69342957e+00j 1.79237111e+00-1.73182029e+00j 7.60626206e+00-2.28016976e+00j 1.29829744e+01+5.24170598e+00j -4.47299461e+00+4.46673917e-01j -6.94830211e+00-1.19678718e+00j 7.63619166e+00+8.17333056e+00j 2.78040775e+00+1.52072695e+01j 1.29509424e-02-1.62344850e+00j 6.23075939e+00+7.00691094e+00j -4.55071523e+00+8.67143960e+00j -4.54417444e+00+8.19450884e+00j 9.95568612e-01+5.58599012e+00j -4.30498628e+00+5.49401574e+00j 1.28094096e+01+5.05827141e+00j -4.25307871e+00+8.76572365e+00j -1.30290617e+00-3.89182779e+00j -1.96151987e+01+6.94310137e+00j -2.46070218e+00+7.75534311e-01j -1.22371017e+00-8.61692860e+00j -4.12230087e+00+1.10425021e+01j -4.56246873e+00+7.20931136e+00j -4.31818830e-01+3.97612767e+00j 4.99455628e-01+2.11779336e+00j -1.46998398e-01-2.44401967e+00j 7.11439078e+00-7.24733962e+00j 4.76394888e+00-1.30774612e+00j -5.24844446e+00-6.67855231e+00j 1.46766573e+00-2.99529097e+00j 8.86068185e+00+8.88178420e-16j 1.46766573e+00+2.99529097e+00j -5.24844446e+00+6.67855231e+00j 4.76394888e+00+1.30774612e+00j 7.11439078e+00+7.24733962e+00j -1.46998398e-01+2.44401967e+00j 4.99455628e-01-2.11779336e+00j -4.31818830e-01-3.97612767e+00j -4.56246873e+00-7.20931136e+00j -4.12230087e+00-1.10425021e+01j -1.22371017e+00+8.61692860e+00j -2.46070218e+00-7.75534311e-01j -1.96151987e+01-6.94310137e+00j -1.30290617e+00+3.89182779e+00j -4.25307871e+00-8.76572365e+00j 1.28094096e+01-5.05827141e+00j -4.30498628e+00-5.49401574e+00j 9.95568612e-01-5.58599012e+00j -4.54417444e+00-8.19450884e+00j -4.55071523e+00-8.67143960e+00j 6.23075939e+00-7.00691094e+00j 1.29509424e-02+1.62344850e+00j 2.78040775e+00-1.52072695e+01j 7.63619166e+00-8.17333056e+00j -6.94830211e+00+1.19678718e+00j -4.47299461e+00-4.46673917e-01j 1.29829744e+01-5.24170598e+00j 7.60626206e+00+2.28016976e+00j 1.79237111e+00+1.73182029e+00j -8.69527059e+00+7.69342957e+00j 2.49028289e+00+2.72983877e+00j -1.43639058e-02-6.07497304e+00j 8.31816602e+00-8.12031116e+00j -2.64360727e+00-1.40083891e-01j 4.00826845e+00+2.00026889e+00j -1.41582353e+00-1.33670043e+00j 1.43890347e+01-3.14850316e+00j -1.28944657e+01-1.39544619e+01j 1.99738700e+00+3.50775905e+00j -4.58791954e+00-5.39486007e+00j -1.71990498e+00-2.11386491e+00j -4.17433965e+00-1.06341935e+01j 1.47281024e+01-3.49800520e+00j 4.90263259e+00-1.51223551e+01j -1.07544048e+01+2.14060328e+00j -9.41193564e-01+2.26423012e+00j 7.70137809e+00+4.00910571e-01j -3.79527744e+00+5.97250993e+00j 7.91080833e+00-1.97026640e+00j 3.16519108e-02+4.02288764e+00j]
以上の結果から、フーリエ変換の結果が複素数であることが分かります。
そのため、
np.abs()
関数を使用して、これら複素数の絶対値(マグニチュード、振幅)を計算します。マグニチュード(振幅)は、各周波数成分の強度を示します。magnitude = np.abs(fourier_transform)
magnitude
に格納されているデータは次のようになっています。[16.39750588 4.02301215 8.15247435 7.07636953 7.71180613 2.45205696 10.96537298 15.89721456 15.13780171 11.42414913 2.72516018 7.08191506 4.03657384 18.99984878 14.72947362 1.94713233 4.47965307 2.64731617 11.62460061 6.07499002 3.69506814 11.61019333 2.49234743 7.94067986 14.00118232 4.49524175 7.05061712 11.18547074 15.45935684 1.62350015 9.37652193 9.79300127 9.37013855 5.67401467 6.97976474 13.77196733 9.74302775 4.10413061 20.80775519 2.58002107 8.70338584 11.78686628 8.53172264 3.99950732 2.17589169 2.44843637 10.15571207 4.94018307 8.4940703 3.33553754 8.86068185 3.33553754 8.4940703 4.94018307 10.15571207 2.44843637 2.17589169 3.99950732 8.53172264 11.78686628 8.70338584 2.58002107 20.80775519 4.10413061 9.74302775 13.77196733 6.97976474 5.67401467 9.37013855 9.79300127 9.37652193 1.62350015 15.45935684 11.18547074 7.05061712 4.49524175 14.00118232 7.94067986 2.49234743 11.61019333 3.69506814 6.07499002 11.62460061 2.64731617 4.47965307 1.94713233 14.72947362 18.99984878 4.03657384 7.08191506 2.72516018 11.42414913 15.13780171 15.89721456 10.96537298 2.45205696 7.71180613 7.07636953 8.15247435 4.02301215]
この計算結果の先頭5つをプリントします。
print(magnitude[:5])
[16.39750588 4.02301215 8.15247435 7.07636953 7.71180613]
- フーリエ変換と時系列データ
-
Contents
時系列データと信号
フーリエ変換を語る上で、信号という概念を知らなくてはなりません。
信号は、連続的な時間や空間上で定義される物理量です。
- 音声信号
- 電気信号
- 電磁波信号
- 生体信号
- 地震波信号
- 画像信号
- 制御信号
では、時系列データとは何でしょうか?
時系列データは、信号を一定の時間間隔でサンプリングして得られる離散的なデータです。
つまり、信号を一定の時間間隔で計測または観測することで、時系列データが得られます。
時系列データは、信号の離散的な表現であり、信号の特徴を捉えるために使用されます。
このような信号を、離散時間信号と呼びます。要するに、「離散時間信号=時系列データ」です。
では、売上などの時系列データは、何の信号なのか?
それは、その信号は物理的な量(音声信号や電気信号など)ではなく、経済活動や人間の行動によって生み出される抽象的な量です。
売上の時系列データは、個々の受注や販売などの事象によって生成される仮想的な連続信号をサンプリングしたものと解釈します。当然ですが、あくまでも概念的なものです。
同様の解釈は、他の経済・金融時系列データにも適用できます。
例えば、株価の時系列データは、市場における継続的な売買活動によって生成される仮想的な連続信号をサンプリングしたものと考えます。
フーリエ変換とは?
フーリエ変換は、時間領域で表現される連続信号または離散信号(売上などの時系列データ)を、周波数領域で表現するための変換手法です。
この変換により、信号を構成する周波数成分を抽出できます。
具体的には、任意の時間信号が異なる周波数を持つ一連の正弦波と余弦波(または複素指数関数)の和(または積分)として表すことができるという「フーリエの定理」に基づいています。
フーリエ変換の結果として得られるのがスペクトルで、これは元の信号が持つ周波数成分の強度などを示します。
なお、コンピュータ上でフーリエ変換を効率よく行うためのアルゴリズムとして「高速フーリエ変換(FFT: Fast Fourier Transform)」が利用されることが多いです。
何のためにフーリエ変換を行うのか?
では、何のために時系列データに対しフーリエ変換を行うのでしょうか?
様々な目的で使用されます。以下は、その主な活用例です。
周期性の検出
フーリエ変換を通じて、時系列データに存在する周期性やパターンを明らかにすることができます。例えば、24時間の周期性を持つ日周リズム、週末と平日の週周期性、季節変動などです。これらは商業活動や気象学、生物学などの多くの分野で重要な役割を果たします。ノイズリダクションとデータスムージング
フーリエ変換はノイズリダクションとデータスムージングにも用いられます。原信号を周波数領域に変換し、一部の低周波数成分のみを残して逆変換することでデータのノイズを低減できます。これは、画像処理や音声信号処理などの分野で広く用いられています。信号解析とシステム特性の理解
エンジニアリングや物理学の分野では、フーリエ変換は信号解析に広く用いられます。周波数領域での解析は、システムの挙動を理解する上で重要な情報を提供します。スペクトル解析と特徴抽出
音響信号や振動信号など、一部の時系列データに対してはスペクトル解析が行われます。この解析は、データのフーリエ変換を用いて行われ、原信号を周波数成分に分解します。それにより、時系列データの特徴を捉えたり、特徴抽出を行ったりすることが可能となります。以上のように、時系列データにフーリエ変換を適用することで、データの周期性の検出、ノイズリダクション、データの特徴抽出などに役立てることができます。
実務的には必ずしも必要というわけではないですが、やるメリットはあるということです。
売上データを例に、そのメリットである季節性の抽出を簡単に説明します。
売上データの例で考えると……
時間領域の売上データを周波数領域に変換し、そのデータに含まれる周期成分や季節性などを明らかにするのに使用できます。
例えば、小売業の売上は季節性がしばしば見られます。つまり、特定の時期(例えばクリスマスや夏休みなど)に売上が上がるパターンが存在します。フーリエ変換を用いれば、このような周期性を数値的に明らかにすることができます。
具体的には、フーリエ変換を行って得られるスペクトルは、どの周波数成分の強度が高いかなどを示します。特定の周波数(例えば年間周期や週間周期)の成分が強い場合、それはその周期性が売上に大きな影響を与えていることを意味します。
この情報は、将来の売上予測を行う際に非常に有用です。予測モデルは過去のデータパターンを基に未来を予測しますが、売上の季節性や周期性を正確に理解していれば、より正確な予測を行うことが可能になります。
異常検出を行うことも可能です。通常の周期性から外れた異常な変化(例えば予期せぬ売上の急増または急減)を検出することで、問題の早期発見や、ビジネスの意思決定をサポートします。
このようなことを実施するデータ分析が、周波数領域解析(スペクトル分析)です。
周波数領域解析(スペクトル分析)とは?
周波数領域解析(スペクトル分析)とは、時間領域で表現された信号を周波数成分に分解し、それぞれの周波数成分の振幅や位相を調べる手法です。これにより、信号がどのような周波数成分で構成されているかを明らかにすることができます。
周波数領域解析(スペクトル分析)の主な目的は以下の通りです。
- 信号の特性理解:信号がどのような周波数成分を含んでいるかを知ることで、信号の特性を理解することができます。
- ノイズ除去:信号に含まれるノイズは、しばしば特定の周波数帯域に集中しています。周波数領域で信号を分析することで、ノイズ成分を識別し、除去することができます。
- 信号の圧縮:信号の中には、特定の周波数成分が支配的な場合があります。そのような場合、支配的な周波数成分のみを保持することで、信号を圧縮することができます。
- 信号の変調・復調:通信システムでは、情報を特定の周波数の信号に乗せて送信します(変調)。受信側では、その周波数成分を抽出することで、情報を復元します(復調)。
周波数領域解析(スペクトル分析)を行うための代表的な手法は、フーリエ変換です。
フーリエ変換は、時間領域の信号を周波数領域の信号に変換します。離散時間信号に対しては、離散フーリエ変換(DFT)が使用されます。
フーリエ変換によって得られた周波数領域の信号は、振幅スペクトル(マグニチュード)と位相スペクトルで表現されます。振幅スペクトル(マグニチュード)は、各周波数成分の強度を表し、位相スペクトルは、各周波数成分の位相(タイミング)を表します。
パワースペクトルと振幅スペクトル、位相スペクトル
周波数領域解析では、振幅スペクトル(マグニチュード)、パワースペクトル、位相スペクトルを中心に据え解析していきます。
簡単に概要を説明します。
振幅スペクトル(Amplitude Spectrum)またはマグニチュード(Magnitude)
- 信号のフーリエ変換の絶対値を表す。
- 各周波数成分の振幅(大きさ)を示す。
- 単位は信号の単位と同じ。
パワースペクトル(Power Spectrum)
- 信号のフーリエ変換の二乗の絶対値を表す。
- 各周波数成分のパワー(エネルギー)を示す。
- 単位は信号の単位の二乗。
- パワースペクトルは、振幅スペクトルの二乗に比例。
位相スペクトル(Phase Spectrum)
- 信号のフーリエ変換の偏角(アーギュメント)を表す。
- 各周波数成分の位相(タイミング)を示す。
- 単位はラジアンまたは度。
つまり、振幅スペクトル(マグニチュード)は信号の振幅情報を、パワースペクトルは信号のパワー情報を、位相スペクトルは信号の位相情報を表します。
振幅スペクトル(マグニチュード)とパワースペクトルは信号の強度に関する情報を与えますが、位相スペクトルは信号の各周波数成分のタイミングに関する情報を与えます。
分かり難いと思いますので、最後に売上データを例に説明します。
売上データの例で考えると……
例えば、ある小売店の月間売上データをフーリエ変換して周波数領域解析(スペクトル分析)を行ったとしましょう。
振幅スペクトル(マグニチュード)として、特定の周波数(例えば1年周期)の成分が強いと見つかったとします。これは、その小売店の売上には季節性(年間で周期的に売上が増え減りする傾向)が強く影響していることを示しています。
しかし、その季節性が年間のどの時点で、つまり何月にピークやトラフが来るのかを知るためには、位相スペクトルが必要となります。
位相スペクトルは各周波数成分が元の売上データ内のどのタイミングで発生しているかを示すもので、例えば……
- 位相が0ならピークは1月
- 位相がπ/2(12か月の四分の一)ならピークは4月
- 位相がπ(12か月の半分)ならピークは7月
- 位相が3π/2(12か月の四分の三)ならピークは10月
したがって、売上予測の観点からみると、季節性の強さ(振幅スペクトル、マグニチュード)だけでなく、そのタイミング(位相)もあわせて考えることが重要となります。
これらの情報は販売戦略の立案や在庫管理等に活用されるでしょう。