はじめに
- 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)
報酬を最大化するように行動する学習手法
処理手順
- データ入手
- データ加工
- データ可視化
- アルゴリズム選択
- 学習プロセス
- 精度評価
- 試験運用
- 結果利用
パッケージ
- 外部のパッケージ/サードパーティ製パッケージ
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
- ?:オブジェクトのうしろにつけて説明表示
- %:マジックコマンド
- !:シェルコマンド実行
内包表記
- リストやセットなどを簡潔に生成する機能。
- 参考:Pythonリスト内包表記の使い方
ジェネレータ式
- リスト内包表記と同じ書き方を()で定義する。nextで次の値を参照。
- 参考:Pythonの内包表記(リストとジェネレータ式について)【追記あり】
ファイル入出力
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)
- 分位数
- 四分位数
- 分散
- 標準偏差
- 度数分布表
- 階級
データの可視化
- ヒストグラム
- 箱ひげ図(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 内積
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)
- EXCELファイル
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() #月平均
欠損値処理
欠損値=nan
dropna() #欠損値の行削除 fillna(0) fillna(method='ffill') fillna(df.mean()) #平均値 fillna(df.median()) #中央値 fillna(df.mode().iloc[0, :]) #最頻値
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
- カテゴリ変数のエンコーディング
- カテゴリ変数を数値に変換する
LabelEncoder()
- classes_ : エンコーディング前の値を確認
- 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:新たな変数(次元削減後)の数
モデルの評価
定量化指標
混同行列 true/false(正しいか) + positive/negative(予測結果が)
- | 実績:正例 | 実績:負例 |
---|---|---|
予測:正例 | tp | fp |
予測:負例 | fn | tn |
交差検証(Cross Validation)
- cross_val_score(model, x, y, cv, scoring)
ROC曲線(Receiver Operating Characteristic)
- roc_curve
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 | 乱数シード値 |