データサイエンス教本 Pythonで学ぶ統計分析・パターン認識・深層学習・信号処理・時系列データ分析

データサイエンス本格的な1冊

データサイエンスの理論がわかりやすくまとめられています。工学分野も含まれており、内容はかなり網羅されています。ただ、統計手法の確認のためにPythonを利用しているだけですので、Pythonを一から学びたいという方向けではありません。

― 序 ―

人は大昔より,言い当てることが好きである。言い当てることには,次のようなものがある。

  • 性格判断:あなたは几帳面でしょう,優しい人が似合うでしょう
  • 予言:今年の夏の天候は穏やかで秋は豊作でしょう, 為替相場は上昇するでしょう
  • ギャンブル:次はサイコロの目は6が出るでしょう,プラン A とプラン B のうち前者が

きっとうまくいくでしょう

  • 目利き:このスイカは見た目で甘いとわかります,この商品はきっと売れるでしょう

このようなことを実施するのに,科学的方法(第1章 1.1 節参照)を用いて,何かに役立たせることを目的とするのがデータサイエンスであり,そのような知識とスキルを発揮できる人間をデータサイエンティストと称している。第1章 1.1 節に書いたように,対象分野 が幅広いうえに,目的や課題設定, データの収集法と分析・評価,その結果のまとめをどのように意思決定に繋げるか,これらを考えられるのが真の意味でのデータサイエンティストといえるであろう。ただ,そのような人材があまりに少ないという声が上がっている。読者自身も,あまりに学ぶ項目が多すぎて迷われているのではと拝察する。

『言葉のイメージを正しく掴むことが,正しい学習に導く』
筆者らは,正しい学習法の第1歩はこのことにあるという立場に立つ。ところが,分野や文脈により,同じ用語でも異なるイメージがある,この逆に,同じようなイメージではあるが,異なる用語を用いている,ということもある。データサイエンスが幅広い分野を扱うということは,多様な分野と,その歴史に基づく文脈(言い回し)が多数あり,これらの概念やイメージの正しい初端を早く知ることが学習にとって大事になるであろう。

同じ用語であっても異なるイメージを有する例として,本文では触れていないが,モデル (model)という用語がある。身近なものでは,ファッションモデル, プラモデルがある。ファッションモデルは,服飾デザイナーの理想化を抽象化して得られたスタイルを体現する職業人のことを指している。プラモデルは、実存するもの,またはSF世界で存在するものを身近に扱えるようにサイズを縮尺してプラスチック性材料で成形したものである。システム工学論では,実存するものをシステムと称し,これを人間が扱いやすくするために近似したものをモデルと称している。

前者の二つは手に取って触れることができるが,後者は触れることができないので,モデルと聞いただけは,モデルのイメージの取り方は異なる。モデルとは,対象のある一面だけに焦点をあてて,その本質やエッセンスだけを抜き出したものであり,概念的なもので あるから,人間がそれを具現化しようとイメージを思い浮かべる段階で異なる解釈が生まれるのは致し方がないことである。ただ,それでは学習には困る。

同じ用語であっても異なるイメージを有する二つめの例として,シミュレーションがある。これは,モデルができたならば,それを何らかの形で動かすことである。これと異なるイメージの代表例が,サッカーの世界での悪い行為を指す。また,先に述べたモデルの種類により,このシミュレーションが実体を扱うもの(航空会社パイロット養成用のフライトシミュレータ),仮想的に扱うもの(コンピュータ上だけで完結するもの)などがあり,分野により異なるイメージをもつ。
これらに対し,同じようなイメージであっても,異なる用語を用いる例を述べる。まず,モデルという用語は,分野や文脈が異なれば,メカニズム,因果性,原因と結果などの用語に変わる。また,本書で触れるものには次のようなものがある。

標本,サンプル,観測値,測定値,データ sample, observation, measurement, data
これらは,もちろん,その背景までに踏み込めばニュアンスは異なる。ところが,これらをモデルに落とし込む(または定式化ともいう)と,xやyという記号で表され,x と y だけで話を進めても支障がないことから,ある種の共通概念(共通イメージと捉えられても構わない)があることがわかる。
これら用語の違いを通して,これらの共通概念を形成できるというメタ学習が進めば,文脈から判断して,これらのどの用語でも内容を認知し,理解の促進が図られることは教育学の観点からいわれていることである。

このため,本書では第1章に「用語の違い」という項目を設けた。これ以外にも,本文中で,日本語の用語(英語からの翻訳された漢字やカタカナ用語も含めている)の背景にはどのような歴史や意味があるのかをていねいに書いたつもりである。これを読むことによって,本書の文章を読み進めるなかで再びその用語に出会ったとき、瞬間的に正しいイメージ(ただし,一つに限定する必要はない)ができるようにすれば,きっと学習効率は向上すると考える。また,分野や文脈により,用いる用語の候補が複数ある場合には,なるべく本文中に“標本(データともいう)”というかっこ付きの注釈を多用している。

データサイエンスが幅広い分野を扱うということは,その分野にある多様な文化に触れることになる。本書を通して、読者の方々に多様な文化に慣れ親しんでいただき,データサイエンティストになるきっかけを得ることができる,このことが本書に込めた願いである。

2018年10月
執筆者を代表して橋本洋志

目次

第1章 はじめに

1.1 データサイエンス概要
1.1.1 読み始める前に
1.1.2 データサイエンスとは
1.1.3 データサイエンスの領域と役割
1.1.4 データを見る眼を養う

1.2 Python とパッケージ
1.2.1 Python の導入
1.2.2 本書で用いるパッケージ
1.3 いくつかの決めごと
1.3.1 Notebook とスクリプト
1.3.2 モジュール名の省略語
1.3.3 ファイル名の省略
1.3.4 パッケージ関数の使用法の調べ方

1.4 クイックスタート
1.4.1 インストール
1.4.2 Jupyter Notebook・スクリプトの開発と実行方法
1.4.3 プログラムとデータの入手方法

1.5 Python で日本語を扱う
1.5.1 スクリプトに日本語を記述する
1.5.2 日本語を含むデータファイルを読む
1.5.3 matplotlib で日本語を表示する

1.6 用語の違い
1.6.1 説明変数 / 目的変数,入力 / 出力
1.6.2 サンプルとデータ
1.6.3 予測と推定
1.6.4 クラス分類
1.6.5 トレーニングデータ, テストデータ
1.6.6 オーバーフィッティング
1.6.7 分析
1.6.8 変数
1.6.9 相関と共分散

1.7 数学,数値計算,物理のことはじめ
1.7.1 数学のことはじめ
1.7.2 数値計算の問題
1.7.3 物理のことはじめ

第2章 データの扱いと可視化

2.1 データの種類

2.2 データの取得

2.3 データの格納
2.3.1 numpy.ndarray
2.3.2 pandas.DataFrame
2.3.3 numpy.ndarrayとpandas.DataFrame の変換

2.4 グラフの作成
2.4.1 matplotlib
2.4.2 複数のグラフ
2.4.3 Titanic(タイタニック号)のpandasプロット
2.4.4 Iris(アイリス)のseabornプロット
2.4.5 Iris データ

第3章 確率の基礎

3.1 確率とは

3.2 基本的用語の説明
3.2.1 離散確率変数
3.2.2 連続確率変数
3.2.3 確率密度関数,確率質量関数とパーセント点
3.2.4 母集団と標本
3.2.5 平均,分散,他の諸量
3.2.6 離散型の期待値と平均

3.3 正規分布
3.3.1 正規分布の表現
3.3.2 確率変数の生成
3.3.3 中心極限定理

3.4 ポアソン分布
3.4.1 ポアソン分布の表現
3.4.2 ポアソン分布の例
3.4.3 ポアソン到着モデルのシミュレーション
3.4.4 逆関数を用いた乱数生成

3.5 確率分布とパッケージ関数
3.5.1 ベルヌーイ分布(Bernoulli distibution)
3.5.2 二項分布(binomial distribution)
3.5.3 ポアソン分布(Poisson distribution)
3.5.4 カイ二乗分布(chi-squared distribution)
3.5.5 指数分布(exponential distribution)
3.5.6 F分布(F distribution)
3.5.7 正規分布(normal distribution)
3.5.8 t分布(t distribution)
3.5.9 一様分布(uniform distribution)

第4章 統計の基礎

4.1 統計とは

4.2 推 定
4.2.1 点推定
4.2.2 区間推定
4.2.3 母平均の信頼区間
4.2.4 母比率の信頼区間

4.3 仮説検定
4.3.1 仮説検定とは
4.3.2 片側検定と両側検定
4.3.3 母平均の検定
4.3.4 母分散の検定
4.3.5 2標本の平均の差の検定
4.3.6 相関,無相関の検定

第5章 回帰分析

5.1 回帰分析とは
5.1.1 回帰の由来
5.1.2 システム論から見た回帰分析
5.1.3 statsmodels

5.2 単回帰分析
5.2.1 単回帰分析の意義
5.2.2 単回帰モデルの統計的評価
5.2.3 家計調査
5.2.4 シンプソンのパラドックス
5.2.5 数学的説明

5.3 多項式回帰分析
5.3.1 多項式モデル
5.3.2 Rデータセットのcars

5.4 重回帰分析
5.4.1 F検定
5.4.2 多重共線性
5.4.3 電力と気温の関係
5.4.4 ワインの品質分析
5.4.5 数学的説明

5.5 一般化線形モデル
5.5.1 一般化線形モデルの概要
5.5.2 ポアソン回帰モデル
5.5.3 z = B₀の例
5.5.4 z = B₀ + B₁x₁ の例
5.5.5 ロジスティック回帰モデル
5.5.6 数学的説明

第6章 パターン認識

6.1 パターン認識の概要
6.1.1 パターン認識とは
6.1.2 クラス分類の性能評価
6.1.3 ホールドアウトと交差検証
6.1.4扱うパターン認識方法

6.2 サポートベクタマシン(SVM)
6.2.1 クラス分類とマージン最大化
6.2.2 非線形分離のアイディア
6.2.3 線形,円形,月形データのハードマージン
6.2.4 ソフトマージンとホールドアウト
6.2.5 交差検証とグリッドサーチ
6.2.6 多クラス分類

6.3 SVM の数学的説明
6.3.1 マージン最大化
6.3.2 カーネル関数の利用
6.3.3 ソフトマージン

6.4 k最近傍法(KNN)
6.4.1 アルゴリズムの考え方
6.4.2 ANN の基本的使い方
6.4.3 Iris データ
6.4.4 sklearn が用意している距離

6.5 k平均法
6.5.1 アルゴリズムの考え方
6.5.2 make-blobsを用いたクラスタリング
6.5.3 卸売業者の顧客データ
6.5.4 数学的説明

6.6凝集型階層クラスタリング
6.6.1 アルゴリズムの考え方
6.6.2 デンドログラム
6.6.3 富山県の市町村別人口動態

第7章 深層学習

7.1 深層学習の概要と種類
7.1.1 深層学習とは
7.1.2 深層学習の活用例
7.1.3 用語の説明

7.2 Chainer
7.2.1 概要とインストール
7.2.2 実行と評価
7.2.3 NN用スクリプトの説明

7.3 NN(ニューラルネットワーク)
7.3.1 概要と計算方法
7.3.2 NNスクリプトの変更

7.4 DNN(ディープニューラルネットワーク)
7.4.1 概要と実行
7.4.2 ファイルデータの扱い方

7.5 CNN(畳み込みニューラルネットワーク)
7.5.1 概要と計算方法
7.5.2 学習と検証
7.5.3 トレーニングデータの作成法

7.6 QL(Q ラーニング)
7.6.1 概要と計算方法
7.6.2 実行方法
7.6.3 瓶取りゲーム

7.7 DQN(ディープ Q ネットワーク)
7.7.1 概要
7.7.2 実行方法
7.7.3 瓶取りゲーム

第8章 時系列データ分析

8.1 動的システム
8.1.1 因果性と動的システム
8.1.2 動的システムの線形モデル
8.1.3 1次システムの時間応答
8.1.4 2次システムの時間応答

8.2 離散時間系
8.2.1 離散化
8.2.2 サンプリング時間の選定
8.2.3 離散時間系の差分形式の見方
8.2.4 遅延演算子 z⁻¹
8.2.5 離散時間モデル導入の問題設定

8.3 ARMA モデル
8.3.1 ARMA モデルの表現
8.3.2 可同定性とPE性の条件
8.3.3 入力信号の候補とB₀項の問題
8.3.4 ARMAモデルの安定性と性質
8.3.5 パラメータ推定

8.4 モデルの評価
8.4.1 モデル次数の選定とAIC
8.4.2 モデル次数の選定と極・零点消去法
8.4.3 残差系列の検定

8.5 ARMA モデルを用いた予測
8.5.1 予測の仕方

8.6 ARIMA モデル
8.6.1 トレンド
8.6.2 ARIMA モデルの表現
8.6.3 トレンドをもつ時系列データ分析

8.7 SARIMAXモデル
8.7.1 航空会社の乗客数
8.7.2 ほかの季節性データ

8.8 株価データの時系列分析
8.8.1 移動平均
8.8.2 ボリンジャーバンド
8.8.3 ローソク足チャート

第9章 スペクトル分析

9.1 基本事項
9.1.1 周波数とは、音を鳴らす
9.1.2 スペクトルとは

9.2 フーリエ変換
9.2.1 フーリエ変換とフーリエ逆変換
9.2.2 振幅,エネルギー,パワースペクトル

9.3 現実の問題点
9.3.1 サンプリング問題
9.3.2 エイリアシング
9.3.3 有限長波形の問題点

9.4 離散フーリエ変換(DFT)
9.4.1 DFTの表現
9.4.2 サイン波の DFT例
9.4.3 ゼロ埋込み

9.5 窓関数
9.5.1 窓関数の種類
9.5.2 窓関数の使用例
9.5.3 数学的表現

9.6 ランダム信号のパワースペクトル密度
9.6.1 パワースペクトル密度の表現
9.6.2 PSD は確率変数

第10章 ディジタルフィルタ

10.1 フィルタの概要
10.1.1 フィルタとは
10.1.2 フィルタ特性
10.1.3 デシベル [dB]

10.2 アナログフィルタの設計
10.2.1 バターワースフィルタ
10.2.2 チェビシェフフィルタ

10.3 ディジタルフィルタの設計
10.3.1 ディジタルフィルタの導入
10.3.2 ディジタルフィルタの構造
10.3.3 FIRフィルタ
10.3.4 IIRフィルタ
10.3.5 正規化角周波数

10.4 FIRフィルタの設計
10.4.1 窓関数を用いた設計法
10.4.2 設計例

10.5 IIRフィルタの設計
10.5.1 アナログフィルタに基づく方法
10.5.2 設計例

第11章 画像処理

11.1 画像処理の概要
11.1.1 表色系
11.1.2 数値としての表現
11.1.3 標本化と量子化
11.1.4 画像データの入手
11.1.5 OpenCV のドキュメント
11.1.6 実行方法

11.2 画像処理の例
11.2.1 2値化
11.2.2 エッジ検出
11.2.3 周波数フィルタリング
11.2.4 特徴点抽出

11.3 その他
11.3.1 カメラからの動画取得
11.3.2 オプティカルフロー
11.3.3 顔認識

参考文献

索引

第1章 はじめに

データサイエンスの意味,本書の決めごと,インストールやスクリプト実行の仕方を説明する。さらに,幅広い分野にまたがる本書での専門用語の使い方や, データサイエンスに必要とされる初歩的な数学,数値計算,物理の内容を説明する。

1.1 データサイエンス概要

1.1.1 読み始める前に 本書を読み始める前に次のことに注意されたい。

【注意事項】

  • インターネット接続は必須,プログラム実行時にデータをインターネット経由で取得するため。
  • Python 文法の説明は行わないので,他書を参照されたい。
  • スクリプト記述作法はていねいでなく,実行結果重視の書き方をしている。
  • パッケージの関数の詳細(意味,使い方など)は読者自身で調べられるようにしている。
  • 早く本題に入りたい人は、最低でも第1章「いくつかの決めごと」と「クイックスタート」を読まれたい。

1.1.2 データサイエンスとは
科学(science)とは,ある領域を対象にして科学的な方法(問題の発見,仮説の設定,それを測る手段,実験による観察・データなどに対する客観的な分析,考察,結論を導くこと)により知識体系を築き上げる研究活動をいう。この科学の意味に照らし合わせて,本書はデータサイエンス(data science)を次のよう