データエンジニア日記

データエンジニアの雑記

TalendOpenStudioで実現する無料(無償)のETLエコシステム

全体のアイディア

有償版のTalendはジョブの開発機能だけではなく、複数人で共通開発するための共有リポジトリやジョブ実行ターミナル(定期実行するWebアプリケーションの仕組み)がついている。 *1

僕も以前これを導入して利用したことはあるが、安定していて良い製品でした。*2

ただ、安い物ではない*3ので、無償版Talendを使ってETLジョブを作った人も、その後本番導入用途で使うのに悩む事も多いのではないだろうか? 僕の今の会社のシステムでは

  1. ジョブ定期実行機能→Rundeck
  2. リポジトリ→Gitlab*4

で代用している。今のところ十分これで出来ている。

ジョブの定期実行機能

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の管理下に置けば、複数のマシンでリポジトリ的に共有できる。 注意点は以下

  1. プロジェクト名(=プロジェクトが置かれるディレクトリ名)は各マシンで共通にする。ディレクトリ名はプロジェクト名を全て大文字に変換したものになるようである。
  2. 利用するTalendのバージョンはマイナーバージョンまで同じにすること。Talendの仕様で「古いバージョンで作ったジョブは新しいバージョンに引き継げる」が逆は出来ないため。(Talend自体のバージョンアップは複数台同時にしたほうがいい)
  3. 変更前後で管理している設定ファイルのdiffを見ても正直、どこをどう変更したのかはわかりにくい。。(ので 、単なるバージョン❝保持❞ツールと割り切ること)
  4. AWSコンポーネントを使う場合など、追加ライブラリのインストールが前提となっているジョブの場合、それは自動インストールされないので、適宜Talend環境ごとにインストールすること。

ジョブを一つ作成すると

  • 「ジョブ名_バージョン番号.item」
  • 「ジョブ名_バージョン番号.properties」
  • 「ジョブ名_バージョン番号.iscreenshot」

というファイルができます。主に最初の2つがジョブの設計情報をXMLで持っているようですね。

*1:無償版(TalendOpenStudio)と有償版(TalendEnterprise)の違いについてはこちら

https://www.gixo.jp/blog/6667/

を参照のこと

*2:ジョブ実行管理画面で日本語表記が不自由だったりしたけど

*3:3ユーザライセンス1年で500万円ぐらいだった記憶

*4:勿論Githubでもいい

自分の会社の分析システム

現在、自分が所属している会社のシステムの概略について書いておく。

使用しているデータベース

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でバッチ管理をしていて、複雑になってきて困っている、、、というユースケースに最適。

Dockerのイメージは実際はどこにある?

タイトルの疑問が沸いたので整理

Linux上では

以下のサイトにばっちり書いてあった。

Dockerのイメージはどこにある? | SOTA

/var/lib/docker

以下らしい

Macbook上では

VMで動いているらしいので、Finderなどのファイルシステム上では見えない。ちなみにVMの場所は ユーザディレクトリ以下の

~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux

らしい。

参考 ja.stackoverflow.com

Dockerはこれから自分の会社の解析環境をデータサイエンティスト達に提供する時に使っていきたいと考えている。

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系の最新のを利用

heartbeats.jp

note.crohaco.net

qiita.com 設定ファイルの変更方法は上記を参照

やった設定

実行ログが大量になってくるとパフォーマンスが落ちるらしい。

ndx.hatenablog.jp

上記サイトに従い、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にも追記する事)

complete -C '/usr/local/bin/aws_completer' aws

コマンド補完 - 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日 御茶ノ水ソラシティカンファレンスセンターにて

基調講演

次を見据え企業が備えておくべきデータ活用基盤とは? ~RDBMSHadoopの活用からディープラーニング・AI技術の今後まで~

enterprisezine.jp

次を見据えて企業が備えておくデータ活用基盤とは?

おかあさんといっしょの新譜のダイレクトメールを間違えて おじいさんおばあさんに送ってしまった→結果大ヒット

・リスクをとって真逆のことをやらなきゃいけないこともある。 出たアウトプットをどうする? アクションは、、、やれる人がいないからノー、、、が多い

・ようはデータ基盤を作って結果を出しても活用できる人がいないので、 アクションまで自動で出きるようにしてよ、、、とか言われてしまう。(神林さん) 出た結果に対してアクションできる人がないデータ解析基盤なんて要らない。

・データ利活用の基盤は(普通のシステム基盤より)難しい。。。企業としてその風土が無いと無理。 データが見得るようになって気づくようにはなったが。。。

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万円で受注)

・営業側が大切だと思っているデータとデリバリ側が大切だと思っているデータが違う 営業側は契約まで、デリバリ側は契約後のデータが大切に思っている、、 ので顧客マスタが分断されがち。

・データ整備にプロパー社員を充てると社員が辞めてしまう。(本来自分がやりたかったことと違うため)

データを活かせる組織の作り方

統計学は最強の学問である」で有名な西内さんの講演

enterprisezine.jp

なぜこのテーマを選んだか?

体制・組織でみんな困っている 導入する目的の明確化 費用対効果も説明できない 人材の育成 分析する対象の選定

ようるにみんな何をしていいのかわからない。

まず正しいデータ 良い分析?

数学的に高度なレポートだけど誰も喜びませんよ、、、とかいうのがありがち 分析結果をどう生かしてアクションをとるのか?

「こうすればいいよ」といっても現場の業務を変えることがなかなか出来ない(忙しいとかで)

データ分析プロジェクトを成功させるには

利用困難なデータ 現場に無知な分析者 数字嫌いな意思決定者 混乱している現場

↑どれかひとつでもあればデータ活用プロジェクトは成功しない。 データ分析プロジェクトは掛け算である。 うまくいけば、単なる足し算よりも大きな効果がある。 が、プロジェクト内に 能力が1未満の人が一人いれば、全体の効果が落ちる。 能力が0の人が一人いれば、効果は0になる。 能力がマイナスの人がいたら・・・・完全逆効果。

アマゾンのアプローチ

分析結果を意思決定を挟まず、直接実装 リコメンドの自動化

リコメントエンジンを作った人は実は最初上司に提案したら、ダメだといわれた。

そこでこのエンジニアは全顧客をランダムに分けてABテスト でレコメンドエンジンを導入した。 さっさと試して効果があれば、導入(意思決定を挟まない!)

一番のボトルは意思決定 課題設定 そもそも何についてものどの指標を最大最小にするか? ビジネスがわかっている人がやるべきこと

データがいっぱい集まったけどどうしたらいいか? 何がどう変わるとうれしいか?をアウトカム(KPI・成果)と解析単位を考えましょう。

無駄な分析のイメージ 関係ない要因から関係ない要因へ。 ・午前中の来店者は滞在時間が長くなりがち、、、だから何? 滞在時間が長い客が良い客とは言えない。 あとは当たり前のKPI

ファミレスでデータ分析した結果「来客が一人増えると1000円売り上げが上がります」 という1億円かけた分析プロジェクトがあった。

価値を上げるために

では?価値がる分析イメージは? 利益がでるためのアウトカム例 * 客単価 * 営業成功率 * 在庫破棄

↑どれをあげたいのかをはっきりさせる。 アウトカムを整理して、どのアウトカムはどの要因が関係するのか?を 整理してそこを分析する。

  • アウトカム→望ましさ を具体的に定義
  • 解析単位→望ましさの単位

比較軸を設定 来店頻度が多い顧客 少ない顧客 販売金額が高い営業 少ない営業 望ましい状態 望ましくない状態

まず望ましい状態を定義してください。

AIビジネスでも同じ どのような値が「高い」ことが良いことなのか? 最適化の選択肢 もっとも良い何を選ぶのか?

AIビジネスで差がつく部分

「何を予測させるか?」 と 「出力結果の活用」 はまだまだ人間がやったほうがいい

特徴量をとらえてデータを前処理、アルゴリズムの適用、細かい設定のチューニング は楽になってきた。 特にチューニングしかできない人は仕事が奪われた。

AIプロダクトの適性を判断する基準

総負荷量:世の中でどれだけの人を煩わせてるのか? 同質性:ケースバイケースなことの小ささ 制御性:取り得る選択肢の組み合わせの有効性(1億通りから選ぶのは難しい) 責任制:選択を誤った場合のリスクと責任の所在 感情性:人間が行うことの嬉しさ

囲碁AIは 総負荷量が× ビジネス的な価値は無い。

ダメな取り組みの例 【寿命予測】:電子カルテのデータから貴方が20年後に死ぬ確率は? 同質性がバラバラ 制御性:「どう対策するか」が無限に 責任性:外れた場合大きな悪影響 感情性:機械に言われても生活を改めにくい

医学世界では「こういうのは知識だけではうまくいかないね」と出ている。

「洞察」と「予測」

「どうしたらこの製品の売り上げがあがるのか?」が洞察 「今年この製品がいくつ売れるのか?教えてください」が予測

人間のデータ分析は「洞察」向き AI機械楽手は「予測」向き

洞察向きの仕事 まだそれほど世の中を煩わせていない ケースバイケースの部分が多い ほぼ無限に打ち手が考えられる場合 リスクが大きく誰かが責任を負うべき 人間が行うことに価値がある

わかった分析結果からどのようにアクションをとるか?

施策は早く試す。

理想的な組織構造

ボス:数字と理屈で意思決定のリスクが取れる人 エキスパート:現場の事情とオペレーションの肌感覚がある人 データマネージャー:社内のデータとITシステムの土地勘がある人 分析担当者:ITとハードワークが苦にならない人

この4人の掛け算がデータ組織となる。(掛け算なので、0の人や0.9の人やマイナスの人が入らないように)

まとめ

良いアウトカムと解析単位を考えよう データとサイエンスが当たり前のチームを アウトカムにアクションを