はじめに
世の中には例題を読ませるだけの教育が氾濫しているが、本当にできるようになるためには、練習が欠かせない。 ここでは、Pythonを用いたデータアナリティクスを本当に自分でできるようになるための練習問題を集めた。 できれば解答をコピペするのではなく、自分の力で考え、自分で試行錯誤をし、自分で書いてみることを勧める。 さらに本書は,単にプログラムが書けるだけでなく,例題と練習問題を通して,背景にある理論を理解し, 自分で実際の問題を解決できることを目標としている.
本書は,JupyterLabで記述されたものを自動的に変換したものであり,以下のサポートページで公開している. コードも一部公開しているが,ソースコードを保管した GitHub 自体はプライベートである. 本を購入した人は,サポートページで公開していないプログラムを
でダウンロードすることができる. ダウンロードしたファイルの解凍パスワードは<本に記述>である.
作者のページ
サポートページ
出版社のページ
Pythonによる実務で役立つデータサイエンス練習問題集 200+ (1) - アナリティクスの基礎・可視化と実践的テクニック-
Pythonによる実務で役立つデータサイエンス練習問題集 200+ (2) - 科学計算の基礎と予測・最適化 -
Pythonによる実務で役立つデータサイエンス練習問題集 200+ (3) - 機械(深層)学習 -
内容
- 数値計算パッケージ NumPy
- データ解析パッケージ Pandas
- 可視化パッケージ matplotlibとseaborn
- 対話型可視化パッケージ Plotly
- データを可視化するための方法 (Plotly Express)
- Python言語の先進的プログラミング (ジェネレータ, simpyによるシミュレーション, 型ヒント, dataclasses, pydanticパッケージによる型の厳密化, 既定値をもつ辞書defaultdict, map関数, 正規表現, JSON, Requestsパッケージ, OpenPyXLによるExcel連携, StreamlitによるWebアプリ作成)
- statsmodelsを用いた統計分析
- 科学技術計算パッケージ SciPy
- PyMCによるベイズ推論とProphetによる時系列データの予測
- グラフ・ネットワークパッケージ NetworkX
- PuLPとGurobi/Pythonによる最適化問題のモデリング
- SCOPによる制約最適化のモデリング
- OptSeqによるスケジューリング最適化のモデリング
- scikit-learn を用いた機械学習
- fastai による深層学習
- PyCaretを用いた自動機械学習
プログラミング環境の整え方
- ブラウザしかない場合: Google Colabを使う. Jupyter Notebookが動き, Google Driveに保管される.
パッケージ(モジュール)のインストールには pip を使う. Google Colab内では !pip とする.
自分のPCにインストール 1: 全部入りの anaconda をダウンロードして入れる. Juputer Labなど色々いっぺんに入る. Plotlyやfastaiやprophetは別途 conda コマンドでインストール
自分のPCにインストール 2 (専門家向け): 仮想環境を作り個別に環境を整備する. 仮想環境とパッケージ管理は Poetry もしくはcondaを推奨.
Poetryの場合: Python 3.x を入れたあとで, Poetryをインストール. Poetryの使い方については,以下のビデオを参照. 「poetry add パッケージ名」で諸パッケージをインストールする.
ビッグデータの定義
ビッグデータの定義には様々なものがあるが,その特徴は,以下のようにまとめられる.
名前の通りサイズが大きい (volume).たとえば,2008年の段階でGoogleは1日に20ペタバイトのデータの処理を行っており, 2020年には全世界でのデータ保管量は35ゼタバイトになると予測されていた(実際には59ゼタバイトを超えていた). ちなみに,ペタはテラの1000倍で,その上(さらに1000倍ずつ)が順にエクサ,ゼタ,ヨタ,そして2022年に追加されたロナ,クエタである. 大きさをイメージするために例を示そう.テラバイトのデータを保管するにはポータブルハードディスク程度なので手のひらサイズであるが,ペタになるとラック1本分,エクサになるとデータセンター1棟分,ゼタになるとデータセンター1000棟なのでちょっと置き場に困ることになる.
頻繁に変更があり,変更されたデータに対してなるべく早く(できればリアルタイムに)応答する必要がある(velocity). たとえば,株の取引などの金融サービスでは1ms(1ミリ秒)以内での応答を要求される.
データが定型でなく,多様である(variety).たとえば,Wal-Martは1時間に100万人分のトランザクショナルデータを処理し,2.5ペタバイトのデータをデータベースに保管している.また,現在の保管されているデータの約88パーセントは非定型データであり,その比率は年々増加している.
以上3つの特徴をまとめて3Vと呼ぶ.他にも(きちんと加工した後に)データが価値をもつこと(value), 正確なこと(veracity=quality;裏返して言うと元データが整理されておらず,誤りが多いこと), 変動性をもつこと(variability =data dynamicity),データが互いに結合していること(valence=connectedness)をあわせて7Vと言う場合もある. さらに細かく言うと,小規模データにはない以下の9つの特徴をもつものがビッグデータである.
- 特定の目的のために収集されていない.
- 1箇所に保管されていない.
- 定型のフォーマットをもたない.
- 1人が準備したものではない.
- データの寿命が長い.
- 数値データの単位が統一されていない.
- データの再現性が低い.
- 収集するための費用が膨大である(最近では,データ収集費用は安くなっている).
- 分析が難しい.
ビッグデータの歴史
研究分野の歴史を眺めることは,その分野の未来を予測するためや,一時的な流行語(buzzword)とそうでないものを見分けるために有意義である.ちなみに筆者は(歴史の授業は嫌いであったが),研究分野の年表を作成することが趣味である.歴史を知ることによって,次にどのような研究をすれば良いかが分かるからである.
過去の研究がない用語は,その分野の始祖となる画期的なものであるか,buzzwordの何れか(ほとんどが後者)である.また,定着した学術用語との区別が明確でないものはbuzzwordである.たとえば,バリューチェーンやデマンドチェーンというのは,素人を煙に巻いて予算をとるために発明されたbuzzwordであり,サプライ・チェイン(筆者はサプライチェーンよりサプライ・チェインが好きである.よって以下ではサプライ・チェインと記す)はロジスティクスから発展した正しい専門用語である.用語の後ろに2.0とか4.0とかが付いているのは大抵buzzwordである.一方では,何でもbuzzwordだといって世界の流れから取り残されるのも危険である.これは古い権威にしがみつきがちな大学関係者に見られがちな現象である.「ビッグデータ,クラウド,データサイエンスはbuzzwordなので,古典的統計理論を教えていればそれでいい」というのでは,新しい人材は育たない.
計算機もなくデータ収集が難しい時代から,ビッグデータ解析の基礎が築かれてきた.その主たるものは統計理論である.統計理論の中で現在でもよく使われるものの1つとして,W. S. Gossetが1908年にペンネームのStudentで発表した$t$-検定がある.検定は古典統計理論の中核も成すものであるが,少量のサンプルデータを用いて大きな母集団についての知識を得るための理論なので,ビッグデータ時代には注意をして使う必要がある.統計パッケージにデータを入れれば,簡単に$p$-値が出力されるが,この結果から嘘をつくことは極めて容易である.中身も分からずに統計を使うことへの警鐘(主に$p$-値の濫用)が,米国統計学会から出されている
1935年にR. A. Fisherが著した “The Design of Experiments” には,「相関は因果関係を意味する訳ではない」という名言が載っている.統計パッケージにデータを入れれば相関は簡単に計算できるので,そこから因果関係があると勘違いした論文に山ほど出会ったことがある.1939年には,品質管理の「デミング賞」でも有名なW. E. Demmingによる “Quality Control” が出版された.1954年にD. Huffが出した”How to Lie with Statistics”は,学術書ではないが統計の使用法に警鐘を鳴らす名著である.この本は翻訳(「統計でウソをつく法―数式を使わない統計学入門」高木秀玄訳, 1968, 講談社ブルーバックス)もあるので一読を勧める. 特に,「高齢者の交通事故の約半数は自宅から500 m以内」などの統計値を毎年発表している官庁の人たちには是非読んで欲しい.
J. W. Tukeyが 1977年に出したExploratory Data Analysis” では,データの可視化やデータマイニングの基礎になる様々な手法が紹介されている.この思想を元に,1984年にベル研究所で開発されたS言語は,その後オープンソースのR言語に引き継がれ,現在でも最も良く使われるデータ解析ツールのうちの1つとなっている.
1990年代に入ると “Knowledge Discovery in Databases” (データ解析によって知識を発見する)ための研究が推進され,その後データマイニングという研究分野として確立された.1996年には,Googleが検索エンジンのプロトタイプを公開し,その後ページランクの概念を用いたWebページの順位付けが行われるようになった.これは現在でもGoogleの中核技術であり,そこではまさにビッグなデータの解析が必要になる.そのための技術であるMapReduceは2004年に公開され,現在でも大規模なデータに計算を適用するための基本技術としてその改良が行われている.
ビッグデータという用語が使われたのは2010年に入ってからであるが,2011年にはIBMが開発したワトソンがクイズ番組で優勝したり,2016年にはGoogleが開発したAlphaGoが囲碁の世界チャンピオンに勝ち越したりニュースには事欠かない.近年では,安価なクラウドコンピューティングが普及し,実務でも比較的容易にビッグデータの解析ができるようになってきている.
最近では,ビッグデータという用語は,一部の大規模解析でのみ利用されるもので,ほとんどのアナリティクスは中規模のサイズの定型データに対して使われることが認識されるようになった. サプライ・チェインにおいてはこの傾向が顕著であり,あまりにも大きいデータをハンドリングする技術よりは,アナリティクスをきちんと使いこなせる技術の方に重点が置かれるようになってきている.
アナリティクス
ビッグデータを用いて意思決定の支援を行うための科学がデータサイエンスであり,そのための手法がアナリティクス(解析的情報技術)である.
アナリティクスは以下の5つに分類できる.
- 記述的(descriptive):データを集計し,レポートを表示する.
- 診断的(diagnostic):OLAP(On-line analytical process)ソフトウェアに代表されるように,データを用いて診断を行う.
- 発見的(discovery):データマイニングで代表されるように,データから何らかの知識を発見する.
- 予測的(predictive):機械学習に代表されるように,データから未来を予測する.
- 指示的(prescriptive):最適化を用いて将来に対する行動を指し示す.
記述的・診断的の境は曖昧だが,そこにはシミュレーション,待ち行列理論,在庫モデル,PERT(Program Evaluation and Review Technique)などが含まれる.同様に,発見的・予測的に境も曖昧であるが,そこには回帰分析,時系列分析,判別分析などの統計分析や連想分析,データマイニング,機械学習などが含まれる.これらの分析は主に戦略を評価するためのものであり,戦略を生成する指示的アナリティクスとは明確な違いがある.指示的(規範的とも訳される)アナリティクスには,最適化の諸技法が含まれる.
サプライ・チェインにおいてビッグデータを利用する際には,以下のように複数の層に分けて考えると良い.
- データ収集(acquisition)
- 準備:データの抽出(extraction),精製(refining),紐付け(linking),集約(aggregation),欠損値の処理(cleansing),探索(exploration),前処理(preprocessing)
- 解析1:データに対する統計解析と機械学習を用いた回帰,分類,クラスタリング,次元削減
- 解析2:最適化(モデル構築,定式化,求解)
- レポート,可視化
- 実施,自動化
第2層のデータ整理においては,GoogleのオープンソースプロジェクトであるOpen Refine (https://openrefine.org/) などのツールやPythonなどのスクリプトが便利である(筆者はハッカーなのでPythonを利用している). 第3層と第4層においては,モデル化が必要になる.また解析ツールが必須になる.
第3層の機械学習においてはビッグデータをそのまま使って解析することができる.まずは次元削減(主成分分析)などでデータの次元を下げ,その後で教師あり学習(回帰や分類)もしくは教師なし学習(クラスタリング)などで解析を行う.
一方,第4層の最適化においては,(少なくともサプライ・チェインの実際問題への適用の際には)ビッグデータをそのまま使うことは避けるべきである. データの集約や洗浄などの前処理を行った後で最適化を適用することが望ましい.
データの前処理
データを入手したとき,最初に行うことはデータの概要を把握することである.これをデータの探索(exploration)と呼ぶ.具体的には,データの型と基本統計量を知り,さらにヒストグラム(度数分布表)や散布図にプロットすることによって,データの外観を見ることである.
データの型(タイプ)は,大きく数値データとカテゴリカルデータに分類できる.数値データとは,何らかの数値が入力されたデータであり,カテゴリカルデータとは,数値情報でない他のすべての型のデータである.たとえば,身長や体重が保管されているデータは数値データであり,性別を表す「男性」と「女性」のいずれかが入力されているデータはカテゴリカルデータである.これらの分類は明確なものではない.男性か女性かを表すデータは0,1の数値に置き換えることが可能であり,身長も1 cm単位で区分し,178 cmというカテゴリーに属するデータと解釈すれば,カテゴリーデータになる.したがって,データの型はどちらとしてとらえると便利かという実用性の観点から分類すべきである.他にも,日付データや地点を表す緯度・経度データは,数値でもカテゴリーでもない型として考えた方が便利な場合もある.
基本統計量としては,まずは,どのような値がデータの典型かを表す指標と,どの程度データがばらついているかを表す指標を見るとよい.データの典型値をみるための指標には,平均,メディアン(中央値),モード(最頻値)がある.平均は,データの合計値をデータの個数で割ったものである.メディアンは,その値より大きいデータの数が小さいデータの数と同じになる値である.モードは,最も発生頻度が多いデータ値である.これを図にすると,以下のようになる.平均は重心,メディアンは中央付近の値,モードは山のてっぺんになる.
データのばらつきを見るための指標として,分散がある.分散は,データ値から平均を引いたものの2乗和を,データの個数で割ったものである.2乗和をとるので分散の単位は,元のデータならびに平均の単位の2乗になる.平均と同じするため分散の平方根をとったものを標準偏差とよぶ.どちらもよく使われるばらつきの尺度である.標準偏差を平均で割ったものを変動係数とよぶ.変動係数は単位をもたない量(無次元の量)になる.これは,平均の異なるデータのばらつきを比較するときに便利な指標である.
基本統計量を確認した後には,データの図示を行う.図(グラフ)には様々な種類があり,データにあったものを選択する必要がある.1つのデータの分布をみるためには,ヒストグラム(度数分布表)が推奨される.2つのデータ間の関係を見たいときには,散布図がよい.時系列データなど1つのデータの変化に対する別のデータの変化が見たい場合には,ライン図がよいが,これは散布図に線をひくのと同じである.カテゴリカルデータには棒グラフがよい.複数のデータの分布を比較するための古典的なグラフとして箱ひげ図があるが,最近ではバイオリン図と呼ばれるモダンな図式もある.ビジネスでは比率を表すのに円グラフが使われることが多いが,これは使うべきではない.また図を魅力的にするために三次元の図を使う人もいるが,これも推奨できない.
データの概要を理解した次に行うのが,データの前処理(preprocessing)である.
前処理は次のフェイズである機械学習や最適化に便利なようにデータを加工するすべての処理が含まれる.
データ洗浄(cleansing, cleaning)には,欠損値の処理,重複データの処理,矛盾するデータの処理,雑音の除去,外れ値の除去などが含まれる.
欠損値とはデータ項目が存在しない状態を指すが,その処理を行うためには,なぜそこにデータがないのかを考える必要がある.単に人間のミスや機械の故障でデータの書き込みがされていないと思われる場合には,「適当な」値で代替することができる.ここで「適当な」とは,他の関連するデータの平均値(メディアン,モード),前後の値のいずれか,もしくは前後の値から計算される内挿値などがあげられる.意図的にデータが書き込まれていないときには,その意味を考えて代替値を入力する必要がある.たとえば,需要がない日には0のかわりに空白を入れている場合には0を代入すればよい.しかし,在庫がないために需要が0になっている場合には,その前の需要量から推定して予測値を代入する必要がある.その日に特定のトラックを使用しないことを表すのにトラック容量に空白を入れている場合には,単に0とするのは危険である.システム内でトラックの積載量の計算をする際に,トラック容量で割り算をするのでエラーを生じる可能性があるからだ.いずれにせよ,欠損値の合理的な値を決めるためには,データと対象とするモデルに関する知識が重要になってくる.
重複データとは,同じキーをもつデータを指す.キー以外のデータ項目(列)もすべて同じである場合には二重登録と考えられるので,単に片方を削除すればよい.別のデータ項目が入っている場合には注意が必要だ.たとえば,名前をキーとし,住所が列に入っているデータに対して,同じ名前で住所が異なる2つのデータなのか,住所の打ち間違いや入力フォーマットの不統一で異なったデータが入っているかによって処理が異なる.前者の場合には,キーが不完全であり,他のキー(たとえば名前と住所の組)をキーに置き換えるなどの処理が必要になる.後者の場合には,片方のデータを削除すればよいが,列が同一になるようにフォーマットの統一を行った方がスマートである.これは以下の矛盾するデータの処理で行われる.
データ項目にはそれぞれ決まったフォーマットが指定されている場合が多い.たとえば,日本の郵便番号は「7桁で半角の数字で間にハイフンを入れない」と指定すれば統一されたフォーマットになる.矛盾するデータの処理のためには,こういったデータのフォーマット(スキーマ)を指定しておくとよい.データ文字列をフォーマットに合うように変換し,その後で適合しないデータに対しては,「適当な」処理を施す必要がある.ちなみに,データのフォーマット変換に対する特別な用語(munging, wrangling)を使う場合もあるが,これらは俗語であり定義は曖昧である.郵便番号の場合には,郵便番号と住所の関係を保存した外部データを保管しておき,住所のデータ項目から類推された郵便番号に近いものに修正する.住所から郵便番号や緯度・経度を求めるアドレスマッチング操作も住所入力の不統一なフォーマットや雑音のため容易ではないが,郵便番号の項目をヒントにして近いものを選択すればよい.
雑音の除去もフォーマット(スキーマ)が定義されているとやりやすい.たとえば,決められた文字列以外のものが入力されている場合には,それを除去すればよい.外れ値はデータ探索における可視化の結果,異常値であると判断されたものを指す.データの取り得る値の範囲が事前に分かっている場合には,外れ値か否かの判断は容易である.下限と上限を超えている場合には,下限か上限に置き換えるか,除去する.機械学習のフェイズで予測を行う場合には,外れ値は除去しておくべきだが,稀に発生する異常値の判定を行いたい場合には,これらのデータが重要になるので除去してはならない.
ビッグデータはサイズが大きいので機械学習を行う前に,特徴(feature)とよばれる小さなデータに変換しておくことがある.必要なデータだけを選択することを特徴選択とよぶ.特徴ベクトルのサイズが小さいと元のデータの情報が失われ,大きいと機械学習にかかりにくい,もしくは計算量が増えることになる.取り扱いやすいサイズになるまで不必要なデータを取り除くことを特徴除去とよぶ.複数のデータを組み合わせて新しいデータを生成することを特徴結合とよぶ.たとえば,身長と体重から新たな指標を計算することが特徴結合に相当する.新たなデータを追加することを特徴追加とよぶ.たとえば,顧客の居住地区を表すデータ列から,店舗がある地区と同じ地区に居住するか否かを表す新しい列を追加することが特徴追加である.
互いに関係があるデータ列は,1つの列にまとめることができる.このためには,次元削減の手法である主成分分析を使うことができるが,これは機械学習の1つの手法であるので,このフェイズではより簡単な変形を用いる.データを適当な方法で正規化することをスケーリングとよぶ.最小値を0と最大値を1になるようにスケーリングしたり,平均を0,標準偏差を1になるように正規化をしたりする方法が標準である.時系列データを移動平均や指数平滑によって平滑化することをフィルタリングとよぶ.雑音を除去することもフィルタリングである.データの集約(aggregation)も重要な前処理である.たとえば,店舗の位置を個別に扱うのではなく,市区町村単位で集約したり,個々の製品を製品群に集約したりすることが相当する.データの集約によって予測精度は向上し,最適化を行うときの計算量の増大も避けることができる.
複数のデータシートにまたがるデータ項目からリレーションを見つけることをデータの紐付け(linking)とよぶ.これはビッグデータの場合には必須ではないが,上で述べた特徴を生成する際に利用される.
一般にデータの前処理で重要な格言として「ゴミを入れればゴミが出てくる」(GIGO :garbage in garbage out) がある.いかに洗練された機械学習の手法を用いても,いかに大規模なデータを準備しても,いかに大がかりな計算機システムを用いて,ゴミデータを入れればゴミのような結果しか得られない.また,似た格言として,「目的にあったデータを入力せよ」というのがある.スナップショットで撮影された粗い画像から人の顔を抽出するための機械学習のために,写真館で撮影されたような綺麗な写真で訓練してはいけないのである.
以上,機械学習や最適化の前に行うべきデータの処理方法について述べた.実際の機械学習と最適化については, 拙著「Python言語によるビジネスアナリティクス-実務家のための最適化,統計分析,機械学習-」(近代科学社) などを参照されたい.
データサイエンティストに必要なスキル
どこかの雑誌で「21世紀で最もセクシーな職業がデータサイエンティストである」という記事が出て以来,データサイエンティストが引く手あまたになっている.需要が供給を遙かに超えている状態が続いているので,当然(日本国内ではそうでもないが)給料がうなぎ登りになっている.データサイエンティストを養成するための大学のコースが(日本以外の諸外国では)雨後の竹の子のように増え,教員の給料も上昇している.
データサイエンティストの定義は様々であり,定まったものはないが,以下の3つのスキルを兼ね備えた人というのが一般的に受け入れられているようだ.
ハッキングスキル:アルゴリズムやデータ構造などの計算法に熟達し,ExcelやTabuleauなどのマウスだけで操作するソフトではなく,数種類のプログラミング言語を使いこなし,キーボードを叩いて仕事ができる.
数学・統計の知識:少なくとも,統計分析や最適化の知識をもち,実際の問題に対して適切なツールを選択できる.
対象とする分野(ビジネス)に特化した知識:たとえば,対象とする分野がサプライ・チェインなら輸送,生産,在庫などの実務に対する知識や経験をもち,少なくとも現場で働く人と会話ができるだけの専門用語を知っている.
ハッキングと数学統計の両方のスキルをもつが,対象分野の知識を持たないグループに属している人たちは,機械学習(人工知能)の専門家と呼ばれる.彼らは,データが与えられて,解析の目標が与えられれば,データを元に適切な分析を行って,レポートを示すことができる.
数学・統計と特定分野の知識の両者をもつが,ハッキングスキルに乏しい人たちは,古典的研究に位置づけられる.彼らは,高度な数学を駆使して論文を書くことに卓越しているが(欧米だと論文を大量に書かないとクビになるのだ),大規模なデータに対して自分でプログラムを組むことが苦手で,実際のデータを解析してレポートを書くよりも,仮想のデータに対して自分の提案手法の優越性に関するレポートを書く方が得意である.
ハッキングスキルと特定分野の知識だけの人たちは,危険ゾーンに位置づけられる.実際の問題の経験と知識をプログラミング技術でシステム化しても,裏に数学的な基礎がない場合には,単なる処理の自動化であって,意思決定の役に立つことは稀である.我が国におけるシステム開発のほとんどが,この危険ゾーンに陥っていると考えられる.
上にあげた3つのスキルだけで十分という訳ではないと筆者は考えている.熟達したプログラミングスキルをもち,数学・統計だけでなく特定分野の知識と経験をもつことに加え, プレゼン能力,人の話を良く聞く能力,他の人と巧くコミュニケーションする能力,数学・統計の理論だけでなく応用分野に対する幅広い知識,特定分野(たとえばサプライ・チェイン)の現場の知識だけでなく全体を俯瞰して捉える能力などもデータサイエンティストにとって必須であると考えられる.