プロクラシスト

今日の寄り道 明日の近道

冬季オリンピックでメダルを取れる国の条件を、重回帰分析で探る!

f:id:imslotter:20180225094049p:plain

こんにちは、ほけきよです。

冬季オリンピック、今日で閉会式ですね。*1 連日、各国選手の美しいプレーには感動しています。

データによれば、 日本は獲得メダル数過去最高らしいです!

そこで、ふと気になることがありました。

冬季オリンピックって、どういう国がメダルをたくさんもらっているのだろう??」

今回は、過去のオリンピックのデータを用いて、冬季オリンピックの強い国の条件を大雑把に分析してみます!

考えられる要因のリストアップ

今回、冬季オリンピックに強い国になりうる理由を、4つ考えてみました

気温

やはり、寒い国が勝つのは、直感的にも正しそうですよね? 赤道直下じゃ雪なんか降らないですものね。

今回は簡単に、各国の首都の年間平均気温を用いることにします。

GDP

スポーツが強いのは豊かな国だという話はよく聞きます。 日々の生活ができて初めて、スポーツはできますからね。

豊かさを表す指標は様々あると思いますが、ここではGDP(国民総生産)を要因として挙げてみます。

人口

単純に分母が大きいと、才能ある選手が生まれる可能性が高いのでは??

という仮説の元、人口もデータとして使います。

開催地からの距離

個人的な感覚ですが、「開催国はかなりメダルが多くなる傾向にありそうだし、開催地からの距離が近いほど、メダル増えるんじゃない?」

と思っています。現に日本のメダルは長野と平昌の時に多いですし。

  • 距離の計算方法はこちらから取得

分析

手順

下記手順で分析しています。(少し専門的な用語を含みます)

  • 1992年~2010年までのオリンピックを対象とする
  • 過去オリンピックでメダルを獲得した国だけを抽出する
  • 取得した各要因データを変数として扱うためつなぎ合わせる*2
  • 人口データとGDPデータの対数を取る
  • 各要因データを、平均と標準偏差で正規化する。
  • 重回帰分析を用いて、各変数の回帰係数を割り出す

なお、メダルは金・銀・銅があるので、下記のようなポイントを割り振って計算しています。

ポイント = 金*5 + 銀*3 + 銅*1

GDPと人口のlogを取るのは、正規化の効果をちゃんと出すためです。例としてGDPを挙げてみると、左(log無し), 右(log有)でグラフの形が大きく異なることがわかると思います。

f:id:imslotter:20180225015311p:plain

平均と標準偏差で正規化する場合は、分布の形が正規分布に近い時に威力を発揮するものだと思ってるので、こういう処理をしておきました。

重回帰分析とは

一つの目的変数(今回はメダルポイント)に対して、複数の変数がどのようにかかわっているかを計算したものです。

重回帰分析の仕組みはTJOさんの記事がわかりやすかったので、復習がてらちらちらと読みました。

ただ、実行に関してはpythonのsklearnモジュールを使っただけです。

from sklearn.linear_model import LinearRegression

で、できますね。簡単!

sklearnの使い方はこちらの記事などもご参考にしてください。

結果 : どの要素が一番強いのか?

分析の結果がこちらです!

メダルポイントの式

名前 係数
気温 -24.3
GDP(log) 31
人口(log) -4.1
開催地からの距離 2.1

f:id:imslotter:20180225024206p:plain この結果からわかるのは、まずは気温が低いほど、冬は強いということですね。やっぱり気温は相当関係しているようです。 また、GDPも関係しているようです。豊かな国であるほどメダルも獲得しやすくなるのですね。

しかし、人口や距離はあまり関係がないらしいです。むむ、予想が外れた。 なにか他にも要因があるのかな...!

精度はどうなの?

こちらが主要国のポイント状況。predictが回帰分析の式に当てはめた予測値。

f:id:imslotter:20180225021245p:plain

GDPが大きく影響しているので、中国はその伸びに従って上がっているのがわかります。USAは毎回安定のメダルラッシュ。 日本は、本来もっとメダルとれるのでは??と思っちゃいますね。

また、次表のように、寒さが際立つロシアでは、GDPよりも寒さが大きな要因となって、メダル予想も高く出ていることがわかります。

f:id:imslotter:20180225023938p:plain

まとめ

いかがでしたか?簡単な重回帰分析でも、いろいろとわかることはありますね。

いろいろ工夫する*3ともう少し精度は上がりそうだなとおもうのですが、まずはこのくらいで!! 個人的には、各大会ごとに大きく変わる変数を見つけたかったです。それが開催地との距離かと思ったのですが、はずれちゃいましたね。。

メダル獲得云々は関係なく、世界一を目指し全力でプレーする選手は素晴らしいですよね。 メダルを取れた選手も、惜しくも届かなかった選手も、本当に尊敬します!フィールド違えど、自分も頑張らないとな。

なお、今回用いたスクリプトとデータはgithubに上げていますので、オリンピックデータに興味があればお使いください。 github.com

だれか、もっと精度を上げてください!!ではでは

*1:本当はいくつかオリンピック×データ分析ネタ、書きたかったんですが。。。とりあえず一つだけでもと思い。

*2:正直これがめんどかった

*3:気温を冬だけにするとか、ほかの要素を追加するとか...

トヨタ生産方式は、なぜ製造業のバイブルとなったのか。

f:id:imslotter:20180130193937j:plain

こんにちは、ほけきよです。

最近トヨタ生産方式を叩き込まれる機会があったので、自分なりに本を読んだり実践したりして、なぜすごいといわれるのか、どうすごいのか、なぜ製造業で使われるのか。を自分なりに理解してかみ砕いたので、内容をまとめてみました。

トヨタ生産方式の起こり

トヨタ生産方式(TOYOTA Production System : TPS)とは、トヨタが提唱する製造業でのモノづくりの仕組みである。

戦後、トヨタが車を発展させたいというときに、アメリカと生産効率が天地ほど違うことに気づいた。そのうえ、アメリカは車文化が根付き始め、大量生産方式が採用された。いわゆる「たくさん作れば安く売れる」業界になっていた。一方で、トヨタはというと、誰が何を買ってくれるかもわからない状態で物を作らないといけない。いわゆる少量多品種生産。

大量に作ったとしても買ってもらえなかったら儲からない。そして頭をひねって作り出されたのがトヨタ生産方式なのである。

なので、トヨタ生産方式は、誤解を恐れずに言うと、「業界内で立場が弱い企業」の戦略とも言える。

トヨタ生産方式の理念「原価低減」

最も重要な前提が、「製品の価格は自分たちで決められない、買い手が決定する」というところ。利益 = 売値 - 原価 なので、利益を上げるためには原価を下げるしかないことになる。

原価を下げるために大事なことが無駄を省くこと。在庫、労働時間、材料費...原価にかかわるムダを品質を維持したままで削っていく。特にトヨタ生産方式では、二つのムダに大きくフォーカスしている

  • 在庫を抱えるムダ
  • むやみな労働時間のムダ

徹底的に利益を追求するのが、トヨタ生産方式。生産性が上がっても、在庫になってしまうと意味がない、必要なものをどれだけロスなく作れるか、を根底とした戦略である。

在庫を減らすための、Just in Time方式

いつ受注が来るかわからないのに、材料を大量に買い占める。それが結局在庫になってしまう。そんな問題を対処しようとに考案されたのが「Just In Time」。必要なものを、必要な時に、必要な量だけ作る方式である。

どうすればそれが実現できるのか、ヒントはスーパーマーケットにあった。 スーパーマーケットは、だれが何を買うかわからない。なので、商品が少なくなったら足すという仕組みになっている。これを製造業にも応用した。

つまり製品が一個組み立て終わったら、前に材料を取りに行くようにしたのだ。前の人ができたら後ろの人に渡すだと、作りすぎがおこるが、完成品ベースで後ろからさかのぼることで、在庫を極力減らせられるようになる。

人には付加価値の高い仕事を。自働化

もう一つが、自働化である。機械が自ら働くとは、どういうことか。

製造業であってはならないことの一つがラインの異常による事故不良品の生産である。機械が自動になっても、これを人がいちいちチェックしていては労働力が減ったことにはならない

異常事態のときは止まり、人に知らせられる機械じゃないと働いていることにはならない、最後までちゃんと面倒をみられるような機械じゃないとダメだ。というのがニンベンに込められている。

トヨタ生産方式が輝ける「条件」

データ分析業界で働いていた私は、ふと、「あの界隈でトヨタ生産方式で聞かないな」と気づいた。しばらく働いていると、両者の違いに気づいた。

トヨタ生産方式には輝ける条件がある。

私が思うその条件は、以下の3つ

  • 買い手と原料供給者が異なっている
  • 製造過程が多段
  • 在庫に賞味期限がある

これら3つの条件と、データ分析系業界が少し相性が悪いのでは?と思う。*1

買い手と原料供給者が違う

いわゆる「仕入れ」である。

データ分析業務などは、原料を握っているのはクライアント側である場合が多い。クライアントが必要だと思う量のデータなんだから、無駄はなく、もとから在庫など抱えることはない。それに付加価値をつけて提供するのがデータ分析業務である。

その一方で、製造業は、発注をかけられたら、その分材料が必要になり、別の業者に発注をかける。必要量は各々が判断しないといけないので、判断を誤ると大変なことになる。 *2

製造過程が多段

次に、製造過程が多段であることがあげられる。 多段であればあるほど各段階に能力のばらつきが起きやすくなる。 能力の低いところがボトルネックとなって、無駄な在庫が増えてしまったりということがある。

また、各過程でのばらつきは、後ろに行けば行くほど拡大していく。*3

そんなときは、ボトルネックとなっているところを見つけやすくしたり、 ばらつきを抑えるように うまく調整するような仕組みが必要となってくる。

在庫に賞味期限がある

作ったものがいずれ必ず使われるのであれば、心配せずに在庫をどんどん生み出せばいい。暇なときに作り置きすればいい

しかし、モノに賞味期限があるときは話は別である。食品は腐る。製造業でいえば、在庫が消化される前に注文の商品が変わるなど...

そういうことが起こるようなときは、やはり過剰な在庫はムダになってしまうのである。

なぜトヨタ生産方式が製造業のバイブルなのか

もちろんシステム自体よくできていて、トヨタ生産方式が輝ける条件に製造業はほぼほぼ当てはまるわけだが、頭のいい人たちならこのくらいの仕組みはトヨタの社員でなくても思いつくのではないのか?と思ってしまう。

数週間実際に体験して、なぜトヨタ生産方式が製造業ですごいといわれるのかが少しわかった気がする。

  • 言葉遊びのような用語
  • 誰にでもわかる平易な説明
  • 誰にでもできる平易なシステム

これらには、作った人の強い哲学めいたものを感じる。

言葉遊びのような用語

トヨタ生産方式には、「トヨタ用語」と呼ばれる言葉がいくつも登場する。 印象的なのは、既存の言葉をいじった言葉遊び的な用語が多いこと。例を挙げると

トヨタ用語 一般用語 違い
自働化 自動化 機械がただ作業するだけでなく、人の負担が減るように動作すること
可動率 稼働率 生産能力に対しての割合が稼働率、一日に生産しなければならない個数に対しての割合が可動率
死料 資料 伝わらない資料は無駄な死料

トヨタ生産方式が目指すべきところをたった漢字一文字で印象付けられる。このように、用語が洗練されているところが、強い。

誰にでもわかる平易な説明/システム

頭のいい人たちが行う説明や、作るシステムは、現場の人にとっては使いづらくなることがままある。しかし、トヨタ生産方式には、そのようなことがない。工場で働く人でもわかるように、わかりやすい言葉、何度やっても絶対に間違えないようにするシステムが出来上がっている。

不必要な説明を省き、必要な説明だけ残す。複雑な工程をうまくシステム化して簡単に見せる。

ぱっと見て、簡単に作れそうだと思うが、たぶんほとんどの人はまねできない。 上司に言われたことは、「手順はなるべく3つまでで完結させること。それ以上は忘れるから。」と。そういう思想が根付いている。だらだらと書くのは案外簡単である。本質を失わずに簡潔なものを作るのは、思った100倍難しい。

トヨタ生産方式の説明には、ある種「引き算の美学」のようなものを感じる。

まとめ

トヨタ生産方式についてまとめてみました。目まぐるしく移りゆく時代の中で、トヨタ生産方式が古いという意見もあります。もちろんメインのシステムは60年も前に確立されたものなので、確かに現代に通用しないところもあります。ですが、トヨタ生産方式の核となるところは方式そのものではなく、「なんでトヨタ生産方式を編み出したのか」、「なんでトヨタ生産方式が広まったか」をたどったところにあると感じました。

方式の丸暗記というよりかは、そのあたりのある種哲学的なところを理解すると、結構応用範囲も広がってくるのではないかと思います。

そういう哲学に一貫性があるがゆえに、製造業のバイブルとなっていったのではないかと思います。内容もさることながら、いろいろと学ぶべきところは多いなと感じました。

この記事だけでもかなり書きましたが、もっと興味のある方は是非、勉強してみてください。ではではっ

トヨタ生産方式――脱規模の経営をめざして

トヨタ生産方式――脱規模の経営をめざして

*1:私が知らないだけでもしかしたら使われているところもあるのかもしれませんが、、、

*2:たまにコンビニでお菓子を一桁多く発注して大惨事になったみたいなニュースをみますね。ああいう感じです

*3:これをBullwhip effectという

Google Homeを英会話の無料トレーニング教材にしてみる

こんにちは、ほけきよです。

我が家に、Google Home Miniが届きました!*1

  • Google Home Mini

    友人がプレゼントしてくれたものです。スマートスピーカープレゼントに最適だと思うんですよ。

    新しくて、興味はあるけど、よくわからないし、自分では最後のひと押し踏み込めない。

    けれど、あればかなり楽しいです。 この辺はAmazonのAlexaとかも一緒かな?

    もらってかなり嬉しかったですし、使ってみて更に感謝が深まった商品でした。

    で、こいつの効果的な活用法を考えて見たのですが、 英語の練習に使えないかなと思って、色々試行錯誤しています。

    今回は、スマートスピーカーの使用例の一つとして、参考にしてみてください。

    Google Home Miniの設定

    • 本体の電源をいれる
    • Google Home Appをいれる
    • Wifiとかいろいろちょこまかと設定する

    これで使えるようになります。ここで

    言語設定を英語にする

    ことで、英語の練習が自然にできるようになります。

    設定の仕方

    設定⇛デバイスで言語の選択ができます。

    More setting

    Device(デバイス)を選択

    Assistant Languageを変更

    利用例

    気温や時刻を聞く

    普段何気なく聞くことも、英語だとどうやって聞くんだろう?ってなりますよね? 大体のことは彼が答えてくれますので、どんどん聞いてみましょう。

    Hey Google! What is the temperature in Tokyo?
    50 degree.
    !?

    どうやらファーレンハイトで計算されるようです。セルシウスにしてくれェ.... でもまあ、海外の文化が分かるってことにしましょう!ちなみに

    What is the temperature in Tokyo in degrees Celsius?

    とかって聞くとちゃんと℃で返してくれます!*2

    アラームをセットする

    アラームをセットして!とかって言うのも、英語でどういうか、パッと出てこないものですよねぇ。

    • Wake me up at 7 o'clock

    とかで十分です。Google Home が勝手にアラームをセットしてくれます。 なお、アラームが鳴ったら

    Let me sleep 10 more minutes...!

    とか適当に言うと、彼が

    OK, I'll give you 10 more minutes.

    と言ってくれる。主従関係...

    寝起きでも、なんとかもっと寝させてもらおうと、意外と英語が出てくるものです。睡眠欲っていうのは素晴らしいですね!ところで、アラームが鳴っているとき、Google Home耳が遠くなる。結構叫ばないと反応しない。狙ってやってるのかな?

    ニュースを聞く

    Today's news?

    と聞くと、ニュースが延々と流れます。英語で。 普通のニューススピードなのでかなり殺人的な速さですが、慣れている人にはいい練習になると思います。なにせ延々と喋り続けてくれますから。

    ゲームをする

    もっとインタラクティブなコミュニケーションをしたいという方は、ゲームGoogle Homeとしてみるのもいいと思います!

    OK, Google. Let's play the game with me.

    と話しかけると、Google Homeがゲームをはじめます。

    実際まだあんまりやったことないのでゲームの内容はよくわかってないのですが、結構インタラクティブにコミュニケーションしながら進めていくゲームもありました。わりと難易度高めでしたがやってみては?

    英語学習用アプリ

    ベストティーチャーという、英会話スクールの会社が、Google Homeでの英語練習用アプリを無償で提供しています。

    japan.cnet.com

    TOEICの会話問題のような内容。現状は100問しかないが、今後のアップデートも考えられるので、是非やってみてはいかがでしょうか。

    尚、この練習をするには、一度Google Homeの設定を日本語に戻す必要があります。日本語にして「ベストティーチャーと話す」というだけで、アプリが起動されます。

    英語のまま話しかけると、、、

    OK google, I'll talk to best teacher.
    Sorry, I don't know how to help that yet...

    まあそうか、よく考えたら英語で英語学習アプリ開かないか。。。

    まとめ

    はじめは全然聞き取ってくれないので心が折れますが、次第に慣れてきて英語も出てくるようになります。 小さなことからコツコツとやってみるのが大事ですからね。スマホの設定を英語にするのと一緒の感覚です。

    いいのは、スピーキングの練習になるところ。発音良くなかったりすると聞き取ってもらえなかったりしますからね。

    お持ちの方はこんな使い方もしてみてはいかがでしょうか?ではでは!

  • *1:2ヶ月前

    *2:ちなみに、ファーレンハイトは25を引いて2で割ると大体セルシウスになるみたいです。50F ≒(50-25)/2=12.5℃

    【Soundpeats】コスパ最強のワイヤレスイヤホン!「Q12」レビュー

    こんにちは、ほけきよです。

    ワイヤレスイヤホンがほしいと思って、イヤホンに造詣の深いブロガーたぐちさん(id:taguchikun)にオススメイヤホンを聞きました。 そのときに紹介してもらったのがこのイヤホン

    私の要望は

    • ワイヤレス
    • 音質もそこそこ
    • 見た目もかっこいい
    • 値段がそこそこ(コスパ重視)

    でした。んで、3ヶ月くらい実際使ってみたんですが、一度なくしました。悲しい。 けれど、また同じイヤホンを注文してしまいました。それくらい使いやすかったので、ご紹介します。

    個人の感想ですが、ご参考に!

    概要

  • Soundpeats社
  • インナーカナル型イヤホン
  • ワイヤレス(Bluetooth接続)
  • 価格3000円前後、コスパ最強
  • SoundPEATS(サウンドピーツ) Q12 Bluetooth イヤホン 高音質 apt-X対応 マグネット搭載 マイク付き スポーツ ブルートゥース イヤホン ブラック

    外観

    外観はこんな感じ。色はブラック、ホワイト、レッド、ブルーの4色から選べます。

    このイヤホンの特徴は、イヤホンの背面同士が磁石でくっつくところ。

    バイスとつながっていないので、無くしがちなワイヤレスイヤホン。 でも、こういう風にくっつけられれば首から掛けるときにも心配が要りません。そして、絡まる心配もほとんどありません!!

    といいつつ、一回無くしているのですが...でもでも、なかったらその3倍は無くしてると思います!!w

    使用感

    装着感

    カナル型だが、正直フィット感は正直もう少しほしいところ。 単純にサイズが合っていないだけなのかもしれないが、つけたとき少し浮いているような感覚になる。

    といっても3-4時間ずっとつけていても気にならないほどには、耳になじんでくれる。

    操作性

    下図のようなボタンがあり、基本操作ができる。

    メインの操作は以下のとおり

    役割 操作方法
    起動 再生ボタン長押し(3~4秒)
    ペアリング 再生ボタン超長押し(6秒以上)
    再生/停止 再生ボタン
    音量調整 +/-ボタン
    曲送り +/-ボタン長押し

    どうやら最近バージョンアップしたようで、前はおっさんの声で「デンゲンヲ、オンニシマス」など操作の音声が流れていたが、 いまは外国人のお姉さんがスタイリッシュな声で「Power On」などと言ってくれる。すこしスタイリッシュな気持ちになれる。

    バージョンアップの効果はもうひとつあって、ボタンが高くなって、押しやすくなりました。これにより、押しミスが減った。


    比較 (左:昔 右:今)

    ワイヤレスの届く範囲

    遮蔽物がなければ、10-20m程度なら軽く届く 普通に家の中を歩き回るのにもほとんど困ることはないでしょう。

    遮音性

    音を聞く際のノイズキャンセリング機能はないが、インナーカナル型なので、音がしっかり耳に届く。周りがうるさくて聞こえないなんてことはない。

    音質

    私の耳は高音質かそうでないかを判断できないけど、おおむね満足はしている。しっかり高音も響いているイメージ。ただ、高級イヤホンとか、ウーファー付スピーカーと比べると、低音の響き(ベースやドラム)はもう少しといったところ。まあこの値段でこの音質ならすばらしいと思います。

    充電

    ワイヤレスの弱点のひとつである充電。

    音楽を鳴らし続けているとき、大体4から5時間くらいでバッテリー切れになる印象。8hはたぶん持たない。 音楽を流していないとき(待機状態)はの充電の持ちかなりよく、平気で2-3日放置していても使える。これもバージョンアップしてかなり持ちがよくなった気がする。

    なお、充電はmicroUSBで行う。2時間でMAXと、すこし時間がかかるので、聞いていないときはこまめに充電するほうがよいかもしれない。


    DC INからmicro USBを差し込む

    まとめ

    いかがでしたか? 3000円にしては、めちゃくちゃよく考えられていますし、とても使い勝手の良いイヤホンだと思います。

    この値段でこのクオリティ...ベストセラーになる理由がわかります。私にいたってはリピーターですしね。笑

    そこまで音にこだわるわけではないけど、いいものがほしい!という方は、ぜひ試してみてはいかがでしょう。

    ではでは!

    【Loctek】オシャレで快適なデュアルディスプレイ!モニターアーム「D8D」レビュー

    こんにちは!ほけきよです。

    ブロガーやプログラマの皆さんは、自分のデスクにこだわりを持っている人も多いかと思います。

    かくいう私も作業効率をUPさせるためデュアルディスプレイ*1なわけですが、やっぱり自分のデスク、スタイリッシュで効率的に行いたいですよね。

    デスクを快適に使うことが出来るモニターアームを入手したので、レビューしていきます!

    Loctek D8D

    今回紹介するのはコチラ

    ロックテックLoctek ガス圧式デュアルモニターアーム D8D

    概要とポイント

  • デュアルディスプレイモニターアーム
  • 30インチまで対応
  • USBポート付き
  • 価格は14000円程度
  • 私は27インチディスプレイ*2を二枚使っているので、2枚とも取り付けられるこのタイプを選びました。

    開封の儀

    届いたので、開封してみます。

    中身を空けるとこんな感じ。一つ一つビニールで丁寧に梱包されています。

    梱包を取り外すと、こんな感じ。他の記事ではキズや汚れありと書かれているものもありましたので、少し心配でしたが、私のはキズなどはありませんでした。

    こうしてみると結構重厚感がありますね!

    組み立て・取り付け

    組み立て・取り付けですが、二人で行うほうが良いと思います。モニターアームが重いので、一人でも出来なくはないですが、そこそこ苦労しました。

    デスクへの取り付けはクランプタイプグロメットタイプの二種類あります

    クランプ グロメット
    方法 机の端で挟み込む 机に穴を空けて挿す
    特徴 簡単に取り付けられる しっかりと固定される
    クランプのほうが簡単に取り付けられるので、位置がはっきり決まっていないうちはクランプで固定でいいと思います。

    机に固定が終わると、モニターの装着です。モニターに付いているネジを一旦外して固定しましょう。

    モニター背部の幅が装着可能な幅かどうかは、予めチェックしておきましょう。

    装着すると、こんな感じ!とてもスッキリ!!

    D8Dモニターアームのいいところ

  • 省スペース
  • 自在に動く
  • 便利なUSBポート
  • 利用前と比べて、ディスプレイの土台がない分、かなりデスクの上がスッキリとしました。

    また、自在にディスプレイを動かせることで、いろんな使い方が出来ます。例えば、画面を90°回転も簡単に出来るので、コードを書くとき、文書を読むときなど、縦長のほうが良いときなどは重宝します!*3

    このアームの真ん中にUSBポートがあるのもうれしいですね。USBメモリを装着したり、充電をする時など、いちいちデスクトップ側のポートを使わなくても良くなりました。

    モニターアームのイマイチなトコロ

    一つだけ、イマイチな点は

    • 左右のディスプレイをくっつけるには奥行きが必要

    なところ。


    (上から見た図)

    こんな感じで、くっつけるためには結構な場所をとるので、奥行きが必要になります。 構造上仕方ないのですけどね。どうしてもディスプレイをくっつけたい人は、机の間を空けるか、奥行きの大きな机で利用しましょう。

    まとめ

    モニターアーム、組み立てがめんどそうだなと思って、入手してからしばらく放置していたのですが、意外と簡単に取り付けられました。 前からほしいと思っていたので個人的に、とても満足です。

    • ディスプレイを快適に動かしたい方
    • 机をスッキリさせたい方
    • 机の上をオシャレに見せたい方

    などは一度検討してみてはいかがでしょうか?

    無くても生きてはいけるけど、あったらデスク作業がますますはかどります!是非検討してみては!ではではっ

    ロックテックLoctek ガス圧式デュアルモニターアーム D8D

    *1:片方がだいたいYouTubeな事は内緒。

    *2:Dell ディスプレイ モニター P2717H/27 インチ/IPS/6ms/VGA,DP,HDMI/USBハブ/3年間保証

    *3:ちなみにWindows10では画面回転のショートカットがあって、Alt+Ctrl+方向キーで簡単に回転ができます。

    頑張れ受験生!受験直前にするべき7つのコト

    こんにちは、ほけきよです。

    そろそろ大学受験シーズンですね。 これまで一年間、成績に伸び悩んだ人、成績が急上昇した人。それぞれでしょう。

    それでも、明日1年間受ける人のほとんどが自分の意思でその道を選び、努力してきたと思います。 遊びたい気持ちを抑え、頑張ったと思います。目標に向かって努力する人はかっこいいですよね!

    そこで今日は、本番まであと少し、そういう時に何をすればいいかを自分の経験を踏まえ書いてみます。 受験直前期に大事なのは問題をときまくるよりもメンタルコントロールと、凡ミス撲滅です。

    どうすれば気持ちを整えられるか、自身を持って臨めるかをまとめました。

    多くの人が、自分の実力を出し切れることを祈っています!

    1. 忘れ物チェック

    • 受験票
    • 鉛筆、シャーペンと芯、消しゴム
    • 時計

    など、絶対に忘れられないものだけは、試験当日にバタつかないように、必要な物はきちんと前日までに用意しておきましょう。

    2. 親や友達など信頼できる味方に弱音をはいておく

    本当に最後の最後、どうしても心落ち着かないときは、信頼出来る人に弱音をそっと吐きましょう。 その人はあなたの一年間をちゃんと見ています。そういう人の言う「大丈夫」に、根拠もないのに案外救われたりします

    また、自分を少しでも下に見ている人・嫌いな人とは話さないでおきましょうね。「嫌いな人とも付き合う」のは社会に出てからでいい。大一番の前に心がざわつくことになります。臆病な自尊心で上等!プライドを傷つけられないようなるべく近寄らないようにしておきましょう。

    3. 絶対解ける問題を解く

    本当の直前の問題演習は、解ける問題の復習に当てましょう。

    この段階で問題を解くのは弱点を克服するためではありません、安心するためです。今までに習ったことを反芻しながら、解けるという自信をつけてから試験に臨みましょう。英単語などもおすすめです。

    4. 腹痛と風邪に注意、体調管理

    体調は集中力に影響するので、なるべく万全な体制で臨みたいですね。

    • いつも通りの睡眠時間
    • 加湿やマスクを忘れずに
    • 試験の3時間前には起床
    • 油物はあんまり食べない

    などなど。わたしは緊張でお腹を壊しやすかったので、直前期は梅干しのおにぎりをずっと食べてました。胃腸に良いらしいと聞いたので!笑

    5. ゲンを担ぐ

    自分が試験前に行うと上手くいくというジンクスなどがある人はそれをしましょう。わたしの場合、試験前にエナジードリンクを飲むです。今でも大一番の前には続けています。

    お守りも効果的です。神様のご利益もありますが、例えば人からもらったものなら、「あの人が応援してくれている」という安心した気持ちにつながると思います。

    6. 今までの参考書とノートを積み上げてみる

    「かなり/まあまあ頑張った」とかだと、イメージしづらいので、努力を定量してみてください。 勉強記録をつけている人なら、1年で何時間勉強したか、とか。

    私のオススメはこの参考書とノートを積み上げることです。一年間って、かなりの勉強と演習を積んでるんだ。となると思います。

    写真を撮ってトップ画にしておくと、お守り代わりになるかもしれません。

    7. 4月に大学生の自分をイメージ

    センター試験に不安で悩むぐらいなら、4月以降の受かった自分を想像しておきましょう。 進む大学、入るサークル、出会う運命の人、挫折を味わう日々、挫折を乗り越えた研究成果など。 イメージの力は強大です。強い想いが、必ず良い方向に導いてくれるでしょう。

    頑張れ受験生!

    受験で実力以上のものが出ることはまずないです。 本番に強い人というのは、実力通りの力を出せる人です。

    実力は1年間の努力分。あとは集中力や緊張、体調などの要素次第です。 今まで通りの力を出し切れるよう、頑張ってください!応援しています。

    2017年の振り返りと2018年のテーマ

    こんにちは、ほけきよです。

    ちょっとアドベントカレンダーで燃え尽きていた&プライベートでバタバタしていたもので、更新が滞っていました。 新年一発目ということで、去年の振り返りと今年の目標的なものを。

    2017年の振り返り

    年が明けました。皆様今年もよろしくお願いします。 昨年は「放」をテーマにしていました。 自分自身を変え、新たな挑戦をどんどんして行くという目標は、ある程度達成できたと思っています。

    ブログでいえば、『技術×情報発信』ということで、プラグイン作ったり、自動記事作ったり、アドベントカレンダーしたり、色々しました。 この辺ふりかえって見ると、なんか楽しそうだな自分、、、という気になります。笑

    どれも楽しそうなので、覗いてみてください!

    また、オフ会に結構参加しました。こうやってブログを通じてたくさんの人と価値観に触れられたのは、自分の今後を考えるいい機会となりました。

    去年1年の教訓は

    • 特に必死で頑張っているときに出来た繋がりは、良縁なことが多い
    • 運がいいというのは、行き当たりばったりではなく、チャンスを掴める準備をすること
    • 自分の過去の意思決定を振り返ると、結構自分の価値基準や行動理念が見えてくる

    特に最後。結構やりたいことなんか無くて、適当に生きてると思ってたんですけど、案外一貫した基準があるんですよねー。私の価値基準は2つ

    • その選択が、振り返ったときに失敗しても「面白い」と思えるか
    • 自分が取りうる最大の難易度の場所か

    はっきりとした目標がない人、結構いると思いますが、振り返って見ると案外知らない自分がわかるかもですよ。

    2018年のテーマ:『届』

    今年は去年とまた環境がガラリと変わりました。

    今年のテーマはです。

    • 言葉を届ける : 英会話・マネジメント・プレゼン
    • 文章を届ける : 記事、執筆
    • サービスを届ける : webアプリケーション

    とかかな。ウェブアプリとか作って一発当てたい気もする。。。笑 *1

    人に言葉、文章、サービスを「届ける」ことを意識して仕事も趣味もブログも頑張ります。

    皆さんに面白いと思ってもらえるコンテンツを届けられるよう、またいろいろとネタを仕込んでいきますので、本年もプロクラシストをよろしくお願いします!

    *1:もちろん、技術メモについても引き続き書いていく予定です!

    知識0だった僕がデータ分析をこれまでどう学び、これからどう使うのか

    f:id:imslotter:20171225203840p:plain

    長かったデータ分析ガチ勉強カレンダーも最終日*1

    自分のこれまで歩いてきた道を軽く振り返ったあと、自分が思う機械学習/データ分析のあり方について書き連ねたいと思う。あくまで一つの価値観として楽しんでもらえればと思います。

    データ分析って何?状態から

    データ分析業務を行うにあたって、まずはじめの難関は、言葉の壁だった。ほぼコンピュータと無縁の世界で生きてきた私は、「Linuxって何?Vimって何?」っていうのを毎日繰り返していた。

    データ分析を実務で扱うには、アルゴリズムを知っているだけじゃどうしようもない。 列挙すると下記のようなものが必要になってくる*2

    • アルゴリズムを動かすプログラム、用意する環境(Linux, VM, サーバーなど)
    • サーバーでコードを動かすための知識、ネットワークの知識
    • 計算量の見積もり、高速に動かすための並列化技術
    • データのin/outを扱うDBやqueueのシステム
    • プログラムの死活を監視するシステム
    • 分析アルゴリズムの理解
    • 複数の処理に対応するトランザクションの知識
    • サービスとして提供するアプリケーションの知識
    • 複数人で開発を進めていくプロジェクト管理技術

    などなど。。。今だからこそ、そこそこ俯瞰的に見られるようになってきたが、はじめはまるで言葉が分からなかった。

    じゃあ、どうやって知識を獲得していったのか。 自分が意識的にやってたことを振り返ってみる。

    やったこと

    わからないところを聞くレベルに達するまで

    はじめは、どこが分からないかすら分からない状態。質問しろといわれても質問できない。だから、下記のことを行っていた。

    • ひたすら単語をメモ帳にメモしまくって、ググる。飲み会の間も分からない単語はメモしてた。調べるたびに分からない単語が増えるけど、耐えるしかない。辛抱強くメモ
    • その道のもっとも簡単な本を専門家に聞くサルでもわかるようなやつ。
    • 染み付くまで訓練を重ねる。一朝一夕でコマンドは打てるようにならない。Linuxコマンドなどは、lsさえ知らなかったので、無意識に基本コマンドが打てるようになるまで体に叩き込んだ。

    そうすれば、ぼやっと聞きたいことくらいはわかるようになってきた。

    わからないところが分かるようになると

    ある程度のことが分かるようになると、このあたりから少しずつ楽しくなってくる。こういうときには、以下のことを意識していた。

    • 人に聞きまくる。わからないことだけじゃなくて、わかったことが正しいかの確認も込めて聞く。
    • 詳しい人が実際にコードを書いたり、デバッグしている過程をよく観察する。結果としての物よりも、過程に知見が詰まっていることが多い。ショートカットの使い方だとか、バグ取りにつかっているコマンドとか。とにかく、観察して、盗む
    • 知っている範囲内の言葉で説明ができないか試みる。「これはつまり~~ってことだな。」と、自分の言葉で納得するまで考える。
    • 複雑な要素は根気強くほどく。世の中の大半が実は難しくなくて、簡単な要素がたくさん組み合わさっていて難しく見えているだけ。
    • 訓練を重ねる。自分がやっていることは大したことではないと思えるレベルまで、理解と実装を重ねる。

    とにかく、自分の言葉で説明できるっていうのに重きを置いていたように思う。あとはやっぱり、ひたすら手と頭を動かした。

    アルゴリズムをどう理解したか。

    物理出身ということもあって、数式の理解には少し自信があった。なのでアルゴリズムの理解はいろいろな技術領域の中でも自分の強みとしたかった。

    • 大事な理論は数式レベルで理解する。基礎的な理解は低レイヤーでの思わぬつながりを産み、未知の状況に対する応用のロバスト性**が高いように感じる。ここの式をこういじれば...みたいなイメージができるようになると強い。
    • 実装はデータのinput/outputを重要視する。特にディープラーニングにおいては、ここはベクトルで入っているのか?それともスカラーなのか?はたまたテンソルかもしれない...それをうやむやにすると魔法の箱化してしまう。あくまで演算にすぎないという意識を持つ。
    • アルゴリズム既存のものとの差分を意識する。何が変わったのか(精度向上、次元拡張、スピードアップ、対象拡大)、どうやって変えたのか(システムレベル、アルゴリズムレベル)などを意識して読む。

    この中でも一番意識したいのは、魔法の箱じゃなくて、計算を行っているに過ぎないということ。だから、どういう計算過程なのかを強く意識した。そうすることで、何が出来て何が出来ないかがぼんやりと分かる。

    自分が思う、これからのデータ分析

    今まで分析業務に従事したり、一ヶ月間ガチで勉強してきたデータ分析を実務で使うものとしての視点で書く。

    良いデータが集まるところに価値が生まれる

    データ分析は料理みたいなものだと思う

    • データは食材、前処理は調味料、アルゴリズムは調理器具。
    • アルゴリズムはすぐに汎用化される。arXivにあげられた論文が1週間後にはgithub上で誰かが上げられている状況。
    • 調理器具の使い方をいち早く理解すること、元となるおいしい食材を集めるところが最重要課題。

    つまり、データが集まるプラットフォームを作れるかどうかが今後のデータビジネスのカギとなってくると思う。メルカリとかお見合いアプリとか理想的だと思っている。人の心理をデータによって数値化できる基盤が整っている。特にスタートアップなどは、真似できないようなデータ収集プラットフォームをどうつくるか、ここに大きな労力を割くべきではないのかと思っている。

    実務のデータ分析は高い精度よりも低コストと高い説明能力

    現場において、ディープラーニングを果たして使うのか?というと、難しいのではと想像する。

    • 失敗原因がわからない怖さ
    • コストと納期の関係

    が原因。実際データサイエンティストの泥臭いフィーチャーエンジニアリングの過程は、それ自体に価値があったりする。だからこそ現場の最前線でロジスティック回帰*3が用いられる。一方で分からないけどいい結果というのは、なによりもクライアントの不安を増長する恐れもある。

    でも、だからといって、ディープラーニングが使われないのは、あまりにもったいなさ過ぎる。 あれだけの精度をわけも分からなく産めるものを、今後実務で使うためには、結果を説明出来る技術が必要だと思う。 機械学習の意味付けの研究はこれから実務的にも重要で、発展していくのではないかと思う。*4

    データ分析はトップダウン

    物理をやっていたものからすると、ボトムアップ的アプローチも利用していきたいものである。

    • データから推論できること、出来ないことをはっきりさせる
    • システムの隠れた状態などをうまくモデリング出来たら、強い
    • トップダウン的に分析し、ボトムアップ的に仮説を立てて実験をすることで、より本質的な理解となる

    と思っている。 大量のデータがあって、それを魔法の箱に突っ込めがなんかしらの良い結果が出る時代にはなってきている。 しかし、データに頼りすぎず、どこが本質的に重要かをミクロな観点から見極めながら、分析できる能力は身につけておきたい。

    あくまで人間の補助、人間とのシナジーを考える

    最後に、私はあまり人間が得意なことを機械でやらせようとは思わない。 そういうことに労力を割くよりは、機械が得意な領域を磨いていくほうが、生産性が高いと思っている。

    意思決定、連想、ばかみたいな発想、人との関わり。こういうのは人間が得意とするところだろう。 データ分析はこれを最大化する方向に利用したい。

    • 自動化できるところ、自動化出来ないトコロを明確に
    • 事務作業は自動化で良い。サービス的な要素は消えない。
    • 職人が自発的にひねり出したアイディアは、独創的で面白い

    まとめ

    とりとめもなく終わりますが、これが数年間データ分析技術を学んで、また現場で実践して考えているところです。 自分が数年後道を見失ったときに読み返せるようにと、書いてみました。

    技術の進歩は著しく、データ分析の技術はこれからますます楽しみになっていきます。 それについていけるようこれからも精進していきたいと思っています。

    これまでのアドベントカレンダーをマージして、ゼロからデータ分析を学べるようなサイトマップを作りました。

    データ分析に興味を持った方は、コチラで勉強してみてはいかがでしょうか。ではでは。

    *1:ながかった、、、ガチだった。。。

    *2:レベル感のばらつきはお許し下さい

    *3:回帰の最も簡単な手法

    *4:発展していって欲しい。

    Pythonでゼロから機械学習/データ分析を学ぶためのサイトマップ

    f:id:imslotter:20171224195620p:plain

    データ分析ガチ勉強アドベントカレンダー 24日目。

    当サイトでも、Pythonを使ったデータ分析や機械学習について、勉強しながらそれをアウトプットとして出すと言うかたちで、何個も記事を書いてきました。 記事数で言えば50とかそのくらいあるような気がします。

    カレンダーも完成しつつあるので、個々では当サイトの総まとめとして、機械学習やデータ分析に触れたいという人がゼロから始めて触れられるように、記事をまとめていきたいと思います。 何か面白いことを勉強したい学生、就職までの勉強に、急に機械学習を使わなければならない社会人方々は、読んで見てください。

    0. 環境構築

    まずは何と言っても環境構築。Pythonは他の言語に比べて構築が簡単な方だとは思いますが、ここでかなり苦戦する人が多いです。

    0.1. Pythonの導入 (Anaconda)

    当サイトではWindowsでも環境構築が簡単に出来るように記事を書いています *1*2。全くゼロから始める方はコチラをどうぞ。

    0.2. エディタ (Pycharm/VSCode)

    いわゆる高機能メモ帳。実際にコードを書き始めると、自分好みのエディタが欲しくなるものです。当サイトでは、PythonならPycharmを、またオールラウンドに使えるエディタとしてVSCodeを紹介しています。

    0.3. バージョン管理 (Git)

    (※あれば便利ですが無くてもコードは書けるので、面倒な方は飛ばしてもらってOKです。)

    賢くコードを管理する仕組みです。ちょっと試したいことがあるだけなのに、コードを一部変更して、そのご間違って保存したりすると悲しいですよね。 そんなことがないように、しっかりと自分の作ったコードのバージョン管理しましょう。Gitの基本的な使い方はこちら

    また、当サイトのGithubアカウントはコチラです。

    github.com

    作ったおもちゃや勉強の様子を保管しているので、よろしければぜひ。

    1. Pythonの使い方(基本ライブラリ)

    環境が作れたら、いよいよコードを書いていきます。 Pythonライブラリが充実しているので、それらを使いながらコードを書いていきます。 機械学習専用のライブラリもあるのですが、まず必ず入れておくべきライブラリであるnumpy, matplotlib, pandas, jupyterの使い方を紹介しています。

    1.1. 数値計算 : numpy

    これを用いることで面倒な基本計算(平均計算、行列計算、etc...)を一行で書けるようになります。スゴい!

    1.2. 表計算/統計処理 : pandas

    Pythonで表を読み込んだり、計算したり、また表として書き出したりするにはpandasがとても便利。 少し使い方にクセがありますが、かなり強力なので、是非身につけておきたいものです。

    1.3. グラフ描画 : matplotlib

    データ分析をしていると、結果をグラフで可視化したいということが多くあります。 そういうときにはmatplotlib. これ一つで色々なグラフを書くことが出来ます。

    また、よりオシャレなグラフを作りたい方向けに、KibanaとElasticsearchで可視化する方法も書いています。この場合は、Python以外の知識も必要です。

    1.4. インタラクティブなコード実行 jupyter

    jupyterの良い点はちょっとずつコードを書きながら試すことが出来るというところです。 コード書いて、コンパイルして、実行...を短いサイクルで回すイメージ。 同時にメモも残せるので、研究や実験に最適です。

    2. データ分析事始め

    Pythonがある程度使えるようになったら、データ分析/機械学習のお勉強です。

    その際に参考になる本やサイト、ライブラリなどをざっと洗い出した記事がありますので、リファレンス代わりにしていただければなと思います。

    3. データ分析の流れ

    ここから、実際に機械学習を交えながら、データ分析を進めます。

    実務では、下図のようにデータ分析を進めていくのですが、その流れを、sklearnを使いながら説明していきます。

    3.1 データを集める

    まず、データを集めないといけません。 モデル/アルゴリズムの性能を調べたいときに、sklearnはいろいろなデータを予め用意してくれています。

    また、情報を集めたいときはスクレイピング/クローリングなどの技術が必要です。 beautifulsoupを使ったり、公開APIを使うなどして、データを集めましょう。

    3.2 データ分析の流れ

    4. 時系列データ

    時間依存のあるデータはそうでないデータに対して、少し扱いが面倒だったりします。 けれど、扱うことも多いので、まとめています。時系列に関する基礎的なまとめから、ディープラーニングに至るまで、まとまってますので、読んでみてください。

    6. 深層学習

    最近界隈を賑わせているディープラーニングに触れない訳にはいかないでしょう。 当サイトでは、KerasとPyTorchの2つに絞って、その使い方について説明しています。

    6.1 自作

    ライブラリを使う前に、ディープラーニングのココロを知るため、まずはPythonで自作しました。

    1から書くと、どういう思想でネットワークが組まれているのかとか、学習の仕組みなどが分かるようになります。

    6.2. Keras

    とっつきやすさでは随一のKeras。簡単なデータ分析に使うにはこれで十分だと思います。ディープラーニングなんて知らなくても使えるそのお手軽さはスゴい。

    6.3 PyTorch

    研究者界隈で盛り上がりを見せているPyTorch。すこしコード記述量は増えますが、Define by Runの設計しそうなので、かなり柔軟な設計が可能。 更に、Sklearnとの連携で、より使いやすくなります。各ライブラリとの比較も書いていますので、是非ご一読を。

    7. 教師なし学習(異常検知/次元削減など)

    上記までが、正解データのラベルに従って学習を進めていく教師あり学習です。 実際の現場では正解データを使わないタスクも多くあります。

    異常検知*3や、座標を変換する空間変換など、正解データという概念が無いようなものに対してもまとめましたので、必要な方はどうぞ。

    8. 強化学習

    強化学習は、教師あり学習とも教師なし学習とも違います。

    実験して、その結果が帰ってきて、学習してまた実験する。

    そのようなまるで人間のような学習の方法です。定式化が出来ない複雑な状況などに応用が期待されており、 実際にマーケティングの広告の配置などに使われたりしています。

    9. 実際にデータ分析をしている記事

    当サイトでは、実際に分析を行った記事をいくつか載せています。

    そこまで高度なことはしていませんが、記事からデータ分析から分かること、データ分析のちからを感じてもらえればと思います。

    まとめ

    いかがでしたか。かなりいろいろなことをやっていたので、一つにまとめました

    今回のアドベントカレンダーは、この記事の順番を意識して進めてきました。その流れで勉強していくと、割とスムーズに進められるのではないでしょうか。

    データ分析業界が盛り上がっているので、これを機に一念発起して勉強したい方なども、ぜひご参考ください。ではでは!

    *1:MacLinuxは環境構築方法をWebで漁れば簡単に出て来るし、またハマりどころもそんなに多くないので、ぐぐってみてください。

    *2:機械学習ライブラリによっては、どうしてもwindowsで出来ないものもあります。

    *3:厳密に言えば教師のある異常検知もあります。

    【Day-23】機械学習で使う"距離"や"空間"をまとめてみた

    f:id:imslotter:20171223191319p:plain

    データ分析ガチ勉強アドベントカレンダー 23日目。

    ここまでデータをどういう風に処理したり、どういうタスクをこなしていくかについて勉強してきたが、 一度基礎的な事項に戻ってみたいと思う。基礎だから簡単というわけではない。基礎だからこそ難しく、また本質的な内容

    データ分析で使われている手法などをまとめて集約して、簡単な説明を付け加えていく。 しかし、このあたりの数学*1は苦手なので、なるべく直感的に自分のイメージを書いていく。

    われわれが生きている空間や、距離は"正しい"のか

    "正しい"というのは、データ分析に使うのに適切なのか。という意味で書いている。 たとえば、新宿まで1.2km"というような表示を見る。地球という座標空間の中で、新宿までの距離が1.2kmというわけだ。われわれは日常生活の中で、それに対して何の疑問も抱かない。それは、日常の距離はユークリッド空間が 大前提にあるからである。

    ユークリッド空間/ユークリッド距離

    簡単に言うと、高校まで*2われわれが生きてきた空間である。たとえば、(0,0)から(3,4)までの距離は?ときかれると、大体の人は三平方の定理だ!となって、5という数字が思い浮かぶ。

    けれど、下図を見てほしい。空間が必ずしもx,yの直交座標であらわされるわけではない。厳密に言うと、地球は丸いので、曲がった空間での距離を求めるべきなのである。また、距離の測り方だってバリエーションがあっていいはずだ。 ユークリッド距離といえば、斜辺の距離と思いがちだが、たとえば街などは、斜めに横切れないことだってあるので、かくかくと進んでいくことを前提に距離を測ったりする*3。このように状況によって空間や測りかたは変わるべきなのである。

    データ分析とは、いろいろなジャンル/いろいろなタスクがあるわけで、それが本当にユークリッド空間/ユークリッド距離で考えるべき話題なのかどうかというのは、考えておくべき問題なのである。 非常に根本的な話であるだけに、きれいな空間や距離で解けたものは美しく、汎用性がある。

    点の距離

    Name 名前 備考(あれば)
    Euclid ユークリッド \sqrt{ \sum_{i}^{n} {\left(x_{1i}-x_{2i}\right)^{2}} } 一般的な距離
    Manhattan マンハッタン \sum_{i}^{n} |x_{1i}-x_{2i}| 外れ値の影響を受けにくい
    Minkowski ミンコフスキー \left(\sum_{i}^{n}{|x_{1i}-x_{2i}|^{p}}\right)^{1/p} Euclid, Manhattan, Chebyshevを一般化したもの
    Chebyshev チェビシフ \max_{i}|x_{1i}-x_{2i}| 成分の差がもっとも大きい次元だけを抽出している
    Mahalanobis マハラノビス \sqrt{\mathbf{ \left( x_{1}-\bar{x} \right)^{T} S^{-1}  \left(x_{2}-\bar{x}\right)}} 正規分布の共分散の形にあわせて算出する距離。よく使う
    Hellinger ヘリンジャー \sqrt{ \sum_{i}^{n} {\left(\sqrt{x_{1i}}-\sqrt{x_{2i}}\right)^{2}} } 外れ地の影響を受けにくいの
    Hamming ハミング dim(\mathbf{x})-\sum_{i}^{n}\delta\left( x_{1i},x_{2i} \right) ベクトルの要素中で一致していない素数。カテゴリ変数に利用

    分布の距離

    分布の距離というときにもいろいろな距離/距離尺度がある。厳密には距離の公理(非負性・同じ点なら0・対称性・三角不等式が成り立つ)*4を満たしていないものもあり、それらは距離とはいえないが、差をあらわすものとしてよく使われるものなので、距離尺度として用いられる。

    名前 備考(あれば)
    Histogram Intersection D_{HI}(p,q) = \sum_i \mathrm{min}(p,q) (距離じゃなくて類似度)ヒストグラムのような離散値に使う。2つの分布の共通領域。
    KL divergence D_{KL}(p||q) = \int_{-\infty}^{\infty}p(x)\log{\frac{p(x)}{q(x)}}dx 相対エントロピーの概念に基づいて、2分布間の距離を算出(非対称)
    JS divergence m(x) = \frac{p(x)+q(x)}{2}
     D_{JS}(p,q) = \frac{D_{KL}(p||m)+D_{KL}(p||m)}{2}
    KLを改良して**p,qに対称性をもたせたもの
    L1 norm D_{L1}(p,q) = \int_{\infty}^{\infty}|p-q|dx 連続的な分布における誤差の絶対値の和
    L2 norm D_{L1}(p,q) = \int_{\infty}^{\infty}(p-q)^2dx 連続的な分布における二乗誤差の和
    Wasserstein distance W_p(\mu, \nu)=\left( \inf_{\gamma\in \Gamma \left(\mu,\nu\right)} \int_{M\times M} d(x,y)^{p}d\gamma(x,y) \right)^{1/p} 分布を荷物量とみなし、荷物を他の分布に移しかえるときにかかるコスト

    それぞれの違いの実装をgithubにあげておく(day23)

    github.com

    wasserstein計量

    物理では昔からある輸送距離だが、WGANの登場により、分布の距離表現として注目される様になってきた。

    • 輸送コスト最小化問題を解いた場合の最小の輸送コスト
    • 最小コストをいちいち計算するため、計算時間はめちゃくちゃかかるが、その分物理的にも本質的な距離になっている。
    • 実装にはPOTというライブラリを使う(Optimal Transportation)github
    pip install Cython
    pip install POT

    カーネル(再生核ヒルベルト空間)

    非線形の問題を扱うものとしては、かなり伝統的な手法。数式を抜いて文字だけで説明するとこんな感じ

    • 線形の特徴量x_1,x_2を組み合わせて、非線形な特徴量を作りたい。
    • こんな特徴量の組み合わせは無数にある(例:x_{1}^2, x_1x_2,...,x_{1}^{4}x_{2}^{3},...)
      • 多いほど非線形性は高まるが、組み合わせが膨大
    • カーネル関数を使うと、無限次元の特徴ベクトルを用いているのと等価*6
    • でも、計算量は無限じゃなくて、データ数に依存する*7
    • 一般的化線形モデルは、カーネル関数によって書き換えることが出来るので、データ数に依存する形で非線形を学習できる

    というわけで、データ数分の計算量で、無限次元空間の学習が出来るって感じ。 注意としては、入力するデータ数が多くなると、計算が厳しくなる(データ数×データ数の逆行列を解く)

    以下、わかりやすい&数式もきちんと載っている説明。

    Topological Data Analysis(TDA)

    • データを点群として扱うのでなく、データの持つ幾何学的な情報に基づいて識別や分類を行う
    • Persistent Homologyという分野
    • 点群の幾何学的な情報を抽出した二次元座標上の点集合(Persistence diagram)を得る
    f:id:imslotter:20171223123208p:plain
    persistent homologyの生成元の発生と消滅のイメージ
    f:id:imslotter:20171223123233p:plain
    上図のように円を広げていき、発生の時刻と消滅の時刻を2次元プロットにしたのがpersistent diagram

    以下、わかりやすい説明と論文

    次元削減/Embedding

    特徴量が非常に多い場合、その特徴量全てがデータとして重要かどうかは微妙。 特徴量を重要な部分だけ抽出したり(Dimension Reduction) 相性の良い空間へ今ある雑多なデータを埋め込んだり(Embedding)することが多い。以下は主要/有望な手法と簡単な説明、文献を列挙する(随時更新)

    PCA(principal component analysis)

    典型的な次元削減の方法。次元を落としても情報をなるべく落とさないような軸を計算で求める。

    ちなみに、AutoEncoderはPCAの純粋な拡張になりうることが数学的に証明できる *8

    t-SNE(t-Distributed Stochastic Neighbor Embedding)

    PCAが点だけを見るのに対し、t-SNEは分布単位で見る。圧縮前と圧縮後の確率分布のKLダイバージェンスを最小化することにより求める。

    f:id:imslotter:20171223125426p:plain
    [t-SNEの仕組み(ALBERT)](https://blog.albert2005.co.jp/2015/12/02/tsne/)より引用

    Word2Vec

    CBoW(Continuous Bag-of-Words)を用いて、文脈中の単語から対象単語が現れる条件付き確率を最大化するように学習を進めていく。

    そうすることで、単語を座標空間上に埋め込むことができる。 これによって、言葉の足し算引き算ができる可能性が拓けた。

    f:id:imslotter:20171223191909p:plain
    男女間の関係が近い値のベクトルで表現される(参考記事より画像を引用)

    最近では、word2vecだけではなくdoc2vecなどもあり、ますます応用可能性が増している。

    Poincare Embeddings

    Word2Vecの空間改良版といったところ。双曲空間にデータを埋め込むことで、

    • 階層構造/木構造を自然に空間の中に埋め込める。そういう構造のデータに良い。
    • リッチな空間表現のため、元の次元を減らすことも出来る
    • 空間に少しの補正を加えるだけで使えるので、拡張が容易

    な点などから、注目されている。双曲空間というのは、下図真中のような、曲がった空間。外に行くほど密になっている(=空間が広い)

    f:id:imslotter:20171223192945p:plain
    [Fig]双曲空間。場所によって距離尺度が変わる

    実際、単語は階層構造をなすことが多く、下図の結果のように、空間上に効率よく単語を配置することができる。

    f:id:imslotter:20171223193551p:plain
    [Fig] 論文の実験結果、ハブと周辺語の階層関係が表せている

    Wasserstein Embeddings

    この前読んだ論文が、Wasserstein空間が作る距離上の空間に埋め込むというものだった。

    LEARNING WASSERSTEIN EMBEDDINGS

    まとめると

    • wassersteinは計量として優秀。分布の差をうまく表す。
    • でも計算重い。だいたい次元の3乗の計算量
    • うまく近似する関数をディープラーニングで作ろう
    • 近似にはSiamese networkが有効そうだから学習して関数を作る
    • うまく近似できた。理論的裏づけが課題。

    使ったのはSiamese network。距離学習によく使われる。

    f:id:imslotter:20171223194521p:plain

    2つのネットワーク\phi,\psiを用意して、パラメータの更新は

    • \phiで変換されたベクトル同士のの二乗誤差と、Wasserstein距離の差を近づけるように
    • \psi\phi(x)xの誤差(再構成誤差)を小さくするように

    行う。今後、リッチな空間で、計算量がネックになる場合は、このようにニューラルネット空間の計量を近似するような手法が主流になるかもしれない*9

    まとめ

    今日は、かなり基礎的な内容になった。 個人的には、このレベルでの新しいアルゴリズムが今後出てくるのではないのかなと思っている。基礎的なところからの変更は、ドラスティックな変革を引き起こすことが多いので。今後も随時追っていきたいと思う。

    いよいよあと2日。明日は、これで本サイトで書いてきたデータ分析/機械学習に関する内容を総まとめしたいと思う。必見です!ではでは。

    *1:空間、計量、測度論...ムリ...

    *2:極座標を除く

    *3:マンハッタン距離

    *4:長くなるので割愛。詳しくはこちら

    *5:物理用語ではこういう。

    *6:証明

    *7:リプリゼンタ定理という

    *8:深層学習 (機械学習プロフェッショナルシリーズ)などを参照

    *9:と、個人的に注目している

    【Day-22】データ分析技術で仮想通貨の暴騰・暴落を捉えられるか

    f:id:imslotter:20171222012923p:plain

    データ分析ガチ勉強アドベントカレンダー 22日目。

    今日は、データ分析の練習も兼ねて、ちょっとした実験!! 対象は最近話題の仮想通貨。 乱高下の激しい通貨に対して、データ分析技術がどこまで通用するかと言うのを検証してみる。

    使う技術 : Change Finder

    change finder とは、データマイニングによる異常検知に出てくる、変化検知の技術。

    ざっくりいうと、データをある時系列モデルで予測し、そこからの変化具合を評価する手法

    全体の流れ

    1. 窓幅kで時系列モデル(ARモデル)を用意してSDARアルゴリズム(忘却型学習アルゴリズム)で学習する
    2. 上記の時系列モデルp_{t-1}に対して、時刻tでの異常値スコアを次のように算出
      • Score(x_{t})=-\ln{p_{t-1}(x_{t}})
      • もしくはヘリンジャースコア(参考)
    3. 幅Tのウィンドウを設けて、スコアの平均を計算する(smoothing)
    4. 平滑化された時系列データy_{t}に対して、再度ARモデルを用意してSDARアルゴリズムで学習する
      • 時刻t-kからt-1までの値で、それ以降の時系列を予測するモデルq_{t}が完成する
      • T'のウィンドウを設けて、スコアの平均を計算する(下式)
      • Score(x_{t})= \frac{1}{T'}\sum_{i=t-T'+1}^{t}\left(-\ln{q_{t-1}(y_{t}})\right)

    ポイントは、2回学習しているところ。一回目のsmoothingで、ノイズに反応した外れ値の除去を行っている。 そのため、本質的な変動を捉えられるようになっている。

    SDARで設定する忘却パラメータはかなり大事で、どのくらい過去の影響を重視するかに関わってくる。これについては後で見てみる。

    ライブラリ

    何気なく「changefinder python」で調べると、作っている素晴らしい人がいた。

    changefinder - Argmax.jp

    なので拝借。上記ページにも書かれているように、numpy, scipy, nose, statsmodelsは必要

    pip install changefinder

    で入る。二種類のアルゴリズムが用意されていて、通常のChangeFinderと、ARモデルをARIMAモデルに変更したChangeFinderARIMA *1

    ChangeFinder

    changefinder.ChangeFinder(r=0.5,order=1, smooth=7)

    主要パラメータは下記の通り

    • r : 忘却パラメータ
    • smooth : 外れ値スコアをsmoothingするための区間
    • order : 時系列モデルの次数

    実験に使うデータ

    • 12/13-12/21の仮想通貨の価格データ ((githubcoindata.csvに保管している))
    • 草コインも含めて868銘柄のデータを10分おきに保管している

    データの集め方については以前記事にしたAPIを使っている。

    コード

    詳しくは、githubに上げている。 github.com

    銘柄を指定し、changefinderにかけてグラフ表示するまで

    コードをみる
    %matplotlib inline
    import changefinder
    import pandas as pd 
    from datetime import datetime as dt
    import matplotlib.pyplot as plt
    import numpy as np
    import os
    
    
    def str2datetime(tstr):
        if tstr.__class__.__name__ == "datetime":
            return tstr
        ts = tstr.split(".")[0]
        return dt.strptime(ts, "%Y-%m-%d %H:%M:%S")
    
    def calc_cf(name, df, cf, threshold=30):
        values = df[name].values
        scores = np.array([cf.update(value) for value in values])
        print(scores)
        # 描画
        fig, ax1 = plt.subplots(figsize=(15,5))
        ax1.set_title(name)
        ax1.plot(df.index, scores,color="red")
        ax1.set_ylabel("anom_score")
        ax2 = ax1.twinx()  # 2つのプロットを関連付ける
        ax2.plot(df.index, df[name].values)
        ax2.set_ylabel("value")
        # しきい値越えリスト
        df["score"] = scores - threshold
        for i in range(1,len(df)):
            if df.iloc[i-1]["score"] < 0 and df.iloc[i]["score"] >= 0:
                print("time:{}".format(df.iloc[i]["timestamp"]))
                ax2.plot(df.index[i],df.iloc[i][name],"o")
        plt.show()
        return df
    
    cf = changefinder.ChangeFinder(r=0.01, order=1, smooth=3)
    df = pd.read_csv("coindata.csv").dropna()
    df.index = df.timestamp.apply(str2datetime)
    calc_cf(name="btc",df=df, cf=cf, threshold=15)
    

    実行結果

    r=0.01, order=1, smooth=3 で実行してみた。結果がコチラ

    ふむ、一見よく捉えられているようにも見える。 でも、実際はそんなに簡単じゃない

    パラメータによる違い。

    r=0.01, 0.02, r=0.05で試してみる。結果は↓

    r グラフ
    0.01
    0.02
    0.05

    忘却パラメータに関しては、与えるパラメータによってかなり変わってくる。 センシティブなので、ナゾの場所で変化検知する場合もあり、シビアな調整が必要そうだ。

    また、r=0.01, order=1は固定で、smoothを3と18で比べてみた。

    smoothing グラフ
    3
    18

    やはり平滑化をしすぎると、反応は遅れるのだなという感じ。しかし、結構変化に敏感に反応はできているという印象を受けた。

    注意したいのが、グラフの縦軸は全然値が変わっているところ。この辺のしきい値の調整もシビアそう。

    結論

    暴騰暴落を捉えられたか?

    • 正直微妙
    • ピークが捉えられたとして、少し反応が遅れると暴落に飲み込まれる
    • 後述するパラメータ調整がシビアすぎる印象

    って感じ。正直、強いトレンドを見るならボリンジャーバンドでいいのでは?って思った。 そう思って、ボリンジャーバンドでもトレンド検知をしてみた。結果がこれ(赤が買いトレンド、青が売りトレンド)

    若干ミスってはいるものの、トレンドを割と追従できてる気がする。真ん中の2点は要らないけど、超安定してたから仕方ない気もする。sigmaの絶対値でしきい値設ければ弾けそう。 これもパラメータ調整が難儀ではあるが、changefinderよりも直感的になので、やりやすそう。

    モデルに関して

    • 特に忘却係数の調整がシビア
    • 基本的に反応は早めだが、smoothing次第で遅れる。ノイズとの兼ね合い
    • スコアもパラメータによって変わるので、相対的な判断が強いられる

    あたりが難しそうだなと思ったところ。探索的に調べたが、なかなか直感にバシッと合うようなものは見つけられなかった。 パラメータの調整方法としては、Day15で書いたベイズ的最適化を使ってやってみるのも面白いと思うので、もうちょっと良いパラメータを見つけたいトコロ。

    *1:ARIMAは計算が重い&非定常な時系列に対して時間窓を区切ってARIMAモデルを独立に作成しているので、モデルの妥当性は不明とのこと。

    【Day-21】統計的異常検知/変化検知の基本をまとめる

    f:id:imslotter:20171221005033p:plain

    データ分析ガチ勉強アドベントカレンダー 21日目。

    世の中のデータ分析のニーズは、何らかの異常を発見したいというところに多くある。 機械で言えば故障を検知する、マーケティングで言えば流行を発見する、株価で言えば相場変動を見つける...

    普通と違うことを発見する技術、それが「異常検知/変化点検知」 今回は下記二点の本を参考にしながら、異常検知とは何か?変化点検知とは何か?をぎゅっとまとめる

    データマイニングによる異常検知

    データマイニングによる異常検知

    異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

    異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

    異常検知と変化検知

    データマイニングによる異常検知では、確率モデルの違いに重きをおいて異常検知を分類している。

    機能 入力対象 確率モデル 検出対象 応用
    外れ値検知 多次元ベクトル 独立モデル
    (ガウス混合分布、ヒストグラム)
    外れ値 不正検出
    故障検知
    変化点検出 多次元時系列 時系列モデル
    ARモデル等
    時系列の急激変化 攻撃検出
    障害予兆検出
    異常行動検出 セッション時系列 行動モデル
    隠れマルコフモデル
    異常行動パタン なりすまし検出
    不審行動検出

    異常検知と変化検知では、データの性質から異常検知を分類している。下図のように

    • (左上)ほかと比べて値が異なる(外れ値)
    • (右上)前後の時系列と比べて値が異なる(時系列的外れ値)
    • (左下)振る舞いが変化している(変化点)
    • (右下)外れ値と変化点が同時に起きている(異常部位検出)

    f:id:imslotter:20171221040958p:plain

    タスクによって、使うアルゴリズムも変わってくる。

    『統計的』異常検知とは

    統計的 = データが裏で、ある確率分布で動いていることを仮定

    もうすこし噛み砕いて言うと、

    1. 自分が観測した情報から、"このシステムはこういう動き方をする"というのを統計的に推測する
    2. 統計的な推測から、どのくらいずれているかを統計的に算出する。

    学生時代を思い出してみる。みんなの平均点が30点なのに、一人だけ100点だったらヤバい。なぜヤバいのか。それを論理的に説明するために、 平均点周りで点数がイイ感じに散らばっているという仮定を置く。イイ感じの分布の一つが正規分布で、ソレを元に、定量的にどのくらいヤバいのかを計算していく。

    異常度の算出

    さっきの例のヤバい定量的に表すことができれば、どの程度異常なのかがはっきりと分かる。 方法は、ラベル付きデータと、ラベルなしデータで違う。

    ラベル付きデータ

    ラベル付きデータの場合は、下図の様に正常・異常共に分布を描くことが出来るので、正常の確率分布と異常の確率分布の値の比から、新しく入力したデータを正常/異常を判定することが出来る。

    これをネイマン・ピアソン決定則といい、次式で表す。

    {\ln{\frac{p\left(x' | y=1,D\right)}{p\left(x' | y=0,D\right)}}}が所定のしきい値{\tau}を超えたら異常

    この決定則は、正常な標本の精度を保ったまま、異常標本の精度を最大化するという条件付き最大化により数式で計算できる。 計算方法に関してはコチラの記事が詳しい。

    ひとことで言うと、ラベルデータの異常判定は正常/異常の対数尤度比から判定できるということ

    ラベルなしデータ

    多くのデータは正常が圧倒的に多くて、異常が少ない/無い。この場合、異常の分布が出せないので、全体のデータから判定する。 ありふれた観測値より「珍しい」観測値を得たほうが得られる情報量が大きいので、それを数式で表すと、対数尤度の負の対数になる。

    \mathbf{x'}に対する異常度a(\mathbf{x'})
    a(\mathbf{x'}) = -\ln{p\left(\mathbf{x'}|D\right)} で表される。

    統計分布で分ける異常検知

    基本的な異常の計算は上記のように、確率分布を仮定し、対数尤度を求めて計算する。

    問題は確率分布pをどうするか。いつもデータがきれいな正規分布とは限らない。 下記に、主要な分布と性質、計算方法をまとめる

    分布 性質 計算方法
    正規分布 単純な分布、大数の法則に従うようなデータには基本使えるので汎用性が高い ホテリングのT2(参考)
    混合分布モデル 分布の山が2つ以上あるようなデータに適用できる。厳密計算が出来ない EM法による近似計算(参考)
    経験分布 分布を仮定せず、データから分布を作る。複雑な形を作れる一方で、データに左右されすぎて非直感的な結果になることも。 k近傍法/LoF (参考)
    ガウス過程 入力と出力が同時に観測できる場合ガウス過程により、関数を確率モデルで近似して異常検知に用いることが出来る ガウス過程回帰(参考)
    ミーゼス・フィッシャー分布 方向データ(長さ1で方向にだけ情報がある)に対する分布、自然言語などに対して用いられる 積率法(参考)

    時系列データの異常

    時々刻々と変わるものに対しては、概ね下記のような手法で変化検知を行っていく

    • 一定の窓幅をとって、誤差を出す
    • それをスライドさせながら、誤差を足していく
    • ある閾値を累積の誤差が超えたところで異常

    誤差に関して

    • 時系列モデルを作って予測してからの誤差 (参考)
    • 少し前の分布との誤差 (参考)

    の二種類がある。

    まとめ

    他にも、密度比推定や、AutoEncoderを用いた異常検知など、まだ色々と異常検知手法はある。 今日のまとめとしては、基本的に

    • 分布をつくり
    • 分布の誤差を計算して
    • しきい値を超えたら異常

    の流れ。分布の作り方、誤差の計算の仕方にバリエーションがあるというイメージ。 異常検知は何かとすることが多いタスクなので、どういうときに何を使うかまで、把握したいところ。

    明日は、変化点検知を実際のデータでやってみたいなと思う。ではでは!

    PROCRASIST