Python3_エンジニアデータ分析試験対策_Part1

本記事は、Python3エンジニア認定データ分析試験におけるチートシート作成を目的としています。
本試験の概要や出題範囲は下記サイトをご確認ください。
チートシートは随時更新していきます。

https://cbt.odyssey-com.co.jp/pythonic-exam.html

また本内容は、PRIME STUDYのデータ分析試験対策模試を参考に作成しています。
本内容にて予習後、下記テストを受けることをお勧めします。

https://study.prime-strategy.co.jp/


# 1. データエンジニアの役割
## 1.1 Pythonについて
Pythonは、データ分析が得意。
機械学習やディープラーニングでもよく利用されている。
Pythonの特徴と苦手分野は以下。

### 1.1.1 Pythonの特徴
プログラムのルールや文法がシンプル
標準ライブラリと外部のパッケージが豊富
データ分析以外にも、幅広い用途で活用できる
オープンソースとして提供されている

### 1.1.2 Pythonの苦手分野
Webデザイン
ゲーム開発など、高速な処理が求められるもの
Webアプリなどのフロントエンド
速度向上などのための低レイヤー処理

### 1.1.3 データ分析に利用されるプログラミング言語
Python
R
Microsoft Excel
Java
Julia
VBA（Visual Basic for Applications)

## 1.2 データサイエンティストについて
データサイエンティストは、データ分析またはデータ解析の一連の処理・評価を行う職種。
データサイエンティストとして活躍するためには、数学、情報工学、対象分野の専門知識など幅広い分野の知識が必要になる。

データサイエンティストの業務内容は、
①モデルやアルゴリズムの構築
②新たな解法や新技術への取り組み（研究分野で重視）
③解決したい課題に向き合う実務（実務で重視）
④データとの向き合い方の提示
⑤分析結果の評価など

## 1.3 データ分析エンジニアについて
データ分析エンジニアは、情報工学を基盤にデータと向き合う分野である、「データ工学」を実践する職種。

データ分析エンジニアに求められる技術としては、
①データのハンドリング（データの入手や加工などの前処理のこと。機械学習においては業務の8割、9割を占める）
②データの可視化
③プログラミング技術（Pythonなど）
④インフラレイヤー（サーバーサイド技術やデータ基盤技術）
などが挙げられる。

## 1.4 機械学習と例

機械学習は、大量のデータを反復的に学習し、機械学習アルゴリズムによって、データの特性を見つけて予測などを行う計算式の塊（モデル）をつくります。機械学習で予測などを行うためのモデルを作り、新たなデータをそれに当てはめることで、データのカテゴライズや数値予測を行っていきます。

### 1.4.1 教師あり学習
正解となるラベルデータが存在する場合に用いられる手法を教師あり学習といいます。
正解ラベルとは、タスクとなる課題に対して目的となる値のことをいい、この目的データを目的変数と呼びます。また、目的変数以外のデータは、説明変数と呼び、目的変数を説明するためのデータです。
教師あり学習は
①回帰と②分類の2種類に分けられます。
この違いは目的変数の種類の違いによるもので、
①回帰は目的変数が連続値となり
②分類は目的変数がカテゴライズされているデータとなり連続値とはなりません。

教師あり学習の例：

・過去の売上から、将来の売上を予測する（回帰）
・与えられた画像が、何の画像であるかを識別する（分類）

### 1.4.2 教師なし学習
正解ラベルを用いない学習手法で、データ間のそれぞれの特徴を元に学習を行う手法を教師なし学習といいます。
①クラスタリング
②次元削減
③DBSCAN法
が教師なし学習の代表的な手法として挙げられます。

①クラスタリングは、データ間の類似度に基づいて、与えられたデータをグループに分ける手法です。
②次元削減は、多次元の情報を、その意味を保ったまま、より少ないデータの種類（次元数）で言い表す手法です。
③DBSCAN法は、密度準拠クラスタリングアルゴリズムであり、特徴量ベクトル間の距離に着眼した手法です。


教師なし学習の例：

学校の成績と平均学習時間の2つのデータを基に、生徒を3つのグループに分類する


### 1.4.3 強化学習
強化学習とは、ブラックボックス的な環境の中で行動するエージェントが、得られる報酬を最大化するように学習する手法のことです。比較的新しい手法です。

強化学習の例：

将棋や囲碁などにおいて、勝利する可能性が高い最適な一手を求める
 
### 1.4.4 機械学習以外のカテゴライズや数値予測を行う方法
機械学習以外のカテゴライズや数値予測を行う方法としては
①ルールベース
②統計的な手法
の２つが挙げられます。
①ルールベースは、プログラミングの条件分岐の要領でデータをルール化する手法です。データを容易にルール化できる反面、パラメータ数が増えると記述が困難になります。
②統計的な手法は、データから統計的な数値を求め、統計的な数値に基づいて予測する手法です。

# 2. Pythonの実行環境、pipコマンド、Anaconda、Python文法
## 2.1 実行環境構築

### 2.1.1 venv
venvは、WindowsでもmacOSでも利用できる、Pythonの仮想環境を作成する仕組みです。Pythonの環境の中に仮想環境を作り、仮想環境において異なるバージョンのパッケージを管理することができます。
仮想環境が有効になるとコマンドプロンプトに環境名が表示され、仮想環境を無効化する（抜ける）には、deactivateコマンドを実行します。

※ venvは、Python自体のバージョン管理はできません。

### 2.1.2 pipコマンド
pipコマンドは、サード製パッケージをPythonの環境にインストールするためのコマンドです。 以下に、コマンドとその働きをまとめた表を示します。
 

※ pip listとpip freezeは出力形式が異なり、pip freezeはpip install向けの形式で出力します。

### 2.1.3 Anaconda
Anacondaは、Anaconda社が開発、配布しているPythonのディストリビューションであり、venv, pipとは異なる仮想環境の作成方法、パッケージ管理システムを採用しています。

#### (1) Anacondaのメリット
多くのパッケージを1度のインストールでセットアップでき便利である。

#### (2) Anacondaのデメリット
condaコマンドでインストールされるパッケージは、 pipでインストールされるものよりもバージョンが古い場合がある。
pipを利用した場合に、condaコマンドで構築された環境が壊れることがある。

※ Anacondaで設定した環境下でパッケージ管理をする場合には、Anaconda独自のcondaコマンドのほかpipも利用できます。しかし、Anacondaを利用する場合は基本的にcondaコマンドでパッケージ管理することが望ましいです。その理由は、稀にcondaコマンドで構築された環境がpipの利用で壊されてしまうことがあるからです。

### 2.1.4 Pythonの文法
#### (1) 文法の考え方
Pythonの設計思想は「シンプルで読みやすいコードが書けること」となっています。コードのブロック構造を括弧ではなくインデント（字下げ）で表現するという部分にもその設計思想が表れています。

#### (2) PEP 8
Pythonで標準となるコーディング規約のことをPEP 8と呼びます。例えば、複数のモジュールをimportするときには、1行ずつimportして書くべきと、PEP8では定義されています。また、pycodestyleを利用することで、#作成したプログラムがPEP8に違反していないかをチェックすることができます。

## 2.2 Pythonの基礎
### 2.2.1 リスト内包表記

内包表記はリストやセットなどを簡潔に生成する機能です。
内包表記にはリスト内包表記や、セット内包表記、辞書内包表記があります。

通常の繰り返し処理を用いた場合とリスト内包表記を用いた場合のコードの違いを確認します。
#### 通常の繰り返し処理を用いた場合
【リスト内にある文字列の長さのリストを生成するスクリプトの例】

```python
names = ['fish', 'dog', 'tiger']
lens = []
for name in names:
  lens.append(len(name))

##出力結果
[4, 3, 5]
```

#コード解説
for文  繰り返し処理　参考：https://www.youtube.com/watch?v=d-eWPT74zXY&t=239s
.append　末尾に追加　参考：https://www.youtube.com/watch?v=uDxiSy_kd7c
len()関数　文字数　参考：https://www.youtube.com/watch?v=yNkhRFt6318


#### リスト内包表記を用いた場合
【リスト内にある文字列の長さのリストを生成するスクリプトの例】
```python
names = ['fish', 'dog', 'tiger']
[len(name) for name in names]

##出力結果
[4, 3, 5]

```
### 2.2.2 正規表現
正規表現とは、文字列を1つのパターン化した文字列で表現する表記法です。
正規表現を使用して、文字列をパターン化した文字列に置き換えることで、文字列の検索や置換を行えます。

参考：https://www.youtube.com/watch?v=ImIF5IREDlg
【正規表現を扱うスクリプトの例】
```python
import re
prog = re.compile('Ab(c|d)e(f|g)h?(i|j)?', re.IGNORECASE)
ret = prog.search('Abcefh')
print(ret[0])

#出力結果
Abcefh
```
#コード解説
import re　　正規表現モジュールreをインポート　　参考：https://techacademy.jp/magazine/19307
IGNORECASEフラグ（大文字と小文字を区別しない）の設定を行い、
compile関数で正規表現オブジェクトを生成し、それを変数progに格納。
searchメソッドで()内の文字列を探し、
正規表現パターンにマッチするところをマッチオブジェクトとして変数retに代入します。
print関数でマッチした文字列全体を表示させます。

### 2.2.3 Pythonのモジュール（logging、pickle、pathlib、datetime） 

#### (1)loggingモジュール
loggingモジュールは、バッチ処理などの途中経過を出力するのに便利で、
ログレベルを指定して任意のファイルにフォーマットを指定してログの出力が可能です。
ログレベルの重要度が低い順に

DEBUG
INFO
WARNING
ERROR
CRITICAL の5つがあります。
※　デフォルトの場合、標準出力にログを出力し、WARNING以上のログレベルが出力されます。

#### (2)datetimeモジュール
datetimeモジュールは、日付などの処理に便利なモジュールです。
datetimeモジュールを用いて行うことができる処理は、以下の通りです。

現在日時の取得　（nowメソッド）
今日の日付を取得　（todayメソッド）
過去の日付から今日の日付までの経過日数の計算　
日付を文字列に変換　（strftimeメソッド）
文字列を日時に変換　（strptimeメソッド）
IS08601形式の文字列を取得　（isoformatメソッド）

#### (3)pickleモジュール
pickleモジュールは、Pythonのオブジェクトをシリアライズ（直列化）して、
ファイルなどで読み書きすることを可能にします。
pickleモジュールを用いてpickle化できるものとしてブール値や数値、文字列などがあります。

#### (4)pathlibモジュール
pathlibモジュールは、Pythonでファイルのパスを扱うのに便利です。
globメソッドではファイル名をワイルドカード(*)で指定することもできます。

### 2.2.4 Jupyter Notebook
データ分析でよく使用される対話型のプログラム実行環境である。
#### (1)Jupyter Notebookの特徴
オープンソースで開発されている。
データ分析、可視化、強化学習などに広く利用されているWebアプリケーション。
プログラムとその結果やドキュメントを、Notebookというドキュメントにまとめられる。
文字列だけでなく、表やグラフも実行結果部分に表示可能。そのためデータ分析や機械学習の分野でよく使用される。
Notebookファイルは、拡張子「.ipynb」で保存される。

#### (2)Jupyter Notebookの便利な使い方
##### ・マジックコマンド
％または％％から始まるコマンドのことをマジックコマンドと呼びます。
よく使われるものとして、プログラムの実行時間を複数回試行して計測するコマンドの、%timeitや％％timeitがあります。

##### ・シェルコマンド
シェルコマンドとは、セルに！を入力して、OSのコマンドを指定して実行することができるコマンドです。
例として、pip listコマンドを実行することもできます。

##### ・Notebookファイル
Notebookファイルとは、Jupyter Notebookにおいてプログラムやグラフなどが保存されているファイルです。
NotebookファイルはJSON形式で記述されていて、基本的にはJupyter Notebookを実行してプログラムや結果を参照します。
しかし、GitHubなどのリポジトリ―サービスはNotebookファイルの表示に対応しているため、
Jupyter Notebook環境がなくても参照することができます。

# 3. 数学の基礎
## 3.1 数式を読むための基礎知識

1. 数学記号
よく使用される基本的な数学記号とその意味を以下の表にまとめました。

|記号  |意味  |
|---|---|
|Σ (シグマ大文字) |足し算の繰り返し  |
|Π (パイの大文字) |掛け算の繰り返し  |
|π (パイの小文字)  |円周率(3.1415…)  |
|e  |ネイピア数(2.71828)  |
|n!  |nから順番に1まで掛け算した数  |
 
## 3.2 関数の基礎
### 3.2.1 指数関数
f(x) = 3^xのような関数の入力が別の数字の肩に乗って使われる関数を指数関数と呼びます。この関数において、3は「底（てい）」と呼びます。
また、指数関数を応用した関数にシグモイド関数があり、この関数はニューラルネットワークでよく用いられます。シグモイド関数のグラフの形は、S字型曲線となり、座標点（0, 0.5）を基点として点対称となります。

### 3.2.2 対数関数
f(x)=log3xのような数式で表現される関数を対数関数と呼びます。対数関数は、入力された値が底の何乗であるかという出力を行います。指数関数と同様に、この関数において、3のことを「底（てい）」と呼びます。特に、底がネイピア数の時は「自然対数」と呼び、底が10の時は「常用対数」と呼びます。自然対数、常用対数の底は省略されることがあるので、底が省略された対数を見る場合には底が何であるかに注意してください。

### 3.2.3 双曲線関数
指数関数を使って定義される次の関数を、双曲線関数と呼びます。

```math
sin hx =  \frac{(e^{x}-e^{-x})}{2}
```

```math
cos hx =  \frac{(e^{x}+e^{-x})}{2}
```
 
それぞれハイパボリックサインとハイパボリックコサインと読みます。coshのグラフの形は、ロープの両端を持った時に見られる曲線の形をしており、「懸垂線」や「カテナリー曲線」と呼ばれています。

また、tanhもtanと同様に定義でき、
```math
tan hx =  \frac{sinhx}{coshx}
```
 
となります。

## 3.3 線形代数
ベクトルの演算やユークリッド距離、マンハッタン距離について学んでいきましょう。
### 3.3.1 ベクトルの演算
ベクトルの足し算は、要素同士の数の足し算です。そのため、要素の数が同じベクトルの間でしか計算はできません。
また、ベクトルとの対比で、単なる1つの数をスカラーと呼びます。ベクトルとスカラーの積は、ベクトルの各要素をスカラー倍することで計算できます。

#### ●ノルム
ノルムとは、ベクトルの大きさをスカラーで表現したものです。ノルムで頻繁に用いられるものに、ユークリッド距離とマンハッタン距離があります。

##### (1) ユークリッド距離
ユークリッド距離は、ベクトルを平面上の原点からの直線距離として測るもので、ベクトルの両脇に縦線を2つ書く記号で表現します、数式で表すと以下のようになります。

```math
||x||=\sqrt{x_1^2+x_1^2+…+x_n^2} \
```
※計算例　ベクトルa(2,3)の原点からのユーグリッド距離

```math
||a||=\sqrt{2^2+3^2}=\sqrt{13}\
```
 
##### (2) マンハッタン距離
マンハッタン距離は、ベクトルの各要素の絶対値を足し合わせて測るものです。目的地まで座標軸に沿って進んでいくようなイメージで、数式で表すと以下のようになります。

```math
||x||_1=|x_1|+|x_2|+…+|x_n|
```
※計算例　ベクトルa(2,3)の原点からのユーグリッド距離

```math
||a||=|2|+|3|=2+3=5
```

### 3.3.2 内積
内積は、2種類あるベクトル同士の掛け算の1つです。ベクトルの内積を表すにはドットを使い、計算結果はスカラーになります。ベクトルの要素同士の数字を掛け、それらをすべて足し合わせた数で、数式で表すと以下のようになります。
```math
x・y=\sum_{k=1}^{n} (x_iy_i) =x_1y_1+x_2y_2+…+x_ny_n
```

また、内積を2つのベクトルのユークリッド距離で割ると、2つのベクトルが成す角度の余弦を求めることができます。数式で表すと以下のようになります。

```math
cosθ=\frac{x・y}{||x||||y||}
```

### 3.3.3 行列、正方行列・単位行列、行列の計算  
#### (1) 行列とは
行列とは、行方向と列方向の2方向の広がりを持って数を並べたものです。要素の指定は行、列の順番で行い、例えば行列Aの2行1列の成分は21となり、要素はa21と表現します。

##### ・正方行列
正方行列は、行と列のサイズが同じ行列のことを指します。また、正方行列のうち、対角成分（左上から右下への対角線上にある成分）がすべて１で、それ以外の要素が0の行列を単位行列と呼び、Iなどの記号で表します。

##### ・正方行列の例

```math
\left(
\begin{array}{ccc}
3 & 0 & 2\\
0 & 2 & 6\\
1 & 9 & 8
\end{array}
\right)
```
##### ・単位行列の例

```math
\left(
\begin{array}{ccc}
1 & 0\\
0 & 1\\
\end{array}
\right)
```
 

#### (2) 行列の足し算、引き算
ベクトルと同様、要素同士の足し算と引き算で、行列の足し算・引き算を定義できます。そのため、行数と列数が同じ行列の間でしか計算はできません。

```math
(計算例)　行列\left(
\begin{array}{ccc}
3 & 1\\
0 & 2\\
\end{array}
\right)と\left(
\begin{array}{ccc}
1 & 2\\
3 & 4\\
\end{array}
\right)の和
\\

\left(
\begin{array}{ccc}
3 & 1\\
0 & 2\\
\end{array}
\right)+\left(
\begin{array}{ccc}
1 & 2\\
3 & 4\\
\end{array}
\right)=
\left(
\begin{array}{ccc}
4 & 3\\
3 & 6\\
\end{array}
\right)

```

#### (3) 行列の掛け算の特徴

##### ・行列同士の掛け算は行列になる
掛けられる側の行列の列数と掛ける側の行列の行数が一致している場合にのみ掛け算は定義可能
一般的にm×s の行列に、s×nの行列を掛けるとm×n行列になる
数値の掛け算とは違い、行列の掛け算は、行列の順番を入れ替えると結果が同じになるとは限らない
行列の列の数とサイズの等しいベクトルの掛け算の結果は、元の行列の行数と同じサイズのベクトルになる。

```math
(計算例)　行列\left(
\begin{array}{ccc}
3 & 1\\
0 & 2\\
\end{array}
\right)と\left(
\begin{array}{ccc}
1 & 2\\
3 & 4\\
\end{array}
\right)の積
\\
\\
\left(
\begin{array}{ccc}
3 & 1\\
0 & 2\\
\end{array}
\right)\left(
\begin{array}{ccc}
1 & 2\\
3 & 4\\
\end{array}
\right)=\left(
\begin{array}{ccc}
3×1+1×3 & 3×2+1×4\\
0×1+2×3 & 0×2+2×4\\
\end{array}
\right)=
\left(
\begin{array}{ccc}
6 & 10\\
6 & 8\\
\end{array}
\right)

```

#### (4) 行列の分解
行列の掛け算において、m×s の行列に、s×n の行列を掛けるとm×n 行列になることを説明しましたが、これを逆に考えると、m×n 行列を、m×s の行列とs×n の行列に分解することができるということです。この理論は、主成分分析法や非負値行列因子分解（NMF）といった方法の根底になっています。