以前、社内の勉強会用の資料として作成した「確率統計-機械学習その前に」という資料を今回大幅に改定して公開しました。
改定の一番のポイントは、統計分析の総覧的なガイドとして使えるようにしたことです。正直な話、内容的に私自身も十分に理解出来ていない部分も多いのですが、いろいろ調べた結果、なんとなく統計分析の手法マップ的なものが頭の中に出来上がってきたので、それをアウトプットとしてまとめてみました。
以前、社内の勉強会用の資料として作成した「確率統計-機械学習その前に」という資料を今回大幅に改定して公開しました。
改定の一番のポイントは、統計分析の総覧的なガイドとして使えるようにしたことです。正直な話、内容的に私自身も十分に理解出来ていない部分も多いのですが、いろいろ調べた結果、なんとなく統計分析の手法マップ的なものが頭の中に出来上がってきたので、それをアウトプットとしてまとめてみました。
若い頃は、と書くと年寄りじみてしまうけど、もうすぐ初老だ。悲しいかな、人間特に何もしていないのに歳だけはとっていく。押井守は「若さに価値などない」という。今に至り、それは概ね真理だとは思うけれど、そうとも言い切れない部分もある。ひとつは(本当にはないのかもしれない)可能性を夢見る能力、もうひとつは残り時間が長い分長期投資ができることだ。
歳をとったからこそわかることというのは多い。若い頃は、自分の面白いと思うものは誰もが面白いと思うものだと思っていた。大学くらいでその違いに気づき始めるが、その違いは話せば埋めることができるものだと思い込んでいた。そしてそのうち、世の中には想像を遥かに超えるいろんな考えの人がいることに気付いていく。
同じ職場にいて、同じように仕事をしていても、それぞれの生まれや性格、人生や立場があり、価値観は意外なほど異なっている。話せばわかりあえる、などというのはたまたま議論の参加者に共通点があったからかもしれないし、実際には噛み合っているようにみえただけで、各人の脳内に浮かぶものはまったく別なのかもしれない。
閑話休題。Netflix でアニメ「未来日記」を見たところ、大変おもしろかった。以前からところどころで言及されるので気にはなっていた。
少し前の作品だからか、あまり言及を見ないけれど「未来日記」はいろいろと新しいアイデアが詰まっている。「未来日記」というガジェット自体、よくある特殊能力系のひとつとも言えるが、その能力の理由付けに合理性があり、携帯だけでなくボイスレコーダーや絵日記、巻物といったメディアの多様性もある。すごく良く出来たアイデアだ。
一番の発明は、「気の狂った殺人鬼かつストーカーだが、一途に愛してくれる」という異常なヒロイン像だ。好きが転じて殺人、というパターンはあったが、こんなキャラクターが成立するとは。
面白いと思うところは人それぞれだろうけど、見ていると自分が「新しい発想が好き」であることに気付かされた。具体的に書くとネタバレになるものが多いから書かないけれど、SFっぽいファンタジーが好きなのもそれに起因している気がする。
後半に行くに連れて斬新さは減ってくるけれども、最初から全力で話が展開していくので、まったく飽きることなく最終話までいっきに見てしまった。
良い悪いということではないけれど、普通の作品だったら、第一話はもっと日常風景を描写したり、主人公が妄想に浸る様子を見せて、その後の展開で驚かせるものだと思う。しかし、そういうまどろっこしい演出は一切ない。そういえば、作中では連続殺人、学校爆破でクラスメート殺戮、タワー破壊と、そうとう陰惨な出来事が起こっているにも関わらず、押しなべてあっさりした演出となっている。悲劇に躊躇も感情もない。
総じて、この作者の考えが私の思考の延長線上にまったくない。
どのキャラクターも狂人の類でまったく感情移入できないし、こんな陰惨な事件をサスペンス・アクションとして書くなどということはできそうもない。私にはストーリーテラーとしての才能はないが、もし書けたとしても常識の範囲内の人間像で造形し、陰惨な事件は陰惨な演出にしてしまうだろう。
「お前は俺か」と思うような作品も楽しいけれど、こういう自分の中にはまったくない思考を垣間見れる作品は本当に貴重に思える。
「話せばわかる」と言って殺された犬養毅の没年は 76 歳だそうだ。歳をとったからと言って必ず気付くものでもないらしい。たしかに気付かない方が人生は幸せそうではあるが。
仕事では単に使える文字のチェックだけが行えればよかったので、結果さほど知識は必要なかったのだけど、個人的に興味がありプライベートで調べていたら結構詳しくなってしまったので備忘録も兼ねて Java 用の JEF漢字文字コードサポートライブラリを作って公開してみた。*1
世代的なこともあるけれど、ホスト系はまったく触れたことがなくレガシーな文字コードには毎度苦労させられる。もちろん、構築するシステム自体はいわゆるオープン系なので、 Unicode、Windows-31J、EUC-JP あたりが中心になるのだけど、移行元のシステムはレガシーなのでホストの知識がないと解決出来ない問題が発生することがある。
今回 JEF 漢字コードを調べることになり、まず驚いたのが、そもそも文字コード表が公開されていない、ということ。あったとしても、せいぜい 1990年以前に出版された辞書のように分厚い書籍だけだったり。
思うに、メインフレームを抱える各メーカーとしてはデータ移行自体も重要なビジネスとなっているため、なかなか公開しづらいところがあるのだろう。JEF4J では「JHT(ホスト連携ツール)SIMPLE版」からリバースでマッピングを作り、これをベースに拡張非漢字や後述の字体変更を反映したものを使用している。このツールがなければJEF4J は実現できなかった。*2
次に驚いたのが、Unicode ですらマッピング出来ない文字が多数存在するということ。*3古い文字コード体系だからと言って符号化文字集合自体は決していい加減なものではなく、むしろ公共機関でも安心して使えるぐらい幅広い漢字がサポートされている。
さらに驚いたのが(これはメインフレームのせいではないけれど) JISコードの標準字体の変更の酷さ。なんと全改定で字体が変更された文字すらある。
PC世代の人が馴染みある字体は 83JIS(新JIS)だが、メインフレームが開発されていた時代はそれよりも前なので、富士通の JEF、NECのJIPS、日立のKEIS いずれも 78JIS(旧JIS)をベースに開発されている。78JISと83JISでは一部のマッピングや字体が変更されているため、同じ JIS コードとはいっても単純に変換できない部分がある。*4
この問題に拍車をかけるのが JIS 2004 での字体変更だ。JIS 2004 では、83JISでの新字体への変更を旧字体に戻した部分がある。現在のフォントの多くは JIS 2004 標準字形をベースとしてはいるが、古いフォントの多くは 83JIS をベースにしている。過渡期の現在においては同じ文字をどちらにマッピングすべきか確定することができない(JEF4Jでは JIS 2004 字体を基準にしている)。
JIS 2004 での字体変更の経緯を知ると納得できないこともない(真の犯人は83JIS)けれども、互換性を破棄するこの決定はシステム屋の常識ではあり得ない選択だとは思う。とはいえ、もはや決まってしまった以上、JIS 2004 を基準にし、これ以上変えないことが重要だろう。*5
メインフレームは、インターネット以前の存在ということもあり、メーカーの協力なしにオープンな場所から情報を得るのが難しい状況にある。とはいえ、まだまだ現役で稼働しているシステムは多数あり、今後もデータ移行などで関わらざるを得ない人もいるのではと思う。そういう人たちの参考になれば幸いだ。
*1:単なる知識とは言え、仕事で仕入れた知識を Web で公開していると思われるとあらぬ誤解を受けかねないので、調査・開発ともに完全にプライベートで実施していることは強調しておきたい。実情を言うと、きっと仕事で使うだろうと思って先回りして調べていたら、結果そこまでのものは必要なかったというオチだったりする。結局、実機すら触ってない。
*2:JIPSやKEISもサポートしたかったがJEF漢字以上に情報がなく断念した。
*3:厳密に言えば、最近ようやく完全に標準化できた異体字領域まで使えば漢字のマッピングまではできるとは思う。
*4:サイトによっては JEF の基本漢字領域は EUC-JP と同じと書かれているが、実際には元規格の差異による違いがある。
*5:でもまだ幽霊文字が残っている……
歴史学者とホロコースト否定論者の裁判を描いた「否定と肯定」を見てきた(なお、映画の内容に触れるためネタバレ注意)。
映画としては説明不足や淡白な演出もあり名作と言えるような出来にはなっていないのが残念だけれど、内容としては非常に面白い作品だった。見る前は、否定論者の陰謀論やデマを歴史学者が苦労しながら反証していく、という話なのだろうと思っていたらこれがまったく違う。
どうも、ホロコースト自体は多くの証拠があるものの、ドイツ軍が国民に隠して秘密裏に実施した上、敗戦時に証拠隠滅を図ったことで、ヒトラーの命令書など直接的な証拠があまり残っていないようなのだ。もちろん、だからと言ってホロコーストが捏造などということはない。生き残った人もいれば、虐殺に協力させられた人々の証言や文書、施設の残骸も残っており、多面的に見れば、歴史的な事実であることは疑いようがない。
だから、裁判の争点は「ホロコーストを否定する言説も成立しえるか」という点に絞られてくる。ホロコースト否定論者のアービングは「ヒトラーの命令書が存在しない」など否定する余地があると主張する一方、歴史学者デボラの弁護チームはアービングはホロコーストの存在をわかっていて主義主張から意図的に証拠を捻じ曲げていると主張することで応戦する。
この映画の面白いところは、これで終わらないところにある。最後半になって裁判官が「否定論者が純粋に自説を信じているのならそれは嘘とはいえないのではないか」と言い出すのだ。正直、演出が下手で単にものわかりの悪い人のように見えてしまうのが残念なのだけれど、裁判官の心中を察するに「アービングの主張がデマなのはわかっている、しかしアービングの立場に立って公正に考えるなら、必ずしも悪とは言えないのではなかろうか」と考えた上で、弁護チームにそれに対する反論を用意しているかを確認したと捉えるべきだろう。
たしかに言われてみれば、それもひとつの立場だ。「言論の自由原理主義」に立てばどのようなデマも暴言も「そう思った」という事実を発露したに過ぎない。しかしながら、もしそれを認めてしまえば、真実とデマを両論併記する口実を与え、結果的に「ホロコーストはあったかもしれないしなかったかもしれない」という空気を作り出してしまう。そして、ネオナチを増長させ別の大きな出来事に繋がってしまうかもしれない。公正であることは必ずしも正義とは言えない。
ここで「OJシンプソン事件」の裁判を思い出した。この裁判ではOJシンプソンが妻を殺害したのはあきらかであったものの、OJシンプソンを有罪にすると黒人コミニティによる暴動が発生する可能性が高い状況にもあった(3年前に無抵抗の黒人を白人警官が暴行した事件があり、無罪になったことで暴動が起こった)。刑事裁判では、優秀な弁護チームのおかげでOJシンプソンは無罪を勝ち取ったものの、民事裁判では決定的な証拠が発見され有罪となっている。
弁護チームは脇に置くとして、損得だけで考えよう。公正に考えるなら、OJシンプソンは有罪にするのが当然だ。しかし、それによって暴動が発生し街にひどい被害が発生しまったく関係ない人々が苦しむことを考えれば無罪にすべきかもしれない。簡単にどちらが正しいとは結論が出せない。
さて、「PEZY Computingの社長逮捕」である。
もちろん真相は藪の中だということは前提だけれど、「特捜が調べているのだからよほどひどいことをしているのだろう」と考える人が多数おり、「犯罪は犯罪なのだから、天才だから助けろなんて問題外」などの主張をよく見かけるで、そういう捉え方は大変まずい、ということを記しておきたい。
まず、特捜が特殊な役割であることを認識すべきであると思う。
「違法は違法」なのであれば、普通に警察が捕まえればよいだけで、特捜が手がける必要はない。特捜が手がけるのは、政治的に壁があったり、専門的であったり、特別なものだけだ。
しかしながら、このことが「特別なもの」⇒「特別な成果を上げる」⇒「社会的に目立つ人物、団体をターゲットにする」というロジックに繋がり、本末転倒な事件化に繋がることがある。
一番有名なのは「障碍者郵便制度悪用事件」の村木厚子さんの冤罪だが、罪に対して罰が重すぎる堀江貴文氏の「ライブドア事件」、結局たいした罪を見つけられず無罪になった小沢一郎氏の「陸山会事件」、政権にもまったく繋がらなかった「森友学園事件」、罪のない安部英氏を主犯であるかのようにでっち上げた「薬害エイズ事件」、なぜ検察が扱う必要があるのかわからない「野村沙知代脱税事件」など、問題のある事件化も非常に多い。
しかも、特捜としても事件化を正当化する必要があるため罪を大げさに表現しマスコミにリークしたり、プレッシャーをかけるため親族や知人も取り調べ対象とすることがあり、最終的に問題がないとわかった場合でも名誉が回復されないのが実情のようだ。相手が国の捜査機関だけに民事裁判で賠償請求するのも難しく、関係者はただ人生を破壊されただけで終わってしまう。
「犯罪は犯罪」と言う人は Winny 事件や微罪逮捕を調べるべきだと思う。日本の捜査機関には大きな裁量権が与えられている。正しく運用されれば犯罪を早急に解決することに繋がるけれども、不適切に利用されれば 21 世紀とは思えない人権侵害になってしまう。
普段であれば見過ごされているような細かい不法行為でも、ひとたび捜査機関のターゲットになればすべてが黒になってしまうというのはとても怖いことだ。例えば、Twitter で見かけた話では NEDOの資金で買ったコピー機で講義資料を印刷すると規定外支出に問われるそうだ。犯罪は犯罪というなら詐欺罪で起訴されるべきということになる。
「公正」であることは、必ずしも「正義」ではない。文脈を無視した「公正」は、悪にもなりかねない。
現時点では、なぜ逮捕されたのかよくわからないところはあるけれども、噂されているように政治がらみのタレコミに繋がりそうだから「スパコンに使うメモリ開発資金をスパコンに流用して詐欺」ということにして事件化したのだとしたら、本当に何をやっているんだ、という話だ。
過去にライブドアに対し劇的に捜査に入り新興市場を壊滅させた実績があるだけに、技術とか経済に対する事の軽重がわかっていないのかもしれない。目立つ成果が挙げられるなら、事件の軽重は問わないという姿勢なのであれば、今後も同様のことが続くことになる。
結果はどうあれ、今回の事件で、多くのベンチャーが国から助成を受けることに消極的になるだろう。ただでさえ、日本発のイノベーションが目立たなくなっている状況なのに、わざわざ自滅の道を選ばなくともいいものを。
追記:そういえば、この「否定と肯定」、ぜひ慰安婦問題をネタに日本で翻案映画作って欲しい。慰安婦問題については各歴史学会から『「慰安婦」問題に関する日本の歴史学会・歴史教育者団体の声明 - 東京歴史科学研究会』という声明が出されており、うってつけだと思う。
確率統計なんて趣味の範疇ならともかく仕事じゃ絶対に使わないよなぁ、とは思っていたのだけど、ここ最近の機械学習の隆盛で必ずしもそうとも言い切れない状況にある。
機械学習と言えばディープラーニングだけれど、画像、映像系ならともかく、テキストデータ中心の業務系の問題への適用を考えるとロジスティック回帰、SVM、ランダムフォレスト、自然言語処理くらいは押さえておかないとダメかな、という感じもあり、そうすると確率統計の基礎も押さえていかざるをえない。
うーん、システム開発の現場にそのレベルの知識、経験って現実的に適用可能なのだろうか。業務システム開発の世界は、基本的に努力と根性の世界であってアカデミックな知識からは最も遠い場所にある。
まぁ、とはいえ、日本のコの業界も少しづつ変わっていけばいいな、と思っているのでその一助になればと。社内勉強会の資料にもそのうち流用する予定。
正直なところ、私のこの分野に関する知識レベルは高くないし、確率統計界隈はマサカリ飛び交うマッドマックス的世界なので、公開するか自体を迷いはしたのだけど、おかしなところを指摘してもらえればきっと理解も深まるだろうと考えることにした。何かあればコメントいただければ幸いである。
過去、何度かIPAの資料に基づき工数見積りを計算するためのエントリを書いた。今回のエントリは、その暫定解決編という位置づけとなる。
hidekatsu-izuno.hatenablog.com
hidekatsu-izuno.hatenablog.com
hidekatsu-izuno.hatenablog.com
前回までは、ロバスト回帰を使って分析していたのだが、実際に使ってみると単一基準ではリスクがどれくらいあるのかわかりにくく、やや使いづらいところがあった。
先日、いつものようにネットサーフィンをしていたところ「分位点回帰」という手法があるのを見つけた。分位点と言えば、1/4(第一四分位数)、1/2(=中央値)、3/4(第三四分位数)など、サンプルを相対的な位置関係を元に判断する手法であり、ロバスト回帰同様、偏りのあるデータに対しても頑健に動作することが期待できる。
さらに、ロバスト回帰に比べ、実際のプロジェクトがどれくらい収まっているのか範囲が明確になるため、リスクの範囲も想像しやすいというメリットがある。
なお、今回は R ではなく Python を使っている(前回記事参照)。ロバスト回帰のペナルティ関数が異なるため、データは同じでも多少数値に差が出ていることをお断りしておく(イマイチどの手法が良いのかはよくわかっていない)。
結果は次のグラフを見ていただくのがわかりやすい。
X軸が機能数(1.5✕画面数+1.0✕帳票数+0.7✕バッチ数)、Y軸が人時工数となる。散布図が原データ、各直線は OLS が単回帰、RMG がロバスト回帰、QR が各パーセンタイルでの分位点回帰の結果を表している。
一見してわかるように、ロバスト回帰と50パーセンタイルでの分位点回帰の結果はほぼ同じ結果を導き出している。そういう意味で、前回までの方法論もさほどおかしくな数字ではないという確信が得られたのはありがたい。
ロバスト回帰と分位点回帰(50%)での工数算出式は次の通り。
ロバスト回帰:工数[開発5工程/人時]=142.05×画面数+94.70×帳票数+66.29×バッチ数
分位点回帰(50%):工数[開発5工程/人時]=136.36×画面数+90.91×帳票数+63.64×バッチ数
たまに時間があると統計を身に着けようと試みているのだけど、データサイエンティストというわけでは当然ないので、すぐにやり方を忘れてしまう。というわけで今日のエントリは完全にメモ書きです。はい。
Python は Anaconda を使ってインストールするのが一番簡単なようだ。
実行は Anaconda をインストールするといっしょに入る Jupyter Notebook という REPL ツールを使うのが一般的な模様。たしかにグラフがその場で表示できるのは便利。
データ操作は pandas を使うのが一般的らしい。numpy は直接使わず、pandas 経由で使うのが今風なようだ。使ってみるとたしかに便利。ライブラリで SQL 的な操作ができる。
# インポート import pandas as pd # TSV の読み込み(1行目は列名) data = pd.read_table("パス") # CSV の読み込み(1行目は列名) data = pd.read_csv("パス") # NaN (= Not a Number) を 0 に置換 data2 = data.fillna(value = 0) # 列の選択 (SQL で言えば SELECT) data3 = data["列1"] data3 = data[["列1", "列2"]] # 行の選択 data4 = data.iloc[3] # 抽出(SQL で言えば WHERE) data5 = data[data["列1"] > 0] # ソート (SQL で言えば ORDER BY) data6 = data.sort_values(by=["列1", "列2"])
統計処理はいくつか方法があるけど、R 相当のことをやりたい場合は、statsmodels を使うのが良いようだ。statsmodels には python っぽい通常の API と R っぽい formula API の2種類があるが、今のところ、通常の API を使ってみている。
# インポート import statsmodels.api as sm # 単回帰 result = sm.OLS(data["従属変数列"], data["説明変数列"]).fit() # 重回帰 result = sm.OLS(data["従属変数列"], data[["説明変数列1", "説明変数列2"]]).fit() # ロバスト回帰 result = sm.RLM(data["従属変数列"], data["説明変数列"]).fit() # 分位点回帰 import statsmodels.regression.quantile_regression as smqr result = smqr.QuantReg(data["従属変数列"], data["説明変数列"]).fit(q=0.5) # 統計サマリー情報の表示 result.summary() # 説明変数に対する予測値 result.fittedvalues
最近のブログを読むと seaborn というライブラリを使うのが流行りみたいなのだけれど、自動で統計処理までやってくれる系のライブラリらしく、自前で計算した数値列をグラフ表示したい場合は従来通り matplotlib を使うのが良いようだ。
# インポート import matplotlib.pyplot as plt # グラフを描画 plt.plot(data["説明変数列"], result.fittedvalues) # 散布図を描画(o で丸記号を表示と言う意味になるらしい) plt.plot(data["説明変数列"], data["従属変数列"], "o") # グラフを表示 plt.show() # グラフのクリア plt.clf()
調べたところ、pandas にも plot 機能があるようだ。単なるラッパーのようではあるけど、こちらを使ったほうが便利かもしれない。
gdata = pd.DataFrame({"x": data["説明変数列"], "y":data["従属変数列"], "p": result.fittedvalues }) # scatter で散布図を描画 ax = gdata.plot.scatter(x = 'x', y = 'y') # ax でグラフを重ねることができる gdata.plot.line(x = 'x', y = 'p', ax = ax)