lsq-line.py 技術ドキュメント

プログラムの動作

lsq-line.py は、与えられたデータセットに対して線形回帰(最小二乗法による直線フィッティング)を実行するPythonプログラムです。 主な機能は以下の通りです。

  • データ入力: Excelファイル(.xlsx 形式)からX-Y座標データを読み込みます。

  • 最小二乗法: 読み込んだデータ点に対し、最小二乗法を用いて最適な直線 \(y = c_0 + c_1 x\) の係数 \(c_0\)\(c_1\) を計算します。

  • 結果出力: 元のデータ点、および計算された回帰直線上のY値をまとめたCSVファイルを生成します。

  • 視覚化: 入力データ点と計算された回帰直線をグラフにプロットし、リアルタイムで表示します。

このプログラムは、散布データから線形な傾向を抽出し、その傾向を最もよく表す直線の式を求めることで、データ分析の基礎的な課題を解決します。

原理

このプログラムは、線形回帰において最も一般的に用いられる最小二乗法を採用しています。 最小二乗法は、与えられたデータ点 \((x_i, y_i)\) とモデル関数 \(y = f(x)\) との残差の二乗和 \(S\) を最小化することで、モデル関数のパラメータを決定する手法です。

線形関数 \(f(x) = c_0 + c_1 x\) の場合、二乗和 \(S\) は以下の式で表されます。

\[ S = \sum_{i=1}^n (y_i - (c_0 + c_1 x_i))^2 \]

ここで、\(n\) はデータ点の総数です。 この \(S\) を最小化するために、\(c_0\)\(c_1\) に関して偏微分し、それぞれをゼロと置きます。

\[\begin{split} \frac{\partial S}{\partial c_0} = -2 \sum_{i=1}^n (y_i - c_0 - c_1 x_i) = 0 \\ \frac{\partial S}{\partial c_1} = -2 \sum_{i=1}^n x_i (y_i - c_0 - c_1 x_i) = 0 \end{split}\]

これらの式を整理すると、以下の連立一次方程式が得られます。

\[\begin{split} n c_0 + (\sum_{i=1}^n x_i) c_1 = \sum_{i=1}^n y_i \\ (\sum_{i=1}^n x_i) c_0 + (\sum_{i=1}^n x_i^2) c_1 = \sum_{i=1}^n x_i y_i \end{split}\]

この連立方程式を行列形式で表すと次のようになります。

\[\begin{split} \begin{pmatrix} n & \sum x_i \\ \sum x_i & \sum x_i^2 \end{pmatrix} \begin{pmatrix} c_0 \\ c_1 \end{pmatrix} = \begin{pmatrix} \sum y_i \\ \sum x_i y_i \end{pmatrix} \end{split}\]

プログラム内の lsq 関数では、左辺の係数行列が Sij、右辺の定数ベクトルが Si に対応します。 係数ベクトル \(c = (c_0, c_1)^T\) は、行列の逆行列を用いて以下のように計算されます。

\[\begin{split} \begin{pmatrix} c_0 \\ c_1 \end{pmatrix} = \begin{pmatrix} n & \sum x_i \\ \sum x_i & \sum x_i^2 \end{pmatrix}^{-1} \begin{pmatrix} \sum y_i \\ \sum x_i y_i \end{pmatrix} \end{split}\]

numpy.linalg.inv を用いて逆行列を計算し、@ 演算子(行列積)を用いて係数を求めています。

必要な非標準ライブラリとインストール方法

lsq-line.py は、以下の非標準ライブラリに依存しています。これらのライブラリは、Pythonのパッケージマネージャである pip を使用してインストールできます。

  • numpy: 数値計算、特に多次元配列オブジェクトや行列演算を効率的に行うためのライブラリです。

    pip install numpy
    
  • pandas: データ解析と操作のためのライブラリで、Excelファイルからのデータ読み込みに使用されます。

    pip install pandas
    
  • openpyxl: Excel 2010 xlsx/xlsm/xltx/xltm ファイルを読み書きするためのライブラリです。pandasがExcelファイルを読み込む際のバックエンドとして利用されます。

    pip install openpyxl
    
  • matplotlib: 2Dグラフを描画するためのライブラリです。計算結果のプロットに使用されます。

    pip install matplotlib
    

必要な入力ファイル

プログラムは、以下の形式のExcelファイル(.xlsx)を入力として期待します。

  • ファイル名: デフォルトでは random-poly.xlsx ですが、コマンドライン引数で指定可能です。

  • 形式: Microsoft Excel ワークブック (.xlsx 拡張子)

  • データ構造: 少なくとも2つの列を持ち、最初の列がxデータ、2番目の列がyデータとして扱われます。列ヘッダーは必須です。

入力ファイル例 (input_data.xlsx):

x

y

1.0

2.1

2.0

3.9

3.0

6.2

4.0

7.8

5.0

10.1

生成される出力ファイル

プログラムは、以下のファイルと視覚的出力を生成します。

  • 出力CSVファイル:

    • ファイル名: デフォルトでは lsq-polynomial-out.csv です。

    • 形式: カンマ区切り値ファイル (.csv 拡張子)

    • 内容: 3つの列で構成されます。

      • x: 入力データセットのx値。

      • y: 入力データセットのy値。

      • y(LSQ): 最小二乗法によって計算された回帰直線上の対応するy値。

    • ヘッダー: ファイルの最初の行に x,y,y(LSQ) が出力されます。

    出力ファイル例 (lsq-polynomial-out.csv):

    x,y,y(LSQ)
    1.0,2.1,1.98
    2.0,3.9,3.96
    3.0,6.2,5.94
    4.0,7.8,7.92
    5.0,10.1,9.90
    

    (上記の y(LSQ) の値は例であり、実際の計算結果とは異なる場合があります。)

  • プロットウィンドウ:

    • プログラムは、matplotlibを使用して、入力されたデータ点と計算された回帰直線をプロットしたグラフウィンドウを表示します。

    • このウィンドウは、ユーザーがターミナルでEnterキーを押すまで表示され続けます。

コマンドラインでの使用例 (Usage)

lsq-line.py は、以下の形式でコマンドラインから実行できます。

基本形式:

python lsq-line.py

この形式では、デフォルトの入力ファイル random-poly.xlsx を使用します。

入力ファイル指定形式:

python lsq-line.py <input_excel_file.xlsx>

<input_excel_file.xlsx> には、使用したいExcel入力ファイルのパスを指定します。

引数:

  • <input_excel_file.xlsx>: オプション。最小二乗法を実行するデータが格納されたExcelファイルのパス。この引数が指定されない場合、プログラムはスクリプト内にハードコードされたデフォルトのファイル名 (random-poly.xlsx) を使用します。

コマンドラインでの具体的な使用例

例1: デフォルトの入力ファイルを使用する

入力ファイルを指定せずにプログラムを実行します。この場合、プログラムは random-poly.xlsx という名前のファイルをカレントディレクトリから探します。

python lsq-line.py

実行結果の説明:

  1. プログラムは起動メッセージ「Least-squares method for linear function」を表示し、線形関数に対する最小二乗法が実行されることを示します。

  2. 使用される入力ファイル名 (infile=random-poly.xlsx) と出力ファイル名 (outfile=lsq-polynomial-out.csv) が表示されます。

  3. 入力ファイルの読み込みが開始され、読み込み完了後、処理中のデータ点数が表示される場合があります。

  4. 最小二乗法の計算が実行され、途中で計算に使用された行列 Sij とベクトル Sipprint 形式でターミナルに出力されます。

    Vector and Matrix:
    Si=
    [array([  ...]), array([  ...])]
    Sij=
    array([[  ...,   ...],
           [  ...,   ...]])
    
  5. 計算された回帰直線の係数 \(c_0\)\(c_1\) を用いた関数式 f(x) = c0 + c1 * x が具体的な数値で表示されます。

  6. lsq-polynomial-out.csv という名前のCSVファイルが、元のデータと回帰直線上の計算値を含む形でカレントディレクトリに生成されます。

  7. matplotlibによってグラフウィンドウが開き、元のデータ点がプロットされ、その上に計算された回帰直線が表示されます。

  8. ターミナルには「Press ENTER to terminate」というメッセージが表示され、ユーザーがEnterキーを押すとグラフウィンドウが閉じ、プログラムが終了します。

例2: 特定の入力ファイルを使用する

例えば、my_data.xlsx という名前のExcelファイルにデータが格納されている場合、以下のように実行します。

python lsq-line.py my_data.xlsx

実行結果の説明: 上記の「例1」とほぼ同様の動作をしますが、infile の表示が my_data.xlsx となり、指定されたファイルが入力として使用されます。出力されるCSVファイル (lsq-polynomial-out.csv) とグラフの内容は、my_data.xlsx のデータに基づいた結果となります。 具体的な出力メッセージやグラフは、my_data.xlsx の内容に依存します。