論理の流刑地

流罪に遭い戸惑う世捨人の雑記

「泣き虫しょったんの奇跡」というか渋川清彦の奇跡(監督:豊田利晃)


『泣き虫しょったんの奇跡』本予告

客がいない

出先からの帰りに見た@池袋HUMAX。
公開初日だというのに、めっちゃ空いてて心配になるほどだった。いくら平日とはいえ。
やはり年齢層は50代以上の年配の男性が多い、という感じだ。
将棋ブーム(なのか藤井ブームなのかはさておき)による需要を見込んでの公開だとは思うが、なかなか実際のところは難しいのだろう。
せちがれぇ。

全体的な感想:長いハイライトムービー

予告を見るとまず抱くのは、キャストが豪華である、といった印象である。
妻夫木も早乙女太一藤原竜也RADWIMPSのアイツも出るのかよっていう。
永山絢斗板尾創路までいるじゃん、予算大丈夫かよっていう。
なんかみんな曲者っぽい役だし、もうワクワクがとまらねぇぜ!っていう予告である。

んで、実際に見た後に抱くのは、
「あ、予告でだいたい全部終わってた」感というかダイジェストムービー感である。
いろんな人物が入れ替わり立ち変わり現れては、2-3分で退場していくっていう。
早乙女太一妻夫木聡藤原竜也も、全然彼らがやる必要性も蓋然性もなかった。

早乙女太一がやっているあの変な対局姿勢の奨励会員とか、絶対なんかやってくれるって期待しちゃうじゃん。でもすぐいなくなるもん、そんなんできひんやん普通。

ある人物の半生を2hで描くっていう制約、
しかも①将棋と出会った幼少期、②奨励会時代、③退会後のアマ時代、④編入試験
の4つの時期をそれなりに描かなくてはいけない、という制約があるから大変だったのはわかるんだけど、
90秒の予告を、すべて均等の濃度で2時間に引き伸ばした、という感があった。
もう少し掘り下げて書くところとそうでないところ、濃淡をつけてもよかったのでは。

ラストの対局シーンでの盛り上げ方が、これまでに出会った人の言葉を走馬灯のように流していく、という方法にしか求められなかった点もこのダイジェストムービー感を増幅している。

映画批評をする枠組みも見識もないし技術論も語れないので、
じゃあどこをどうすればよかったのよ!って言われると口をつぐむしかないのが歯痒いところではあるんだが。

将棋を題材にする難しさ:「聖の青春」との比較

豊田監督は元奨励会員であることから、「将棋の面白さを伝える」という意味で、
これまでの将棋映画の監督とは異なる期待を寄せられていた(いる)と思う。

映像化という観点だけでなく普及という点からいっても、
将棋の魅力を将棋をよく知らない人に伝えるのはむずかしい。

ある程度将棋を知っているひとにとってみれば、
たとえば去年の竜王戦第4局渡辺-羽生戦の△6六飛や今年の竜王戦予選5組決勝石田-藤井の△7七同飛成といった手は、
その一手の意味がわかってくるとともに、背筋をゾワっとさせるような興奮や人間の叡智というものを感じさせるような力をもっている。


しかし、将棋をわからない人から見ればそれは、ほかの変哲もない手と同様に、
パチっという駒音とともにひとつ駒が移動したという現象が目に映るにすぎないのである。
(そういった意味で近年の将棋界が、将棋めしや棋士のキャラクター性を全面に押し出すことで、指し手を楽しむのとは違う方向性でのファン=「観る将」の開拓を進めているのは興行的に正しい)


だから映画をつくるにあたっては、どうにかして将棋を指している棋士の対局姿をうまく撮ることで、なんとか魅力を伝えていくしかない。
ただ、その点においても、ダイジェスト・ムービーたる「しょったんの奇跡」は弱いところがあった。
対局シーンが映し出されるシーンは数多くあるものの、ひとつの対局=真剣勝負をじっくり見せるというシーンが皆無に等しかったのが残念であった。
結婚式で流れる新郎新婦の紹介ムービーではないが、どんなに長くても一局は2-3分で終わってしまっていた。


その点は映画としては「聖の青春」のほうがうまくやれていて、
村山-羽生戦における両棋士(というか松ケンと東出昌大)の
鬼気迫る姿をじっくり見せることによって、見る側が「これはただのボードゲームじゃない」と感じられるような真剣味を感じさせることができていた。

聖の青春 [DVD]

聖の青春 [DVD]

この棋譜NHK杯のものであるものの、羽生と村山が和服で長時間対局するという設定は架空のものであり、この脚色自体については長年の将棋ファンからすれば賛否あるものだったと思う。


この変更点に関して、私は映画としてはアリだが、原作も素晴らしい作品なので否定派の気持ちもわからんでもない、という立場であったが、
映画「しょったん」を見た後に改めて考えて見ると、これはやはり森義隆監督(かあるいは脚本の向井康介)の名采配だったのだ、という印象をもつ。

よかったところ

上述のように映画全体に関しては若干一本調子な印象をもったが、もちろんひとつひとつのシーンや演技、セリフには素晴らしい要素もたくさんあった。

まず、やはり心動かされるセリフがいくつもあったのは良い点だと思う。小林薫扮するアマ強豪の人(名前忘れた)のセリフで、

「人生は負けたら終わりだけど将棋は負けても次の対局がある。敗北も楽しめないと将棋を愛せない」(うろ覚え)

みたいな言葉があったんだけど、なんか沁み入るものがあった。
小林さんの演技がよかったのもあるんだけど、いや人生も同じだよなぁと。敗北も愛せるようにならないとたぶんいい味出せないよなぁと。黒星を積み重ねながら歳をとっていくおっさんとしてはそう思わされた。
あとキャッチコピーにもなっているけど、「負けっぱなしじゃ、終われない」っていうのはシンプルだけど力のある言葉で、やはりあのタイミングで出てくると感動してしまう。

プロ試験にのぞむ瀬川に旧友がかける

しょったんの弱点は、勝つことに慣れてないことだよ
勝つことの喜びを恐れるなよ

という言葉も重みがある。
「勝つことの喜びを恐れない」っていうのは本当に重要な言葉で、もうちょいやれるのに自分にブレーキをかけてしまうことが多くなる齢の自分には刺さるものがあった。

そして何より白眉は、豊川七段(がモデルとなった棋士)を演じた渋川清彦さんのすばらしい演技である。
何を言っているがわからないと思うが本人よりもマンモス感あった。なんというか濃縮還元100%マンモスである。
時折出るダジャレ(「こんばんワイン〜♪」)だけでなく、カラオケではしゃいでる姿や、後輩を暖かく見守る姿、そのすべてが我々の「豊川孝弘」像の理念型みたいなものをうまく表現できていて、個人的にはこの映画のMVPであった。


ってことでおつかれマンモス!


www.nicovideo.jp

Stataで出力したregression tableをcsv形式で出力 by estoutパッケージ

備忘用。年を重ねるごとに物忘れが激しくなってしまうな。

Motivation

Stataで回帰分析を行なった結果をExcelにうつすときのやりかた(これがbestかはわからん)。

Texで出力するのがスタンダードでスマートなのはわかっているが、
実際の仕事だと(例えば出版社に回帰分析の元表を提出するときなど)Excelベースの管理が一般的という事情もある。

あとMacユーザだと、Excelでregression tableを作っておけば、
その部分を選択コピーしてからプレビューを開いて、command + Nで比較的綺麗に画像形式(pdfファイル)に変換できるというのがコスパがよくて重宝する。

そうなると(Texの習得に費やす労力も考えると)やっぱりExcelにベタ貼りできるような形で整形・出力してくれるようにしたくなるのだ。

"estout"パッケージ。

ふだんあまりStataを使わないこともあって調べ方が悪いのかもしれないが、 標準で実装されている機能であまり御誂え向きなものはなかった。 今の所、Excelに貼り付けられそうな形での出力になじんだパッケージとしてestoutを利用するのが、 それなりに簡単で、実用にたえうる手段であるように認識している。
※outreg2というのもあるらしいけどよくわからない。

以下、参考URL

install

Stataのコンソールで以下を実行。

ssc install estout, replace 

eststo関数によりtableを保存

たとえば普通の重回帰分析を2本推定して、それを並べた表を出力したい時。
まず、以下のように、回帰分析の結果を保存する。

*Model1: 従属変数yをx1,x2で回帰 
quietly reg y x1 x2 

*mdl1という名前をつけて保存 
eststo mdl1 

*Model2 : 従属変数yをx1,x2, x3で回帰 
quietly reg y x1 x2 x3

*mdl2という名前で保存する
eststo mdl2

esttab関数により、csvファイルに出力。

上の手続きで、回帰分析の推定結果を保存したのちに、
esttab関数のusingオプションを使うことで、csvファイルとして出力できる。

以下は、上で保存した結果を

  • デスクトップにcsv形式で「tbl1.csv」という名前で保存。
  • 統計量としては調整済R自乗、対数尤度、AIC, BICを出力
  • 標準誤差は丸括弧(parentheses)でなく角括弧(brackets)にする。
  • Model名を「Model1」「Model2」と指定
  • 回帰係数、標準誤差ともに、小数点以下4桁まで表示する。

といった形式で出力するときのプログラムである。

esttab mdl1 mdl2 using "/Users/Ronri_Rukeichi/Desktop/tbl1.csv" , /*
*/replace b(4) se(4)  ar2  scalar(ll) aic bic brackets mtitles("Model1"  "Model2") 

以下補足

  • scalarsの中に指定できる統計量については、このページのExample3を参照。例えばパラメータ数も表示したい時はscalars(ll rank)と指定する。
  • 詳しい構文はesttabのhelpを参照。


場合によってはspost9アドインが求められるが、そのときは以下のプログラムを実行する

net install spost9_ado

対応分析(correspondence analysis, CA)では一体何を「分解」しているのか

Introduction

小野滋さんの「読書日記」が久しぶりに更新を再開し、ひとり小躍りするGW中盤戦...

前々回の記事で、SVDとはなんぞや、について解説した。
ronri-rukeichi.hatenablog.com


この記事のなかで、対応分析も多重対応分析も結局はSVDだよーってちらっとふれたんだけど、とりあえず今回は対応分析がSVDであることを示さんとす。

目の前の仕事が煮詰まっていることからの現実逃避もかねてね...

[参考資料]

  1. Clausen(藤本訳)「対応分析入門」
  2. Greenacre, 1984 , Theory and Applications of Correspondence Analysis

対応分析入門 原理から応用まで 解説◆Rで検算しながら理解する

対応分析入門 原理から応用まで 解説◆Rで検算しながら理解する

前提知識

とりあえず前々回記事からの抜粋で復習すると、

行列AのSVDが得られているとき、降順に並んだj \ ( j <= k ) 個の特異値と、それに対応する左右の特異ベクトルからなる
  A_{j^*}  = \Sigma_{i = 1}^j \lambda_j u_i  v_i  は、
すべてのランクjの行列X_{j^*}のなかで、距離|| \boldsymbol{A - X_{j^*}}||_F を最小化するような行列となる。


すなわち、この意味で  A_{j^*} は、Aの「ランクjの最小二乗近似」であるといえる。

フロベニウスノルムを最小化するような近似行列を得るような特異値& 左右特異ベクトルのセットを得るための方法として、SVDはあった。
だから、上の説明でいうところの、A分解の対象としたい、データ全体の適切な散らばりの表現の行列を指定しさえすれば、色々な応用がきく。

実際に、Greenacre(1984, pp.348-9)においては、Aに様々な行列を選ぶことで、さまざまな手法がSVDとしてとらえられることを一覧化している。
(ただし、Aだけでなく、距離計算のときの重み付けを指定する正定値対称行列\Omega , \Phiの指定も考える必要がある。これに関しては今まで説明していない一般化SVDという枠組みが関係してくるが、説明はおいおい...)

SVDとしての対応分析

いきなり答えから載せちゃうと、対応分析は、
行列 D_r^{-1/2} ( P - r c^T ) D_c^{-1/2}特異値分解している。

  • D_rは、対角成分に各行の周辺相対度数をとる対角行列、D_cは、対角成分に各列の周辺相対度数をとる対角行列、
  • rは各行の周辺相対度数をとるベクトルで、cは各列の周辺相対度数をとるベクトルである。
  • Pは「同時確率行列」と呼ばれるものだが、要するに相対度数の行列で、クロス表を総度数で割ったものである。

アルファベットがゴツゴツとした感じで並んでて感じ悪い行列だが、
この意味は(初等的なカテゴリカル・データの扱い方を学んだ経験のある者からすれば少なくとも)比較的明確である。

まず、 D_r^{-1/2}, \  D_c^{-1/2}はそれぞれ対角行列であるが、対角行列を左からかける場合対角成分の値を各行にかけたものが、
対角行列を右からかける場合対角成分の値を各列にかけたものが、得られる。
よって、i行j列目の分母は、完全独立が成立している場合の相対期待度数の平方根となる。

つぎに、 P - r c^Tだが、これは相対度数から完全独立が成立している場合の相対期待度数を引いたものである。これが分子となる。

よって、行列 D_r^{-1/2} ( P - r c^T ) D_c^{-1/2}の各要素というのは
(相対度数- 完全独立が成立している場合の相対期待度数)/(完全独立が成立している場合の相対期待度数の平方根
となっている。

さて、ここで D_r^{-1/2} ( P - r c^T ) D_c^{-1/2}にSVDを適用するということは、
フロベニウスノルム || D_r^{-1/2} ( P - r c^T ) D_c^{-1/2} || への最小近似を提供するような分解を得るということである。

フロベニウスノルムの定義より、 || D_r^{-1/2} ( P - r c^T ) D_c^{-1/2} ||というのは、
すべての行列の要素に関して、その要素の自乗を足し合わせたものであるので、
要するに、

(相対度数- 完全独立が成立している場合の相対期待度数)の二乗/(完全独立が成立している場合の相対期待度数) の総和

となる。

これはどこかで見たことがないだろうか....
そう、これはカイ自乗値の定義式そのものである

つまり、

対応分析というのは、分析対象となる二重クロス表から算出されるカイ自乗値への最小近似を実現するような特異値と特異ベクトルを、SVDによって得ているだけの処理である

といえるのである。

SVD後のこまかい処理の話:対応分析から得られるスコアはどうやって得られるか

そしてこっからは対応分析に関するSVD「後」の話になる。
 A = D_r^{-1/2} ( P - r c^T ) D_c^{-1/2}とし、このSVDから A = USV^Tという分解が得られる。

ここから、 座標(行・列)のスコアに関して、重み付きの自乗和が固有値と一致するような形で特異ベクトルを変換したい。
すなわち、行スコアをF_r 、列スコアをF_cとすれば、
   (D_r^{1/2} F_r)^T D_r^{1/2}F_r=  F_r^T D_r F_r = S^2
   (D_c^{1/2} F_c)^T D_c^{1/2}F_c=  F_c^T D_c F_c = S^2
が成り立つようにしたい。

SVDの性質より、 U^T U   = V^T V = I が成り立っているので、
 F_r = D_r^{-1/2} U S ,  F_c = D_c^{-1/2} V S という変換を施せば、

  F_r^T D_r F_r = S^T U^T  D_r^{-1/2} D_r D_r^{-1/2} U S  = S^T U^T U S = S^2
  F_c^T D_c F_c = S^T V^T  D_c^{-1/2} D_c D_c^{-1/2} V S  = S^T V^T V S = S^2
という形で上制約を満たすスコアが得られる。

これが対応分析で得られる行/列のスコア(座標)である。

Conclusion

ってことで、対応分析という手法は、
フロベニウスノルムがカイ自乗値となるような行列に対してSVDを適用したのちに、
スコアの重み付き自乗和が固有値(=特異値の自乗)と一致するように左右の特異ベクトルを変換するだけの簡単なお仕事だとわかった。

ちなみにMCAもほとんど同じようなロジックであるが、ちょっと疲れたので気が向いたらまたまとめよう


Def Tech - Catch The Wave

そんじゃ、Enjoy!

【備忘】Rcppパッケージ使うためのURL集

the 備忘 of 備忘

直近の仕事には使わないけど、(たぶん)数ヶ月以内に舞い降ってくるであろう仕事では、最適化計算の速度をあげる必要があるので、さすがに避けられなくなってきたか。

Chapter 1 Rcppの活用ポイントによれば、

Rと比べて C++ で書くことによって特に高速化が見込めるのは次のようなケースです。

  • 繰り返し処理、特に次の処理が前の処理に依存しており並列化できない場合
  • ベクターや行列の個々の要素へアクセスする場合
  • 繰り返し関数の呼び出しがある場合
  • ベクターのサイズを動的に変更する場合
  • 高度なデータ構造やアルゴリズムを用いた処理

らしいが、今回の場合はどうなんだろう...(わかってないんかい)

Link

みんなのRcpp
→ 日本語で詳細かつ「C++にもそれほど詳しくない方々に対しても Rcpp を利用するのに必要な情報を提供することを目的として」いるため、ハードルも低そう。ここからはじめるのが本筋か。
Rcpp · Advanced R.
→Hadley Wickham(唯一神)が書いてるページみたいだが使いやすさは不明

アルマジロその1. 行列操作編 - サボタージュ禁止のおさぼり日記
アルマジロその2. 演算編 - サボタージュ禁止のおさぼり日記
アルマジロその3. 線形代数編 - サボタージュ禁止のおさぼり日記
RcppArmadilloでnumericMatrix型を扱う | 竹林の事前分布
→行列計算するには、もうひとつパッケージ (RcppArmadillo)が必要らしい。その情報(めんどくせぇ....)。

ダンゴムシでもわかる特異値分解(SVD)

脊椎動物なめんな。節足動物なめんな。

Introduction

この世に生を受けて30年以上たつけど、もう5万回くらいSVDのやりかたを覚えて忘れてまた覚え直すを繰り返している。
肌身に染み込んで行かないのが文系ブレインの限界ですよね...

ゆえに、SVDの概要・用途・実装方法をここに記す。

[参考文献]
①:千葉大羽石研究室のサイト(授業「医用画像工学」のスライド)
②:小野滋さんのWeb上の公開資料(Greenacre1984の和訳・解説)
③:ボレガラ・岡崎・前原, 2016, 「ウェブデータの機械学習」,pp.158-162.

ウェブデータの機械学習 (機械学習プロフェッショナルシリーズ)

ウェブデータの機械学習 (機械学習プロフェッショナルシリーズ)

SVDの概要

基本の定義

任意のm × nの実数行列A (rank = k) があるときに、次元m×mの直交行列Vと、次元n× nの直交行列U
そして非対角成分がゼロで対角成分 \lambda_iが、
  \ \lambda_i > 0  \ (i <= k ), \  \lambda_i = 0 (i > k )

となる行列Sが存在し(この非ゼロの対角成分を 特異値とよぶ)

 A = V S U^T

と変形できる。

便利な別表現

 V = \begin{bmatrix} v_1 & \ldots & v_m   \end{bmatrix}
 U = \begin{bmatrix} u_1 & \ldots & u_n   \end{bmatrix}

とすれば、以下のようにも、表現できる。
 A = V S U^T = \Sigma_{i=1}^ k \lambda_i v_i u_i^T

基本性質

前提知識:フロベニウスノルムによる距離の定義

 || \boldsymbol{A}||_F = \sqrt{\Sigma_{i=1}^m \Sigma_{j=1}^n |a_{ij}|^2  } = \sqrt{ trace(A^T A) }
をフロベニウスノルムという。

ちなみに2つめの等号においては、次元数の等しい行列 A, Bの成分の積の総和は、 A B^Tのトレースに等しいという性質(参考URL)を利用している。
 trace(AB) = trace(BA) なので trace(A^T A ) = trace(A A^T)


このフロベニウスノルムを使うと、二つの行列A, Bの距離を || \boldsymbol{A - B}||_F として定義できる。

性質①:最小二乗近似を得る方法としてのSVD

行列AのSVDが得られているとき、降順に並んだj \ ( j <= k ) 個の特異値と、それに対応する左右の特異ベクトルからなる
  A_{j^*}  = \Sigma_{i = 1}^j \lambda_j u_i  v_i  は、
すべてのランクjの行列X_{j^*}のなかで、距離|| \boldsymbol{A - X_{j^*}}||_F を最小化するような行列となる。


すなわち、この意味で  A_{j^*} は、Aの「ランクjの最小二乗近似」であるといえる。

性質②:行列Aと転置行列A^Tとの積の成分分解

SVDにより、 A = V S U^Tが得られているとき、以下が自明に導かれる。


 A A^T = V S U^T (U^T)^T S^T V^T = V S U^T U S^T V^T = V S S^T V^T
 A^T A  =  (U^T)^T S^T  V^T V S U^T  = U  S^T  V^T V S U^T = U S^T S U^T

ここで、 S S^T = S_{row}^2 ; \ S^T S = S_{column}^2 と表現することとすると
 A A^T =  V S_{row}^2 V^T \iff   AA^TV = V S_{row}^2 \iff AA^Tv_i = \lambda_i^2 v_i
  A^T A  =  U S_{column}^2 U^T \iff   A^TAU = U S_{column}^2  \iff A^TAu_i = \lambda_i^2 u_i


となり、 A A^T  A^T Aが分析対象として意味のある行列のときは、
それぞれを左右の特異ベクトルv_i ,\  u_iと特異値\lambda_iの二乗を用いてランクkで表すことができる。

性質②の具体的な例

 A A^T  A^T Aが分析対象として意味のある行列のとき」とかいきなり言われてもピンとこないと思うので、一つ例をあげよう。

たとえばm人分のケースについてnつの変数の観測値を保存した行列X =\begin{bmatrix} x^1 & \ldots & x^n   \end{bmatrix} があり、
そこから各列について、変数の平均値\bar{x^j}を差し引いて中心化した行列X^*を得る。


すると、ランクn×nの行列(X^*)^TX^* は、変数の分散共分散行列(にスカラmをかけたもの)になるし、
いっぽうで、ランクm×mの行列(X^*)^TX^* は個人間の距離(にスカラnをかけたもの)を表した行列(対角成分は重心からの距離)になる。

したがって、X^*についてSVDを適用しておけば、
変数のばらつき(分散・共分散)や、個人間の距離についての全ての情報を、k個のベクトルの線形和として表現できる。

(厳密にはもっと説明が必要だけど)これが、いわゆる主成分分析の大枠である。
カテゴリカルな変数に対して用いられる「対応分析」や「多重対応分析」と言われる手法も、 A = V S U^TAをどう選ぶかだけの違いに帰着して説明することができる。
(詳しくは別稿で)
その意味で、SVDは多くの分析手法を統合的に理解するうえで非常に強力な方法・枠組みだといえよう。

性質③:2つの特異ベクトル間の変換

もう一度、SVDの別表現を記載する。
 A = \Sigma_{i=1}^ k \lambda_i v_i u_i^T

この式の両辺に、右特異ベクトル u_j \ ( 1 <= j <= k )をかけると、特異ベクトルの正規直交性から、以下のようになる。

 A u_j  = \Sigma_{i=1}^ k \lambda_i v_i u_i^T u_j   = \lambda_j v_j  u_j^T u_j = \lambda_j  v_j
ゆえに、

 v_j = \frac{1}{\lambda_j}  A u_k

となり、左特異ベクトルを右特異ベクトルとSVDの適用対象行列A、そして特異値によって表現することができる。

また、上の別表現を転置したのちに右から v_j \ ( 1 <= j <= k )をかけることで、同様に

 u_j = \frac{1}{\lambda_j}  A^T v_k

を得られる。

固有値分解との関係性

上述の性質②より、
 A A^T =  V S S^T V^T = V  S_{row}^2  V^T
 A^T A = U S^T S U^T =  U  S_{column}^2 U^T

が成立する。よく見ればこれは A A^Tおよび A^T A固有値分解である。
よって特異値\lambda_iというのは、 A A^T A^T A固有値分解したときに得られる固有値平方根である。

実装方法

以下の手順を実装すればいい。Simple!

  1.  A A^Tあるいは A^T A(通常は計算量が少ない方、すなわちm < nだったら A A^T、m > n だったら A^T A)を固有値分解し、その結果から特異値の対角行列Sと右あるいは左特異行列SもしくはUを得る。
  2. 上記の性質③の変換式を利用して、SUの得られていない方を得る。

ちなみに A A^Tあるいは A^T Aは対称行列なので、いくつかの効率的な固有値固有値分解計算の効率的な方法(ヤコビ法、3重対角行列を用いた逆反復法、ユーザーである我々は詳しく知る必要はない..)が使えるよ。

Rで確認

Rにはsvd()というSVDのための関数が備え付けであるが、一応上の方法で計算されていることを確認するために検算してみる

# 適用データ生成
# 元データは、Clausen,1998=2015「対応分析入門」, p.189より
tbl <- matrix( c( 395 , 2456 , 1758 , 147 , 153 , 916 , 694 , 327 , 1347)  , byrow=3  , ncol = 3)
colnames(tbl) <- c("強盗" , "詐欺", "破壊")
rownames(tbl) <- c( "オスロ" , "中部地域", "北部地域")

#分布に変換
tbl_p <-  tbl / sum(tbl)
mgn_c <- apply( tbl_p , 2, sum)#列周辺分布
mgn_r <- apply( tbl_p , 1, sum) #行周辺分布

D_clm <- diag(1/sqrt(mgn_c)) #列周辺分布の-1/2乗を対角成分とした行列
D_row <- diag(1/sqrt(mgn_r)) #行周辺分布の-1/2乗を対角成分とした行列

# SVDを適用する対象の行列をつくる。
mat_A <- D_clm %*% (tbl_p - mgn_r %o% mgn_c) %*% D_row


## SVDを適用する
svd_res <- svd( mat_A) 

#--結果--#
# ちなみに上記の解説とはuとvが逆になってるので、注意が必要(uが左, vが右)
#$d  (特異値)
#[1] 7.927067e-01 8.484083e-02 1.339025e-17
#
#$u(左特異ベクトル)
#          [,1]        [,2]      [,3]
#[1,] -0.9210524  0.02831857 0.3884076
#[2,]  0.2288391 -0.76764442 0.5986273
#[3,]  0.3151112  0.64025003 0.7005604
#$v (右特異ベクトル)
#          [,1]       [,2]      [,3]
#[1,]  0.1744326  0.6379811 0.7500356
#[2,] -0.8992856 -0.2070410 0.3852524
#[3,]  0.4010719 -0.7416968 0.5376125


## 実際に固有値を利用する方法でやってみるver
#今回は行列Aが正方行列なので計算量的にはどっちでもいいが、
#とりあえず、左特異ベクトルを求めてから変換公式で右特異ベクトルを求める形にする。

mat_B <- mat_A %*% t(mat_A) #固有値分解の対象行列を生成
evd_res <- eigen(mat_B, TRUE) #固有値分解する

sval <- sqrt(evd_res$values ) #平方根をとることで特異値をえる
u_vec <- evd_res$vectors #左特異ベクトルを得る

v_vec <-    t(mat_A) %*% u_vec %*% diag(  1/ sval)  #変換公式 v =  1/λ * A^t * u を適用
#補足: 1/λjを対角成分とする対角行列を右からかけることによってj列を1/λj倍している

### 固有値分解をアプローチによる結果 ###
#> sval
#[1] 7.927067e-01 8.484083e-02 8.575436e-09
#> u_vec
#           [,1]        [,2]       [,3]
#[1,]  0.9210524  0.02831857 -0.3884076
#[2,] -0.2288391 -0.76764442 -0.5986273
#[3,] -0.3151112  0.64025003 -0.7005604
#> v_vec
#           [,1]       [,2]          [,3]
#[1,] -0.1744326  0.6379811 -1.941982e-08
#[2,]  0.8992856 -0.2070410 -6.473275e-09
#[3,] -0.4010719 -0.7416968  2.427478e-08
 
#--この場合、二軸で分散を説明しきっているので、3個目/3列目の特異値/特異ベクトルは誤差というか無視して良い
#--2つ目までのの特異値と特異ベクトルは先ほどのsvd()関数の戻り値と完全に一致しており、求める結果が得られた
#--なおひとつめの特異ベクトルは符号が違うが、左右一緒に同一固有値に対応する特異ベクトルの符号を変えさえすれば-1をかけてもよい(正規直交基底の性質と変換公式を考えれば明らか)

Conclusion

さいきんは、ずっと、これをきいている...
www.youtube.com


SVDがとても便利だってわかって、さらにその仕組みがわかったので、
次はSVDの枠組みでMCA(多重対応分析)とCA(対応分析)を説明するYO!
SVDがわかると両手法の仕組みや違い・共通点を超エレガントに説明できるYO!

Enjoy!

Catch up!(藤井猛, 2017, 「四間飛車上達法」)

四間飛車上達法 (最強将棋レクチャーブックス)

四間飛車上達法 (最強将棋レクチャーブックス)

非常にいい本だった(さすが藤井"てんてー"御大)
急戦(棒銀)への対応の定跡について、ここまでいろんな思想を交えながら詳説してくれる書はあまりなかったのではないだろうか。

しかし何より白眉は、藤井九段の生き方が凝縮されているような次の一言にある。
このために1400円(税別)を払ってもいいくらいだ。

至言

p.55より抜粋。

私はスタートが遅かったんですよ。
研修会に入ったのが14歳のとき、そして高校一年になるときに奨励会に入ったんです。
早熟の天才がごろごろといるこの世界では、記録的に遅い部類に入ります。


しかも私は、将棋教室などには行かず、一人で本を読んで勉強していました。
考えながら読むというより、最初はただひたすら読む、ただ読む、という感じです。
一冊の本をボロボロになるまで読む。将棋の月刊誌をひたすら読む。
そのうち棋譜が全部頭の中に入ります。


すると知らないうちに、本に書いてない変化も含めて考えることができるようになる。
月刊誌であればひと月後に次の号が出て、あとは同じことの繰り返しです。
それが私の勉強法でした。


さすがにアマチュアの三段くらいになってからは実戦を指す機会も増えましたが、
それでも1日に数局を上限としました。その数局を集中して指す。
そして局後の検討を真剣にやって、反省すべき点をきちんと洗い出す。


私は、指す戦法も指す局数も、厳選して強くなったタイプなんです。

非常に示唆的である。
分野を問わない、ビハインドを負った状態からの弱者の逆転法のエッセンスが詰め込まれたエピソードだ。

Conclusion

あのウサギとカメの例のレースは教訓としてアレなケース
勝者敗者いずれにしたってダメ ウサギはバカで油断しちゃっただけ
ある意味カメはさらにそれ以下 敵のミス待ちってそれでいいのか?
天賦の才能を弱者代表が打ち負かし格差解消
しようって場面でカメは無策すぎ 勝算もねぇのに余りにウカツすぎ
そういうとこマジしょせん動物の限界
....
武器はたゆまぬK.U.F.U.
常に練習 常に研究
知恵を結集し 君をレスキュー



弱者が勝ち上がるとこに見出す人間の叡智!
藤井システム最強!Enjoy!

「世界を動かすプロジェクトマネジメントの教科書」(佐藤知一, 2015)

モチうめぇ。ピザうめぇ。

Introduction

プロジェクト・マネジメントという概念やその実行技術というものは、 業界や立場、そしてチームで仕事をするか/個人で仕事をするかという違いを超えて必要な知識だと思う。
(学校で教えてもいいくらいだと思う。道徳や総合学習よりよっぽど健全な社会の形成に役立つだろう)

どうやって仕事を適度な作業単位に分解しどうやってスケジュールに落とし込むのか、
そしてどう進捗を管理していくか、というのは(やや大仰な言い方だけど)人生のコア・スキルであると思うのだが、 意外と誰も教えてくれないのである。

ただ、PMBOKやP2Mなどの規格となるような知識体系はややとっつきにくく、 実際の使用シーンに応用しづらいきらいがある。

その点、日揮にお勤めの佐藤氏は、ブログ(タイム・コンサルタントの日誌から)や個人サイト(マネジメントのテクノロジーを考える)において、実際にプロジェクトをマネジメントしていくうえでの、ノウハウや考え方、ツールの作り方・使い方に関して、業務経験で培った肌感覚に沿ったわかりやすい語り口で解説してくれている。正直めっちゃありがたい。

その佐藤氏の著書である本書では、海外プロジェクトに抜擢された若手エンジニアが、
PMの達人である大学の先輩に、教えを乞うというストーリー形式でわかりやすくproject mangementの要点が解説されている。

(類似本にありがちな)「Xつのポイント」的な感じで列挙してくのではなく、実際の作業手順まで示してくれている点が白眉だと思う。
Amazonのレビューでも指摘されているが、本のタイトルが若干軽い感じ(意識高い系な感じ)なので誤解をうけてしまいそうなるのが心配になるほど、実用的な本だ。

備忘用メモ

備忘用に重要だと思う箇所だけ抜き書きしてく。

プロジェクト = アクティビティの連関という世界観(p.52)

じつは、現代プロジェクトマネジメントの理論や技法は、1950年代に米国において、プロジェクトという大きな仕事の塊を「システム」と捉えたことからはじまったのです。

プロジェクトを「アクティビティ」と呼ぶ作業要素が違いに連関したシステムだと考えました
そこから、重要な技法が次々に生まれたのです。

逆にいえば、ひとつひとつの要素のアクティビティがしっかり定義されているからこそ、しっかりとしたシステム=プロジェクトが成立する。

アクティビティの形式(pp.70-71)

  • アクティビティとは、プロジェクトを構成する「部品」である
  • アクティビティの具体的構造とは、インプット・アウトプット(成果物/完了状態)・リソースと指示・報告である
  • なんども似た形のもの繰り返されるようなのPJTについては特にアクティビティ・リスト(=WBS辞書)を作る必要がある。これは仕事のBOM(部品表)のようなものである。

だれでも正しいWBSを作れる方法(pp.75-)

本全体のキモとなる部分かもしれない。

WBSの作り方は、成果物の分解構造からアプローチする方法(P-WBS)と、作業フローに沿った仕事の機能的な分解から作る方法(F-WBS)が存在する。
どちらも有力な方法*1だが、この本では両者の考え方を組みあわせることでアクティビティを洗い出す方法を推奨している。

紹介されているWBSの作成手順は以下の通り。

  1. プロジェクトの「成果物の構造図」をつくる(→P-WBS的発想)
  2. プロジェクトが最終成果物にいたるまでの仕事の「プロセスの構造図」をつくる(→F-WBS的発想)
  3. 両者のマトリクスを作成する
  4. マトリクスのマス目(=最小単位のアクティビティ)をグループ化して、適正なワークパッケージを形成する
  5. マネジメントの分担を意識して、ワークパッケージに整理番号をふり、WBSに構造化する。
  6. 各ワークパッケージのインプット・アウトプット・必要リソースを、アクティビティリストに記述する(=WBS辞書の完成)

実際の作業イメージも本のなかでは示されていて、とてもわかりやすかった。
会社によってはF-WBSのコード体系が共通で整備されていて、そのコードが社内言語化されているし実績もコード別に管理されている、というエピソード(おそらく佐藤氏の勤務先の日揮のことだろう..)も興味深い。

「一回限りの仕事=Project」をマネジメントするための知識体系ではあるけれど、
それでも共通化できる部分のマスタを整備して、練度を高めて高速化するのがこういった技法のもうひとつの使い方ではないか。

スケジューリングの方法(pp.115-121)

クリティカル・パス法の説明などの部分である。

  1. アクティビティリスト上で、各アクティビティに対して「先行アクティビティ」が何であるか明確にしておく。
  2. アクティビティリスト上で、各アクティビティの所要工数が定義されている
  3. プレシーデンスダイアグラム(Precedence Diagram)を書いて、順序関係を図示する
  4. 一番はじめのアクティビティから後続のアクティビティに向かって、最早着手日と最早完了日を順番に書き込んでいく(ここでクリティカル・パス*2がわかる)
  5. 最後のアクティビティから前のアクティビティにさかのぼっていくように、最遅完了日と最遅着手日を画定していく

ちなみに4は「フォワードスケジューリング」、5は「バックワードスケジューリング」と言う。
いきなりガントチャートとか引く前に、順序関係を図示したほうがいいよね、っていう話。

クリティカル・パスの短縮化の定石(pp.122-125)

どうしても納期を短縮したいときには、

  1. ゆとりの集中化(個人がもっているバッファを集中管理した上で削減する)
  2. 並列作業化

の2つの方法を使う。前者はチーム・プレーのときのみ使えるワザで、後者がより個人単位の仕事にも用いやすい。

クリティカル・パス上のあるアクティビティの完了が次のアクティビティの開始条件になっているとき、
実は先行アクティビティを100%完了させることが、次のアクティビティに必要でない(例えば70%段階まで仕上げられれば次に移れる)場合がある。

こういった場合に、先行アクティビティを構成するいくつかの作業のうち、後続アクティビティに必要な部分のみ完了した時点に最早着手日をずらす、という方法をとる、というのが「並列作業化」が意味するところである。
(実際にこういった変更を施す場合は、後続アクティビティに必要部分とそうでない部分に分割して、別々のアクティビティとして定義し直すほうがスマートだろう。たぶん。)
このような操作を行った場合に、クリティカル・パスが別の経路にうつることがあるのでそれも考慮すべしである、とのこと。


この「並行作業化」は大人数が関わる共同作業としてのプロジェクトだけでなく、個人で行なっている様々な仕事を高速化するための方法論としても有効だと感じた。
当然視されているタスクA→タスクBというフローを、タスクAをa1, a2, a3と分割することによってa1→a2→B(並行してa3)といった感じに短縮することができないか常に検討する姿勢が重要だろう。

工程表への追記によるスケジュール管理

・なんかかっこいいところ

工程表は、航海士にとっての海図に似ています。
工程表もつくらずにプロジェクトを始めるのは、海図を持たずに航海に出るようなものです。

もちろん、多くの会社は最初に工程表をつくってはいるでしょう。
ただ、それを最後までアップデートせずに使い続けるところも少なくないようです。
ちょうど、航海に出たけれど、海図に自船の現在位置や進路や速度をいっさい記入しない航海士のようなものですね。
(p.163)

ガントチャート上で進捗を示すときは、「イナズマ線表記」か「二重線表記」のいずれかを使う。
(→後者しかなじみがなかったので、イナズマ線表記のほうが直感的でいいなと思った)

・よりわかりやすくかつ可視的・参加的な方法として、F-WBS × P-WBSマトリックス上にそのままポストイットを貼っていって進捗を管理する方法もある(→これ結構いいな)

Conclusion

身も蓋もないけど、ちゃんと締め切りを守れるようにするためには、まずしっかりWBSを作ろう。
んで、いきなり天守閣をつくるのではなく石垣たるアクティビティをしっかり定義しようっていうのが著者の主張で、それは正鵠を射ている。

WBSを作るような思考習慣っていうのは、(ロジックツリーとかの広まりとともに)それなりにもう日本にも根付いてきたといえるが、
そもそもWBSのマスタとしてのアクティビティ・リストを整備するのが管理のためにも作業全体の高速化のためにも大事だぜっていうのが、佐藤氏の主張の特徴的かつ示唆的なところだといえる。

brevis.exblog.jp
brevis.exblog.jp

佐藤氏の最近のブログの記事(↑)でも指摘されているように、いきなり工程表を引いたり、
WBSを書き下すのではなく、まず「基本部品」たるアクティビティの定義がなされて、その組み合わせとしてプロジェクトを表現する、というのが本筋である

Enjoy!

*1:ただし佐藤氏はこの記事では、「仕事のプロセス自体は大筋に変わりがないので、WBSのマスタが作りやすい」という理由でF-WBSを推奨している。この観点には多いに賛同できる

*2:よくクリティカル・パスに「隘路」と訳語がつけられているがこれは正しいのだろうか...なんか違和感が