はじめに
「Pythonでデータ分析をしたいが何から学んで良いかわからない」という声を、コミュニティの中で聞くようになったのが2017年中頃でした。すでに、データ分析や機械学習をテーマにした書籍はたくさん出版されていました。しかし、データ分析の学びはじめに手頃な、Pythonを使った基本的なツールおよび分析に必要な数学の解説本がないと感じ始めました。それであれば本を作ろうと思い立ち、共著者および出版社に協力をしてもらい本書が生まれました。 本書は、Pythonのデータ分析ツールおよび分析に必要な数学知識を幅広く学べる教科書です。教科書としてデータ分析に必要な情報を提示し、簡潔に説明をしています。必要最低限の知識の習得に本書を活用頂き、本書でカバーしきれていない内容は、それぞれの公式ドキュメントや他の書籍に委ねることとしています。
読者ターゲットは、データ分析エンジニアを目指している方で、Pythonをある程度理解しているエンジニアとなります。Pythonをある程度理解しているとは、Python公式のチュートリアルを読み理解できるレベルにあることと定義し、本書ではPythonの文法や仕様を必要最低限の紹介にとどめています。ツールの使い方として、まず、NumPyやpandasを使って、データ分析において重要なデータの取り扱い方を学びます。次に、Matplolibでデータを可視化できるようになり、最後に、scikit-learnを用いて機械学習の分類や予測が実行できるようになります。また、ツールの使い方以外に数学の基礎的な解説も含まれています。データ分析や機械学習を実務で行うためには、数学の知識も必要となります。数式を読むことからはじめ、数式の理解ができるように解説されています。さらに、実際にデータ分析を行うにはデータの収集や、データを分析が可能な形式に変換し処理することも重要です。そこで、Webスクレイピング、自然言語処理、画像処理の簡単な解説を掲載しています。
本書を通してデータ分析を統合的に学び、データ分析エンジニアとして活躍できる第一歩を踏み出せることを期待しています。
CHAPTER 1 データ分析エンジニアの役割
1.1 データ分析の世界
ここでは、データ分析エンジニアの役割について取り巻く状況を踏まえて説明します。
1.1.1 データ分析を取り巻く状況
ビッグデータの時代といわれ始めて数年が経過しました。多くの情報がデジタル化され、さまざまな事象や現象を数値やテキストデータとして取り扱うことができるようになりました。インターネットの発達により通信コストが下がり、さらにコンピュータの高性能化が大量のデータの生成を加速させています。
また、大量データの取り扱いが家庭用PCのレベルでも処理できる時代となっています。例えば、店舗のPOSデータを基に売上傾向を見たり、予測をしたりすることが容易にできるようになりました。他にも、行動予測や画像認識の分野では、機械学習が多く用いられています。
機械学習にはデータが欠かせません。データを基に事象の予測や分類を行っています。このため、本書で扱う「データ分析」が重要な技術となっています。
データ分析から導き出されるもの
データ分析は幅広い分野で行われており、さまざまな用途に応用されています。例を挙げると、データ分析は工場の異常検知システムに活用が進んでいます。工場のシステムから出力される機器の温度変化や回転数などのデータを基に異常の兆候を事前に発見する技術が作られています。他にも、広告出稿に対する価値評価や、天気予報にも利用されています。これらはデータを分析することで、傾向を掴むところから始まり、どのような要因があるのかを見つけ出し、さらには未知の事象を予測しようとしています。
データ分析の世界は、今まさに広がりつつあり、可能性に満ちています。本書を足がかりとして、データ分析の手法を学び、必要な技術を1つずつ学習していきましょう。
1.2 データ分析とPython
本書は、データ分析に必要な技術をプログラミング言語Pythonを使って学んでいきます。
データ分析におけるPythonの役割
データ分析の分野において、プログラミング言語Pythonはデファクトスタンダードな存在になっています。そして、世界中の多くのデータ分析エンジニアがPythonを利用しています。
データ分析では、多くのデータに触れることとなります。分析では数値、テキスト、画像や音声といったデータを扱います。Pythonを用いてプログラミングすることで、これらのデータを分析が可能な形式に加工し、統計処理や機械学習を用いた予測などが行われています。
Pythonの特長
Pythonは汎用のプログラミング言語です。多くのユーザがおり、商用サービスにも利用されています。Pythonの特長は以下のとおりです。
- 言語としての仕様がわかりやすい
- コンパイル不要な動的スクリプト言語
- 豊富な標準ライブラリと外部のパッケージ
- データ分析以外にも応用範囲が広い
- オープンソース
Pythonが得意とする分野
Pythonはデータ分析以外にも以下のようなさまざまな用途で活用されています。
- サーバ系ツール
- Webシステムの構築
- IoTデバイスの操作
- 3Dグラフィックス
Pythonは標準ライブラリが充実しており、外部のパッケージを利用しなくても多くの処理が実行できます。さらに、外部のパッケージを利用することで、より多くの用途に利用できます。データ分析以外のさまざまな用途に応用できることもPythonをデータ分析に使うメリットの1つとなります。
Pythonが苦手とする分野
以下のような分野では他のプログラミング言語の方が有利な場合があります。
- Webアプリなどのフロントエンド
- デスクトップGUI
- 速度向上などのための低レイヤー処理
- 超大規模かつミッションクリティカルな処理
幅広いPython活用の動きの中で、これらの分野への応用も始まっていますが、絶対的な優位性はありません。プログラミング言語には、向き不向きがあります。これらを知った上でPythonを活用しましょう。
Pythonでデータ分析に使われるツール
Pythonには多くの標準ライブラリがそろっていますが、データ分析を行うには外部のパッケージの導入が必要です。データ分析に使われる主なパッケージは、Jupyter Notebook、NumPy、pandas、Matplotlib、SciPy、scikitlearnとなります。詳細は、本章第3節データ分析に使う主なパッケージ(P.013)及び第2章1節内の「パッケージのインストール、アンインストール」(P.020)を参照してください。これらのパッケージもPythonと同様にオープンソースです。パッケージを活用し、Pythonでデータ分析を行っていきます。
Python以外の選択肢
Pythonだけがデータ分析に向いているわけではありません。データ分析の分野でPythonとよく比較されるのが、R言語です。R言語は統計を中心に充実したライブラリが備わっており、手元の環境でデータ分析や機械学習を行うことに特化したオープンソースのプログラミング言語です。統計の分野においてはPythonよりも特化したツールが準備されていることがあります。しかし、Webへの応用やサーバサイドで動作をさせるためにはR言語だけで解決できない問題もあります。
他の選択肢として、Microsoft Excelでもある程度のデータ分析ができます。GUIでの操作が可能ですぐに使えるのですが、日々のデータ取り込みを繰り返し実行させるためには、VBAなどでプログラミングをする必要があります。他には、Javaやその他の汎用プログラミング言語でもデータ分析が行えます。これらの言語を選択する場合、ライブラリの充実度や見本となるサンプルの量が少ない場合があり注意が必要です。
使い慣れた言語やツールでデータ分析を行うことは、最初のハードルを下げると思います。しかし、Pythonは学ぶコストが低く、書きやすいプログラミング言語です。データ分析を学ぶ際に同時にPythonを学習することも容易だと思いますので、Pythonでのデータ分析に挑戦してみてください。
1.1.3 データサイエンティストとは
データサイエンティストは、数学、情報工学、対象分野の専門知識(ドメイン知識)の3つの分野の知識を総合的に持ち、データ分析またはデータ解析の一連の処理及び理解・評価を行える立場の職種です。
データサイエンティストの役割
より具体的にデータサイエンティストの役割を示すと以下のようになります。
- モデルやアルゴリズム構築
- 新たな解法や新技術への取り組み
- 解決したい課題に向き合う実務
- データとの向き合い方の提示
- 分析結果の評価
研究分野と実務の違い
データサイエンティストの役割は、研究分野と実務で多少の違いがあります。
研究分野においては、新たな解法や新技術への取り組みが重視されます。一方、実務においては、解決したい課題に向き合う部分が重視されます。研究分野と実務で求められていることが違うことを意識しましょう。
1.1.4 データ分析エンジニアとは
データサイエンティストに対して、データ分析エンジニアという職種の定義を行いたいと思います。
データ工学という学術分野があります。主に、情報工学を基盤にデータと向き合う分野とされています。データ工学はデータベース技術からデータの活用までデータに関わる幅広い分野に広がっています。本書では、データ工学を実践する1つの職種としてデータ分析エンジニアを位置づけています。
データ分析エンジニアが持つべき技術や知識
データ分析エンジニアが最低限持つべき技術としては、以下の4項目があります。
次に、データ分析エンジニアが付加的に持つべき技術として、以下の3項目があります。
1.1.5 データハンドリング(前処理)の重要性
データ分析を行う上で、データハンドリングは非常に重要な役割を持ちます。機械学習においてはデータのハンドリングが業務の8割とも9割ともいわれています。データのハンドリングは前処理ともいわれ、データの入手や再加工、つなぎ合わせや可視化など、分析を行う上で何度も繰り返し実行します。データが不足していれば別のデータソースを探し、機械学習の方法によっては、データの正規化などの加工が必要な場合もあります。
1.2 機械学習の位置づけと流れ
データ分析の分野で注目を集めている機械学習について、その位置づけや処理の流れを解説します。
1.2.1 機械学習とは
機械学習は大量のデータから、機械学習アルゴリズムによってデータの特性を見つけて予測などを行う計算式の塊を作ります。これをモデルといいます。機械学習で予測などを行うためのモデルを作り、データのカテゴライズや数値予測を行っていきます。そのモデルを作るためには、入力するデータと、データを処理するアルゴリズムが必要です。
データとアルゴリズムを基に内部のパラメータを順次更新して、機械学習のモデルを作り上げていきます。このモデルから、入力したデータ以外の未知のデータで数値予測や、入力データの素性を知るためのカテゴライズなどができます。
1.2.2 機械学習以外の選択肢
機械学習を用いずに、カテゴライズや数値予測を行う方法もあります。
1つ目が、ルールベースといわれる手法です。
この手法は、プログラミングの条件分岐の要領で、if文の条件を書いていくというアプローチです。
例えば、店舗の1日の売上を予測する時に、明日は「日曜日」で「晴れ」なので、5万円の売上が見込まれるとか、明後日は「月曜日」で「雨」なので、3万円の売上になるだろうと見込みをたてることです。この例では2つの変数「曜日」と「天気」だけを利用して予測を立てました。パラメータが2つなので容易に今までのデータをルール化することができます。ただし、パラメータの数を増やしていくと、ルールで記述するのが難しくなってきて、プログラミングできない量になってきます。
2つ目が、統計的な手法です。
この手法は、データから統計的な数値を求め、それらの数値に沿うように予測するアプローチです。
例えば、ある学校の小学校3年生の男子児童の50m走のタイムから平均と分散を求めておき、数人の小さな学校の同じ学年で同じ性別の児童の50m走の結果から、この小さな学校の児童が外の学校と比べた時の予想順位を求めるというようなことです。学校単位ではなく全国の網羅的な数値を検証すれば、全国でのタイムのばらつきや順位が判明します。他には無作為に集めたサンプル(標本)のデータを使って、全国の児童の中の順位を予測することも可能です。これらの手法を統計的な手法での数値予測といいます。機械学習のアルゴリズムには統計的なアプローチを拡張して作られているものがあり非常に親和性が高いアプローチとなります。
1.2.3 機械学習のタスク
機械学習を用いて解決できる業務範囲は日々増えています。ここでは、業務範囲を機械学習のタスクとしてとらえ、タスクを行うための方式別に分類し解説します。
機械学習を学習方式で分類すると以下の3種類に分類できます。
- 教師あり学習
- 教師なし学習
- 強化学習
教師あり学習
教師あり学習(Supervised Learning)とは、正解となるラベルデータが存在する場合に用いられる方式です。
正解ラベルとは、タスクとなる課題に対して目的となる値のことをいいます。つまりこの方式は、目的の値となるデータを持っていることが前提となります。正解ラベルである目的データが重要な意味を持ち、正解ラベル以外のデータを基に正解または正解に近い値を予測することができる方式を教師あり学習と呼びます。
正解ラベルである目的データを目的変数と呼びます。目的変数以外のデータは、目的変数を説明するためのデータとなることから、説明変数と呼びます。説明変数は、特徴データや特徴量などとも呼ばれています。
機械学習の教師あり学習は、説明変数が目的変数をうまく予測するような、内部パラメータをコンピュータが求めることです。説明変数と目的変数の組み合わせが多いほど正解に近付くモデルとなります。
教師あり学習は,目的変数の種類により回帰と分類の2種類に分けられます。回帰は、目的変数すなわち正解ラベルが連続値となります。機械学習によって連続値を予測するので、結果も連続値となります。例えば、売上金額を予測したり、気温を予測したりするというタスクになります。
分類は目的変数がカテゴライズされているデータとなります。分類は、インフルエンザにかかっているかかかっていないかという二値分類や、動物の種類を予測するというような多値分類などがあります。重要な点は、目的変数が連続値でないということです。深層学習(ディープラーニング)で解析が行われる物体検出なども方式としては分類となります。
教師あり学習には教師あり回帰と教師あり分類の2つの種類があることを理解しておきましょう。
教師なし学習
教師なし学習(Unsupervised Learning)とは、正解ラベルを用いない学習方法です。
正解ラベルがない状態で何を学習していくのかと疑問に思うかもしれません。教師なし学習では、データ間のそれぞれの特徴を基に学習をします。
教師なし学習では、主にクラスタリングや次元削減といったタスクを行います。
クラスタリングは、与えられたデータの中からグルーピングを行っていきます。学校の成績と睡眠時間の2つのデータを基に、3つにクラスタリングしてみるというようなことが行えます。一見、因果関係がなさそうに見えても、クラスタリングを行うことで、それぞれのクラスタの中では相関が見つかることがあります。クラスタリングは1度やって終わりということは少なく、データの種類を増やしたり、クラスタリングの数を変えたりして結果を見てみることになります。
次元削減は、大量なデータの種類(説明変数の次元数)をより少ないデータの種類(次元数)で言い表す手法です。数千を超えるような説明変数をそのまま教師あり学習に掛けると、計算量が多くなり学習が進まない場合があります。このような場合に、主成分分析(P.247)などの手法を用いて次元削減を行うことで、計算しやすい数まで説明変数を減らすことが可能です。
強化学習
強化学習(Reinforcement Learning)とは、ブラックボックス的な環境の中で行動するエージェントが、得られる報酬を最大化するような状態に応じた行動を学習していく手法です。この数年研究が進んでいる手法です。
将棋や囲碁のようなゲームのルールを環境として与え、勝ちにつながる行動により高い報酬を与えていき学習を進めていきます。他にもロボットが前に進めた場合に報酬を与え、最終的にはロボットがゴールにたどり着けるようになるというようなロボット工学の分野でも使われています。データ分析の世界ではまだ始まったばかりの手法です。本書の範囲を超えていますので、詳しい説明は強化学習専門の書籍などを参考にしてください。
1.2.4 機械学習の処理の手順
ここでは、機械学習の処理でよく行われる手順を、教師あり分類を例に順番に説明します。
処理の流れを役割ごとに分割すると、以下の8項目になります。
- データ入手
- データ加工
- データ可視化
- アルゴリズム選択
- 学習プロセス
- 精度評価
- 試験運用
- 結果利用
これらの役割の流れは次のフロー図のような順番になります。主に使うツールや技術も付記しています。
処理の流れを簡単に説明します。各種ライブラリのより具体的な使い方や説明は第4章で行います。まずは流れを追うこととし、第4章を読み終えた段階でこの項に戻ってきて再確認をすることをおすすめします。
データ入手
機械学習はまず利用できるデータを探し、手に入れるところから始まります。データを入手したらまず、データの概要をとらえ、目的の機械学習に使えることを確認します。
データの概要をとらえ、見やすい形に整えるには、NumPy、pandasが活用されます。
データ加工
入手したデータを初期加工していきます。データ型を整える場合や、複数のデータソースから入手したデータがある場合はこの段階で連結処理をしていきます。データの一部が不足している、いわゆる欠損値への対応もこの段階で行います。
このパートの作業でも、前パート同様にNumPy、pandasが活用されています。
データ可視化
まとまったデータを、表やグラフなどで可視化していきます。機械学習できるようなデータがそろっているのかなど可視化ツールを使い確認します。
このパートでは、可視化ツールMatplotlibが活用されています。統計値などの確認には、pandasが利用できます。
アルゴリズム選択
アルゴリズムを選択していきます。機械学習で最も難しい作業となります。この作業は、前パートまでの作業で行ったデータを確認し、目的及びデータに沿ったアルゴリズムを選択します。
このパートでは、機械学習ツールキットのscikit-learnが多く活用されます。
学習プロセス
アルゴリズムを基にしてモデルを学習していきます。その際にアルゴリズムにハイパーパラメータを設定します。ハイパーパラメータというのは、各アルゴリズムの実行に必要なパラメータのことで、機械学習ではアルゴリズムの選択とともにこのハイパーパラメータを適切に設定することが重要なポイントとなります。その後、学習データを使って学習を実行します。
このパートでは、前パート同様に scikit-learnが多く活用されます。
精度評価
学習済みモデルを使って予測を行っていきます。この時、学習に使ったデータと検証用に保持していたデータの両方で予測を行います。
予測結果を評価する際には正解率だけを見て結論を出してはいけません。分類タスクであれば混同行列(P.249)で確認したり、適合率や再現率などを確認する必要があります。
このパートでも、前パート同様にscikit-learnの各種機能が多用されます。
試験運用
ここまでは、既存のデータを使って学習済みモデルを構築してきました。結果の確認も既存のデータを使って行いました。
実際の評価となると、結果のわからない未知のデータでの実行が必要となります。モデルを作る段階では知り得なかったデータで試験運用を行い、最終的に評価を行っていきます。
評価の結果が思わしくない場合は、各プロセスを見直し、再実行をすることになります。これらの繰り返しがより良い結果を作っていくことになります。
評価はなるべく定量的な評価を行う必要があります。そのためには統計的な手法を使い数値化することが望まれます。
結果利用
試験運用の結果、実業務に利用可能な精度が確保できれば、学習済みモデルを保存し、実業務にモデルの予測結果を取り入れます。引き続き、予測精度の継続的な評価やデータを追加して学習を行うなどの運用が必要です。
未知のデータを入力し予測をするWebシステムを構築したり、毎日自動的に予測を行うシステムを構築したりと応用範囲が広がっていきます。
続きは本書で
本書『あたらしいPythonによるデータ分析の教科書』ではこのあと、Pythonの環境構築と必要な数学の基礎を解説したあと、ツールの解説とデータ収集・加工について説明していきます。データ分析エンジニアとして役に立つ基礎をひととおり紹介していくので、ぜひリファレンスのように使ってみてください。