散布図と回帰直線

  1. 散布図と回帰直線
    1. 目的
      関連しあう二つの変数があるとき、その関係を散布図として表示し、各点との距離を最小とする直線(線形回帰直線)を求めます。

    2. 散布図
       元になる変数をx座標に、他の座標をy座標とし、各点の座標をグラフとしてマークします。この図を散布図といいます。散布図を見ることにより、変数間の関係を直感的に把握できます。

    3. 回帰直線の計算式
      与えられた各点との距離の和を最小にする直線

       y = a + b・(x-μx

      を求める問題です。a,b は次のように求めることができます。

       a = μy
       b=(Σ(i=1..n)xiyi -nμxμ)/ (Σ(i=1..n)xi2-nμx2

      これは、次のように計算できます。ac,bc が求め対直線の計数です。
         for(int i=0;i<dsx;i++){
           sx += datax[i];
           sx2 += datax[i]*datax[i];
           sy += datay[i];
           sxy += datax[i]*datay[i];
         }
       ac=sy/dsx;
        bc=(sxy-sx*sy/dsx)/(sx2-sx*sx/dsx);

    4. 文字列の切り出し
       複数の数字を "," で区切り、文字列として入力/編集します。この文字列から","で切られた数字を切り出すクラスStringTokenizer を利用します。文字入力枠から、Stringクラスの文字列をstに取り出し、これから、

       StringTokenizer tkn=new StringTokenizer(st,",");

      で文字列を切り出す tkn を作成します。このとき、切り出す記号 "," をしていします。tkn から、次の "," までの文字列を切り出すには、tkn.nextToken() を用います。切り出す文字列の有無は tkn.hasMoreTokens() で知ることができます。

       以下の関数は、文字枠 dataField から  ","  で区切られた数字を取り出し、順に配列 datax[]とdatay[] に記録します。
        void SetData(){
          dsx=0;
          String st=dataField.getText();
          StringTokenizer tkn=new StringTokenizer(st,",");
          while(tkn.hasMoreTokens()){
            datax[dsx]=Double.parseDouble(tkn.nextToken());
            datay[dsx++]=Double.parseDouble(tkn.nextToken());
          }
        }

  2. プログラム

    1. 画面レイアウト
       データを入力、編集する文字枠と再表示するボタンを用意します。

    2. 計算プログラム:recursion
       直線の係数a,bを求めます。x、y、x・y、x2、の和を求めます。x,y は配列 datax[]、datay[]に記録されています。これらの和から、係数を変数 ac,bc に求めます。
       同時に、回帰直線を描画するため、xの最小と最大をminxとminyに求めます。minxとminyに対応する直線上の値を、fminとfmaxに求めます。

    3. 表示プログラム:paint()
       与えられた点の座標をそのまま表示することはできません。点の座標から適切に画面の座標(この場合、[0,200]の範囲の整数値)に変換する必要があります。ここでは、この変換関数を fx() と fy() で行います。この変換処理のための係数は自動生成していませんから、データの値が大きく変化した場合、変更する必要があります。
       
    4. プログラム
       このプログラムのソースはここにあります。

    5. 実行
      データの散布図と回帰直線を表示します。x,y の順に並んだ数値データを編集し、再表示ボタンを押します。



  3. 演習

     
    1. 演習1
      プログラムのソースをファイルに保存し、コンパイル&実行をして下さい。データの値を変更して、回帰直線が変化する様子を確認してください。

    2. 最終課題例
       直線でなく、多項式で近似する方法を調べ、プログラムを作成して下さい。