#author("2019-04-30T10:47:17+09:00","default:takataka","takataka") #author("2019-04-30T10:47:47+09:00","default:takataka","takataka") *基礎セミナー 2019年度 ex05 [#e237d833] #contents **回帰分析の初歩 [#r9fabbda] 気温 &mathjax{x}; [度] とアイスの売れた数 &mathjax{y}; [個] のような2つの量の間の関係を表す式を求めて分析する,&color(blue){''回帰分析''}; と呼ばれる手法の初歩を体験してみよう. ***データの入手,散布図の描画,並べ替え [#b9fc89ac] + 成績データの分析をしたスプレッドシート「ex04-T180XYZほげほげお」に新しいデータをインポートしよう.このスプレッドシートを開いた状態で,「ファイル」 > 「インポート」する.成績データと同じ場所にある line-mac.csv および line-win.csv のいずれかをインポートしよう.その際,「新しいシートを挿入する」にして,開いているスプレッドシートに追加すること.ウィンドウ下部を見れば2つのタブがあり,それらをクリックすることで成績データのシートと今追加したばかりのデータのシートを切り替えることができる. + x と y の値の散布図を描こう + 値の変化をわかりやすくするため,x の列を基準にしてデータを並べ替えてみよう. ++ 列Aをクリック → 列BをShift押しながらクリックして範囲指定 ++ メニューの「データ」を選ぶと, 列Aを基準に... といった選択肢が表示されるので,x の値に小さいものが上にくるようになるものを選んでみよう. + このデータも先の成績データも,(x, y) や (数学, 物理, 情報) のように数値が組になっており,1行がひとかたまりの値を表すので,どれか1列だけ並べ替えたりするとデータが壊れてしまいますね. ***適当に直線をあてはめてみる [#i08193d7] 散布図と並べ替えたデータを眺めると,このデータには,x が大きくなると y が小さくなる関係があり,ばらつきはあるものの,x と y の関係を直線の式(&mathjax{y = ax + b}; という形)で表せそうである.というわけで,次のことをやってみよう. + セル E1, F1 に a, b と書き,それぞれの下のセル E2,F2 に適当な実数値を入れる + セル C1 に a*x+b と書き,C2以下のセルが「そのセルと同じ行の x の列の値にE2の値を掛けて F2 の値を足したもの」になるように式を書く. -- C2 に式を書いたあと,その下のセルに同じ式を書くのをサボろうとドラッグすると,うまくいかないことがわかるだろう.その原因は,C2 に書いた式をドラッグして C3 にコピーすると,ソフトが気をきかせて式中の E2, F2 を勝手に E3, F3 にしてくれちゃうせいである. -- そのような動作をさせないためには,C2 の式の中の E2 の箇所を「E$2」と,2の前に「$」をつけた形にしておいてやればよい(Fの方も一緒). -- 上記の $ 記号の意味については,「絶対参照」と「相対参照」をキーワードに調べてみたらよい.この例では,Eの方にも $ をつけて「$E$2」としてもよい. + 散布図の設定を変更して,A列の値に対するC列の値も表示させよう. -- C列の方については,「グラフエディタ」>「カスタマイズ」>「系列」で a*x+b の方を選び,「ポイントサイズ」を「なし」にして,「トレンドライン」のチェックを入れることで,直線を描くことができる. さらに,「ラベル」を「方程式を使用」にすると... -- 上記は「トレンドライン」機能の本来の使い方からはちょっとずれている...まっとうな使い方はすぐ後で + a, b の値を変えると,C列の値は自動的に計算し直される.いろいろ変えて,y 列の値になるべく近い値が作れるようにしよう. + &color(white,blue){check}; ''Step6'' ここまでできたら takataka に知らせてください. ***回帰式を求めてみる [#mdb6d30f] 上で考えた直線の式の係数(パラメータ)&mathjax{a, b}; は,&color(blue){''最小二乗法''}; という方法で最適な値を求めることができます.上の学年の授業で学ぶことなのでここではちゃんとは説明しませんが,直線を当てはめたときの「二乗誤差」が最小になるように &mathjax{a, b}; を決めることができます. 最小二乗法によると,&mathjax{a, b}; は次式のように計算すればよいことがわかります. #mathjax{{ a = \frac{S_{xy} }{S_{xx} } \qquad b = \bar{y} - \bar{x}a }} ただし,&mathjax{\bar{x}, \bar{y} }; は &mathjax{x, y}; の値の平均です.個々のデータの番号を添字 &mathjax{n}; で表すことにして,データが &mathjax{(x_1, y_1), (x_2, y_2), \ldots , (x_N, y_N)}; のように全部で &mathjax{N}; 個(&mathjax{N};組)あるとすると,&mathjax{\bar{x}, \bar{y} }; は次式で求められます. #mathjax{{ \bar{x} = \frac{1}{N}\sum_{n=1}^{N} x_n \qquad \bar{y} = \frac{1}{N}\sum_{n=1}^{N} y_n }} また,&mathjax{S_{xx}, S_{xy} }; は次式で求められる値です. #mathjax{{ S_{xx} = \sum_{n=1}^{N} (x_n - \bar{x})^2 \qquad S_{xy} = \sum_{n=1}^{N} (x_n - \bar{x} )(y_n - \bar{y} ) }} 上記の式だけ与えられてスプレッドシートの計算式をいきなり書くのは難しいかもしれません.次のように段階分けして考えたらよいでしょう. + 適当なセルに &mathjax{\bar{x}, \bar{y} }; の値を計算しておく.AVERAGE関数使ったらよいでしょう. + 適当な列に &mathjax{x_n - \bar{x} \ (n = 1, 2, \ldots , N)}; の値を計算して入れておく.1番上の行に,x - avg(x) という名前をつけておこう. + &mathjax{y_n - \bar{y} }; についても同様にする. + それらを使って &mathjax{(x_n - \bar{x})^2}; を計算する列を作る + 同様に &mathjax{ (x_n - \bar{x} )(y_n - \bar{y}) }; を計算する列を作る + 適当なセルに &mathjax{S_{xx}, S_{xy} }; の値を計算しておく. + &mathjax{a, b}; の値を入れていたセルに計算式を書く. + &color(white,blue){check}; ''Step7'' ここまでできたら takataka に知らせてください. 実は,上で出てきた「トレンドライン」という機能は,このような計算を自動的にやって得られた式から直線のグラフを自動的に描いてくれるものです.散布図で y の値の方でトレンドラインを表示させてみると,全く同じ直線が得られるのがわかるでしょう. ***気温 vs アイス「ゴリゴリ君」の売上数 [#b572d30c] 「Kiso2018」>「ex07」にある以下の2つのファイルのどちらかを新しいシートに追加して,これまでと同じように回帰分析してみよう. 「Kiso2019」>「ex04」にある以下の2つのファイルのどちらかを新しいシートに追加して,これまでと同じように回帰分析してみよう. gorigori-mac.csv および gorigori-win.csv 数式もコピーできるので,うまくやると結構すぐできちゃうかも. 回帰式を用いると,&mathjax{x}; の新しい値が与えられたときに,&mathjax{y}; の値はいくつになるか予測することができる.上記で得られた結果を利用して,気温が次の値のときにゴリゴリ君の売上はそれぞれ何個になると予測されるか計算してみよう. > 0度, 気温が平均値と等しい時, 30度, 40度 < 逆に,100個売れるのは気温何度の時か推定することもできます. &color(white,blue){check}; ''Step8'' ここまでできたら takataka に知らせてください.