【初学者に向けて】データサイエンスにおけるエンジニアリング領域についてのメモ



# データサイエンスにおけるデータエンジニアリングについて
　筆者は、基盤領域/業務領域のエンジニアであるが、データ活用の領域であるデータサイエンスにおけるエンジニアリングの領域についてどのようなものがあるのか学びも込めて整理したいと思います。

　データサイエンス/分析の領域において、機械学習や深層学習などのモデルに注目が集まるものですが、実際にデータを収集したり、加工、蓄積したりする環境を構築するスキルもデータサイエンスに含まれるエンジニアリングの領域である。下記で、体系的にどのような項目があるのかを見ていきたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/10d6c26a-ba3c-b12e-9db3-2f1d5cb19c6a.png)

項目としては、下記のようなカテゴリーが該当する。

- システム設計
- アーキテクチャー設計
- クライアント技術
- 通信技術
- データ抽出
- データ加工
- データ構造
- データ蓄積
- データ共有
- プログラミング
- ITセキュリティ
- AIシステム運用
- 生成AI

下記でそれぞれの項目について、簡単にみていきたい。

## システム設計
- オープンデータを収集して活用する分析システムの要件
    オープンデータとは何か？
- クラスターリング構成を理解する
- オンプレミス環境もしくはIaaS上のデータベースのバックアップ運用を理解する

## アーキテクチャー設計
- ノーコード、ツールの組み合わせ、アプリを作成できる
　ノーコードツールをメリット・デメリットについて整理

- コンテナ技術の概要を理解して、Dockerイメージを活用して分析環境を構築する
- Amazon Saga Maker,Azure Machine Learning,Google Cloud Vertex AIなどのフルマネージド統合 AI 開発プラットフォームを使用する
　分析環境のGUIの基本操作などを理解できる

## クライアント技術
- 対象プラットフォームが提供する機能(SDK、API、ライブラリ)の概要を理解
- Webクローラー・スクレイピングツールを用いて静的コンテンツを収集できる

## 通信技術
- 通信プロトコル(HTTP、FTP)を用いてデータ収取先に格納する機能を実装する

## データ抽出
- データベースからデータ抽出を活用して、データセットを作成できる
- 分析をするためのログ出力の使用などを理解する

## データ構造
- 扱うデータが構造化データか非構造化データなのかを判断する
- ER図からリレーションシップの関係を理解する
- テーブルの正規化を理解する技術

## データ蓄積
- DWH・DWHアプライアンスに接続してデータを抽出する技術
- HadoopやSparkの分散技術
- NoSQLデータストアにAPIを介してデータ登録を行う
- クラウド上のオブジェクトストレージ(S3など)に対してデータ格納をする技術
- 小規模な構造化データ（CSV、RDBなど）を扱うデータ処理（抽出・加工・分析など）を、設計書に基づき、プログラム実装できる

## データ加工
- データファイルに対して条件を指定してフィルタリングができる
- 正規表現を持ちてデータを合致するデータを抽出する技術 (where句)
- データファイルに対して複数のソート条件を設定できる (Order by)
- データファイルに対して、内部結合、外部結合を加味してUNION結合をする技術
- データファイルに対してNULL値・外れ値の除外、もしくは変換する技術(クレンジング)
- データファイルに対して既定のリストと照合してデータを変換する技術(マッピング処理技術)
- データファイルに対してランダムにデータをサンプリングする技術
- データ型に注意してSQL、pythonなどで四則演算を実施する技術
- 変換元と変換先の文字コードを意識して変換処理を行う技術

## データ共有
- 加工データ・分析データをCSV,JSON,Excelの指定のフォーマットで出力する技術
- FTPサーバー、ファイル共有サーバーなどから必要なデータファイルをダウンロードして取り込む技術
- BIツールからデータベースにアクセスしてメンバーに共有する技術
- BIツールの自由検索機能を活用して、必要なデータを抽出して可視化する技術

## プログラミラング
- プログラミング言語や環境によって変数のデータ型毎に確保するメモリサイズや自動変換の仕様が異なることを理解しておく
- データ処理プログラミングのため分岐や繰り返しのフローを作成することができる
- オブジェクト指向の概念を理解してスーパークラスのプロパティやメソッドを有効に活用する技術
　継承、カプセル化、ポリフォーミズムなど
- ホワイトボックステスト、ブラックボックステストの際などを理解してテストを考案する技術
- JSONやXMLなど標準フォーマットを受け渡しを理解してAPIのプログラム設計などを実施する技術
- 外部ライブラリが提供する関数の引数や戻り値を理解した上で活用する技術
- WebAPI(REST)経由で他サービスが提供する分析技術、学習済みモデルを活用する技術
- 目的に応じて音声認識関連のAPIを選択して適用する技術
- AI(生成AI含めて)を活用してソースコードのレビューやチェック機能を活用する技術
- 入れ子の処理などでシステムリソースに負荷がかかっている処理などを改善・検討する技術
- クラウド上の統合開発環境（AWS SageMaker Studio Lab、Google Colab、Azure Data Studio、IBM Watson Studioなど）で提供されるNotebookを用いてPythonなどを扱う技術
- SQL構文は一通り理解し、記述、実行する技術(DDL,DML)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/67c6c848-f965-51e1-64e3-c88564892798.png)

## ITセキュリティ
- セキュリティの3要素(機密性、完全性、可用性)について具体的な内容を理解している
- マルウェアの深刻なリスクについて十分に理解している
- OS、ネットワーク、MW、アプリケーションなどの各レイヤーに対してユーザごとのアクセスレベルを設定する必要性を理解している
- 暗号化されていないデータのリスクを理解して、暗号化方式(共通鍵、公開鍵方式)などを理解している
- 暗号化方式と合わせて電子署名などのなりすまし/改ざんの対策について理解している
- ハッシュ関数を使用してデータの改ざんなどを検知できる仕組みを理解している
- OAuth認証を理解してWebAPI経由でデータのやり取りなどをすることができる

## AIシステム運用
- AutoML
- GItやSebversionのバージョン管理
- MLOpsの仕組みやメリットについて知識として把握している
- AIOpsとは何かを理解している
- 

## 生成AI
- LLMを利用してデータ分析やサービス、システム開発のためのコード開発、修正を実施する技術
- 生成AIを活用する際に出力したい要件に合わせてFew-shot-ProgramingやChain-of-Thoughtなどのプロンプト技法の利用やAPIパラメーターの設定をする技術
- 画像生成AIに組み込まれた標準機能の利用やプロンプトruleに従い適切な画像イメージの生成をする技術
- 
- 大規模LLMを利用して開発機能のテストや検証用のダミーデータを生成する技術
-