
探索的データ分析(EDA)を効率化するAutoEDAライブラリの紹介
まとめ
・従来のEDAの課題とAutoEDAのメリットの紹介(2章)
・AutoEDAライブラリを用いたデータマイニングプロセスの具体例紹介(3, 4章)
・レポーティングやデータの確認などに特化したAutoEDAライブラリの紹介(5章)
・(データエンジニア絶賛募集中!)
はじめまして。ネオキャリアのデータソリューショングループに所属している綿引と申します。
2020年7月に中途入社し、プロダクトのデータ分析や、広告関連データの基盤構築業務を行っております。
入社以前は、SI企業でWebサービスや人材採用に関するデータ分析を経験後、データ分析企業で統計解析や機械学習を活用した分析案件を担当してきました。Webマーティング分野の分析に関心があり、ネオキャリアでも社内のマーケティング部門と協力してデータ活用を進めています。
本noteでは、前回触れたEDA(探索的データ分析)を自動化するAutoEDAについて、CRISP-DMにおけるデータ理解と前処理の工程を自動化し、データ分析業務の効率化につながる部分をご紹介します。
最後までよろしくお願いいたします。
1. データ分析職が担当するEDA
前回のnoteでは、直接プロダクトに関わる現場の方々がデータリテラシーを向上させ、データを利活用できるようになることを目的としたEDAに着目し、Exploratoryを用いた取り組みについてお話しました。
EDAの目的は、データリテラシーの向上だけではありません。元々Tukeyによって提唱された際(※1)には、統計モデリングを前提としており、それ以外にも機械学習モデルの精度向上、データの有効性確認(後述)など、データを用いる状況によって目的は異なります。
分析人材の育成のため、その技能(スキル)要件の定義・標準化を行っているデータサイエンティスト協会(※2)は「課題解決の各フェーズで要求されるスキルセットのイメージ」について、以下のような図(※3)を提示しています(注記とコメントは筆者追記)。
「目的・テーマ設定」や「問題定義」のフェーズはBIツールを用いてデータを可視化することで現場の方たちだけで構想を立てられます。
しかしながら、具体的にどういう手順と手法で進めると筋が良いかという分析計画の立案・設計や、UIで未実装の処理を含めて高度な分析に対する理解と様々なデータを取り扱った実体験や専門能力が求められるフェーズでは、データ分析者がプログラミング言語を用いて実施するほうが保持するスキルセットの違いから有効と言えます。医療分野で言うと、地域に根ざしたかかりつけ医が包括的な判断をし、必要に応じて専門医が特殊な診断や医療を担当する役割分担のようなものです。
前回はExploratoryを用いたEDAによって、ビジネス力が求められるフェーズからデータサイエンス力が求められるフェーズへとつなげるお話でした。今回はデータサイエンス力とデータエンジニアリング力が求められるフェーズが焦点です。
2. 手作業によるEDAの課題
RやPythonなどのプログラミング言語を使用したEDAは、細かい単位まで深堀りできる反面、集計可視化のコーディング部分で似たコードを繰り返し書くことが多くあります。関数化やライブラリの自作による対応も考えられますが、すでに公開されているものがあれば、ゼロから整理する手間を省略できます。後述するAutoEDAはそれに該当します。
BIツールを使えば繰り返し作業を省力化できますが、より細かい分析を要する場合や、統計モデリングや機械学習モデル構築を行う場合は、大半のBIツールでは対応が困難で、プログラミング言語に頼る必要があります。これらを併用すると、EDA部分はBIツール、それ以降の工程はプログラミング言語と、ツールが分断されてしまい作業や管理が煩雑になってしまいます。
前回のnoteでご紹介したExploratory(※4)であれば、EDA工程の繰り返し作業の省力化から、一部モデリングまで対応できます。基本統計量の算出や可視化をSummary機能によって自動で実行したり、変数同士の相関を1クリックで確認可能です。
ただし、Exploratoryは機能を有効利用するには有料となります。ローカルファイルのみを扱うなら無料版で可能ですが、事業会社のデータ分析ではデータ量が多く、データベース上に保存されていることも多いです。
様々なデータソースに無料でアクセス可能で工程を一気通貫で扱えるというプログラミング言語によるアプローチの利点を残して課題を解決するため、EDA作業やレポート作成を自動化できるAutoEDAをご紹介します。
3. AutoEDAが自動化するデータマイニングプロセス
下記リンクにあるR言語のEDAライブラリを紹介する論文では、機械学習プロセスを自動化するライブラリ群が「AutoML(Auto Machine Learning)」と呼ばれていることにちなみ、EDAを自動化するライブラリ群を「AutoEDA」と呼んでいます。
・The Landscape of R Packages for Automated Exploratory Data Analysis (PDF)
この論文の前半で、データマイニングの一般的なプロセスを示した「CRISP-DM(CRoss-Industry Standard Process for Data Mining)(※5)」に沿って、AutoEDAの担当する領域を次のように説明しています(日本語訳は筆者による)。
2番目のData Understanding(データ理解)がEDAに当たりますが、AutoEDAではその後工程であるData Preparation(前処理)まで含んでいるライブラリが多くあります。
これらのData Understanding(データ理解)とData Preparation(前処理)はより細かい工程に分解でき、以下のように説明されています(日本語訳は筆者による)。
・description:概要(行や列の数や各変数の型などデータの概要を確認)
・validity :有効性(欠損値や異常値などデータに問題がないか確認)
・exploration:探索(単変数や多変数の組み合わせでデータの探索)
・cleaning :整備(データの品質を高めるため欠損や誤記などを修正)
・derived :特徴量作成(既存の変数から新たな変数を抽出)
ライブラリによっては一部工程をサポートしていないなど差異はありますが、AutoEDAは基本的にこれら5つの工程を自動化する処理が実装されています。
4. dlookrを用いたAutoEDAの具体例
具体的にどのようなことができるのか、R言語を使用して確認します(※6)。
例示するEDAの対象にはpenguinsと呼ばれるデータを使用します(※7)。データ分析例でしばしば用いられるirisデータと異なり質的変数や欠損値を含むため、今回のAutoEDAの対象として適していると考え採用しました。
・Palmer Archipelago (Antarctica) Penguin Data
使用するAutoEDAライブラリは、比較的新しく、上記の5工程すべてに対応しているR言語のライブラリであるdlookrを選択しました。コード例では一部、Rのdplyrによるデータ操作知識を前提としており、パイプ演算子をデータ処理に用いています。
・Tools for Data Diagnosis, Exploration, Transformation
本章の残りのセクションでは前述した図に記載した工程を、dlookrを用いて上から順に実行していきます。
4.1 dlookrを活用したdescription(概要)とvalidity(有効性)の例
dlookrでデータの概要把握(description)と有効性の確認(validity)を実行するにはdiagnoseという関数を使用します。実行すると次のように各項目の型や、欠損とユニーク状況が表示されます。
# dlookrのdiagnose関数を活用してデータの概要と有効性を確認
dlookr::diagnose(penguins)
#> Registered S3 method overwritten by 'quantmod':
#> method from
#> as.zoo.data.frame zoo
#> # A tibble: 8 x 6
#> variables types missing_count missing_percent unique_count unique_rate
#> <chr> <chr> <int> <dbl> <int> <dbl>
#> 1 species factor 0 0 3 0.00872
#> 2 island factor 0 0 3 0.00872
#> 3 bill_length_mm numer~ 2 0.581 165 0.480
#> 4 bill_depth_mm numer~ 2 0.581 81 0.235
#> 5 flipper_length_~ integ~ 2 0.581 56 0.163
#> 6 body_mass_g integ~ 2 0.581 95 0.276
#> 7 sex factor 11 3.20 3 0.00872
#> 8 year integ~ 0 0 3 0.00872
「missing_percent」は欠損率(%)、「unique_rate」はユニークな値が占める割合を示しています。例えば、「bill_length_mm」は「0.58%」が欠損しており、「47.9%」がユニークな値であることが分かります。「missing_percent」は百分率、「unique_rate」は小数で表示されている点に注意が必要です。
欠損率は後述する欠損補完が必要かの判断に利用します。ユニークな値の割合は、全レコードに1つの値のみが入っている変数や、全レコードに名義尺度として異なる値が入っている変数など、分析での活用が難しい変数の発見に利用します。
4.2 dlookrを活用したexploration(探索)の例
次は探索のフェーズです。この工程ではデータの関係性を見ることが多く、dlookrでもそのための関数が用意されています。
単変数の分布も対応していますが、ここでは2変数間の関係を描画します。target_byとrelateのふたつの関数で描画したい変数を指定すると、変数の型に応じた適切な方法で可視化を実行します。具体的には量的変数と量的変数の場合は散布図と予実プロット、量的変数と質的変数の場合は箱ひげ図が描画されます。
# dlookrのtarget_by関数とrelate関数を活用して量的変数同士の描画
penguins %>%
dlookr::target_by(bill_length_mm) %>%
dlookr::relate(bill_depth_mm) %>%
plot()
左の散布図から複数のグループに分かれていることが確認できます。右の予実プロットから、線形回帰の当てはまりが悪く、グループごとに傾向が異なると考えられます。
# dlookrのtarget_by関数とrelate関数を活用して量的変数と質的変数の描画
penguins %>%
dlookr::target_by(bill_length_mm) %>%
dlookr::relate(species) %>%
plot()
箱ひげ図からは「bill_length_mm(くちばしの長さ)」は「species(ペンギンの種類)」によって異なり、とくに「Adelie」という種類は短いと分かります。
4.3 dlookrを活用したcleaning(整備)の例
ここまでは「データ理解」のステップでしたが、ここからは「前処理」に入ります。
データ整備では外れ値の処理や不要な変数の削除などがしばしば実施されます。中でも欠損値の存在は、統計処理を不可能にしたり、データに偏りを発生させるといった問題を引き起こすため、補完して扱うケースが多いです。例えば、Rで欠損を含んだ「body_mass_g」の平均値を算出すると以下のように表示されます。
# 欠損を含んだ変数の平均値算出
mean(penguins$body_mass_g)
#> [1] NA
na.rm引数をTRUEにすると欠損を除外して平均値を算出します。
# 欠損を除外した変数の平均値算出
mean(penguins$body_mass_g, na.rm = TRUE)
#> [1] 4201.754
dlookrにはimputate_na関数で欠損値の補完ができます。補完の方法は平均値や中央値などによる単一代入法や多重代入法を選択できます。(※8)
次のコードでは中央値による欠損補完を実施しています。
# dlookrのimputate_na関数を活用して欠損値補完
penguins <- penguins %>%
dplyr::mutate(body_mass_g_imputate = dlookr::imputate_na(penguins, body_mass_g, method = "median")) # imputate_na関数で欠損補完
penguins %>%
dplyr::select(dplyr::starts_with("body_mass_g")) %>%
dplyr::filter(is.na(body_mass_g)) # 元々欠損であったレコードを表示
#> # A tibble: 2 x 2
#> body_mass_g body_mass_g_imputate
#> <int> <imputatn>
#> 1 NA 4050
#> 2 NA 4050
左の列が元の状態で、欠損していることが分かります。右が補完した後の列で、「4050」が代入されています。
この値が正しいのか確認するため、na.rm引数をTRUEにして算出します。
# 全体の中央値を確認
median(penguins$body_mass_g_imputate, na.rm = TRUE)
#> [1] 4050
「4050」と算出され、imputate_na関数によって補完された値が正しく中央値であると分かりました。
この結果を用いて先ほどと同様に平均値を求めると、欠損値によって算出できない問題が解消されています。
# 欠損補完後に平均値が算出されるか確認
mean(penguins$body_mass_g_imputate)
#> [1] 4200.872
4.4 dlookrを活用したderived(特徴量作成)の例
最後に特徴量の作成です。特徴量の作り込みが機械学習による予測モデルの品質に大きく影響するため、分析者が最も労力を割く工程と言えます。
dlookrではtransform関数で特徴量作成が可能で、method引数で変換方法を指定します。ここでは入力を二乗していますが、標準化や対数変換も可能です。
# dlookrのtransform関数を活用してbill_length_mmを二乗した変数を作成
penguins <- penguins %>%
dplyr::mutate(bill_length_mm_transform = dlookr::transform(bill_length_mm, method = "x^2")) # transform関数で変換
penguins %>%
dplyr::select(dplyr::starts_with("bill_length_mm")) %>%
head() # 元々の値と変換後の値を表示
#> # A tibble: 6 x 2
#> bill_length_mm bill_length_mm_transform
#> <dbl> <transfrm>
#> 1 39.1 1528.81
#> 2 39.5 1560.25
#> 3 40.3 1624.09
#> 4 NA NA
#> 5 36.7 1346.89
#> 6 39.3 1544.49
実行結果のうち、左の列が元の値で右が変換後です。
正しく二乗されているのか確認するため、上に表示した6つの値を二乗すると以下のように算出されます。
# 二乗した値の確認
(penguins$bill_length_mm[1:6])^2
#> [1] 1528.81 1560.25 1624.09 NA 1346.89 1544.49
transform関数の結果と合致しており、正しく二乗されていたことが分かります。
4.5 dlookrを活用したreporting(レポート作成)の例
最後にレポート作成について触れます。この工程はCRISP-DMには存在しませんが、大半のAutoEDAライブラリはレポート作成機能を備えています。
dlookrではeda_report関数にデータを渡すと、前述の「データ理解」の工程を実行し、HTMLやPDFの形式でまとめてくれます。
次の画像はレポートファイルの目次部分です。縦に長いファイルになるので、「1.2 Information of Variables」の途中まで表示しています。
# dlookrのeda_report関数でレポートを作成
penguins %>%
dlookr::eda_report(output_format = "html",browse = TRUE)
「1 Introduction」では欠損率やユニーク率などデータの概要を表示し、「2 Univariate Analysis」では単変数の基礎統計量に加えて正規性の検定を実施しています。「3 Relationship Between Variables」で変数間の相関を確認し、「4 Target based Analysis」で変数の型に応じて描画を行っています。
複数の集計可視化結果をHTMLやPDF形式で出力する機能はプログラミング言語を使用する必要がなく、現場の方に共有する際に便利です。
5. その他AutoEDAパッケージの紹介
前章ではCRISP-DMの5つの工程とreporting(レポート作成)について、dlookrを例にAutoEDAの基本的な流れを解説しました。dlookr以外にもAutoEDAのライブラリは多数存在しており、今回はその中から有用と思われる4つのライブラリをご紹介します。(※9)
それぞれの機能を比較表(※10)にまとめると次の通りです。
5.1 R言語によるAutoEDAライブラリ
dataMaidはデータの有効性検証に優れたR言語のライブラリです。4章ではdlookrによる欠損状況やユニーク状況を確認しましたが有効性の観点はそれだけではありません。データ入力時の間違いで意図しない値が混入する可能性があります。
# toyDataの内容を確認
head(toyData)
#> # A tibble: 6 x 6
#> pill events region change id spotifysong
#> <fct> <dbl> <fct> <dbl> <fct> <fct>
#> 1 red 1 a -0.626 1 Irrelevant
#> 2 red 1 a 0.184 2 Irrelevant
#> 3 red 1 a -0.836 3 Irrelevant
#> 4 red 2 a 1.60 4 Irrelevant
#> 5 red 2 a 0.330 5 Irrelevant
#> 6 red 6 b -0.820 6 Irrelevant
上記に表示したデータセットはdataMaidライブラリにあるtoyDataというサンプルデータです。toyData中の「region」という変数にはピリオドの横に半角スペースを含む要素があります。
# toyDataのregion変数の要素を確認
toyData$region %>% unique()
#> [1] a b c . other OTHER
#> Levels: . a b c other OTHER
データの生成過程によりますが、半角スペースやピリオドを欠損として扱い、”other”と”OTHER”を同じ値として扱うほうが適切かもしれません。この「region」をcheck関数に渡すと、問題がありそうな要素を表示してくれます。
# dataMaidのcheck関数でregionの有効性を確認
dataMaid::check(toyData$region)
#> $identifyMissing
#> The following suspected missing value codes enter as regular values: , ..
#> $identifyWhitespace
#> The following values appear with prefixed or suffixed white space: .
#> $identifyLoners
#> Note that the following levels have at most five observations: , ., a, b, c, other, OTHER.
#> $identifyCaseIssues
#> Note that there might be case problems with the following levels: other, OTHER.
#> $identifyNums
#> No problems found.
・「$identifyMissing」
欠損値の間違いと疑われる要素として、半角スペースとカンマを提示しています。
・「$identifyCaseIssues」
大文字小文字に問題があると疑われる要素として、"other"と"OTHER"を提示しています。
ExPanDaRはレポーティングに特化したR言語のライブラリです。R言語によるWebアプリ開発ライブラリであるShinyを利用して、インタラクティブなレポートを作成してくれます。
penguinsデータを指定すると下記画像のようなUIを提供するShinyアプリが作成され、可視化する項目の選択や表示するデータの絞り込みをプルダウンメニューで行えます。
# ExPanDaRのExPanD関数でレポートを作成
ExPanDaR::ExPanD(penguins)
左の列で変数を選択すると、質的変数は棒グラフ、量的変数はヒストグラムで描画されます。他にも散布図の描画や、目的変数と説明変数を選択して回帰分析を実行することも可能です。
以下の画像は棒グラフを描画している様子です。「Select factor to display」で表示する変数を選択し、「Select additional factor to display」で棒グラフの内部を色分けする変数を選択します。「Relative display」をチェックすると100%積み上げ棒グラフに変更します。
5.2 PythonによるAutoEDAライブラリ
Pandas Profilingはデータの概要を素早く掴む目的で広く利用されているPythonのライブラリです。ProfileReport関数にデータを渡すとjupyter notebook上にレポートを作成してくれます。
# PandasProfilingのProfileReport関数でレポートを作成
profile = ProfileReport(penguins)
profile
Sweetvizはふたつのデータセットを比較したレポート作成が可能なPythonのライブラリです。penguinsを以下のように「species」が”Adelie”のものと”Gentoo”のふたつに分割して、動作を確認します。
# penguinsを2つのデータセットに分割
adelie = penguins[penguins["species"] == "Adelie"]
gentoo = penguins[penguins["species"] == "Gentoo"]
compare関数に2つのデータを渡した後に、showhtml関数を実行すると、データの分布を比較するHTMLのレポートファイルが出力されます。
# Sweeetvizのcompare関数でadelieとgentooを比較するレポートを作成
my_report = sv.compare([adelie, "Adelie"], [gentoo, "Gentoo"])
my_report.show_html()
左側で各変数の分布を描画しています。青色が”Adelie”、橙色が”Gentoo”を示しており、ふたつのデータセットを比較できます。左側でひとつの変数をクリックすると選択した部分が赤く囲われ、右側に相関係数や最頻値など、より詳細な情報が表示されます。
6. AutoEDAの利点と課題
ここまでAutoEDAについてRとPythonのライブラリを取り上げて実行例とともに、手作業と比較して工数を削減できる利点を提示してきました。
4章でご紹介したdlookrは、データの概要や有効性の確認を1つの関数で行え、可視化を繰り返すステップも変数名を与えれば、データ型に応じた可視化を自動で実行してくれました。そしてレポート作成機能では、一通りのEDA工程をたった数行のコードで実行できました。
これらの省力化以外にもAutoEDAには次のようなメリットがあります。
1. 探索すべき基本的なポイントを学べる
2. データの品質管理・保証の側面からの活用
dataMaidを使用してデータの有効性の確認をした際、異常が疑われるポイント(大文字小文字の混在、スペースの混入など)を分析者が調査する必要がありませんでした。このように自動化された処理からデータ分析の基礎を知ることができ、経験が少ない分析者にとって学習の道標となるでしょう。
また、分析者だけでなくデータ基盤構築を行うデータエンジニアにとってもAutoEDAは有用な試みです。データの品質管理・保証はデータを整備する上でエンジニアの抱える大きな課題と言え、AutoEDAの要素のひとつとして挙げたvalidity(有効性)はデータの品質チェックに該当し、意図したデータを取得できているのか検証する工程です。
下記以下のリンク先の「How the package can be used in production?」にあるように、問題が疑われる場合に通知(リンク先の場合はemail)を飛ばすような仕組みを構築するといった活用方法が考えられます。
・validate your data and create nice reports straight from R
一方、利用可能な部分が定型化された機能に限られる点が課題として挙げられます。グラフの細かい部分を修正したい場合などは、別途手作業でコーディングしなければいけません。
また、AutoEDAによって集計可視化の作業は自動化されますが、仮説設定は分析者が行う必要があります。これに対して、特定分野に限定し、機械学習の助けを借りることで仮説から検証まで自動で行う取り組みもあります(※11)。しかし、仮説設定の機能は限られており、しばらくは分析者が現場の方と協力しながら仮説を磨き上げていく工程は必要です。
これらの利点や課題は現在流行しているノーコードと呼ばれているサービスと共通する部分が多く見られます。ノーコードとは、プログラミングコードを書かずにアプリケーション開発ができるサービスのことです。
実際にコードを書いて開発を進める場合と比較してノーコードの利点として、学習コストが低く、短期間で開発できることが挙げられます。対して、開発できる機能がサービスで提供されているものに限られるため、柔軟性や拡張性に課題があります。
これを解消するため、必要に応じて最小限のコードを書く、ローコードと呼ばれるサービスも登場しています。
本noteの2章で触れたBIツールによるEDAはノーコードに、AutoEDAはローコードに相当すると言えます。開発や分析に限らず様々な分野で自動化が進んでいる中で、ツール導入のために一方をあげつらうのではなく、自動化の限界や課題点を補完する方法を適切に把握し、正しく使いこなしていく視点が求められます。
7. おわりに
今回はプログラミングによるEDAを効率化するAutoEDAライブラリについてお話しました。 AutoEDAは、データ理解や前処理に必要な工程を自動化し、データ分析の効率化を行います。
自動化による利点と課題を把握しながら、皆様の分析業務の効率化につなげていただければと思います。
最後に、弊社では基盤領域を主導できるデータエンジニアを絶賛募集しております。
カジュアル面談を含めたご都合の良い形にて、是非ともお話を伺いたいと考えております。こちらも合わせてご興味がある方は是非ご連絡いただけると幸いです。
※1:探索的データ解析は、1960年ごろより有名な統計学者J.W.Tukeyによって提唱されたもの。データの解釈にあたっては「まずモデルありき」ではなく、モデルを仮定する前に現実的な立場で、データの示唆する情報を多面的に捉えるという、解析初期のフェーズを重視したアプローチ。
https://www.msi.co.jp/splus/products/eda.html より
※2:Exploratoryについてはこちら。
※3:https://www.datascientist.or.jp/
※4:http://www.datascientist.or.jp/files/news/2014-12-10.pdf
※5:CRISP-DM (Cross-Industry Standard Process for Data Mining) は、業界で実証されている、データ・マイニングの指針となる手法。
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_sub/modeler_crispdm_ddita/clementine/crisp_help/crisp_overview.html より
※6:R言語と並んでデータ分析に広く用いられるPythonには、機械学習プロセスを自動化するAutoMLのライブラリが多く存在する。EDAの自動化を含むAutoMLもあるが、大半のライブラリは前処理、モデリング、精度評価の工程を自動化することに注力しており、本noteではAutoEDAに着目するためR言語のライブラリを中心に紹介している。
※7:penguinsデータとは、これまで統計解析や機械学習分野のサンプルデータとして広く使用されてきたアヤメに関するデータセットであるirisデータの代替として登場したもの。irisデータは初めて引用された論文が優生学のものであったことから、倫理的に問題があるとされ、別のデータに置き換えられる動きがある。irisデータの問題点や代替データについては以下をのWebサイトを参照。
・It's time to retire the iris dataset
・Stop using iris
・Let's move on from iris
※8:欠損値があるデータの分析
※9:RのAutoEDAライブラリについては以下の論文を参照。
・The Landscape of R Packages for Automated Exploratory Data Analysis
PythonのAutoEDAライブラリは以下のWebサイトを参照。
・10 Python Automatic EDA libraries which makes Data Scientist life easier
AutoEDAの情報を取りまとめたリストには次がある。
・A list of software and papers related to automatic and fast Exploratory Data Analysis
※10:description(概要):すべてのライブラリでデータ概要は出力可能。
validity(有効性):主に欠損率を調べるのみ。dataMaidのみ後述するように異常値と疑われる値を検出するため◎。
exploration(探索):dataMaidは2変数の組み合わせによる探索を行わないため△。
cleaning(整備):ExPanDaRは外れ値の処理のみであるため△。dlookrは前述した欠損値処理に加えて、外れ値処理や正規化の機能を持つ。
derived(特徴量作成):AutoEDAライブラリの大半は特徴量作成機能が弱い。特徴量作成には、質的変数のエンコーディングや複数の変数を組み合わせた特徴量の作成などがあるが、dlookrの機能も対数変換や階乗のみに限られる。AutoMLライブラリが得意とする工程。
reporting(レポート作成):ExPanDaRはWebアプリレポートの柔軟性が高く、◎とした。
※11:Let Data Ask Questions, Not Just Answer Them