Pythonで文字列処理〜大文字小文字全組み合わせを作る

f:id:massox:20210220201223p:plain

記事の内容

タイトルどおり

背景

オンラインコミュニティで(NLPに関するプロジェクトでの)専門用語の辞書作りどうやって楽にできるかなぁって話がきっかけ。

(簡単な)表記ゆれぐらいなら吸収できそうですよね、という話になった。

機能

入力文字列の大文字小文字の全パターンを作成し、リストとして返す。

実装

Google Colab で動かす

import itertools

def get_unique_list(seq):
    seen = []
    return [x for x in seq if x not in seen and not seen.append(x)]

def case_ch_flgs(input_text: str="") -> list:
  if input_text == "":
    return None
  ch_flgs = []
  tl = len(input_text)
  for i in range(tl):
    flg = [1] * (i+1)
    flg.extend( [0] * (tl - i - 1) )
    flg_prm = list(itertools.permutations(flg))
    flg_prm = get_unique_list(flg_prm)
    ch_flgs.extend(flg_prm)
  return ch_flgs

def text_data_augmer(input_text: str="") -> list:
  """テキストデータ拡張
  """
  if input_text == "":
    return None
  # 大文字小文字の全組み合わせを作る
  ch_flgs = case_ch_flgs(input_text)
  
  _lower = input_text.lower()
  _lower_chrs = [c for c in _lower]
  
  # 全組み合わせの文字列リストを作る
  aug_text_arr = []
  for ch_flg in ch_flgs:
    _aug_text = [c.upper() if f == 1 else c for f, c in zip(ch_flg, _lower_chrs)]
    aug_text_arr.append(''.join(_aug_text))
  return aug_text_arr

結果のイメージ

f:id:massox:20210220202642p:plain

所感

  • itertools で順列組み合わせを計算している
    • 話によると more-itertools という便利なやつがあるらしい
  • 今回の実装は再帰で書くともっとスマートに実装できたはず
  • 計算の効率がすごく悪いので、文字列の10文字ぐらい超えるとColab上ではメモリが足りなくなる(クラッシュする)
  • n文字の計算時間は、O(n!)なので、こんなものを仕事で使うわけには行かない😇😇😇

エッセンシャル思考とは何か?

f:id:massox:20210214223217p:plain

はじめに

年明けから最近まで、「やりたいこと」や「やらねばならないと思うこと」が、可処分時間に対して多すぎると感じる日々を過ごしていた。

結論から言うと、この原因のほとんどは、年始の「2021年は○○をやるぞ!」と意気込んで、何にでも手を出し始めたことだと思う。ちょっと気合を入れすぎた。

そこで私は、実は以前から積ん読していた『エッセンシャル思考』という書籍に助けを求めた。本記事では、エッセンシャル思考とは何か?について簡単に紹介できればと考えている。




ずばり

「エッセンシャル思考とは何か」という問いに答える切り口は、いくつもある。ここでは、エッセンシャル思考非エッセンシャル思考の比較から意味を理解してみよう。

非エッセンシャル思考とは、

  • やらなくては
  • どれも大事
  • 全部できる

という思考パターン


エッセンシャル思考とは、

  • 「やらなくては」ではなく、「やると決める
  • 「どれも大事」ではなく、「大事なものはめったにない
  • 「全部できる」ではなく、「何でもできるが、全部はやらない

という思考パターン


これだけ覚えておけば、もう大丈夫な気がする。かなり明確な表現でわかりやすい。短くて覚えやすい。




ちょっと細かい話

前述の3つのポイントについて、筆者は「選択」「ノイズ」「トレードオフ」という3つの章でわかりやすく解説してくれている。せっかくなので、それらを簡単にまとめてみる。

この本では、至るところに心くすぐるパワーワードが散りばめられているので、それらを拾っていく感じでまとめよう。


選択〜選ぶ力を取り戻す

選ぶ能力は誰にも奪えない。ただ、本人が手放してしまうだけだ。

本書では、「早い段階でタフな選択を行い、後の些末な選択に時間を奪わせるな」と繰り返し述べている。本ワードは、その最初の部分である。今回の私のように「あれもやらないと、これもやらないと」という状況のとき、選ぶことから目をそむけている気がする。実際私は、そうだったと思う。選択肢は奪うことはできても、選ぶ能力(自由意志)は誰にも奪えない。これはとても勇気をくれる言葉だと感じた。自由意志を大事にしたいと思った。


エッセンシャル思考の最初の一歩は、「選ぶ」ことを選ぶことだ。

自分の自由意志を大切に、選ぶことを選べば、他人の選択(あるいは、自分自身の過去の選択)を黙々と実行する自分から開放される。選ぶ権利を大切にし、他人に自分の人生を決めさせないことが重要だ。

決して、「わがままになれ」という意味ではないと思うが、その境目は曖昧な気もする。本書を読んで、「わがままになればいいんだ」と解釈する人もいるかもしれない。


ノイズ〜大多数のものは無価値である

重要な少数は些末な多数に勝る

有名な「80対20の法則(パレートの法則)」のお話である。成果の80%は20%の努力に起因するという説である。やがて、この仮説を元に品質管理の分野において、「決定的に重要な少数の法則」というものが唱えられた。これは、問題のごく一部の改善が全体の品質を大きく改善させるという話である。


ほとんどあらゆるものは、徹底的に無価値である
by ジョン・C・マクスウェル

これはなかなか強い言葉だと思う😅(ちょっと言いすぎかなと思うぐらい)ただ、後の世に語り継がれる言葉というのは、力がこもっているもの。多めに見ておこう。着目すべきは、「ほとんどが無価値だ」という部分ではなく、(行間の)「ごく少数の価値あるものを見つけよ」という言葉だと私は解釈した。


トレードオフ〜何かを選ぶことは何かを捨てること

完璧な答えなど存在しない。あるのはトレードオフだけだ。
by トーマス・ソエル

本書の中で、トップクラスに好きな言葉だ。実は最近、キャリア選択で悩んでいる方にこの言葉を贈ってドヤ顔をしたというエピソードがある。けど、ここで語るのはやめておく。自分もそうだが、「すべてを叶えられる手段や選択肢が(まだ気づいていないだけで)どこかにあるのではないか?」と考えてしまうことがよくある。特に大切にしたい複数のことを天秤にかけなければならなくなったときだ。まさに「タフな選択」が必要なとき。そういう時にこの言葉を覚えておくと、ある種のバイアスから逃れられるような気がする。「すぐに何かをあきらめる」という意味ではないと思うので、そこは間違えないようにしたい。


「顧客、従業員、株主の皆様をもっとも大切に考えます」というステートメントも見かける。みんなを優先するのは、誰も優先しないのと同じだ。

耳が痛い。なんか聞き覚えがあるな。特に「みんなを優先するのは、誰も優先しないのと同じだ。」という部分。


エッセンシャル思考の人は、(中略)「何をあきらめなくてはならないか?」と問う代わりに「何に全力を注ごうか?」と考える。

何かを捨てて、何かを選ぶという同じ行動をとったとしても、心の中でどう考えるかでその後の行動も変わってくるのではないかと私は考える。何かを捨てたことを「後悔する気持ち」よりも、何かを選び「大切にするという決意」に目が向くからだ。




おわりに

昨年の秋頃、この本を手に取りざっと読んだとき「なるほどね、そうだよね。わかるわかる。自分は実践できてるな」と感じたのを覚えている。当時は、結構余裕があったからだと思う。そしてここ最近は、(大したものではないけど)苦境に立たされてい訳だ。状況が変わると人間の心や考え方は変わるものだなぁと感じた。その本を「手に取るべきときに手に取れる」状態にしておいたという意味では、積ん読にしてたのは悪いことではないよね。(え?)


メタ思考とは何か?いつ役に立つのか?

今回は、「メタ思考」というトピックについて、自分なりに感じることを簡単に整理したいと思います。

(読むのに必要な時間:約5分)


メタ思考とは何か?

メタ思考とは何でしょうか?


まずは、言葉の意味から考えてみます。メタ思考とは、「メタ」な「思考」のことです。

それでは、「メタ」とはどういう意味でしょうか?以下、Wikipediaの引用です。

「あとに」という意味の古代ギリシャ語の接頭辞。 転じて「超越した」、「高次の」という意味の接頭辞で、ある学問や視点の外側にたって見る事を意味する。 「変化」を意味する接頭辞。例えばmetamorphose(変化)、metabolism(代謝)などで用いられる。


言葉の意味を純粋に考えると、ある視点の外側に立って思考することと言えそうです。


一般的には、「一つ上の視点から思考する」などと表現されます。(参考

わかりやすくなるように下のような絵を描いてみました。


f:id:massox:20210203015152p:plain

私たちは見聞きした情報に対して、思考する訳ですが、その思考に対してさらに思考するというイメージを私は持っています。 例えば、「失敗Aの原因はBである」と考えている場合、「じゃあ、その根拠は何か?なぜそう考えているのか?」と思案を巡らせる行為がメタ思考です。


思考とメタ思考の対応関係は以下のようになるでしょう。


  • 「失敗Aの原因はBである」=思考
  • 「『失敗Aの原因はBである』と考える根拠はCである」=メタ思考

メタ思考の具体例

先ほど挙げたのは、「失敗の原因分析」というメタ思考活用シーンの一つです。ここでは、もう一つの活用シーンとして、「前提を見直す」という事例を挙げましょう。


例:前提を見直す

「Xという事実をみて、Yという仮説を立てた」時に、「その仮説は妥当か?と考える行為」がメタ思考です。


先ほどと同じように対応関係を書くならば、以下のようになるでしょう。


  • 「Xという事実に基づくと、Yという仮説が立つ」=思考
  • 「『Xという事実に基づくと、Yという仮説が立つ』は妥当ではない。なぜなら、Yという仮説はXが前提条件Zを満たす場合においてのみ成り立つものであり、今は前提条件Zが成り立っていないからである。」=メタ思考

といった形になります。

終わりに

今回挙げた「前提を見直す」「失敗の原因を分析する」は、いずれも探索的な要素の強い仕事において、成果を出すために重要なことだと感じます。(これは私の解釈です)


前提を見直すことができないと、容易に本来の目的とはかけ離れた施策打ってしまうでしょう。議論も発散しがちになります。失敗の原因を分析できないと、トライアルから得られた結果を元に適切な改善策が見つけられません。


私はこれまで、前提条件の整理ができていない or 忘れていることが原因で、どんどん議論が脱線していってしまう現場や失敗に対して表面だけしか見られていない(真の原因を特定できていない)為に的外れな対策しか打てない現場を見てきました。いずれもメタ思考力が不足していたことが原因の一つと言えると思っています。

現代のように、不確定性の高い事柄、かつ様々な要素が複雑に絡み合った事柄を扱わねばらないシーンが多いと、これらの能力が求められることも多いと感じるのです。

尤度と最尤推定がいつも分からなくなる君へ

わたしは、数学がめっちゃ苦手です。どれぐらい苦手かというと、大学入試の二次試験で数学250点満点中60点を叩き出したぐらい苦手です。わたしは物理学科だったので、周囲の友人は数学強強な人ばかりでした。点数開示のときに数学の点数を暴露する勇気がありませんでした。


タイトルの「君」とは、わたしのことです。仕事柄、数学とはうまく付き合っていかなければならない立場にあり、数学苦手マンな自分としては、何度学んでもわからなくなる概念、迷子になる理論がたくさんあります。その中の代表格が「尤度」です。


考えてみたんです。なぜわからないのか。


結論としては、「尤度とは?最尤推定とは?」というその語の意味を理解しようと考えていたからだと思っています。これらの語は、何か問題を解くときに、手法や指標に明確な名前付けをすることで、後々の議論をやりやすくするという狙いが含まれているものと(勝手に)解釈しています。最初にこの言葉が生まれたというより、「こいつに名前つけないとなぁ」となって名付けられた類のものということです。(←わたしの解釈です)


統計学で詰まる時

個人的な考えですが、統計学で詰まるときは、「何が与えられていて、何を解こうとしているのか」がわからなくなっているケースが多いと感じています。


実際のデータ分析業務では、すでに与えられているものは「データ」です。これは、数理統計学の言葉で言えば、観測データ何らかの確率分布モデルに従っている確率変数の実現値の集合などと表現できるでしょう。


そのデータの背景には、何があるのかわかりません。どんな確率分布モデルに従うかもわからないことがほとんどです。


にもかかわらず、統計学の教科書の例題や練習問題はそういった状況を容易に無視します。確率分布モデルがすでに分かった状態で、いきなり「期待値を計算せよ」みたいな問題がたくさんあるわけです。概念を理解するための練習問題なので、これ自体は悪いことでもなんでもないのですが、実務において「通常与えられるはずもないもの(データが従う確率分布モデルとか)が平気で与えられてしまっている」ことが、読者を混乱させるのではないかと感じています。特に、わたしのような数学弱々人間は、平気でわけがわからなくなってしまいます。😭😭😭


ということで、ここでは、現実のケースに準えて、最尤推定なるものがいつ登場するのか?を記してみたいと思います。

ここから本題に入ります。

尤度という言葉を使わずに最尤推定を説明する

与えられるもの

現実の課題を解く時、「手元に何があるか」を理解することが重要です。 通常、(分析するぞーとなっている時であれば)観測データが手元にあります。

ここでは、例として日本に生息するアサガオの花弁の長さのデータとでもしておきましょう。 アサガオの花弁の長さが1000件ほどあるとします。


解くべき問題

ずばり、「日本に生息するアサガオの花弁の長さはどのような確率分布に従っているのか」を求めること、とします。


問題解決の糸口〜確率分布の型を決める

問題解決の糸口として、最終的に求めたい確率分布の形の候補を絞ります。ここでは、正規分布モデル(※)という確率分布モデルに従うとしたら…と考えてみます。ここは、解こうとする問題ごとに利用するモデルをヒューリスティックに当たりをつけます。

※…厳密には、今回のような非負で連続な数については、ガンマ分布などを用いるべきですが、尤度の理解に支障なしと考え、簡単のため正規分布を使います



f(x) = \frac{1}{\sqrt{2\pi \sigma^2}} \exp \left(-\frac{(x - \mu)^2}
{2\sigma^2} \right) \hspace{20px} (-\infty < x < \infty)


正規分布を数式で表すと上記のようになります。xは、確率変数(連続値)です。確率変数xが得られる確率はf(x)である、ということを意味しています。練習問題などでは、xが9~10となる確率を求めよ、みたいな問題がありますが、実務ではあまり使わないように思います。ただ、確率密度関数の性質を理解しているかどうかを確認する上では、大切な問題なので、別にディスっているわけではありません。😅


答えを求める〜具体的な確率分布を求める

さて、前項で確率分布モデルを決めることで、解答の候補を絞りました。しかし、まだ答えには至っていません。なぜなら、パラメータが決まってないからです。

確率分布モデルは、あくまでもざっくりした型を表現するもの。具体的な確率分布とするには、パラメータを定めないといけません。下記のようなイメージです。正規分布というモデルを定めたとしても、平均・分散というパラメータ(図中のつまみみたいなもの)を調整して、最終的にどういう分布を採用するのか具体化する必要があります。じゃあ、このパラメータは一体どうやって決めればいいんだ?ってなりますよね。

f:id:massox:20210125185700p:plain

この時、パラメータを定める手段の一つが最尤推定です。



最尤推定を考えついた人(誰か知りませんが)はこう考えた訳です。 「平均○、分散△のときに、手元の1000件のデータが観測されうる確率を求め、その確率が最大になるような○と△を最適であるとみなそう」これこそが最尤推定という方法です。


ちょっと、数式でも書いておきましょうか。

1000件のデータは、{x_1, x_2, ..., x_{1000}} と表すものとすると、平均○、分散△のときに、手元の1000件のデータが観測されうる確率は、以下のように表現できます。


L({\mu}, {\sigma}) = p(x_1 | {\mu}, {\sigma})\times p(x_2 | {\mu}, {\sigma}) ... \times p(x_{1000} | {\mu}, {\sigma}) \\


パラメータがμ、σという条件の下で値が {x_i} となる確率(p(x_i | {\mu}, {\sigma}))をひたすら掛け合わせていきます。 余談ですが、1以下の確率という値をこれだけ何個もかけ合わせたら、めちゃくちゃ小さい数になりますよね?なんで普通に計算すると、やりづらいんです。コンピュータ計算するときとかも。なので、対数をとるのが通例です。


名前をつけた方が議論しやすい

さて、最尤推定の説明は終わりました。これで割と頭がすっきりした気がします。


とはいえ、この手法について説明する場合、もっと明快に説明できた方が良いですよね。この手法は「○○を最大化(あるいは最小化)するものである」みたいな感じで。この○○に該当するものが、評価関数とか目的関数とか、いろんな名前で呼ばれる概念です。

今回の評価関数は、「平均○、分散△の時に、手元にある観測データ(N個)が観測されうる確率」です。これを尤度(likelihood)と名付けました。

以上〜♬

参考書

結論、データドリブンな意思決定を下せる友達の多い総合格闘家になりたいのかもしれない

この記事は「データ分析人材のキャリアアドベントカレンダー」の23日目の記事です。


はじめに

内容だけさっと目を通したい方は 結論 をお読みください。

この記事は、「主にデータ系職種に携わる場合のキャリア構築アイデア」と「私のキャリアプラン」を紹介することを主題としています。自己紹介をつらつら書くつもりはないのですが、最近以下の記事を書きました。ありがたいことに色々と反応もいただきまして、2020年の良き思い出となりました。

qiita.com


本記事では、はじめに「データサイエンティストとしてのキャリアをスタートさせた契機」を述べ、次に「データ系職種としてのキャリアプランニングのアイデア」を提供し、最後に「私のキャリアプラン(2020/12版)」をご紹介します。



結論

自身の経験を正しく評価し、なりたい人材に求められる知識・経験・スキルを正しく調査し、それらの差をとることで、自分がやるべきことを明らかにしましょう。そのためにDSのスキルやキャリアについての解説記事が役に立つと思います。


私のビジョンというかやりたいことは、「社会に潜む構造的な課題を技術の力で解決し、関係者が無為な作業から解放され、よりクリエイティブでワクワクすることに集中できる社会」の実現です。(長い)私は、「データドリブンな意思決定を下せる、頼れる友達の多い、総合格闘家になることで自身のビジョンを実現しようと思っています。


そのために必要なことは、大きく2つあると考えています。1つ目は、(運に左右されますが)実務を通して走りながら学び、専門知識を手に入れつつ、業務外での勉学を通して、浅い知識を手に入れつつ、知見の深さと広さを向上させる。2つ目は、自身の能力を生かして人のためになることを実行していく、自分のビジョンを語る、他者を巻き込んだプロジェクトを推進していく、といった行動です。あとは運に任せます。


データ系職種キャリアスタートの契機

結論から述べますと、私のデータ系職種としてのキャリアがスタートした一番の契機は、「データラーニングギルド」というコミュニティに入ったことだと思います。

data-learning.com

このコミュニティにおいて、データ分析に関わる人から「おすすめ学習リソース」「現場で得た知見」などを学びとりながら、一緒に勉強ができたことがキャリアをスタートさせる上で、最も重要な要素であったと思います。こういう風に書くと、宣伝感が強いのですが(しかも某○○ゼミっぽさを感じる)、実際そうなので仕方ないです笑

まずは、前職の内容を説明したあと、データ系職種としてのキャリアをスタートさせた経緯を説明することにします。


前職は、3Dデジタル地図の製造研究やデジタル地図製造アプリケーションの開発に携わっていました。約7年ぐらいです。 扱うデータは主に、地図計測用車両の計測データです。内容は以下のような感じです。

  • GPS受信機のログ(1Hzぐらい)
  • 産業用カメラによる同画像(メガピクセルクラス)
  • 3Dレーザースキャナ(秒間数百万点取得)とかです。

これらをつかって、センサー同士のログの時刻同期処理や各センサーの理論的な誤差モデルを求めたり実測誤差を計測するための実験計画・推進を行っていました。

技術スタックは、以下のような感じです。

仕事の中で、実験データを分析し、考察した結果をお客様にレポートしていました。そんな中で、技術情報を漁っていた時に見つけたのが「データサイエンティスト」という職種です。そこから、なんやかんや調べていて、データラーニングギルドというコミュニティを見つけて、入ることにしました。2019年の12月のことです。このとき既に2020年夏までに転職することを決意していました。


このコミュニティでは、データ分析人材(になりたい人も含む)が集まっていて、日々分析業務で詰まったことの相談やおすすめ学習リソースの共有がなされたり、勉強会や懇親会が催されたりしていました。前職では、私の周りに「データ分析」に詳しい人は誰もいなかった為、私にとってこのコミュニティはとても貴重な情報源であり、勉強仲間を見つけられる憩いの場でもありました。


そんな中、コミュニティ内でSlackの会話データをつかった分析プロジェクトを立ち上げる話が持ち上がり、(やったこともないのに)私は手を挙げました。今考えると、この瞬間に何かが大きく動いたような気がします。


そこから、Slackの会話データをラングリングするために自然言語処理(の主に前処理技術)を学び、BigQuery上に蓄積されたデータを用いてSlackをインターフェイスとしたレコメンドシステムを作るためにGCPを学び、といった感じで課題解決のために走りながら学んできました。


そんな感じで、コミュニティ内で割と活発に活動しつつ、転職についても相談していた時にコミュニティの代表である村上さん (@GreenGreenMidor) にお声掛けいただいた、というのが経緯になります。


データ系職種としてのキャリアプランニングのアイデア

私の観測範囲内におけるデータ分析に興味を持つ方のバックグラウンド

データラーニングギルド(以下、DLG)に所属してから、多くの方と「どんな経緯でデータ分析に興味を持ったか?データ分析を仕事にしたいと思ったか?」という話をさせていただきました。 その流れで、元々従事されていた仕事というか、その方の(技術的な)バックグラウンドをお聞きする機会がありまして、おおよそ以下のようにまとめられる気がしています。

  • ■ エンジニアリング領域
    • Web系エンジニア
    • ハードウェアエンジニア、IoTエンジニア
    • 製造業の生産技術/生産管理
  • ■ ビジネス領域
  • ■ 先端研究領域・アカデミア領域

広義のデータサイエンティストは総合格闘家

広義のデータサイエンティスト(参考)は、いわば総合格闘家と言えるでしょう。幅広く、深い知見が求められます。

f:id:massox:20201223182428p:plain
データサイエンティストに求められる3つのスキル

先程、挙げたようにデータサイエンティストになりたいと考えられている方は、様々なバックグラウンドを持っています。データサイエンティストに求められるスキルが広い範囲にわたるのならば、自分が得意とする(少なくとも幾ばくかの経験値を持つ)領域がどこかにあるはずです。各々の得意分野を理解して、どこから攻めていけばいいかを考えると良いと思います。格闘技に例えれば、ボクシング出身の人は、キック力、絞め技や寝技の能力を高めて総合力を上げていく、みたいなイメージです。言うは易く行うは難し、ですが。そこを見極めれば、データサイエンティストとしてのキャリアプランニングのスタート地点に立ったといえるのではないでしょうか。


私のキャリアプラン

ここまでの文章で「総合力を上げる」ことばかりを述べている気がしますが、実は私は総合力を上げる戦法はとらないことにしています笑

もう少し正確に言うと、「自分一人の力だけで全ての能力をシニアレベルで保持することは諦めている」でしょうか。

私はどんな人材になりたいか

結論から言えば、「いくつかの専門領域を持ちつつ、他分野の専門家と協調できるような広い技術的知識とコミュニケーション力を持つ者」であり「他分野の専門家との人脈を持つ者」が目指す姿です。(簡単に書いたけど、めっちゃ難しい笑)

2つの観点から、自身のなりたい人物像を考えてみました。


1つ目は技術的興味です。

私が最も興味があるのは、データエンジニアリングの領域です。エンジニア出身というのもあるかもしれませんが、アイデア段階のソリューションを「実現できる力」に魅力を感じます。この領域はシンプルに「面白い!」と思えるので、学習効率やモチベーション維持率が高いと考えており、自身の専門領域の一つにしたいと思いました。


2つ目は人生のビジョンです。

私の人生のビジョンは、「社会に潜む構造的な課題を技術の力で解決し、関係者が無為な作業から解放され、よりクリエイティブでワクワクすることに集中できる社会」を実現することです。これを実現するためには、まだまだデータ分析の対象に含まれていない(私が知らないだけかもですが)領域に手を出していかなければなりません。例えば、介護問題、生活習慣病、環境汚染問題、心の病などです。


これらの課題に相対した場合、データサイエンス力やデータエンジニアリング力だけでなく、ビジネス力もとても重要になってくると思います。説得力のある施策効果の説明、古い枠組みを取り払って、新しい枠組みに移行するプロセス設計など、必要なスキルは様々と思います。もちろん、課題にはチームで取り組むことが多いと思いますので、メンバーと協調するスキルやマネジメントスキルも必要になるでしょう。


このビジョンを叶えるためには、現実のビジネス課題を解決する経験を得ること、他の専門家と(主に分析プロジェクトにおいて)協調できるような人物になることが必要と思いました。また、自分が生涯をかけて解決したいと感じる社会の課題に出会ったとき、協力してくれる仲間を集められるような人脈も大切と思います。


なりたい人材になるために何をすべきか?

さて、前項で述べたような人材になるためには何をすればいいのでしょうか。

大きく分けて2本の柱で進めていく予定です。

  1. 専門性を高める
  2. 人脈を広げる

ざっくりいうと、そうなのですが、それぞれ具体的なアクションを以下に示します。


1. 専門性を高める

専門性の向上方法は、「業務で携わる」「業務外で学ぶ(独学・勉強会など)」という大きく2つあると思っています。


まず、「業務で携わる」について。現在、私は受託分析を行っています。したがって、必ずしも学習したい領域を学べるとは限りません。運に左右されるところもありますが、業務で携わる場合は自学するよりも深い知見を蓄えることができるというメリットがあると思います。実務を通して走りながら学ぶというスタイルは強力です。


次に、「業務外で学ぶ」について。冒頭で述べたように私はDLGというコミュニティに所属しておりまして、仲間内で勉強会や輪読会を開催して、勉強しております。また、座学だけでなく、業務の状況に近い分析プロジェクトを実施し、生のデータを触りながら、システム構築もしながら学んでいます。この場合は、「業務で携わる」とは異なり、自身の学びたい領域を選択できるというメリットが有る一方で、実務よりは得られる知見も浅いものになることは否定できません。


(あくまでも私の想像ですが)ここまでの内容からして、自身の専門領域は業務として携わり、深い知見を得た領域だけになるでしょう。つまり、自身のビジョンを成し遂げるには、一人じゃ無理というのは確かかと思います。前項で示した私のビジョンを成し遂げるには、様々な分野の専門的スキルが必要かなと漠然と考えているからです。なので、トランザクティブメモリーを大切にしたほうが良くて、他の人とコミュニケーションがとれるような他分野の基礎知識と、他分野専門の人を手助けできるような自身の専門知識を携えて、次項の「人脈を広げる」を頑張らなければならないと思うに至りました。


2. 人脈を広げる

最近「GIVE & TAKE」という書籍を読みまして、人脈が広い人の特徴について学びました。その学びと私のオリジナル考察結果に基づいて、人脈を広げる方法を考えてみました。

やることは以下の3つです。

  • 自身の専門性を生かして、誰かを助ける(できるだけWINWINになるような課題解決を)
  • 他者を巻き込んだプロジェクト推進(仕事でなくても勉強会とかでも可)
  • ビジョンを掲げ、発信し、ビジョンの実現に懸命に取り組む
  • あとは、運に任せる

それぞれの説明はしないですが、「ビジョンを掲げ…」については、私のオリジナルアイデアなので、補足説明をしておきます。ビジョンを掲げ、発信することで、「私がどんな人物か、どうなりたいか」ということを周りの人に伝えることができます。もしかしたら、共感してくれる人がでてくるかもしれません。それを期待しています。また、「ビジョンの実現に懸命に取り組む」ことで、本気度が伝わり、共感してくれる人に出会ったときに「一緒にやりたい・手助けしたい」と思ってもらえる確率が上がります。(と勝手におもってます)


あとは、運任せです。ぶっちゃけ人脈とかはコントローラブルではないと思ってますし、今考えてもしかたないこと。先のことだし、運によるもの。であれば、今できることに集中しましょう。ついでに、幸運が目の前を通り過ぎるとき見つけやすいようにアンテナを張っておくぐらいの仕掛けはしておいていいでしょう。(これがビジョンの発信)


最後に、私の好きなアリストテレスの言葉を記します。

快楽は本来、『活動(エネルゲイア)』にほかならず、それ自身目的(テロス)なのである(ニコマコス倫理学より)

ざっくり意訳すると、「将来の目的や計画をいったん忘れ、今この瞬間のやりたいこと、やるべきことに熱中せよ」ということです。

Google Data Portal に入門〜データビジュアライゼーションの基本を少し実践するまで

  • はじめに
  • 1. 今回参考にさせていただく資料
    • できるネットさんの解説記事
    • データビジュアライゼーションの教科書
    • データ視覚化のデザイン
  • 2. 基本操作を学ぶ
    • データポータルのホーム画面
    • レポートの概観を把握する
  • 3. ダッシュボード構築の基本のキ
    • 3.1. データソースに接続してデータを取り込む
    • 3.2. 取り込んだデータを表示する
    • 3.3. データの表示手段いろいろ試す
      • ① 指標に売上目標を追加する
      • ② 日付の順序になるように棒グラフをソートする
  • 4. ダッシュボードのデザイン基本のキを実践
    • 4.1. フィルタを設定してみる
      • フィルタ機能とは何か、何のための機能か?
      • フィルタ機能を扱う
        • ① 複合グラフのフィルタを追加する
        • ② フィルタ設定UIが表示される
        • ③ 所望の条件とフィルタ名を設定してフィルタを保存する
        • ④ フィルタを適用した結果を表示する
    • 4.2. スタイルを扱う
    • 4.3. デザインを意識したスタイル修正
      • スタイル修正の前に〜ビューモードで実際の見栄えを確認する
      • 伝わるデザインにするための9つの色の基本
      • 「色の数は少なめに」を実践
      • 「色相違いの2色使いは要注意」を実践
  • その他

はじめに

直近の業務でダッシュボード構築を経験させてもらえることになりそう。 一応軽くDataPortalを触ったり、DataVisualizationの書籍*1, *2を読んではみました。ですが、業務レベルのダッシュボード構築をするには、まだまだ勉強不足だと思うので、入門してみたいと思います。

できるだけ効率良く学ぶ為に、まず最低限の機能や操作方法を学んだら早速(基礎的な)ダッシュボード作成をやってみる、という流れで行こうと思います。



1. 今回参考にさせていただく資料

できるネットさんの解説記事

dekiru.net

Google Data Portal 自体の解説+BIの基礎知識をきれいにまとめてくださっています。

データビジュアライゼーションの教科書

データビジュアライゼーションとは何なのか、という本質的な内容にはじまり、 データビジュアライゼーションに関する様々な How to が体系的にまとまっている書籍です。

そもそもこの書籍自体が非常に読みやすいです。

インフォメーションデザインを専門にする方が書いているので、当然かもですが笑

アウトラインや色使いなど細かいところが丁寧に作られているので、個人的には電子書籍より紙媒体を推奨します。

この手の本は、電子書籍で読むとせっかく整えられたデザインが崩れてしまうという難点がありますからね。

電子書籍の仕様が今後改善されることを密かに期待しています……

データ視覚化のデザイン

あえて「データビジュアライゼーションの教科書」との比較をするならば、 データビジュアライゼーションに関する Why が体系的にまとまっている書籍と言えるでしょう。

なぜそのような見せ方をすべきなのか、といった情報ですね。

データビジュアライゼーションの教科書同様に、読者が読みやすいようにデザインされています。この本自体がインフォメーションデザインの教科書になりますね。

本書の著者である永田さんは、私の所属するデータラーニングギルドのメンバーでもありまして、 出版前、表紙デザインのアンケートにも携わったことから、個人的に思い入れのある本でもあります。

続きを読む

とある回帰問題の評価指標を考えた話

はじめに

「最近仕事で多次元ベクトル集合を推測する」時の評価指標を考えるシーンがあったので、 備忘録として考えたことを書き記しておく。

実務に関わることなので情報はぼかしている。(故にちょっと抽象的すぎるかも……)

解こうとしている問題

以下のような2次元ベクトル集合を予測する問題

予測には、仮想ロボットが取得した3D点群データや周辺の画像データを用いる。

今回、ここは触れない。

f:id:massox:20200716193927p:plain

(説明変数を省いて)テーブルデータで表現すると

f:id:massox:20200716194004p:plain

みたいな雰囲気になる。

何を評価したいのだろうか?

顧客にヒアリングしてみると、以下のような返答であった。

  • 搭載しているセンサーの性能と補正ベクトルの推定ロジックから、正解ベクトルに完全一致しないのは承知している。つまり、限界値があることは理解している。
  • センサーが取得したデータに問題がない場所については、可能な限り上記限界値付近に収まってほしい
  • ただし、外部環境が要因で適切にセンシングできない場合は、多少大きく予測が外れてしまうところはあってもしょうがない。その場合は、後の工程で手動補正を行う。
  • そのうえで、予測結果に対してOK/NG判定をできるような指標が欲しい。「OK=後工程に流してもよい」を意味する。

f:id:massox:20200718171142p:plain

少し整理してみる。

(おそらく)顧客のやりたいこと

  • 補正ベクトルの自動推定ロジックがどの程度「使える」のかを知りたい
  • 後工程にまわしてもよいかどうかを妥当な基準を用いて判断したい

ポイント

  • 後工程にまわす基準が決まっていない。後工程にまわす基準を考える手助けになる情報があると良さそう。
  • 一つの判断指標として、「センサー分解能と予測ロジックの性質から求められる許容誤差」があると良さそう
  • 一つの判断指標として、「外れ値=後工程で手動補正が必要になりそうなデータ数」があると良さそう
  • 目標値が2段階存在し、データは3つに分類されるだろう
    • 分類①:センサー分解能+予測ロジック的に算出できそうな最高クラスの結果
    • ==========目標値①=============
    • 分類②:悪くはない。後工程で手動補正が必要ではない結果
    • ==========目標値②=============
    • 分類③:外れ値=後工程で手動補正が必要になりそうな結果
  • 目標値①は、推定性能を測る為に利用する
  • 目標値②は、推定性能を測る為+後工程への影響を測る為に利用する

次のアクション

(おそらく)顧客のやりたいこと」を実現する為に

以下のアクションをとることにする。

  1. 補正ベクトルの自動推定ロジックがどの程度「使える」のかを示す情報を提示する
  2. 後工程にまわす基準を考える手助けになる情報を提示する

推定ロジックがどの程度「使える」のかを示す情報を提示する

これは、シンプルに回帰でよく利用される「決定係数・RMSE・MAE」などを用いれば良さそうだ。 評価指標が目標となる値より大きいか、小さいかを見れば良い。


ここでは便宜的に目標値①をL_1、目標値②をL_2とする。 さらに簡単の為、X成分もY成分も目標値は同じものとする。


さて、ここで、目標値①をギリギリ達成するような仮想の推定値Z _ 1は以下のように計算できる。

Z_{1i} = (y_i - L_1)

次に、目標値②をギリギリ達成するような仮想の推定値Z _ 2は以下のように計算できる。

Z_{2i} = (y_i - L_2)

ある指標における目標値を求めたいならば、 上記Z _ 1Z _ 2について、指標値(例えば決定係数R2)を求めれば良い。


(具体例)決定係数 R2 の場合

決定係数の数式は、推定値をY _ i、正解値をy _ i、正解値の平均を\overline{y}とすると、

R^2 = \frac{\displaystyle{\sum_{i = 1}^n {\left(Y_i - \overline{y}\right)}^2}}{\displaystyle{\sum_{i = 1}^n {\left(y_i - \overline{y} \right)}^2}}

と表現できる。


したがって、上記 Y _ iZ _ {1i} を代入すれば目標値①が、 Y _ iZ _ {2i} を代入すれば目標値②が求められる。

すなわち

R^2の目標値① = \frac{\displaystyle{\sum_{i = 1}^n {\left(Z_{1i} - \overline{y}\right)}^2}}{\displaystyle{\sum_{i = 1}^n {\left(y_i - \overline{y} \right)}^2}}


R^2の目標値② = \frac{\displaystyle{\sum_{i = 1}^n {\left(Z_{2i} - \overline{y}\right)}^2}}{\displaystyle{\sum_{i = 1}^n {\left(y_i - \overline{y} \right)}^2}}


※注:決定係数やRMSEは相対的な値なので、判断指標にするならば使うデータセットは固定しなければならない


一応、外れ値を入れた場合と入れない場合の2パターンの値を計算しておくと良さそう。

レポートするときに両方出せるようにしておくと良いだろう。

後工程にまわす基準を考える手助けになる情報を提示する

自動補正によって全工程の工数をどれだけ削減できるだろうか?といった角度から結果を見ることができれば、

後工程にまわす基準」を考えやすそうだ。今はその情報がないので、作ってやればよいだろう。

具体的には、「外れ値が○件のとき、後工程で追加で発生する整備コストは△である」という関係式を作って上げて、 実験したときの「外れ値の件数」から「後工程で追加で発生する整備コスト」を算出する。


「外れ値の数が○以下であれば良い」を直接判断するのは難しいけど、 「後工程で追加で発生するコストが○円(あるいはOP工数△時間)以下であれば良い」を判断するのは、少し簡単だからだ。

■手順

  1. 外れ値を定義する ※顧客ヒアリングにより決める
  2. 外れ値1つあたりの追加コスト(=手動整備コスト)を算出する ※調査+試算
  3. 外れ値をカウントする
  4. 外れ値の数 × 外れ値1つあたりの追加コスト=後工程で追加で発生する整備コスト


まとめ

結果として、以下の情報を提供することが今の所の結論だ。

  1. R2, RMSE, MAE を外れ値含む/含まないの2パターン算出し、目標値①と目標値②と並べて提示する。
  2. 外れ値の個数と単位コストから後工程で追加で発生しそうな整備コストを提示する。