はじめに
- 2019年9月末まで開催されるベータ試験に向けた学習用に作成。(以後、継続的に更新)
- 目的は、キーワード・ポイントをまとめ、試験前の復習に使えるようにすること。
- 解説は必要最低限とする。
- 内容がわからない場合は、テキスト見るorググってください。
- スライスなどの単純なものは書いてません。
- ※オリジナルは2019年11月に書いたものです。
まとめ内容
シラバスと公式テキストに準じる
Chapter1(配点2/40)
データ分析ツール
- Jupyter Notebook
- NumPy
- pandas
- Matplotlib
- SciPy
- scikit-learn
データサイエンティストとは
3つの分野の知識を総合的に持ち、データ解析またはデータ解析の一連の処理及び、理解・評価を行える立場の職種。
データ分析エンジニア
データ工学を実践する1つの職種
必要な技術
- データハンドリング
- データの可視化
- プログラミング
- インフラレイヤー
- 機械学習
- 数学
- 対象分野の専門知識(ドメイン知識)
データハンドリング(前処理)
機械学習の8割から9割を占める、非常に重要な処理。
教師あり学習(Supervised Learning)
- 正解ラベル
- 値
- 目的変数
- 説明変数
- 回帰(教師あり回帰)
- 分類(教師あり分類)
教師なし学習(Unsupervised Learning)
報酬を最大化するように行動する学習手法
処理手順
- データ入手
- データ加工
- データ可視化
- アルゴリズム選択
- 学習プロセス
- 精度評価
- 試験運用
- 結果利用
パッケージ
Chapter2(配点5/40)
2.1 実行環境構築(配点1/5)
venv
環境作成
python -m venv test
仮想環境切り替え
Activate.ps1
activate
仮想環境無効化
deactivate
pip
インストール(バージョン指定)
pip install [パッケージ名]==[バージョン番号]
pip install numpy==1.14.1
アンインストール
pip uninstall numpy
リスト表示
pip list
バージョン統一
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'))
標準ライブラリ
- re:正規表現
- logging
- datetime
- pickle
- pathlib
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)
- 分散
- 標準偏差
- 度数分布表
データの可視化
データの関係性
確率
- 全事象
- 条件付き確率
- 確率変数
- 確率分布
- 期待値
- 分散
- 確率質量関数:離散的な確率変数
- 確率密度関数:連続的な確率変数
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)
データの種類
head
tail
index
columns
loc[:, :] #インデックス名、カラム名指定
iloc[n, m] #インデックス番号、カラム番号指定
ファイル等の操作
read_csv(filename, encoding="utf-8")
to_csv(filename)
read_excel(filename)
to_excel(filename)
read_html(url) # Tableタグを読み込む
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:散布図
- hist:ヒストグラフ
- bins:棒の数
- orientation:グラフの方向指定
- stacked:積み上げ
- boxplot:箱ひげ図
- pie:円グラフ
- ax.axis('equal')
- startanble:開始位置(角度)
- counterclock:回転方向
- shadow:影付き
- autopct:値表示
- explode
4.4 scikit-learn(配点8/27)
前処理
- 欠損値の除去
- 欠損値の補完
Imputer(strategy, axis)
- strategy:mean, median, most_frequent
- カテゴリ変数のエンコーディング
- カテゴリ変数を数値に変換する
LabelEncoder()
- classes_ : エンコーディング前の値を確認
- One-hotエンコーディング
- ダミー変数化する
OneHotEncoder(categorical_features)
- 疎行列(scipy.spars)をtoarray()でNumpyに変換する必要あり
- 分散正規化
- 平均0、標準偏差1に正規化する
StandardScaler()
- 最小最大正規化
- 最小値が0、最大値1に正規化する
MinMaxScaler()
分類
- テストデータセットへの分割
train_test_split(X, y, test_size)
- 汎化能力 : 未知のデータに対する対応能力
- 交差検証
- 線形分離できる/できない
直線や平面で分離できる/できない
- カーネル
データ間の近さを定量化する、高次元の空間でのデータ間の内積を計算する関数に相当
- 決定境界、サポートベクタ、マージン
- 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)
回帰
- 目的変数を説明変数・特徴量で説明するタスク
- 線形回帰:1次式
- 単回帰:説明変数がひとつ
- 重回帰:説明変数が複数
- LinearRegression
次元削減
- 主成分分析(Principal Component Analysis:PCA)
- PCA(n_components)
- n_components:新たな変数(次元削減後)の数
モデルの評価
- |
実績:正例 |
実績:負例 |
予測:正例 |
tp |
fp |
予測:負例 |
fn |
tn |
ハイパーパラメータの最適化
- グリッドサーチ(grid search)
ハイパーパラメータの候補を指定して 予測結果がよいものを選択する
交差検証との組合せでよく用いられる
- GridSearchCV(model, param_grid:パラメータ候補, cv:交差検証分割数)
- best_params_:最適なパラメータの確認
- best_estimator_ :最適なモデルの確認
- ランダムサーチ(random search)
パラメータ |
説明 |
n_clusters |
クラスタ数 |
init |
初期値の与え方 |
n_init |
実行回数 |
max_iter |
反復最大回数 |
tol |
許容誤差 |
random_state |
乱数シード値 |
- 階層的クラスタ
- 凝集型:小さなクラスタを作ってから、地道にコツコツとまとめていく
- cluster.AgglomerativeClustering
- 分割型:大きな塊をクラスタに分解していく