SlideShare una empresa de Scribd logo
1 de 13
Descargar para leer sin conexión
第 1 章
機械学習を⽤いた⽇経電⼦版 Pro
のユーザ分析
本稿では、筆者が所属するデジタル事業 BtoB ユニット データドリブンチームにおけ
る機械学習の活⽤事例を紹介します。データドリブンチームの役割は、部署内のデータ基
盤を整備し、サービス企画・開発や営業・マーケティングにおいてデータを⾝近にするこ
とです。筆者は特に、営業・マーケティング向けのデータ分析や、業務効率化のための環
境整備を担当しています。
今回紹介する事例は、約 3 カ⽉にわたって週に⼀度、1 ⽇ 3 時間の枠で集中的に取り組
んだ機械学習トレーニングでの成果物です。データ分析の教育・研修事業を⾏っている
データミックス社*1
の講師を招き、機械学習の理論やビジネスへ応⽤するためのノウハウ
などを学びました。パッケージを使わない機械学習アルゴリズムの実装から始め、最終的
には機械学習を⽤いて⾃社サービスのデータを分析しました。
なお機械学習トレーニングは、2017 年から開始しているデータドリブンを加速するた
めの教育制度であるデータ道場*2
の発展版です。⼀部のデータ分析の担当者だけでなく、
幅広く編集・営業・広告の関係者らが、SQL やデータに基づく PDCA の回し⽅などを学
んでいます。
1.1 分析の題材
今回の機械学習トレーニングで題材として取り上げたのは⽇経電⼦版 Pro*3
という法⼈
向けのサービスです。複数⼈で記事のコメントや共有ができるグループ機能など、個⼈契
約の⽇経電⼦版にはない機能・コンテンツが充実しています。⽇経電⼦版 Pro では、本契
約前の無料トライアルを提供しています。この無料トライアルから本契約に⾄る割合、す
なわち本契約率は、売上に直結する重要な指標です。
今回は本契約率の向上を⽬指し、過去に無料トライアルから本契約した∕しなかった
*1 https://datamix.co.jp/
*2 https://speakerdeck.com/yosukesuzuki/nikkei-data-driven-20180823/
*3 http://pr.nikkei.com/pro/
9
Sam
ple
第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析
ユーザを対象に、それぞれどのような特徴があるか把握することを分析のゴールに設定し
ました。たとえば A という機能を使っているユーザは本契約率に⾄りやすいという知⾒
が得られれば、A という機能が⽬⽴つ UI に変更するといった施策が考えられます。
もちろん、これまでも営業が各ユーザとの対話を通じて、個々の案件が本契約に⾄った
理由をある程度把握できています。しかし、ユーザの属性情報や利⽤傾向に関する情報は
⾮常に特徴が豊富で、⼈間が⼗分に要因を把握できているとは限りません。そこで今回、
機械学習を⽤いることで⼤量のデータを処理し、本契約するか否かに関わる特徴を定性的
ではなく定量的に特定したいと考えました。
具体的には、無料トライアルを実施したユーザの属性情報やアクセス情報を⽤いて、本
契約するか否かを判定する予測モデルを構築します。ここで、予測に⽤いた特徴の重要度
を算出できる機械学習アルゴリズムを採⽤することで、本契約するか否かに影響する特徴
とは何かを推定できます。
より詳細に説明するため、統計の分野で有名なアヤメのデータセットを⽤います。この
データセットは、次の情報で構成されます。
• 特徴:がく⽚⻑(sepal length)、がく⽚幅(sepal width)、花びら⻑(petal length)、
花びら幅(petal width)
• 予測の対象:花の種類(0、1、2 の 3 種類)
詳細は割愛しますが、特徴の重要度を算出できる機械学習アルゴリズムを⽤いて、4 つ
の特徴から花の種類を予測してみます。その際、特徴の重要度を算出すると次のような結
果になりました(図 1.1)。
▲図 1.1 アヤメのデータセットにおける特徴の重要度
10
Sam
ple
1.2 データの取得
作成した予測モデルにおいては、petal length が⼀番重要で、sepal width が⼀番重要
でないと読み取れます。
今回の機械学習トレーニングで作成したのは、次のようなデータセットです。
• 特徴:属性情報と無料トライアル時のアクセス情報
• 予測の対象:本契約するか否か
アヤメのデータセットと同様の枠組みを⽤いて予測モデルを構築することで、本契約す
るか否かに影響する特徴とは何かを推定しようと思います。
1.2 データの取得
⽇経電⼦版ではユーザの属性情報やアクセス情報などを収集しています。800 万⼈以上
の⽇経 ID と呼ばれる会員の情報を保有しており、平⽇ 1 ⽇のデータ量は約 1 億件にも達
します。これらのデータは、Redash*4
、Kibana*5
といった BI ツールで、気軽に取得・分
析できるよう整備されています。
今回は Redash 上で SQL を書くことで、データセットの作成に必要な次の情報を取得
しました。機械学習を⽤いた⽐較的複雑な分析を⾏う都合上、SQL ではデータ取得まで
を扱い、残りの処理は Python を⽤いることにしました(表 1.1)。
▼表 1.1 取得したデータの概要
分類 説明
ID 特定の期間に無料トライアルを実施した ID の⼀覧
属性情報 上記 ID の登録情報
無料トライアル時のアクセス情報 上記 ID のカテゴリ∕デバイス別の閲覧数、保存記事数
本契約に⾄ったか否か 上記 ID の無料トライアル後の会員ステータス
1.3 探索的データ分析
分析の⼿始めとして、取得したデータの各特徴の分布や、⽋落している値(⽋損値)の
有無などを確認します。これは探索的データ分析(Exploratory Data Analysis)と呼ば
れ、個⼈的にはビジネスの世界でデータを扱っていく上で特に重要な過程だと思っていま
す。与えられた条件下で純粋に予測モデルの精度を競う⼤会などと⽐べ、ビジネスでは解
決すべき問題を特定し仮説を⽴てることに価値があると考えているからです。
本章では csv 形式のファイルを Python の pandas を⽤いて、データを処理していきま
す。まずは、データを読み込みます(リスト 1.1)。
▼リスト 1.1 データの読み込み
*4 https://redash.io/
*5 https://www.elastic.co/jp/products/kibana/
11
Sam
ple
第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析
import pandas as pd
df = pd.read_csv('df.csv', encoding="utf-8")
ここでは、次のような形式で情報を保持しています (表 1.2)。
▼表 1.2 df の概要(出⼒)
user_id 属性情報 1 属性情報 2 アクセス情報 1 アクセス情報 2 cnv_flg
0000000001 hoge1 fuga1 piyo1 foo1 0
0000000002 hoge2 fuga2 piyo2 foo2 1
0000000003 hoge3 fuga3 piyo3 foo3 0
0000000004 hoge4 fuga4 piyo4 foo4 1
0000000005 hoge5 fuga5 piyo5 foo5 1
表では省略していますが、特徴の数は属性情報が 10 程度、アクセス情報が 400 程度で
す。cnv_flgは本契約に⾄ったか否かを表し、本契約に⾄った場合は 1、そうでない場合
は 0 の値となっています。データの⾏数は約 25,000 です。
最初に、各特徴の基礎統計量を⾒てみます(リスト 1.2)。
▼リスト 1.2 各特徴の基礎統計量
df.describe()
このコマンドにより各特徴の基礎統計量を算出できます。特徴ごとの最⼩値、平均値、
最⼤値、標準偏差などが確認できるので、⼤まかに傾向を確認できます。具体的な数字に
は⾔及できませんが、予測の対象である cnv_flgは、1 に⽐べて 0 が多い不均衡データで
した。
次いで、各特徴の⽋損値の割合を確認します(リスト 1.3)。
▼リスト 1.3 各特徴の⽋損値の割合
df.isnull().sum() / len(df)
各特徴の⽋損値の数を計算し、それぞれ全体の数で割ることで割合に変換しています。
ここでは、SQL で集計した保存記事数が 0 件の場合と、⾃由回答で収集している属性情
報に⽋損があると分かりました。
予測の対象となる値と各特徴の相関や、特徴間の相関を出してみることも効果的です。
どのような特徴が予測の対象と強い関係性を持っているか、過剰な相関がある特徴の組み
合わせはないかなどを確認します。過剰な相関がある特徴の組み合わせがあると、統計的
な分析結果が正しく推計できなくなる問題が発⽣する場合があります。そのような組み合
わせが⾒つかった際には、1 つを残して特徴から削除する対応が⼀般的です。
次のコードでは、予測モデルの作成に向けて cnv_flgとの正の相関が⼤きい特徴を、順
に出⼒しています(リスト 1.4)。
12
Sam
ple
1.3 探索的データ分析
▼リスト 1.4 予測の対象となる値と各特徴の相関
corr = df.corr()
corr['cnv_flg'].sort_values(ascending=False)
最後に、⾼次元データの次元削減の⼿法である t-SNE*6
を⽤いて、今回のデータを可
視化してみます(リスト 1.5)。
▼リスト 1.5 t-SNE での可視化
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
X = df.drop(['user_id', 'cnv_flg'], axis = 1)
y = df['cnv_flg']
X_reduced = TSNE(n_components=2, random_state=0).fit_transform(X)
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y)
t-SNE を⽤いて元の特徴を保持しながらデータを圧縮することで、⼈間が解釈しやすい
2 次元での可視化を実現しました(図 1.2)。
▲図 1.2 t-SNE での可視化(出⼒)
⻩⾊は cnv_flgが 1 の ID、紫⾊は 0 の ID を⽰しています。⻩⾊の点が⽐較的まと
まった位置にプロットされており、適切に予測モデルを設計することで、ある程度の精度
*6 http://www.jmlr.org/papers/v9/vandermaaten08a.html/
13
Sam
ple
第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析
を達成できるのではないかと解釈しました。
1.4 データの前処理
ここからは探索的データ分析で得られた知⾒も踏まえて、データの前処理を実施してい
きます。まずは⽋損値を処理します。最初に、SQL で集計した保存記事数が 0 件の場合
の⽋損値に対応します。ここは単純に、保存記事数の⽋損値を 0 で補完します(リスト
1.6)。
▼リスト 1.6 保存記事数の⽋損値を 0 で補完
df.fillna({'saved_articles': 0}, inplace=True)
⾃由回答で収集している属性情報について、⽋損値の割合が多い特徴は情報量が⼩さい
ため削除します。今回は閾値を 50 %に設定しました。⽋損値の割合が 50% より⼩さい
場合には、⽋損していない値の情報を基に補完します。量的変数の場合には平均値や中央
値で補完するのが⼀般的ですが、今回は質的変数だったので、煩雑ですが次のような処理
を実⾏しました(リスト 1.7)。
▼リスト 1.7 質的変数の⽋損値の補完
target_column_name = list(df.columns[df.isnull().any(0)])
for tcn in target_column_name:
df[tcn] = 
df[tcn].apply(
lambda x: df[tcn].dropna().sample().values[0] if x != x else x
)
⽋損値を、⽋損していない値からランダム抽出して補完する操作になっています。
1.4.1 質的変数の処理
ここでは、質的変数を量的変数に変換し、機械学習アルゴリズムで扱えるようにしま
す。次のコードでは、対象となる特徴を dummy_columnsというリストに格納しています
(リスト 1.8)。
▼リスト 1.8 質的変数を量的変数に変換
df = pd.get_dummies(df, drop_first = True, columns = dummy_columns)
1.4.2 Leakage の削除
最後に、健全な予測モデルを作成するために Leakage となっていた特徴を削除しま
す。Leakage とは、予測の対象となる値に関する予期せぬ情報が学習データ内に存在する
14
Sam
ple
1.5 予測モデルの構築
ため、機械学習アルゴリズムが⾮現実的に⾼い精度を⽰す現象のことです*7
。予期せぬ情
報としては、たとえば正解に直結する特徴や、予測時には知りえない未来の特徴などが挙
げられます。
今回の場合は、アクセス情報として取得していたカテゴリ別の閲覧数の中の、本契約
申し込み⼿続きページの閲覧数が Leakage となっていました。本契約を申し込む⼿続き
ページを閲覧しているユーザは、当然ほぼ 100% の確率で本契約に⾄っています。これで
は⽬的となる予測モデルを構築できないので、今回はこれらの特徴を削除することにしま
した。
実のところ、最初に予測モデルを構築するまでは、⽤意した特徴に Leakage があると
気付いていませんでした。ところが機械学習アルゴリズムの精度が異常に⾼かったため改
めて特徴を精査したところ、Leakage の発⾒に⾄りました。
次のコードでは、対象となる特徴を delete_columnsというリストに格納しています
(リスト 1.9)。
▼リスト 1.9 Leakage の削除
df.drop(delete_columns, axis=1, inplace=True)
delete_columnsで指定した列を削除できました。
1.5 予測モデルの構築
いよいよ、ここまでで前処理をしてきた特徴を基に、機械学習アルゴリズムを適⽤して
予測モデルを構築します(リスト 1.10)。
▼リスト 1.10 X, y の準備
X = df.drop(['user_id', 'cnv_flg'], axis = 1)
y = df['cnv_flg']
user_idと cnv_flgを除いたデータを特徴として Xに、cnv_flgを予測の対象として y
に代⼊しました。
1.5.1 機械学習アルゴリズムの選定
今回は、広く使われている機械学習パッケージ scikit-learn*8
を利⽤します。Kag-
gle*9
というサイトで公開されているコード*10
を参考に、10 個の機械学習アルゴリズムの
精度を⽐較しました。指標としては単純な正解率を採⽤し、10 分割の交叉検証で精度を検
*7 https://www.kaggle.com/docs/competitions#leakage/
*8 http://scikit-learn.org/stable/documentation.html/
*9 https://www.kaggle.com/
*10 https://www.kaggle.com/sinakhorami/titanic-best-working-classifier/
15
Sam
ple
第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析
証しています。正解率だけではなく、不均衡データの分類の評価により適した AUC*11
と
いう指標でも検証しましたが、概ね同様の結果が得られました(図 1.3)。
▲図 1.3 10 個の機械学習アルゴリズムの精度⽐較
今回は、精度の⾼かった機械学習アルゴリズムの中から勾配ブースティング決定⽊
(GradientBoostingClassifier)*12
を採⽤しました。主な採⽤理由は、次の 2 つです。
• 勾配ブースティング決定⽊は、予測に⽤いた特徴の重要度を算出でき、今回の⽬的
に合致する
• 同程度に精度の⾼いサポートベクトルマシンを⽤いた分類器(SVC)と⽐べ、本契
約に⾄るか否かという⼆値分類以外にも応⽤しやすい
勾配ブースティング決定⽊は、決定⽊と呼ばれる単純なアルゴリズムを逐次的に何度も
実⾏し、それらの結果を組み合わせることで汎⽤的な予測を導出する⼿法です。決定⽊で
は、数ある特徴の中から 1 つを選択して、予測の分岐点となる閾値を求める⼿続きがあり
ます。特徴 1 つずつの単位で予測の精度への寄与度が計算でき、この程度を特徴の重要度
をみなすことが可能です。
同じく精度の⾼かった K 近傍法(KNeighborsClassifier)は、予測したいデータと特徴
が似ている K 個のデータを取り出し、それら K 個のデータの情報を基に予測を導出する
⼿法です。⼀部のデータのみを取り出し予測しているため、全体における特徴の重要度を
理解するのが難しく、今回は採⽤を⾒送りました。
*11 http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.
html#sklearn.metrics.roc_auc_score/
*12 http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.
GradientBoostingClassifier.html/
16
Sam
ple
1.5 予測モデルの構築
1.5.2 ハイパーパラメータの調整
機械学習アルゴリズムを実⾏する際には、ハイパーパラメータと呼ばれるいくつかの値
を設定する必要があります。この設定値に応じて結果が変わるので、適切な調整が必要で
す。今回はハイパーパラメータの調整にグリッドサーチ(GridSearchCV)*13
を利⽤しま
した。指標としては AUC を採⽤し、10 分割の交叉検証を実⾏しています。また sample
_weightを設定し、データ数の少ない cnv_flgが 1 のデータを重要視させることで、デー
タの不均衡を緩和するよう調整しました(リスト 1.11)。
▼リスト 1.11 グリッドサーチの出⼒結果
0.8031225667643095
GradientBoostingClassifier(criterion='friedman_mse', init=None,
learning_rate=0.05, loss='deviance', max_depth=2,
max_features=0.1, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=13, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100,
presort='auto', random_state=None, subsample=1.0, verbose=0,
warm_start=False)
AUC は 0.80 を超えており(最⼤ 1、最⼩ 0)、ある程度の性能が出ていると確認できま
した。
1.5.3 特徴の重要度
最後に、今回の予測モデルにおける特徴の重要度を出⼒します。分かりやすさのため
に、重要度が最⼤の特徴が 100 になるように正規化しました(リスト 1.12)。
▼リスト 1.12 特徴の重要度の出⼒
feature_importance = clf.feature_importances_
feature_importance = 100.0 * (feature_importance / feature_importance.max())
残念ながら結果の詳細はお⾒せできないですが、この特徴の重要度の⼤きい順に並び替
えることで、本契約するか否かに影響する特徴とは何かを推定できました。scikit-lea
rnの勾配ブースティング決定⽊では、特徴の重要度がジニ係数の変化に基づいて計算され
ています*14
。当然のことながら、過度に特徴の重要度を信じることなく、理論的背景を
意識して慎重に解釈する必要があります。
*13 http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.
GridSearchCV.html/
*14 https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/tree.py#
L511/
17
Sam
ple
第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析
1.6 おわりに
ここまで、機械学習を⽤いて⽇経電⼦版 Pro のユーザ分析を実施し、無料トライアルか
ら本契約に⾄る要因となる特徴を定量的に特定しました。分析結果はサービス企画・開発
や営業・マーケティングの担当者にも共有し、今後の施策に向けた議論の材料となってい
ます。
本稿では「データを⾝近にする」ことを⽬標に活動しているデータドリブンチームの取
り組みの⼀部を紹介しました。我々の取り組みに、少しでも興味を持っていただく機会に
なれば幸いです。
18
Sam
ple
著者紹介
第 1 章 ⽯原祥太郎 / @upura0
Kaggle Expert。仕事では、どうすれば機械学習を使わないで済むかを考えています。
第 2 章 加藤皓也 / @hirosaji
ゲーム実況を観ながらコードや記事を書くのが好きな Web エンジニアです。本章は
2BRO. と Vtuber の皆さまの御⼒をお借りして執筆しました。
第 3 章 清⽔正⾏ / @shimizu
毎⽇データビジュアライゼーションを作ってます。仕事の6割は神 Excel との戦い
です。
第 4 章 安⽥翔平 / @nyasusho
デザインで⾷べてバイクで遊ぶ⼈。⽇経ビジュアルデータのコンテンツデザイン、UI
デザイン担当してます。SCSS 依存症。
第 5 章 伊藤⼤晃 / @isudzumi
r.nikkei.com の開発と電⼦版マーケット情報ページの運⽤をしています。業務とまった
く関係ないことを書いてます。
第 6 章 Kei / @kei_n_n_iek
電⼦版アプリ・紙⾯ビューアーアプリのログ分析をやらせてもらっています。昨年は 
r.nikkei.com  の開発をしていました。
第 7 章 伊藤 / @fumito_ito
iOSDC から考えなしにイベント参加を⼊れてしまった中で泣きながら書きました。内
容⾃体は iOSDC での登壇内容の焼き直しなので、ぜひイベントの動画や資料も合わせて
ご覧いただけると嬉しいです。
第 8 章 まりーな / @marina10172003
Adobe 製品が好きな iOS エンジニア iOSDC2018 で登壇した内容の本版です。解析し
たアニメーションは参照先の Web ページでみれます。After Effects でアニメーショント
141
Sam
ple
付録 著者紹介
レース・・次はやらないかな(遠い⽬)
第 9 章・第 11 章 おがぱん / @ogapants
軽い気持ちでコラムを書いていたら章になりました。最⾼の校正をしてくださったなか
てぃるさんと from-unknown さんに深く御礼申し上げます。
第 10 章 やまんだ / @ymnd
スーパードンキーコング2を買いました。Android いっぱい好き。
装丁デザイン 安⽥翔平 / @nyasusho
久々の紙デザイン超楽しかった(コナミ
編集 やまんだ / @ymnd
次は⾵来のシレンを買います。
142
Sam
ple
Nikkei Development Book
2018 年 10 ⽉ 8 ⽇ 技術書典 5 版 v1.0.0
著 者 Nikkei Engineer Team
編 集 ymnd
発⾏所 Nikkei Engineer Team
 
(C) 2018 Nikkei Engineer Team
143
Sam
ple

Más contenido relacionado

Último

20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 

Último (12)

20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 

機械学習を⽤いた⽇経電⼦版Pro のユーザ分析

  • 1. 第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析 本稿では、筆者が所属するデジタル事業 BtoB ユニット データドリブンチームにおけ る機械学習の活⽤事例を紹介します。データドリブンチームの役割は、部署内のデータ基 盤を整備し、サービス企画・開発や営業・マーケティングにおいてデータを⾝近にするこ とです。筆者は特に、営業・マーケティング向けのデータ分析や、業務効率化のための環 境整備を担当しています。 今回紹介する事例は、約 3 カ⽉にわたって週に⼀度、1 ⽇ 3 時間の枠で集中的に取り組 んだ機械学習トレーニングでの成果物です。データ分析の教育・研修事業を⾏っている データミックス社*1 の講師を招き、機械学習の理論やビジネスへ応⽤するためのノウハウ などを学びました。パッケージを使わない機械学習アルゴリズムの実装から始め、最終的 には機械学習を⽤いて⾃社サービスのデータを分析しました。 なお機械学習トレーニングは、2017 年から開始しているデータドリブンを加速するた めの教育制度であるデータ道場*2 の発展版です。⼀部のデータ分析の担当者だけでなく、 幅広く編集・営業・広告の関係者らが、SQL やデータに基づく PDCA の回し⽅などを学 んでいます。 1.1 分析の題材 今回の機械学習トレーニングで題材として取り上げたのは⽇経電⼦版 Pro*3 という法⼈ 向けのサービスです。複数⼈で記事のコメントや共有ができるグループ機能など、個⼈契 約の⽇経電⼦版にはない機能・コンテンツが充実しています。⽇経電⼦版 Pro では、本契 約前の無料トライアルを提供しています。この無料トライアルから本契約に⾄る割合、す なわち本契約率は、売上に直結する重要な指標です。 今回は本契約率の向上を⽬指し、過去に無料トライアルから本契約した∕しなかった *1 https://datamix.co.jp/ *2 https://speakerdeck.com/yosukesuzuki/nikkei-data-driven-20180823/ *3 http://pr.nikkei.com/pro/ 9 Sam ple
  • 2. 第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析 ユーザを対象に、それぞれどのような特徴があるか把握することを分析のゴールに設定し ました。たとえば A という機能を使っているユーザは本契約率に⾄りやすいという知⾒ が得られれば、A という機能が⽬⽴つ UI に変更するといった施策が考えられます。 もちろん、これまでも営業が各ユーザとの対話を通じて、個々の案件が本契約に⾄った 理由をある程度把握できています。しかし、ユーザの属性情報や利⽤傾向に関する情報は ⾮常に特徴が豊富で、⼈間が⼗分に要因を把握できているとは限りません。そこで今回、 機械学習を⽤いることで⼤量のデータを処理し、本契約するか否かに関わる特徴を定性的 ではなく定量的に特定したいと考えました。 具体的には、無料トライアルを実施したユーザの属性情報やアクセス情報を⽤いて、本 契約するか否かを判定する予測モデルを構築します。ここで、予測に⽤いた特徴の重要度 を算出できる機械学習アルゴリズムを採⽤することで、本契約するか否かに影響する特徴 とは何かを推定できます。 より詳細に説明するため、統計の分野で有名なアヤメのデータセットを⽤います。この データセットは、次の情報で構成されます。 • 特徴:がく⽚⻑(sepal length)、がく⽚幅(sepal width)、花びら⻑(petal length)、 花びら幅(petal width) • 予測の対象:花の種類(0、1、2 の 3 種類) 詳細は割愛しますが、特徴の重要度を算出できる機械学習アルゴリズムを⽤いて、4 つ の特徴から花の種類を予測してみます。その際、特徴の重要度を算出すると次のような結 果になりました(図 1.1)。 ▲図 1.1 アヤメのデータセットにおける特徴の重要度 10 Sam ple
  • 3. 1.2 データの取得 作成した予測モデルにおいては、petal length が⼀番重要で、sepal width が⼀番重要 でないと読み取れます。 今回の機械学習トレーニングで作成したのは、次のようなデータセットです。 • 特徴:属性情報と無料トライアル時のアクセス情報 • 予測の対象:本契約するか否か アヤメのデータセットと同様の枠組みを⽤いて予測モデルを構築することで、本契約す るか否かに影響する特徴とは何かを推定しようと思います。 1.2 データの取得 ⽇経電⼦版ではユーザの属性情報やアクセス情報などを収集しています。800 万⼈以上 の⽇経 ID と呼ばれる会員の情報を保有しており、平⽇ 1 ⽇のデータ量は約 1 億件にも達 します。これらのデータは、Redash*4 、Kibana*5 といった BI ツールで、気軽に取得・分 析できるよう整備されています。 今回は Redash 上で SQL を書くことで、データセットの作成に必要な次の情報を取得 しました。機械学習を⽤いた⽐較的複雑な分析を⾏う都合上、SQL ではデータ取得まで を扱い、残りの処理は Python を⽤いることにしました(表 1.1)。 ▼表 1.1 取得したデータの概要 分類 説明 ID 特定の期間に無料トライアルを実施した ID の⼀覧 属性情報 上記 ID の登録情報 無料トライアル時のアクセス情報 上記 ID のカテゴリ∕デバイス別の閲覧数、保存記事数 本契約に⾄ったか否か 上記 ID の無料トライアル後の会員ステータス 1.3 探索的データ分析 分析の⼿始めとして、取得したデータの各特徴の分布や、⽋落している値(⽋損値)の 有無などを確認します。これは探索的データ分析(Exploratory Data Analysis)と呼ば れ、個⼈的にはビジネスの世界でデータを扱っていく上で特に重要な過程だと思っていま す。与えられた条件下で純粋に予測モデルの精度を競う⼤会などと⽐べ、ビジネスでは解 決すべき問題を特定し仮説を⽴てることに価値があると考えているからです。 本章では csv 形式のファイルを Python の pandas を⽤いて、データを処理していきま す。まずは、データを読み込みます(リスト 1.1)。 ▼リスト 1.1 データの読み込み *4 https://redash.io/ *5 https://www.elastic.co/jp/products/kibana/ 11 Sam ple
  • 4. 第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析 import pandas as pd df = pd.read_csv('df.csv', encoding="utf-8") ここでは、次のような形式で情報を保持しています (表 1.2)。 ▼表 1.2 df の概要(出⼒) user_id 属性情報 1 属性情報 2 アクセス情報 1 アクセス情報 2 cnv_flg 0000000001 hoge1 fuga1 piyo1 foo1 0 0000000002 hoge2 fuga2 piyo2 foo2 1 0000000003 hoge3 fuga3 piyo3 foo3 0 0000000004 hoge4 fuga4 piyo4 foo4 1 0000000005 hoge5 fuga5 piyo5 foo5 1 表では省略していますが、特徴の数は属性情報が 10 程度、アクセス情報が 400 程度で す。cnv_flgは本契約に⾄ったか否かを表し、本契約に⾄った場合は 1、そうでない場合 は 0 の値となっています。データの⾏数は約 25,000 です。 最初に、各特徴の基礎統計量を⾒てみます(リスト 1.2)。 ▼リスト 1.2 各特徴の基礎統計量 df.describe() このコマンドにより各特徴の基礎統計量を算出できます。特徴ごとの最⼩値、平均値、 最⼤値、標準偏差などが確認できるので、⼤まかに傾向を確認できます。具体的な数字に は⾔及できませんが、予測の対象である cnv_flgは、1 に⽐べて 0 が多い不均衡データで した。 次いで、各特徴の⽋損値の割合を確認します(リスト 1.3)。 ▼リスト 1.3 各特徴の⽋損値の割合 df.isnull().sum() / len(df) 各特徴の⽋損値の数を計算し、それぞれ全体の数で割ることで割合に変換しています。 ここでは、SQL で集計した保存記事数が 0 件の場合と、⾃由回答で収集している属性情 報に⽋損があると分かりました。 予測の対象となる値と各特徴の相関や、特徴間の相関を出してみることも効果的です。 どのような特徴が予測の対象と強い関係性を持っているか、過剰な相関がある特徴の組み 合わせはないかなどを確認します。過剰な相関がある特徴の組み合わせがあると、統計的 な分析結果が正しく推計できなくなる問題が発⽣する場合があります。そのような組み合 わせが⾒つかった際には、1 つを残して特徴から削除する対応が⼀般的です。 次のコードでは、予測モデルの作成に向けて cnv_flgとの正の相関が⼤きい特徴を、順 に出⼒しています(リスト 1.4)。 12 Sam ple
  • 5. 1.3 探索的データ分析 ▼リスト 1.4 予測の対象となる値と各特徴の相関 corr = df.corr() corr['cnv_flg'].sort_values(ascending=False) 最後に、⾼次元データの次元削減の⼿法である t-SNE*6 を⽤いて、今回のデータを可 視化してみます(リスト 1.5)。 ▼リスト 1.5 t-SNE での可視化 import matplotlib.pyplot as plt from sklearn.manifold import TSNE X = df.drop(['user_id', 'cnv_flg'], axis = 1) y = df['cnv_flg'] X_reduced = TSNE(n_components=2, random_state=0).fit_transform(X) plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y) t-SNE を⽤いて元の特徴を保持しながらデータを圧縮することで、⼈間が解釈しやすい 2 次元での可視化を実現しました(図 1.2)。 ▲図 1.2 t-SNE での可視化(出⼒) ⻩⾊は cnv_flgが 1 の ID、紫⾊は 0 の ID を⽰しています。⻩⾊の点が⽐較的まと まった位置にプロットされており、適切に予測モデルを設計することで、ある程度の精度 *6 http://www.jmlr.org/papers/v9/vandermaaten08a.html/ 13 Sam ple
  • 6. 第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析 を達成できるのではないかと解釈しました。 1.4 データの前処理 ここからは探索的データ分析で得られた知⾒も踏まえて、データの前処理を実施してい きます。まずは⽋損値を処理します。最初に、SQL で集計した保存記事数が 0 件の場合 の⽋損値に対応します。ここは単純に、保存記事数の⽋損値を 0 で補完します(リスト 1.6)。 ▼リスト 1.6 保存記事数の⽋損値を 0 で補完 df.fillna({'saved_articles': 0}, inplace=True) ⾃由回答で収集している属性情報について、⽋損値の割合が多い特徴は情報量が⼩さい ため削除します。今回は閾値を 50 %に設定しました。⽋損値の割合が 50% より⼩さい 場合には、⽋損していない値の情報を基に補完します。量的変数の場合には平均値や中央 値で補完するのが⼀般的ですが、今回は質的変数だったので、煩雑ですが次のような処理 を実⾏しました(リスト 1.7)。 ▼リスト 1.7 質的変数の⽋損値の補完 target_column_name = list(df.columns[df.isnull().any(0)]) for tcn in target_column_name: df[tcn] = df[tcn].apply( lambda x: df[tcn].dropna().sample().values[0] if x != x else x ) ⽋損値を、⽋損していない値からランダム抽出して補完する操作になっています。 1.4.1 質的変数の処理 ここでは、質的変数を量的変数に変換し、機械学習アルゴリズムで扱えるようにしま す。次のコードでは、対象となる特徴を dummy_columnsというリストに格納しています (リスト 1.8)。 ▼リスト 1.8 質的変数を量的変数に変換 df = pd.get_dummies(df, drop_first = True, columns = dummy_columns) 1.4.2 Leakage の削除 最後に、健全な予測モデルを作成するために Leakage となっていた特徴を削除しま す。Leakage とは、予測の対象となる値に関する予期せぬ情報が学習データ内に存在する 14 Sam ple
  • 7. 1.5 予測モデルの構築 ため、機械学習アルゴリズムが⾮現実的に⾼い精度を⽰す現象のことです*7 。予期せぬ情 報としては、たとえば正解に直結する特徴や、予測時には知りえない未来の特徴などが挙 げられます。 今回の場合は、アクセス情報として取得していたカテゴリ別の閲覧数の中の、本契約 申し込み⼿続きページの閲覧数が Leakage となっていました。本契約を申し込む⼿続き ページを閲覧しているユーザは、当然ほぼ 100% の確率で本契約に⾄っています。これで は⽬的となる予測モデルを構築できないので、今回はこれらの特徴を削除することにしま した。 実のところ、最初に予測モデルを構築するまでは、⽤意した特徴に Leakage があると 気付いていませんでした。ところが機械学習アルゴリズムの精度が異常に⾼かったため改 めて特徴を精査したところ、Leakage の発⾒に⾄りました。 次のコードでは、対象となる特徴を delete_columnsというリストに格納しています (リスト 1.9)。 ▼リスト 1.9 Leakage の削除 df.drop(delete_columns, axis=1, inplace=True) delete_columnsで指定した列を削除できました。 1.5 予測モデルの構築 いよいよ、ここまでで前処理をしてきた特徴を基に、機械学習アルゴリズムを適⽤して 予測モデルを構築します(リスト 1.10)。 ▼リスト 1.10 X, y の準備 X = df.drop(['user_id', 'cnv_flg'], axis = 1) y = df['cnv_flg'] user_idと cnv_flgを除いたデータを特徴として Xに、cnv_flgを予測の対象として y に代⼊しました。 1.5.1 機械学習アルゴリズムの選定 今回は、広く使われている機械学習パッケージ scikit-learn*8 を利⽤します。Kag- gle*9 というサイトで公開されているコード*10 を参考に、10 個の機械学習アルゴリズムの 精度を⽐較しました。指標としては単純な正解率を採⽤し、10 分割の交叉検証で精度を検 *7 https://www.kaggle.com/docs/competitions#leakage/ *8 http://scikit-learn.org/stable/documentation.html/ *9 https://www.kaggle.com/ *10 https://www.kaggle.com/sinakhorami/titanic-best-working-classifier/ 15 Sam ple
  • 8. 第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析 証しています。正解率だけではなく、不均衡データの分類の評価により適した AUC*11 と いう指標でも検証しましたが、概ね同様の結果が得られました(図 1.3)。 ▲図 1.3 10 個の機械学習アルゴリズムの精度⽐較 今回は、精度の⾼かった機械学習アルゴリズムの中から勾配ブースティング決定⽊ (GradientBoostingClassifier)*12 を採⽤しました。主な採⽤理由は、次の 2 つです。 • 勾配ブースティング決定⽊は、予測に⽤いた特徴の重要度を算出でき、今回の⽬的 に合致する • 同程度に精度の⾼いサポートベクトルマシンを⽤いた分類器(SVC)と⽐べ、本契 約に⾄るか否かという⼆値分類以外にも応⽤しやすい 勾配ブースティング決定⽊は、決定⽊と呼ばれる単純なアルゴリズムを逐次的に何度も 実⾏し、それらの結果を組み合わせることで汎⽤的な予測を導出する⼿法です。決定⽊で は、数ある特徴の中から 1 つを選択して、予測の分岐点となる閾値を求める⼿続きがあり ます。特徴 1 つずつの単位で予測の精度への寄与度が計算でき、この程度を特徴の重要度 をみなすことが可能です。 同じく精度の⾼かった K 近傍法(KNeighborsClassifier)は、予測したいデータと特徴 が似ている K 個のデータを取り出し、それら K 個のデータの情報を基に予測を導出する ⼿法です。⼀部のデータのみを取り出し予測しているため、全体における特徴の重要度を 理解するのが難しく、今回は採⽤を⾒送りました。 *11 http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score. html#sklearn.metrics.roc_auc_score/ *12 http://scikit-learn.org/stable/modules/generated/sklearn.ensemble. GradientBoostingClassifier.html/ 16 Sam ple
  • 9. 1.5 予測モデルの構築 1.5.2 ハイパーパラメータの調整 機械学習アルゴリズムを実⾏する際には、ハイパーパラメータと呼ばれるいくつかの値 を設定する必要があります。この設定値に応じて結果が変わるので、適切な調整が必要で す。今回はハイパーパラメータの調整にグリッドサーチ(GridSearchCV)*13 を利⽤しま した。指標としては AUC を採⽤し、10 分割の交叉検証を実⾏しています。また sample _weightを設定し、データ数の少ない cnv_flgが 1 のデータを重要視させることで、デー タの不均衡を緩和するよう調整しました(リスト 1.11)。 ▼リスト 1.11 グリッドサーチの出⼒結果 0.8031225667643095 GradientBoostingClassifier(criterion='friedman_mse', init=None, learning_rate=0.05, loss='deviance', max_depth=2, max_features=0.1, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=13, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=100, presort='auto', random_state=None, subsample=1.0, verbose=0, warm_start=False) AUC は 0.80 を超えており(最⼤ 1、最⼩ 0)、ある程度の性能が出ていると確認できま した。 1.5.3 特徴の重要度 最後に、今回の予測モデルにおける特徴の重要度を出⼒します。分かりやすさのため に、重要度が最⼤の特徴が 100 になるように正規化しました(リスト 1.12)。 ▼リスト 1.12 特徴の重要度の出⼒ feature_importance = clf.feature_importances_ feature_importance = 100.0 * (feature_importance / feature_importance.max()) 残念ながら結果の詳細はお⾒せできないですが、この特徴の重要度の⼤きい順に並び替 えることで、本契約するか否かに影響する特徴とは何かを推定できました。scikit-lea rnの勾配ブースティング決定⽊では、特徴の重要度がジニ係数の変化に基づいて計算され ています*14 。当然のことながら、過度に特徴の重要度を信じることなく、理論的背景を 意識して慎重に解釈する必要があります。 *13 http://scikit-learn.org/stable/modules/generated/sklearn.model_selection. GridSearchCV.html/ *14 https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/tree.py# L511/ 17 Sam ple
  • 10. 第 1 章 機械学習を⽤いた⽇経電⼦版 Pro のユーザ分析 1.6 おわりに ここまで、機械学習を⽤いて⽇経電⼦版 Pro のユーザ分析を実施し、無料トライアルか ら本契約に⾄る要因となる特徴を定量的に特定しました。分析結果はサービス企画・開発 や営業・マーケティングの担当者にも共有し、今後の施策に向けた議論の材料となってい ます。 本稿では「データを⾝近にする」ことを⽬標に活動しているデータドリブンチームの取 り組みの⼀部を紹介しました。我々の取り組みに、少しでも興味を持っていただく機会に なれば幸いです。 18 Sam ple
  • 11. 著者紹介 第 1 章 ⽯原祥太郎 / @upura0 Kaggle Expert。仕事では、どうすれば機械学習を使わないで済むかを考えています。 第 2 章 加藤皓也 / @hirosaji ゲーム実況を観ながらコードや記事を書くのが好きな Web エンジニアです。本章は 2BRO. と Vtuber の皆さまの御⼒をお借りして執筆しました。 第 3 章 清⽔正⾏ / @shimizu 毎⽇データビジュアライゼーションを作ってます。仕事の6割は神 Excel との戦い です。 第 4 章 安⽥翔平 / @nyasusho デザインで⾷べてバイクで遊ぶ⼈。⽇経ビジュアルデータのコンテンツデザイン、UI デザイン担当してます。SCSS 依存症。 第 5 章 伊藤⼤晃 / @isudzumi r.nikkei.com の開発と電⼦版マーケット情報ページの運⽤をしています。業務とまった く関係ないことを書いてます。 第 6 章 Kei / @kei_n_n_iek 電⼦版アプリ・紙⾯ビューアーアプリのログ分析をやらせてもらっています。昨年は  r.nikkei.com  の開発をしていました。 第 7 章 伊藤 / @fumito_ito iOSDC から考えなしにイベント参加を⼊れてしまった中で泣きながら書きました。内 容⾃体は iOSDC での登壇内容の焼き直しなので、ぜひイベントの動画や資料も合わせて ご覧いただけると嬉しいです。 第 8 章 まりーな / @marina10172003 Adobe 製品が好きな iOS エンジニア iOSDC2018 で登壇した内容の本版です。解析し たアニメーションは参照先の Web ページでみれます。After Effects でアニメーショント 141 Sam ple
  • 12. 付録 著者紹介 レース・・次はやらないかな(遠い⽬) 第 9 章・第 11 章 おがぱん / @ogapants 軽い気持ちでコラムを書いていたら章になりました。最⾼の校正をしてくださったなか てぃるさんと from-unknown さんに深く御礼申し上げます。 第 10 章 やまんだ / @ymnd スーパードンキーコング2を買いました。Android いっぱい好き。 装丁デザイン 安⽥翔平 / @nyasusho 久々の紙デザイン超楽しかった(コナミ 編集 やまんだ / @ymnd 次は⾵来のシレンを買います。 142 Sam ple
  • 13. Nikkei Development Book 2018 年 10 ⽉ 8 ⽇ 技術書典 5 版 v1.0.0 著 者 Nikkei Engineer Team 編 集 ymnd 発⾏所 Nikkei Engineer Team   (C) 2018 Nikkei Engineer Team 143 Sam ple