ITとかCockatielとか

技術のこととか。飼鳥(オカメインコ)のこととか。気になったこととか。基本的には備忘録。

Python 3 エンジニア認定データ分析試験【試験対策まとめ】

はじめに

  • 2019年9月末まで開催されるベータ試験に向けた学習用に作成。(以後、継続的に更新)
  • 目的は、キーワード・ポイントをまとめ、試験前の復習に使えるようにすること。
  • 解説は必要最低限とする。
    • 内容がわからない場合は、テキスト見るorググってください。
    • スライスなどの単純なものは書いてません。
  • ※オリジナルは2019年11月に書いたものです。

まとめ内容

シラバスと公式テキストに準じる

Chapter1(配点2/40)

データ分析ツール

  • Jupyter Notebook
  • NumPy
  • pandas
  • Matplotlib
  • SciPy
  • scikit-learn

データサイエンティストとは

3つの分野の知識を総合的に持ち、データ解析またはデータ解析の一連の処理及び、理解・評価を行える立場の職種。

データ分析エンジニア

データ工学を実践する1つの職種

必要な技術

  • データハンドリング
  • データの可視化
  • プログラミング
  • インフラレイヤー
  • 機械学習
  • 数学
  • 対象分野の専門知識(ドメイン知識)

データハンドリング(前処理)

機械学習の8割から9割を占める、非常に重要な処理。

機械学習

  • モデルを作る。

機械学習以外の選択肢

  • ルールベース
  • 統計的な手法

機械学習のタスク

教師あり学習(Supervised Learning)

  • 正解ラベル
  • 目的変数
  • 説明変数
  • 回帰(教師あり回帰)
  • 分類(教師あり分類)

教師なし学習(Unsupervised Learning)

強化学習(Reinforcement Learning)

報酬を最大化するように行動する学習手法

処理手順

  1. データ入手
  2. データ加工
  3. データ可視化
  4. アルゴリズム選択
  5. 学習プロセス
  6. 精度評価
  7. 試験運用
  8. 結果利用

パッケージ

Chapter2(配点5/40)

2.1 実行環境構築(配点1/5)

venv

環境作成

python -m venv test

仮想環境切り替え

Activate.ps1 #windows
activate #mac

仮想環境無効化

deactivate

pip

インストール(バージョン指定)

pip install [パッケージ名]==[バージョン番号]
pip install numpy==1.14.1

# -y :確認省略
# -U :Upgrade

アンインストール

pip uninstall numpy

リスト表示

pip list

# -o :新バージョン存在確認

バージョン統一

# 現在の環境のバージョンをテキストに出力
pip freeze > requirements.txt

# テキスト情報から環境にインストール
pip isntall -r requirements.txt

Anaconda

  • condaコマンドを利用
  • pipを使うと環境が壊れてしまう可能性あり

2.2 Pythonの基礎(配点3/5)

コーディング規約

IPython

  • ?:オブジェクトのうしろにつけて説明表示
  • %:マジックコマンド
  • !:シェルコマンド実行

内包表記

ジェネレータ式

ファイル入出力

with open(filename, mode, encoding)
  • チュートリアル
  • mode
    • ファイルが読み出し専用なら 'r'
    • 書き込み専用 (同名の既存のファイルがあれば消去されます) なら 'w'
    • 'a' はファイルを追記用に開きます。ファイルに書き込まれた内容は自動的にファイルの終端に追加されます。
    • 'r+' はファイルを読み書き両用に開きます。
    • mode 引数は省略可能で、省略された場合には 'r' であると仮定します。

文字列操作

str.upper()
str.lower()
str.title()
str.split(',')
str.endswith(('a')) # True,false
str.isdigit() # True,false
str.join('abc'))

標準ライブラリ

2.3 JupyterNotebook(配点1/5)

  • 対話型のプログラム実行環境
  • 実行
jupyter notebook
  • %timeit:1行のプログラムに対する処理時間計測
  • %%timeit:セル全体に対する処理時間計測
  • pandocとLaTeXをインストールすればPDF形式でもダウンロード可
  • NotebookファイルはJSON形式で記述されている

Chapter3(配点6/40)

3.1 数式を読むための基礎知識(配点1/6)

ギリシャ文字

集合

  • 和集合
  • 積集合

定数

関数

三角関数

双曲線関数

3.2 線形代数(配点2/6)

線形代数

行列

3.3 基礎解析(配点1/6)

微分積分

3.4 確率と統計(配点2/6)

代表値

  • 最小値(minimum)
  • 最大値(maximum)
  • 平均値(mean) ※not average
  • 中央値(median)
  • 最頻値(mode)
    • 分位数
    • 四分位数
  • 分散
  • 標準偏差
  • 度数分布表
    • 階級

データの可視化

  • ヒストグラム
  • 箱ひげ図(box plot)
    • IQR(第3四分位数-第1四分位数)
    • 外れ値
  • 散布図

データの関係性

確率

  • 全事象
  • 条件付き確率
  • 確率変数
  • 確率分布
  • 期待値
  • 分散
  • 確率質量関数:離散的な確率変数
    • 離散一様分布
  • 確率密度関数:連続的な確率変数

Chapter4(配点27/40)

4.1 NumPy(配点6/27)

  • 配列、行列計算が高速
  • ndarray:配列用の型
  • matrix:行列用の型
  • 専用の数値型がある ex.int16, float32

ndarrayの操作

array.shape
array.reshape((行数, 列数))
array.dtype
array.astype(NumPy.型)
array.ravel()   #行列の1次元変換、Shallow Copy
array.flatten() #行列の1次元変換、Deep Copy

NumPy関数

# 数列生成
arange(...)

# 同じ要素の数列
zeros(size)
ones(size)
eye(行列サイズ)
full(size, value) # 指定の値で全部埋める

# Not A number、データとしてはfloatに分類
nan

# =LINear SPACE(線形空間)
linspace(from, to, 分割size)

# 要素間の差分
diff()

concatenate([a, b], axis=1)

# 水平方向
hstack([a, b])
hsplit(a, [first-size])

# 垂直方向
vstack([a, b])
vsplit(a, [first-size])

# 転置行列
T

newaxis

meshgrid(m, n)

NumPy.randomモジュール

seed(...)

random((行, 列))
rand(行, 列)

randint(from, to)

uniform(from, to, size=(行, 列)) # 小数の乱数

randn(from, to) # 正規分布の乱数、平均0、分散1
normal(...) # 平均、標準偏差、sizeで正規分布乱数取得

NumPy機能

  • ユニバーサルファンクション:配列要素内のデータを一括変換
abs(ndarray)
sin(e)
cos(e)
log(e)
log10(e)
exp(e)
  • ブロードキャスト:配列を一括計算
mean(ndarray)
dot(a, b)
a @ b

判定・論理値

count_nonzero
sum
any
all
allclose # 浮動小数点誤差を無視したい場合に便利

4.2 pandas(配点7/27)

データの種類

  • Series 1次元データ

  • DataFrame 2次元データ 列ごとにデータ型が決まる

head
tail
index
columns
loc[:, :]  #インデックス名、カラム名指定
iloc[n, m] #インデックス番号、カラム番号指定

ファイル等の操作

  • CSVファイル
read_csv(filename, encoding="utf-8")
to_csv(filename)
read_excel(filename)
to_excel(filename)
  • HTMLファイル
read_html(url) # Tableタグを読み込む
  • PICKLEファイル
to_pickle(filename)
read_pickle(filename)

DataFrame

query("条件式")
dtypes
apply(pd.to_datetime)
astype(type)
set_index(column)
sort_values(by="column", ascending=False)
drop(column, axis=1)
get_dummies(DataFrame, prefix="any")

時系列データ

pandas
 .date_range(start="...", end="...")
 .date_range(start="...", periods="...")
 .date_range(start="...", end="...", freq="...")

df.groupby(pd.Grouper(freq='M')).mean() #月平均

df.resample('M').mean() #月平均

Grouper freq

欠損値処理

欠損値=nan

dropna() #欠損値の行削除
fillna(0)
fillna(method='ffill')
fillna(df.mean()) #平均値
fillna(df.median()) #中央値
fillna(df.mode().iloc[0, :]) #最頻値

fillna

method : {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None Method to use for filling holes in reindexed Series pad / ffill: propagate last valid observation forward to next valid backfill / bfill: use next valid observation to fill gap.

データ連結

pd.concat([df1, df2], axis=1, sort=True)

別次元を連結するとNaNで埋められる

統計データ

max()
min()
mode()
mean()
median()
std()       # 標準偏差
std(ddof=0) # 母集団の標準偏差の推定量

describe()  # 要約表示(count, mean, std, min, 25%, 50%, 75%, max)

corr()      # 相関係数

scatter_matrix(df)

データ変換

df.values

4.3 Matplotlib(配点6/27)

スタイル

メソッド

plt.title(...)  # MATLAB

plt.subplots()  # オブジェクト
as.plot(...)
ax.set_title(...)
ax.set_xlabel(...)
ax.set_ylabel(...)
ax.legend(loc='best')
fig.suptitle(...)

plt.show()

fig.savefig(filename)  # png, pdf, ps, eps, svg

グラフの種類

  • plot:折れ線グラフ
  • bar:棒グラフ
    • tick_label=labels
    • barh:水平方向
  • scatter:散布図
    • marker='v'
  • hist:ヒストグラフ
    • bins:棒の数
    • orientation:グラフの方向指定
    • stacked:積み上げ
  • boxplot:箱ひげ図
    • vert:グラフの方向指定
  • pie:円グラフ
    • ax.axis('equal')
    • startanble:開始位置(角度)
    • counterclock:回転方向
    • shadow:影付き
    • autopct:値表示
    • explode

4.4 scikit-learn(配点8/27)

前処理

  • 欠損値の除去
    • df.isnull() → dropna()
  • 欠損値の補完
    • Imputer(strategy, axis)
    • strategy:mean, median, most_frequent
  • カテゴリ変数のエンコーディング
  • One-hotエンコーディング
    • ダミー変数化する
    • OneHotEncoder(categorical_features)
    • 疎行列(scipy.spars)をtoarray()でNumpyに変換する必要あり
  • 分散正規化
    • 平均0、標準偏差1に正規化する
    • StandardScaler()
  • 最小最大正規化
    • 最小値が0、最大値1に正規化する
    • MinMaxScaler()

分類

  • テストデータセットへの分割
    • train_test_split(X, y, test_size)
  • 汎化能力 : 未知のデータに対する対応能力
  • 交差検証

サポートベクターマシンSupport Vector Machine, SVM

  • 線形分離できる/できない 直線や平面で分離できる/できない
  • カーネル データ間の近さを定量化する、高次元の空間でのデータ間の内積を計算する関数に相当
  • 決定境界、サポートベクタ、マージン
  • SVC(kernel, C)
    • kernel:サポートベクタマシンのカーネル、linear, rbf(radial basis function、動径基底関数)
    • C:マージンの広さ、値が大きいほどマージンは狭い
  • 分類結果は、極端に絶対値の大きな特徴量に影響を受けやすいため、正規化した方がよい

決定木(decision tree)

  • ノード、エッジ、子ノード、親ノード、根ノード(root node)、葉ノード(leaf node)

  • メリット データのスケールを事前に揃えておく必要がない。 分析結果の説明が容易である。

  • 情報利得 データを分割することでどれだけ得するか 親ノードでの不純度 - 小ノードでの不純度

  • 不純度 どれだけきれいにデータを分けられるか 指標:ジニ不純度(default)、エントロピー、分類誤差

  • DecisionTreeClassifier

  • pydotplusライブラリで可視化可能、GraphVizを使用(要インストール)

ランダムフォレスト(random forest)

  • 複数の決定木から予測結果を決定する。

  • バギング+決定木により、過学習しやすいという弱点を補完。

  • ブートストラップデータ ランダムに選択されたサンプルと特徴量のデータ

  • アンサンブル学習 複数の学習器を用いた学習方法

  • RandomForestClassifier(n_estimators)

    • n_estimators:決定木の個数

回帰

  • 目的変数を説明変数・特徴量で説明するタスク
  • 線形回帰:1次式
  • 単回帰:説明変数がひとつ
  • 重回帰:説明変数が複数
  • LinearRegression

次元削減

  • 主成分分析(Principal Component Analysis:PCA)
  • PCA(n_components)
    • n_components:新たな変数(次元削減後)の数

モデルの評価

  • 定量化指標

    • 適合率(precision)
    • 再現率(recall)
    • F値(F-Value
    • 正解率(accuracy)
    • classification_report(ラベル, 予測)
  • 混同行列 true/false(正しいか) + positive/negative(予測結果が)

- 実績:正例 実績:負例
予測:正例 tp fp
予測:負例 fn tn
  • 交差検証(Cross Validation)

    • cross_val_score(model, x, y, cv, scoring)
  • ROC曲線(Receiver Operating Characteristic)

  • AUC(Area Under the Curve)

    • roc_auc_score

ハイパーパラメータの最適化

  • グリッドサーチ(grid search) ハイパーパラメータの候補を指定して 予測結果がよいものを選択する 交差検証との組合せでよく用いられる
    • GridSearchCV(model, param_grid:パラメータ候補, cv:交差検証分割数)
    • best_params_:最適なパラメータの確認
    • best_estimator_ :最適なモデルの確認
  • ランダムサーチ(random search)
    • RandomizedSearchCV

クラスタリング

  • k-means
    • KMeans
パラメータ 説明
n_clusters クラスタ
init 初期値の与え方
n_init 実行回数
max_iter 反復最大回数
tol 許容誤差
random_state 乱数シード値
  • 階層的クラスタ
    • 凝集型:小さなクラスタを作ってから、地道にコツコツとまとめていく
    • cluster.AgglomerativeClustering
    • 分割型:大きな塊をクラスタに分解していく