社会人のためのデータサイエンス入門 第2週 回帰分析
2種類以上のデータの間の関係を読み取る方法を回帰分析という。
予測したい値のことを目的変数、分かっている値を説明変数という。
平たく言うとY=aX+bの式を求めること。
例えば降雨量を予想するのに、気圧、風速、湿度が影響すると考える。
湿度から降雨量を予想する場合、湿度を説明変数、降雨量を目的変数といい、説明変数が1つなので、単回帰分析と呼ぶ。この場合は2次元のグラフ上に点の一番真ん中を通るように直線を引く。このY軸の時の値のことを切片、変化の度合いを傾きという。
一方、気圧、湿度から降雨量を予想する場合、気圧、湿度が説明変数、降雨量が目的変数となり、説明変数が2つなので重回帰分析と呼ぶ。この場合では3次元のグラフを書き、点の一番真ん中を通る平面を求める。
基本は曲線、曲面ではなく、直線、平面らしい。なぜかは説明がなかったが、なんとなく平面の方が計算しやすいからなのではないかと思っている。曲線を求めることもあるらしい。
この線はきれいに引けない場合もあるため、どれだけずれが出ているかを確認する必要がある。求め方としては予測値と目的変数との差を2乗してデータの個数で割るという手順で、この値を残差二乗の平均という。
この回帰分析による予測値がない場合は指標となる数値は平均しかないため、平均値と実際の値との差を2乗してデータの個数で割って、残差の二乗を求める。
2つの変数の間に関係があれば、平均よりもうまく説明できるはずなので、回帰分析による予測値の残差の二乗の平均と、平均による予測値の残差の二乗の平均を比べると、誤差は回帰分析の方が少ないはずで、回帰分析による予測値の残差の二乗の平均の方が小さくなるはずである。
ただ、これは単位や用いる値によって大きさが変わるため、様々なデータで説明できている度合を統一的に比較する際に障害となる。このため、どれだけ点を説明できるかという指標を利用する。これを決定係数という。
決定計数とは、
(平均の残差の二乗の平均ー回帰分析の予測値の二乗の平均)÷平均の残差の二乗の平均
で求められる。
誤差が0ならば回帰分析の残差の二乗の平均も0になるはずで、そうすると、
平均の残差の二乗の平均÷平均の残差の二乗の平均
となり、決定計数は1となる。
一般的にはそんなことはないので、0~1の間となるらしい、とここまで書いて、完全に説明できたら1だけど、そうじゃなかったらマイナスにならんかな、と思ったのでもうひと調べ。どうやら、マイナスもなくはないそうだ。回帰分析の結果として出てきた予測だから平均よりかはちょっとはましだろうということだろうか。
残差のイメージについては以下のサイトの絵が分かりやすい。
講演会に行ってきました。(Rochelle Kopp: 自分の組織でチェンジメーカー(変革を起こす人)になる方法)
今日はこのイベントに行ってきました。
今日の講演の動画はFacebookで公開されてました。詳しい内容はこちらを↓。
スライドも共有していただきました。
テーマは自分の組織で変革を起こすにはどうしたら良いかというもの。頭に残ったことをメモしておく。
組織の文化を変える手順は、Unfreeze→Change→Freezeするということ。最後にFreezeするのは変革を定着させるために必要。
より細かい手順では以下の8つのステップで進める。
1.危機意識を高める
2.変革推進のための連帯チームを作る
3.ビジョンと戦略を生み出す
4.変革のためのビジョンを周知徹底する
5.従業員の自発を促す
6.短期的成果を実現する
7.成果を生かして、さらなる変革を推進する
8.新しい方法を企業文化に定着させる
もし、5.で副作用が起きた場合は、一度改革を止めて原因を分析して、対策を行い、もう一度取り組むと良い。
Nothing succeed like a success.
成功事例が大事。成功したらそれが文化になる。
組織のトップから変革を起こしたい場合は、戦略を具体的なものに落とし込む必要がある。逆に、下から変革を起こしたい場合は危機感の共有が必要で、それが難しい場合は、先にチームで6.の短期的成果を生み出してそれを元に推進する。
重要なのは一人で抱え込まずに他人を巻き込むこと。また、今まではダメというのではなく、今までを元にさらに良くするという考え方で行う。今までの良いところをはっきりさせると、大事なところは変えないというのを示しやすい。
感想としては、自分の会社では、3.ビジョンと戦略を生み出す、4.変革のためのビジョンを周知徹底するの2点をもっと進めたい。今は危機感の共有は出来ているけど目指す姿が共有出来ていなくて、ベクトルが分散している感じ。
もう1つロシェルさんの言葉ではっとしたのは、危機意識を高めるには、現実に何が起きているかを知るのが大事、Get out of the building、現地・現物で確認するということ。お客、ターゲットのところに行って何が起きているかをしっかり観察すること。
言葉では分かってたけど、出来てなかったなぁ、、、。スキルアップなどの準備は考えていたけど現場にアプローチするまではやれていなかった。
参考リンクを追記
レヴィンとコッターの変革モデル
コッターの8段階の変革モデル
ASP.NET Web Forms でAutoFacを試す。
今さら感はあるけど、ASP.NET Web Formsで依存性の注入(DI)をやってみた。使ったのはAutoFacです。ちょうど最近MSDNのブログでASP.NET Web FormsにUnityを入れるという投稿があったけど、これは.NET Framework 4.7以降じゃないとダメなので断念。
上はMSDNとAutoFacのチュートリアル。チュートリアルはAutoFacの方が丁寧で分かりやすいけど、MSDN Blogの投稿コメントがなかなか面白い。
Web Forms — Autofac 4.0 documentation
すごいいいタイミングでUnityというDIライブラリをASP.NET Web Formsに導入するサンプルが出てるけど、これは、.NET Framework 4.7を使ってて、今のプロジェクトでは使えない、、、。AutoFacより簡単そうなのに残念。
定義をファイルから入れるようにしている人がいた。
社会人のためのデータサイエンス入門 第2週 関係の見方・相関係数
2つの変数の関係の見方を扱う。2つの変数が関係があるかどうかを見る場合にはまず、2つの軸の散布図を描く。そうするとなんとなく関係がありそうかどうかが分かる。
統計局のHPより
この散布図の情報を数値化して表すのが共分散である。共分散は、データ1つずつについて、変数1と変数2のそれぞれの平均との差をかけあわせた値を、データ全てで合計したものである。この値が0に近いと変数の間での関係は少なく、0から離れていると変数の間で関連があると見れる。
ただし、この値は単位の取り方によって値が大きく変わってしまう。平方メートルから平方センチメートルにすると上の散布図の共分散の値は大きくなる。
これを避けるために利用されるのが、相関係数である。相関係数は、単位を気にせず、変数間の関連を見ることができる値である。相関係数は、上の共分散を変数ごとの標準偏差の積で割ります。
共分散を標準偏差の積で割ることで、単位がそろい、結果として得られる相関係数は-1~+1までの値となる。-1に近ければ負の相関、+1に近ければ正の相関、0に近ければ相関がないということになる。
ただし、この相関係数は、変数間の直線的な関係性を見るのには良いが、曲線のパターンが現れていても相関係数は小さく見えるし、外れ値があると、大部分のデータを無視して相関が強く、または弱く出たりする。
社会人のためのデータサイエンス入門 第2週 箱ひげ図、パーセンタイル
中央値を利用したデータの表し方に箱ひげ図がある。私の箱ひげ図のイメージは為替相場の変動のグラフのイメージ。今調べたらこれはローソクというらしい。
箱ひげ図は、データをその個数で4等分して、分布の範囲を可視化する図です。25%~75%を箱として表示し、50%のところに線を引きます。そして、25%から50%、50~75%の間の距離の1.5倍の部分に一番近い値で線を引き、その外側の値を外れ値とする。
このような図で表すことによって、狭いスペースでもデータのばらつきを表現することができる。
また、これに時系列の変化を組み合わせて見たい場合に利用するのがパーセンタイルである。パーセンタイルとは四分位、25%よりも細かくデータを分割してそれを表や図にする。一般的な例としては、赤ちゃんの成長曲線だろうか。年齢と体重、または身長の推移を低い方のXXパーセント、高いほうのXXパーセントで線を引き、おおむねこの枠内に収まるだろうという目安を提供している。
詳しくは母子手帳をご参照ください。
講演に行ってきた。「プロジェクト&プログラム・アナリシス研究部会」6/7
これに行ってきた。講師はギルドワークス代表の市谷聡啓さん。20分くらい遅刻したがとても中身の濃い講演だった。
色々と講演資料が上がっているので今回の講演もそのうちにアップされるかも。
講演のタイトルは「アジャイル開発の実際」で、アジャイルの入門的な講義ながらも市谷さんの経験や観点に基づいた話で面白かった。
以下心に残った話を。
アジャイルが向くプロジェクトとは。機能の種類、完成度が決まっているものはアジャイル開発向きではない。それ以外はアジャイルで行ける。ただし、機能の種類、完成度についてはスコープを変える可能性があることを顧客と合意できる。機能の種類または完成度を工数に応じて調整するよう事前に合意しておくと良いとか。完成度にコミットした場合は、特定の期間内にひとそろいの機能が出来上がらない可能性もある。一方機能の種類にコミットした場合は完成度は低いながらも一通りの機能は出来上がる。こちらの場合は、完成度を松竹梅に分けて、工数に応じて完成させる。講師は契約では請負契約で、機能の種類にコミットする。但し書きで完成度についてスコープの調整を行う可能性があることを明らかにしておく。
アジャイルを取り入れるときにアジャイルをやると思わずに、アジャイルの一つの型を取り入れると考えるとよい。失敗したのはアジャイルではなくアジャイルのプラクティス。他のやり方だとうまく行くのではと考えられる。
アジャイルでは少しずつ形にすることができる。これは体をコントロールするのに似ている。体のコントロールでは目で見て、考え、体を動かす。これはちゃんとフィードバックが得られる。見る、考える部分が仮説思考、体を動かすというのがアジャイル開発。見る、考えるというのはプロジェクトでいうとバックログを作る、ユーザーを見るといった作業となる。体を動かすというのはコミュニケーションを取りにいく、手を動かすといった作業となる。
アジャイルはチームを一人の人間として捉えると、外部を観察し、体を動か巣といった形で機能しているはずで、そうでなければ、チームがうまく回っていないということ。
Intro to Machine Learning Lesson8 Outliers 外れ値の除外がまだ終わらない
Udacityのこの単元では、Pythonのコードで実際に外れ値を除去して、単回帰分析の精度を上げる練習を行う。
それで、コードはほとんどセットアップされていて、書くべきコードはnumpyのndarrayで、年齢、年収、予測年収のリストを受け取って、予測年収と年収のかい離が大きい10件の外れ値のTupleを返す。
まずは、numpyの配列の計算がすごく楽なのが勉強になった(笑)
配列と配列は+演算子で項目ごとに足せるし、配列の結合も簡単。
ただ、外れ値上位10%のインデックスが拾えない、、、。先頭4件はこんな感じのndarrayでここから、差をerrorsにつめて、errorsの値上位10件のインデックスが欲しいけど、とれない。
print(predictions[[range(0, 4)]])
[[314.65206822]
[314.65206822]
[197.85966342]
[350.19758273]]
print(ages[[range(0, 4)]])
[[57]
[57]
[34]
[64]]
print(net_worths[[range(0, 4)]])
[[338.08951849]
[344.21586776]
[243.79287312]
[378.84578142]]
errors = numpy.round(numpy.sqrt(numpy.square(predictions - net_worths)))
count = int(errors.size * 0.1)
idxs = numpy.argpartition(errors, -1, 0, -count)[-count: ]
このサイトを参考にしたけど、配列の形式が違うからか。
誰か助けて。
2018/06/09追記
結局、自分で調べてもダメだったのでUdacityのForumを参考にしながら解決。
最終的にこんなコードになりました。
errors = numpy.round(numpy.sqrt(numpy.square(predictions - net_worths)))
#予測値と実際の値の差をリストで取得(差を2乗して平方根を求めることで、マイナスをなくす)
data = numpy.c_[ages, net_worths, errors]
#行列を結合して、データをひとまとまりにする
data = data[data[:, 2].argsort()[::-1]]
#3つ目の要素でデータをソートする
count = round(errors.size * 0.1)
#外れ値とするデータの個数を計算(10パーセント)
array = data.tolist()
#データをリストに変換
del array[0: count]
#外れ値でないデータを削除
for item in array:
#対象のデータを1件ずつタプルに変換
cleaned_data.append(tuple(item))
return cleaned_data