TalendOpenStudioで実現する無料(無償)のETLエコシステム
全体のアイディア
有償版のTalendはジョブの開発機能だけではなく、複数人で共通開発するための共有リポジトリやジョブ実行ターミナル(定期実行するWebアプリケーションの仕組み)がついている。 *1
僕も以前これを導入して利用したことはあるが、安定していて良い製品でした。*2
ただ、安い物ではない*3ので、無償版Talendを使ってETLジョブを作った人も、その後本番導入用途で使うのに悩む事も多いのではないだろうか? 僕の今の会社のシステムでは
で代用している。今のところ十分これで出来ている。
ジョブの定期実行機能
RundeckはWebプリケーションベースの定期実行ツールで、crontabを超高機能にしたようなものである。 crontabに比べて、エラー通知機能、Web上からの手動実行機能、過去の実行ログ閲覧機能など重要な機能は一通りあると思う。 TalendOpenStudioで作成したジョブはZIP形式でエクスポートして、Rundeckをセットアップしたマシン(AWSのEC2のAmazonLinux版であるがオンプレのLinuxサーバでもOKでしょう)の適当なディレクトリ上に解凍。ジョブ実行のシェルスクリプトをRundeck上で指定して、実行している。 Rundeckはコンポーネントを追加すれば、Webhookを指定してSlack上にジョブ開始時、完了時、失敗時にメッセージを送る事が可能なので、これで実行結果を検知できる。 欠点としては、Talendで開発したジョブの自動配置が出来ないので、どうしても
- Talend上でジョブをエクスポートしてZIP圧縮
- 実行サーバに転送(SCPなど)
- 解凍
- ジョブのパスをRundeckに新たに登録
という手間が必要になる。毎日たくさんのジョブを配置、実行しなければいけないような状況は自分は今のところはないので、これが手動でもそんなに手間ではない。
リポジトリ
筆者はデータエンジニアとして一人で開発をしているので、必須ではないのだが、複数人での開発している場合では共有リポジトリにジョブの保存は必要であろう。 (ソースコードの管理やバックアップ的な観点からも) TalendOpenStudioのジョブをGitで保存出来るか検証してみた。
Talendを使う時に「ローカルプロジェクト」を設定するとそのプロジェクトの中身の実体が設定したディレクトリ以下にできるはずである。
デフォルトであれば、Talend本体を解凍したディレクトリ以下にworkspaceというディレクトリがあるはずで、そこ以下にプロジェクトのディレクトリができる。
このディレクトリをGitの管理下に置けば、複数のマシンでリポジトリ的に共有できる。 注意点は以下
- プロジェクト名(=プロジェクトが置かれるディレクトリ名)は各マシンで共通にする。ディレクトリ名はプロジェクト名を全て大文字に変換したものになるようである。
- 利用するTalendのバージョンはマイナーバージョンまで同じにすること。Talendの仕様で「古いバージョンで作ったジョブは新しいバージョンに引き継げる」が逆は出来ないため。(Talend自体のバージョンアップは複数台同時にしたほうがいい)
- 変更前後で管理している設定ファイルのdiffを見ても正直、どこをどう変更したのかはわかりにくい。。(ので 、単なるバージョン❝保持❞ツールと割り切ること)
- AWSのコンポーネントを使う場合など、追加ライブラリのインストールが前提となっているジョブの場合、それは自動インストールされないので、適宜Talend環境ごとにインストールすること。
ジョブを一つ作成すると
- 「ジョブ名_バージョン番号.item」
- 「ジョブ名_バージョン番号.properties」
- 「ジョブ名_バージョン番号.iscreenshot」
というファイルができます。主に最初の2つがジョブの設計情報をXMLで持っているようですね。
自分の会社の分析システム
現在、自分が所属している会社のシステムの概略について書いておく。
使用しているデータベース
Netezzaを利用しているがRedshiftにリプレースを進行中
利用ツール
が中心。その他チーム外への簡易な分析プラットフォームとしてごく一部RStudioのShinyとTableauを使用
外部データソース
主にTreasureData。その他、独立したシステムからCSV,TSV形式でファイルを定期的に持ってくるなど。
データ取込バッチ
- TreasureWorkflow(digdag)
- Talend
- Rundeck を採用。
TreasureWorkflowはTreasureDataとの親和性が高い。 とりあえずI/OにTreasuredataが関わる部分に使っている。 (今後digdagを採用して、範囲を拡げていきたい)
TalendはオープンソースのETLツールでかつ、ある程度混み行った複雑な成型や処理も出来るため。 作成したバッチの動作だけならJavaさえ入っていればどこでも動くのが良い。(実行環境にTalendのインストールは不要) ある程度、どんなDBにでも対応できる。
RundeckはTalendで作成したジョブを定期実行させる仕組み。端的にいうと、GUIで超便利なcrontab。crontabでバッチ管理をしていて、複雑になってきて困っている、、、というユースケースに最適。
Rundeck系情報まとめ
自分の会社のシステムでは一部Rundeckを採用している。 主に今までcrontabでキックしていたものを管理しやすくするためである。
cronで不満だった点
- そのままではジョブが実行中なのか、完了したのか、異常終了したのかが把握しにくい点(別途ログ出しや監視が必要になる)
- 失敗して再実行するオペレーションが面倒(サーバにログインしてコマンドを叩いて実行する必要有)
cronに比べた利点
- 実行履歴が残る(実行時間も記録される)
- GUIで実行履歴を調べれる。
- GUI(Webブラウザ)で手動実行できる。(休日深夜の対応がしやすい)
- 障害時や完了時などにメールやSlackへの通知を飛ばせる。(cronはデフォルトのメール通知があるがほぼ使われていない)
- ある一定以上の時間がかかっている場合に通知を飛ばすことができる。
- 障害時にリトライができる
- 直近の予定時刻がわかる(たとえば、crontabだと一分後に実行させたいつもりで記述しても、記述ミスで一分後に実行されていなかった、、、ということもあるが、Rundeckだと大丈夫)
自社の環境
AWS利用(AmazonLinuxのEC2) Webサーバ用のEC2(t2.medium)とジョブ実行用のEC2(r4.large:こちらはメモリをやや多めにしている)を別に立てている。 今後ジョブが増えてきたら、ジョブ実行用のEC2を増加予定。 メタデータはMySQLのRDSに保存。
/etc/rundeck/rundeck-config.properties と /etc/rundeck/framework.properties を色々書き換える必要あり。(後述のサイト参照)
有用な情報サイトまとめ
dev.classmethod.jp 基本的にここのサイトの通りにセットアップ。JDKは1.8系の最新のを利用
やった設定
実行ログが大量になってくるとパフォーマンスが落ちるらしい。
上記サイトに従い、ALTER INDEX文をDBで実行して、管理テーブルにインデックスをはった。
もしくは、
Rundeck はじめました - ゆるふわカウンターアタック の 「ジョブが増えてくるとDBサーバーがCPUリークする」という記述を参照
あと、Web画面での管理作業実行中にすぐにタイムアウトになって不便なため
Faq · rundeck/rundeck Wiki · GitHub の How do I change the default session timeout duration? を参考にして、 長い時間に設定した。
brewでawsのcliをインストール
ずっとWindowsを使っていたエンジニアがMacbookを支給されたので、開発環境構築中 以下でインストール可能でした。
brew install awscli
インストールしたあとはコマンド保管されるように以下のコマンドを打ちましょう。 (.bash_profileにも追記する事)
コマンド補完 - AWS Command Line Interface
ログは以下
[~]$ brew install awscli Updating Homebrew... ==> Auto-updated Homebrew! Updated 1 tap (homebrew/core). ==> New Formulae apm-server bedtools cling ddgr dnsdist glslviewer kubeless mongodb@3.4 neal raylib vert avimetaedit chamber clingo dislocker envconsul joplin libidn2 mrboom node@8 sceptre ==> Updated Formulae git ✔ exploitdb imapfilter mujs rtv openssl ✔ faas-cli instead nano rust pyenv ✔ fabio iso-codes nasm rustup-init abcm2ps fail2ban jenkins natalie s-nail abcmidi fcitx-remote-for-osx jenkins-lts nativefier s6 ace fd jhipster ndpi sbcl ack fdroidserver jruby nghttp2 sbt acmetool ffmpeg just nmh scalariform advancemame fibjs kibana@5.6 node scamper adwaita-icon-theme filebeat knot node-build sdl2_mixer agedu firebase-cli kompose node@4 securefs amazon-ecs-cli fish kontena node@6 selenium-server-standalone angular-cli flow kops nodebrew sfk ansible fluent-bit kotlin notmuch shairport-sync ansible-lint fn krb5 nsd shellcheck ansifilter folly kube-aws nss shfmt aptly fonttools kubernetes-cli ntopng shpotify arangodb fpc kvazaar nuget sile armadillo freeling kyoto-tycoon nvm sip artifactory freeswitch kyua ocamlbuild skinny aspcud freetds lbdb octave slackcat ats2-postiats fwup ldc ohcount spotbugs aurora-cli fzf lgogdownloader oniguruma sql-translator aws-sdk-cpp game-music-emu libassuan onscripter sqlmap azure-cli gandi.cli libatomic_ops open-scene-graph sslyze azure-cli@1 gauge libcddb opencbm stormlib b2-tools gegl libcdio openshift-cli stunnel bacula-fd geoserver libcdr optipng suite-sparse bazaar get_iplayer libcouchbase osc sundials bazel geth libdivecomputer osm2pgsql suricata bench ghc libgit2-glib osquery swi-prolog binaryen git-annex libgosu osrm-backend swift bindfs git-ftp libgweather ott swift-protobuf bit git-town libhttpseverywhere packer swiftformat blink1 gitbucket liblcf packetbeat syncthing blockhash gitlab-runner liblinear packmol sysbench bluepill gjstest libmaxminddb paket tarantool bmake glade libmicrohttpd pandoc tasksh brotli glog libmspub parallel tectonic btfs glpk libphonenumber passenger telegraf bwfmetaedit gmic libqalculate payara termius byobu gmime libquvi pazpar2 terraform bzt gnome-recipes libraw pdftoedn terragrunt cabal-install gnuplot librdkafka pdftoipe tgui carthage gnuplot@4 librealsense pdns thefuck cassandra@2.2 goffice libsass pdnsrec thrift ceres-solver gopass libswiften peco tidy-html5 certbot gosu libtcod pegtl tinyxml2 chakra gperftools libtensorflow percona-server@5.5 tippecanoe charm gradle libtiff percona-server@5.6 tmuxinator-completion checkstyle gradle-completion libtins phoronix-test-suite tor chromedriver grails libunistring pilosa tracebox citus grakn libuv pinentry traefik clang-format graphicsmagick libvirt pioneer treefrog clhep groonga libvisio planck twarc clojure grpc libwps plzip uncrustify cockroach gsoap libxc pngquant urh coffeescript gst-editing-services linkerd polyml vcdimager commandbox gst-libav little-cms2 poppler vim conan gst-plugins-bad lldpd ppsspp vips conjure-up gst-plugins-base logstash pqiv vowpal-wabbit corsixth gst-plugins-good logstash@5.6 pre-commit webp couchdb gst-plugins-ugly lsyncd presto webpack couchdb-lucene gst-python lua protobuf weechat cppad gst-rtsp-server lua@5.1 pulledpork widelands cromwell gst-validate lutok pygobject wireguard-tools curl gstreamer macvim pyinvoke wireshark dcm2niix gtk-doc mame pyqt wtf dcos-cli gtksourceview3 mapnik python-markdown x265 dialog gx mariadb pyvim xmoto diff-pdf gx-go mediaconch q xmrig digdag hadolint menhir qbs xonsh direnv hana mercurial qca xtensor dmd haproxy meson qscintilla2 xxhash dmtx-utils harfbuzz metricbeat qt yaz docfx haskell-stack mgba r ydcv docker-machine-nfs heartbeat micro radare2 yle-dl druid heimdal midnight-commander rancher-cli you-get duck heroku mimic re2 youtube-dl dwdiff hfstospell minio rebar@3 zanata-client efl highlight miniupnpc redis zbar ejabberd html-xml-utils mockserver remake zebra elasticsearch httest mongodb reminiscence zimg elasticsearch@5.6 huexpress mono restic zorba emscripten hugo mono-libgdiplus rocksdb zsh-autosuggestions erlang ibex monotone rom-tools etcd icu4c mpd roswell etsh imagemagick mpg123 rpm exim imagemagick@6 mpv rtags ==> Deleted Formulae clasp geogit gringo lua@5.3 ==> Installing dependencies for awscli: sqlite, gdbm, openssl, xz, python3 ==> Installing awscli dependency: sqlite ==> Downloading https://homebrew.bintray.com/bottles/sqlite-3.21.0.sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring sqlite-3.21.0.sierra.bottle.tar.gz ==> Caveats This formula is keg-only, which means it was not symlinked into /usr/local, because macOS provides an older sqlite3. If you need to have this software first in your PATH run: echo 'export PATH="/usr/local/opt/sqlite/bin:$PATH"' >> ~/.bash_profile For compilers to find this software you may need to set: LDFLAGS: -L/usr/local/opt/sqlite/lib CPPFLAGS: -I/usr/local/opt/sqlite/include For pkg-config to find this software you may need to set: PKG_CONFIG_PATH: /usr/local/opt/sqlite/lib/pkgconfig ==> Summary 🍺 /usr/local/Cellar/sqlite/3.21.0: 11 files, 3.0MB ==> Installing awscli dependency: gdbm ==> Downloading https://homebrew.bintray.com/bottles/gdbm-1.13.sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring gdbm-1.13.sierra.bottle.tar.gz 🍺 /usr/local/Cellar/gdbm/1.13: 19 files, 554.4KB ==> Installing awscli dependency: openssl ==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2n.sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring openssl-1.0.2n.sierra.bottle.tar.gz ==> Caveats A CA file has been bootstrapped using certificates from the SystemRoots keychain. To add additional certificates (e.g. the certificates added in the System keychain), place .pem files in /usr/local/etc/openssl/certs and run /usr/local/opt/openssl/bin/c_rehash This formula is keg-only, which means it was not symlinked into /usr/local, because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries. If you need to have this software first in your PATH run: echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile For compilers to find this software you may need to set: LDFLAGS: -L/usr/local/opt/openssl/lib CPPFLAGS: -I/usr/local/opt/openssl/include For pkg-config to find this software you may need to set: PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig ==> Summary 🍺 /usr/local/Cellar/openssl/1.0.2n: 1,792 files, 12.3MB ==> Installing awscli dependency: xz ==> Downloading https://homebrew.bintray.com/bottles/xz-5.2.3.sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring xz-5.2.3.sierra.bottle.tar.gz 🍺 /usr/local/Cellar/xz/5.2.3: 92 files, 1.4MB ==> Installing awscli dependency: python3 ==> Downloading https://homebrew.bintray.com/bottles/python3-3.6.3.sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring python3-3.6.3.sierra.bottle.tar.gz ==> /usr/local/Cellar/python3/3.6.3/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python3/3.6.3/bin --in ==> /usr/local/Cellar/python3/3.6.3/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python3/3.6.3/bin --in ==> /usr/local/Cellar/python3/3.6.3/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python3/3.6.3/bin --in ==> Caveats Pip, setuptools, and wheel have been installed. To update them pip3 install --upgrade pip setuptools wheel You can install Python packages with pip3 install <package> They will install into the site-package directory /usr/local/lib/python3.6/site-packages See: https://docs.brew.sh/Homebrew-and-Python.html ==> Summary 🍺 /usr/local/Cellar/python3/3.6.3: 3,588 files, 56.1MB ==> Installing awscli ==> Downloading https://homebrew.bintray.com/bottles/awscli-1.11.190.sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring awscli-1.11.190.sierra.bottle.tar.gz ==> Caveats The "examples" directory has been installed to: /usr/local/share/awscli/examples Bash completion has been installed to: /usr/local/etc/bash_completion.d zsh completions and functions have been installed to: /usr/local/share/zsh/site-functions ==> Summary 🍺 /usr/local/Cellar/awscli/1.11.190: 4,124 files, 36.1MB
データエンジニアとは
データエンジニアという仕事についてデータサイエンティストと対比させて書いてみようと思います。 ここでは「データサイエンティスト」がどういった職業なのかは、大まかに知っている前提で話を進めます。 それこそ「データサイエンティスト」とググれば説明は(質はともかく)沢山出てきます。
データを魚に、データサイエンティストを料理人にたとえたら
データサイエンティストとデータエンジニアは料理人と八百屋(魚屋肉屋)みたいな関係じゃないかと思います。
優れた料理人というのはわかりやすいですよね。美味しい料理(=優れた分析)を作れるシェフです。 勿論、どんな料理でも作れる人もいるかもしれませんが、料理人にも得意分野があります。(イタリアン、和食、フレンチ、etc)
「優れた分析」「良い分析」とは何か?というのは(これはこれで突き詰めると難しい話になるのですが) それはデータビークルの西内氏のブログでも読んでもらうことにして http://www.dtvcl.com/blog/ 話を進めます。
さて、料理人は材料が用意されなければ、料理はできないわけです。 そこでデータエンジニアの出番というわけです。 魚屋に例えると、 データを集めてきて(魚を集めてきて)、生簀(データレイク)や倉庫(データウエアハウス)に貯めて、きちんと魚の種別ごとに分類して、 在庫管理(決まった時間間隔できちんと取りに行けているか)をして、品質管理(取得元で不具合が発生していないか)をして、不良品の魚を取り除いて(クレンジング)、時には料理人が料理しやすいように2枚や3枚に開いておろしたり(Transform)して、 料理人に出荷します。
料理人でも色々います。スキルが高いプロの料理人は 「とにかく鮮度と鮮度と形が良い魚をタイムリーに提供してくれ」 という注文をしてするでしょうし、逆に (ファミレスのバイトの調理の人などは)レンジでチンすれば料理になってお客さんに提供できるように、下ごしらえまで全部したものを提供してくれ という料理人もいるでしょう。
(この後者を料理人(データサイエンティスト)と言えるのかどうかは別にして事実としてこういう需要もあります)
もっとも、 「いや、俺はデータサイエンティストだけど、自分が分析したいデータは自分の力で集めることができるし、データをクレンジングしたりなども自力で全部できるスーパーマンだぞ!」 という方もいらっしゃるでしょうが、それはデータエンジニア(魚屋)としてのスキルも持ち合わせているデータサイエンティスト(魚の料理人)ということ になるかと思います。
実際一部のプロの料理人でも自分で魚釣りに行って、釣った魚を調理するということもありますし。
データエンジニアに求められる能力
以下、データエンジニア特有の必要スキルを書きます。
- SQL(単に書けるだけでなくテーブル構造に適したクエリーを作成でき、かつチューニングまでできる)
- DBAレベルのDatabaseManegementSystemの知識(OLTP側だけでなく、DWH方面の経験も)
- データモデリング・正規化・設計能力
- システムアーキテクトレベルのコンピュータシステム全体の知識(特にAWSなどクラウド知識は近年は必須)
- 様々なデータソースから迅速かつ正確かつ変化にタイムリーに対応しながらにデータを取って来れる(ETL)能力
- データを定期的&自動的に取って来れるようにETLバッチを構築・運用できる能力
- データサイエンティストが使うツールや言語への知見
こんな感じでしょうか? (勿論これ以外にデータサイエンティスト的な能力やらコミュニケーション能力とかも勿論あった方が良いです・・・)
他サイト情報
ちなみにここ https://learningnetwork.cisco.com/docs/DOC-31728 ではデータサイエンティストをロックスターに例えて、データエンジニアをギタークルーのような裏方に喩えてます。
data tech 2017雑感
event.shoeisha.jp 2017年11月2日 御茶ノ水ソラシティカンファレンスセンターにて
基調講演
次を見据え企業が備えておくべきデータ活用基盤とは? ~RDBMS、Hadoopの活用からディープラーニング・AI技術の今後まで~
次を見据えて企業が備えておくデータ活用基盤とは?
・おかあさんといっしょの新譜のダイレクトメールを間違えて おじいさんおばあさんに送ってしまった→結果大ヒット
・リスクをとって真逆のことをやらなきゃいけないこともある。 出たアウトプットをどうする? アクションは、、、やれる人がいないからノー、、、が多い
・ようはデータ基盤を作って結果を出しても活用できる人がいないので、 アクションまで自動で出きるようにしてよ、、、とか言われてしまう。(神林さん) 出た結果に対してアクションできる人がないデータ解析基盤なんて要らない。
・データ利活用の基盤は(普通のシステム基盤より)難しい。。。企業としてその風土が無いと無理。 データが見得るようになって気づくようにはなったが。。。
・RDB VS Hadoopについて 10ペタバイトのデータが無ければHadoop導入の意味はない。 1Tを超えるとRDBのパフォーマンスは落ちる。
・テラバイト以下はRDBでいい。
・その間(1テラから10ペタの間)にマッチするアーキテクチャが今は無い。。。。 書き出しが特に地獄、、新しいタイプのDB HTAPがある。ただまだ出来てない。 SAP HANAとかが候補
AIへの取組はどうすればいいか?
・AI系は苦戦している。 形が変わらないもの(文字とか)の認識にはDeepLearningは優秀。人間より優秀。
・しかし例えば、人間の認識が難しい。 人間を人間として分析する、、、のは難しい。 そういうわけでシンギュラリティはまだまだ。。
・ガンの手術の時にガンの細胞のテスト、、、 既存の枠組みを変えずに入れれるところからピンポイントで絞って導入するのがよい。 枠組み自体を変えるのは時間がかかる。。。ので止めといたほうがいい。
・用途を絞ること。
・特性検知(異常検知)は非常に有効
・IOTは通信コストなどの社会インフラがまにあっていない。 全部のデータを送ると当初予算の20倍、、、 データを保存するとすぐにテラバイトの処理が、、、処理をどうする?
データ分析系の人材の育て方
・自由にやらせるのが、、、データ活用できる人材が育つ一番の手 教育方法(これこれこういうトレーニングをやれば良い)というのはない。 好奇心がある人がそのまま動ける環境を作る。環境を作ればほっといても人は伸びる。 環境をどう作るかのほうががよっぽど大事。
・締め付け「これやるな?これをやっても無駄だ」みたいなことを上が言うのが一番ダメ。 成功したやり方のクローンを作るのはだめ。
・使えるデータと好奇心があれば人は伸びる 定型的な教育だと伸びない。
分析基盤の導入に不可欠なデータ統合の進め方
こちらで記事になっています。 enterprisezine.jp
業務データと分析データの違いとは? → 有限な状態へ分類できるものか数値の大小
・なか★の会社 マスタ整備してみたら思わぬ副産物が 営業の担当店舗を効率化して 40人を15人の営業に減らせた。
・白★屋 営業の人数を最適化
・小売り会社 撤退予定だったのがシェアが増えた。
・よく「マスタデータを整備しても売り上げは一円もあがらない」とかいう人がいるが、 マスタデータを整備しただけで効果はある。
・事例:マスタから無効な顧客データを消したら、無駄なDMの料金が減った。 2億→1億に(2000万円で受注)
・営業側が大切だと思っているデータとデリバリ側が大切だと思っているデータが違う 営業側は契約まで、デリバリ側は契約後のデータが大切に思っている、、 ので顧客マスタが分断されがち。
・データ整備にプロパー社員を充てると社員が辞めてしまう。(本来自分がやりたかったことと違うため)
データを活かせる組織の作り方
「統計学は最強の学問である」で有名な西内さんの講演
なぜこのテーマを選んだか?
体制・組織でみんな困っている 導入する目的の明確化 費用対効果も説明できない 人材の育成 分析する対象の選定
ようるにみんな何をしていいのかわからない。
まず正しいデータ 良い分析?
数学的に高度なレポートだけど誰も喜びませんよ、、、とかいうのがありがち 分析結果をどう生かしてアクションをとるのか?
「こうすればいいよ」といっても現場の業務を変えることがなかなか出来ない(忙しいとかで)
データ分析プロジェクトを成功させるには
利用困難なデータ 現場に無知な分析者 数字嫌いな意思決定者 混乱している現場
↑どれかひとつでもあればデータ活用プロジェクトは成功しない。 データ分析プロジェクトは掛け算である。 うまくいけば、単なる足し算よりも大きな効果がある。 が、プロジェクト内に 能力が1未満の人が一人いれば、全体の効果が落ちる。 能力が0の人が一人いれば、効果は0になる。 能力がマイナスの人がいたら・・・・完全逆効果。
アマゾンのアプローチ
分析結果を意思決定を挟まず、直接実装 リコメンドの自動化
リコメントエンジンを作った人は実は最初上司に提案したら、ダメだといわれた。
そこでこのエンジニアは全顧客をランダムに分けてABテスト でレコメンドエンジンを導入した。 さっさと試して効果があれば、導入(意思決定を挟まない!)
一番のボトルは意思決定 課題設定 そもそも何についてものどの指標を最大最小にするか? ビジネスがわかっている人がやるべきこと
データがいっぱい集まったけどどうしたらいいか? 何がどう変わるとうれしいか?をアウトカム(KPI・成果)と解析単位を考えましょう。
無駄な分析のイメージ 関係ない要因から関係ない要因へ。 ・午前中の来店者は滞在時間が長くなりがち、、、だから何? 滞在時間が長い客が良い客とは言えない。 あとは当たり前のKPI
ファミレスでデータ分析した結果「来客が一人増えると1000円売り上げが上がります」 という1億円かけた分析プロジェクトがあった。
価値を上げるために
では?価値がる分析イメージは? 利益がでるためのアウトカム例 * 客単価 * 営業成功率 * 在庫破棄
↑どれをあげたいのかをはっきりさせる。 アウトカムを整理して、どのアウトカムはどの要因が関係するのか?を 整理してそこを分析する。
- アウトカム→望ましさ を具体的に定義
- 解析単位→望ましさの単位
比較軸を設定 来店頻度が多い顧客 少ない顧客 販売金額が高い営業 少ない営業 望ましい状態 望ましくない状態
まず望ましい状態を定義してください。
AIビジネスでも同じ どのような値が「高い」ことが良いことなのか? 最適化の選択肢 もっとも良い何を選ぶのか?
AIビジネスで差がつく部分
「何を予測させるか?」 と 「出力結果の活用」 はまだまだ人間がやったほうがいい
特徴量をとらえてデータを前処理、アルゴリズムの適用、細かい設定のチューニング は楽になってきた。 特にチューニングしかできない人は仕事が奪われた。
AIプロダクトの適性を判断する基準
総負荷量:世の中でどれだけの人を煩わせてるのか? 同質性:ケースバイケースなことの小ささ 制御性:取り得る選択肢の組み合わせの有効性(1億通りから選ぶのは難しい) 責任制:選択を誤った場合のリスクと責任の所在 感情性:人間が行うことの嬉しさ
囲碁AIは 総負荷量が× ビジネス的な価値は無い。
ダメな取り組みの例 【寿命予測】:電子カルテのデータから貴方が20年後に死ぬ確率は? 同質性がバラバラ 制御性:「どう対策するか」が無限に 責任性:外れた場合大きな悪影響 感情性:機械に言われても生活を改めにくい
医学世界では「こういうのは知識だけではうまくいかないね」と出ている。
「洞察」と「予測」
「どうしたらこの製品の売り上げがあがるのか?」が洞察 「今年この製品がいくつ売れるのか?教えてください」が予測
人間のデータ分析は「洞察」向き AI機械楽手は「予測」向き
洞察向きの仕事 まだそれほど世の中を煩わせていない ケースバイケースの部分が多い ほぼ無限に打ち手が考えられる場合 リスクが大きく誰かが責任を負うべき 人間が行うことに価値がある
わかった分析結果からどのようにアクションをとるか?
施策は早く試す。
理想的な組織構造
ボス:数字と理屈で意思決定のリスクが取れる人 エキスパート:現場の事情とオペレーションの肌感覚がある人 データマネージャー:社内のデータとITシステムの土地勘がある人 分析担当者:ITとハードワークが苦にならない人
この4人の掛け算がデータ組織となる。(掛け算なので、0の人や0.9の人やマイナスの人が入らないように)
まとめ
良いアウトカムと解析単位を考えよう データとサイエンスが当たり前のチームを アウトカムにアクションを