smoothing.py の技術ドキュメント
プログラムの動作
smoothing.py は、CSV形式で保存された時系列データや実験データ(特にX線回折データなど)のノイズを除去し、基調となるトレンドを抽出するためのPythonスクリプトです。このプログラムは、指定された入力CSVファイルからデータを読み込み、特定のX軸範囲でフィルタリングした後、複数の平滑化アルゴリズムと異なるウィンドウサイズを適用します。平滑化された結果は、個別のCSVファイルとして保存されると同時に、matplotlib を用いて視覚的に比較可能なグラフとして表示されます。
主な機能は以下の通りです。
CSVファイルからのデータ読み込みと、指定されたX軸範囲でのフィルタリング。
単純移動平均 (Simple Moving Average) によるデータの平滑化。
多項式フィッティング平滑化 (Polynomial Fit Smoothing、Savitzky-Golayフィルターに類似) によるデータの平滑化。
異なる平滑化ウィンドウサイズでの処理と、その結果の比較。
平滑化されたデータと元のデータをCSVファイルとして出力。
元のデータと複数の平滑化結果を一枚のグラフにまとめ、視覚的に比較表示。
このプログラムは、実験データにおけるランダムノイズの低減や、明確なピークやトレンドの識別といった課題を解決することを目的としています。
原理
smoothing.py は、以下の二つの平滑化アルゴリズムを実装しています。
1. 単純移動平均 (Simple Moving Average)
単純移動平均は、最も基本的な平滑化手法の一つです。各データ点について、その点を中心とする特定の範囲(ウィンドウ)内のデータ点の平均値を計算し、その平均値を元のデータ点に置き換えます。これにより、データに含まれる短期的な変動(ノイズ)が除去され、長期的なトレンドが強調されます。
SmoothingBySimpleAverage(y, n) 関数では、n をウィンドウサイズとして使用します。ある点 \(i\) の新しい平滑化値 \(y'_i\) は、以下の数式で計算されます。
ここで、\(n = 2m + 1\) であり、\(m = \lfloor n/2 \rfloor\) です。つまり、点 \(i\) の両側に \(m\) 点ずつを含め、合計 \(n\) 点の平均を取ります。データの両端では、ウィンドウがデータ範囲を超える場合、利用可能な点のみで平均が計算されます。
2. 多項式フィッティング平滑化 (Polynomial Fit Smoothing / Savitzky-Golay Filter)
多項式フィッティング平滑化は、Savitzky-Golayフィルターに類似した手法です。この方法は、単純移動平均よりもデータの形状(ピークの高さや幅など)を保持しながらノイズを除去する能力が高いとされています。各データ点について、その点を中心とするウィンドウ内のデータ点に対し、低次(このコードでは2次)の多項式を最小二乗法でフィッティングします。その後、フィッティングされた多項式から中央点の新しい値を計算します。
SmoothingByPolynomialFit(y, n) 関数では、n をウィンドウサイズとして使用します。この関数では、Savitzky-Golayフィルターの2次多項式、中央点での平滑化のための重み \(w_{23j}\) を計算して使用しています。
まず、重み計算のための定数 \(W_{23}\) と、各位置 \(j\) における重み \(w_{23j}\) を計算します。 ここで \(m = \lfloor n/2 \rfloor\) であり、\(j\) は \(-m\) から \(m\) までの整数です。
そして、ある点 \(i\) の新しい平滑化値 \(y'_i\) は、これらの重み \(w_{23j}\) を用いて以下の数式で計算されます。
データの両端では、ウィンドウがデータ範囲を超える場合、利用可能な点に対応する重みのみで加重平均が計算されます。分母の \(\sum w_{23j}\) は、有効な重みの合計で正規化を行っています。
必要な非標準ライブラリとインストール方法
smoothing.py は、データ処理とグラフ描画のために以下の非標準ライブラリを使用します。
matplotlib: データの可視化(グラフ描画)に使用されます。
これらのライブラリは、Pythonのパッケージ管理システムである pip を使用してインストールできます。コマンドラインまたはターミナルで以下のコマンドを実行してください。
pip install matplotlib
必要な入力ファイル
プログラムは、データ入力のために xrd.csv という名前のCSVファイルを想定しています。
ファイル名:
xrd.csv形式: ヘッダー行を含むカンマ区切り(CSV)形式。
データ構造:
1行目はヘッダー行である必要があります。
1列目にはX軸に対応する数値データ(例: 角度、時間)。
2列目にはY軸に対応する数値データ(例: 強度、測定値)。
例: xrd.csv の内容
Angle,Intensity
36.9,100.5
37.0,102.3
37.1,105.8
37.2,103.1
37.3,101.9
...
45.8,98.2
45.9,96.7
46.0,95.1
プログラムは、xmin (デフォルト 37.0) から xmax (デフォルト 46.0) の範囲にあるデータのみを処理します。この範囲外のデータはスキップされます。これらの設定値は、ソースコード内のグローバル変数で変更可能です。
生成される出力ファイル
smoothing.py を実行すると、複数のCSVファイルが生成されます。
ファイル名形式:
smoothing-{method}-{nsmooth}.csv{method}: 平滑化方法を示す文字列。simple(単純移動平均) またはpolynomialfit(多項式フィッティング平滑化) のいずれかです。{nsmooth}: 平滑化に使用されたウィンドウサイズ(整数値)です。
生成されるファイルの具体例:
smoothing-simple-3.csvsmoothing-simple-11.csvsmoothing-simple-31.csvsmoothing-simple-51.csvsmoothing-polynomialfit-11.csvsmoothing-polynomialfit-31.csvsmoothing-polynomialfit-51.csv
内容: 各出力CSVファイルは以下の3つの列を持ち、ヘッダー行が含まれます。
x: 元のX軸データy(raw): 元のY軸データy(smooth): 平滑化されたY軸データ
また、プログラムの実行中に matplotlib を使用してグラフウィンドウが表示されます。このグラフは、元のデータと、さまざまな平滑化手法・パラメータで処理されたデータを比較して表示します。このグラフは自動的にファイルに保存されませんが、表示されたウィンドウから手動で保存することが可能です。
コマンドラインでの使用例 (Usage)
smoothing.py は、コマンドライン引数を受け付けません。すべての設定(入力ファイル名、出力ファイル名のテンプレート、データ範囲、平滑化パラメータなど)は、スクリプトのソースコード内に直接記述されています。
プログラムを実行するには、Pythonインタープリターを使用してスクリプトファイルを直接呼び出します。
python smoothing.py
コマンドラインでの具体的な使用例
以下の手順で smoothing.py を実行し、その結果を説明します。
入力ファイルの準備: まず、
xrd.csvという名前で以下の内容のファイルを作成し、smoothing.pyと同じディレクトリに配置します。Angle,Intensity 36.9,100.5 37.0,102.3 37.1,105.8 37.2,103.1 37.3,101.9 37.4,106.2 37.5,104.7 37.6,108.0 37.7,110.1 37.8,112.5 37.9,115.3 38.0,118.0 38.1,120.5 38.2,122.8 38.3,124.7 38.4,126.3 38.5,127.5 38.6,128.0 38.7,127.8 38.8,127.0 38.9,125.5 39.0,123.5 39.1,121.0 39.2,118.0 39.3,114.5 39.4,110.8 39.5,107.0 39.6,103.5 39.7,100.2 39.8,97.0 39.9,94.0 40.0,91.2 40.1,88.5 40.2,86.0 40.3,83.7 40.4,81.5 40.5,79.5 40.6,77.6 40.7,75.8 40.8,74.2 40.9,72.7 41.0,71.3 41.1,70.0 41.2,68.8 41.3,67.7 41.4,66.7 41.5,65.8 41.6,65.0 41.7,64.3 41.8,63.7 41.9,63.2 42.0,62.8 42.1,62.5 42.2,62.3 42.3,62.2 42.4,62.2 42.5,62.3 42.6,62.5 42.7,62.8 42.8,63.2 42.9,63.7 43.0,64.3 43.1,65.0 43.2,65.8 43.3,66.7 43.4,67.7 43.5,68.8 43.6,70.0 43.7,71.3 43.8,72.7 43.9,74.2 44.0,75.8 44.1,77.6 44.2,79.5 44.3,81.5 44.4,83.7 44.5,86.0 44.6,88.5 44.7,91.2 44.8,94.0 44.9,97.0 45.0,100.2 45.1,103.5 45.2,107.0 45.3,110.8 45.4,114.5 45.5,118.0 45.6,121.0 45.7,123.5 45.8,125.5 45.9,127.0 46.0,127.8 46.1,128.0 46.2,127.5 46.3,126.3 46.4,124.7 46.5,122.8 46.6,120.5 46.7,118.0 46.8,115.3 46.9,112.5 47.0,110.1
プログラムの実行: ターミナルまたはコマンドプロンプトで、
smoothing.pyファイルが存在するディレクトリに移動し、以下のコマンドを実行します。python smoothing.py実行結果の説明:
標準出力: プログラムが起動すると、まず
xrd.csvからデータを読み込んでいることが表示されます。設定されたxmin(37.0) とxmax(46.0) の範囲内のデータのみが読み込まれ、その内容が標準出力に表示されます。 次に、各平滑化処理(単純移動平均、多項式フィッティング平滑化)が実行されるたびに、使用されたメソッドとウィンドウサイズ (nsmooth) が表示され、処理されたデータの一部(X値、元のY値、平滑化後のY値)が詳細に表示されます。標準出力の例(一部抜粋):
Read data from [xrd.csv] Angle Intensity 37.0 102.3 37.1 105.8 ... 46.0 127.8 Smoothing by simple moving average nsmooth=3 37.0 102.3 103.4 37.1 105.8 103.73333333333333 ... Write to [smoothing-simple-3.csv] nsmooth=11 ... Write to [smoothing-simple-11.csv] ... Smoothing by polynomial fit nsmooth=11 ... Write to [smoothing-polynomialfit-11.csv] ...
生成されるファイル: 上記の実行例では、以下のCSVファイルが、
smoothing.pyと同じディレクトリに生成されます。smoothing-simple-3.csvsmoothing-simple-11.csvsmoothing-simple-31.csvsmoothing-simple-51.csvsmoothing-polynomialfit-11.csvsmoothing-polynomialfit-31.csvsmoothing-polynomialfit-51.csv
これらのファイルは、それぞれ指定された平滑化方法とウィンドウサイズで処理されたX、元のY、平滑化されたYのデータを含みます。例えば、
smoothing-simple-3.csvの内容は以下のようになります(ヘッダー行とデータの一部)。x,y(raw),y(smooth) 37.0,102.3,103.4 37.1,105.8,103.73333333333333 37.2,103.1,103.6 37.3,101.9,103.73333333333333 ...
グラフ表示: プログラムの実行が完了すると、
matplotlibによって生成されたグラフウィンドウが表示されます。このウィンドウには、3x3のサブプロットグリッドがあり、それぞれ異なる平滑化方法とウィンドウサイズで処理されたデータが元のデータと共にプロットされています。これにより、各平滑化手法の効果を視覚的に比較できます。 グラフが表示された後、ターミナルにはPress ENTER to exit>>と表示され、Enterキーが押されるまでプログラムは待機します。Enterキーを押すと、グラフウィンドウが閉じられ、プログラムが終了します。