「ゼロからはじめるデータベース操作」を読んでみた
なぜ読んだか
過去の記事にも書いた通り、2023年2月よりデータサイエンス職として働きます。 詳細な分析環境についてはまだイメージしきれていないものの、「SQLは自由に書けるようにしておいてほしい。」と先方から伝えられています。
現職は分析用のデータマート構築が業務の1つであったため、SQLに関しては抵抗感はないものの、SQLに関する知識は実務で学びながら付けていったところが多く、体系的に学んだ経験がなく...。 また分析業務を行う際も、ETLツールを使うことが主だったため、素早くSQLが書けるかと問われると自信に欠けるところもあり...。
地をしっかりと固めることを目的にSQLの入門書である本書を読むことにしました。
本書の内容(振り返り用メモ)
第1章はデータベースやSQLに関する概要説明。記載されている内容は基本情報処理技術者試験相当のものが多く、既に理解できているものが多かった。
後半はDDLに関する説明もあり、その中でカラム型などに関する説明もある。
本書では詳細に取り扱われていないが、CHAR型とVARCHAR型の細かい挙動の違いやメリデメ*1についてはよく忘れてしまう。
第2章はSELECT句とWHERE句に関する説明。こちらも記載されている内容については既に理解できていたものが多かった。
以下、自分用メモ。
- SELECT句ではAS句を使って定数を出力できる*2
- DISTINCT句で指定した列にNULLが含まれている場合、NULLも1種類のデータとして取り扱われる
- DISTINCT句では複数列をキーに指定し、重複削除できる*3
- 計算式にNULLを含むと、結果もNULLとなる
- NULLの比較はIS NULLで行う
- 第3章 集約と並べ替え
- テーブルを集約して検索する
- テーブルをグループに切り分ける
- 集約した結果に条件を指定する
- 検索結果を並べ替える
第3章はGROUP BY句と集約関数に関する説明。後半にはORDER BY句の説明もある。この辺りはETLツールでは問題なく処理できるが、いざSQLを書けとなると詰まる部分...。
以下、自分用メモ。
- GROUP BY句で集約したキーにNULLが含まれる場合、NULLも1つのグループとして分類される
- GROUP BY句で集約した場合、SELECT句にかけるのは定数、集約関数、集約キーのみ
- 集約関数の結果を抽出条件とする場合、HAVING句を利用する*4
- COUNT(*)はNULLを含む行数を、COUNT(列名)はNULLを含まない行数を返す
- 値の重複を除いた行数を数える場合、COUNT(DISTINCT 列名)とする*5
- AVGはNULLを除外した上で、平均値を算出する
- GROUP BY句、HAVING句、ORDER BY句を含むSQLの記述順序は、SELECT句→FROM句→WHERE句→GROUP BY句→HAVING句→ORDER BY句
- GROUP BY句、HAVING句、ORDER BY句を含むSQLの実行順序は、FROM句→WHERE句→GROUP BY句→HAVING句→SELECT句→ORDER BY句
- 第4章 データの操作
- データの登録(INSERT文の使い方)
- データの削除(DELETE文の使い方)
- データの更新(UPDATE文の使い方)
- トランザクション
第4章はINSERT句やUPDATE句など、データ更新に関する説明。こちらも記載されている内容については既に理解できていたものが多かった。
以下、自分用メモ。
- DEFAULT制約されているカラムについても、明示的にデフォルト値を挿入すべき
- INSERT句はVALUES句で具体的なデータを指定する以外に、SELECT句で他テーブルのデータを選択することもできる、データコピーなどに利用できる*6
- DELETE句で削除できるのは行のみ(≠テーブル、セル)
- UPDATE句では複数の列を一度に更新することもできる*7
- ワンセットで行われるべき更新の集合は、必ずトランザクションとして一纏めに行う
- 第5章 複雑な問い合わせ
- ビュー
- サブクエリ
- 相関サブクエリ
第5章はビューやサブクエリに関する説明。特に相関サブクエリについてはお恥ずかしながら全く無知だった...。
以下、自分用メモ。
- ビューを作るメリットは容量を節約できることと、よく使うSELECT文を保存できること
- ビューからビューを重ねて作ることもできるが、パフォーマンス低下につながるので避けるべき
- 特定の条件下(元テーブルのカラム制約を準拠している、単一のテーブルのみに影響を及ぼすなど)では、ビューから元テーブルに対してINSERT句を発行できる*8
- サブクエリは使い捨てのビューをFROM句で発行するイメージ
- 単一の値になるサブクエリをスカラ・サブクエリとよび、抽出条件などにも活用できる*9
- 集約したグループ単位ごとに比較をしたい場合、相関サブクエリを使う*10
- 第6章 関数、述語、CASE式
- いろいろな関数
- 述語
- CASE式
第6章は関数や述語、CASE式に関する説明。細かい文法はさておき、ETLツールで活用している機能と相違ないものが多かった。使いながら調べつつ覚えていく部分という認識。
以下、自分用メモ。
- COALESCEを使いNULLを別の値へ変換することができる、NULLを含む演算を行う際に便利*11
- INを使うことでORでの条件記載を省略できる、INの中身ではサブクエリを発行することもできる*12
- NOT INの中身にNULLを含めると、真偽値が常にFALSEになってしまう*13
- EXISTSを使うことで「ある条件に合致するレコードの存在有無」を調べることができる*14
- CASEを使うことで縦横変換ができる*15
- 第7章 集合演算
- テーブルの足し算と引き算
- 結合(テーブルを列方向に連結する)
第7章はテーブル同士の演算に関する説明。結合に関しては理解できていたが、重複行が含まれるUNIONの挙動などは知らなかった。
以下、自分用メモ。
- UNION句は重複行を削除したうえで和集合を求める、UNION ALL句では重複行が削除されない
- INTERSECT句は積集合を求める
- EXCEPT句は差集合を求める
- JOIN句はINNER JOIN句と同等
- 3つのテーブルを結合する場合は、2つずつ結合していく*16
第8章はウィンドウ関数(OLAP関数)やGROUPING演算子*17に関する説明。ウィンドウ関数についてはデータマート構築の実務でも使ったことがあるが、GROUPING演算子は全く無知だった。ただGROUPING演算子については実務でどこまで活用されているのか若干疑問視。この辺りはSQLとプログラムの役割分担が実務でどのようになっているのか気になる。
- 第9章 アプリケーションからデータベースへ接続する
- データベースの世界とアプリケーションの世界をつなぐ
- Javaの基本知識
- JavaからPostgreSQLへ接続する
第9章はアプリケーションとデータベースを実際に通信してみる内容。JJDBCを使ったWebアプリケーションは研修でも作ったことがあったのでサラッと読み飛ばし。
読んでみて
「ETLツールだとこう処理するけど、SQLだとどう書くんだ...?」となっていた部分が、かなりクリアになりました。 というか、SQL(特に集約やサブクエリ回り)を全然理解できていなかったなと本書を読みながら痛感しました...。(入社までに読んでおいてよかった。)
使わないとすぐ忘れていってしまうと思うので、Pandasの勉強と合わせてデータサイエンス100本ノック(構造化データ加工編)でアウトプットしてみようと思います。
インプット過多にならないようにしつつ、以下の本も(いずれ)読みます。
「PythonではじめるKaggleスタートブック」を読んでみた
なぜ読んだか
ご縁があり、2023年2月よりデータサイエンス職として働かせていただくことになりました。
ご面談の中で、働くまでに具体的にどんなスキルが必要か尋ねた際に、「最低限、KaggleのTitanic問題について、予測精度を自分なりに向上できるスキルを身に着けておいてほしい。」とご回答をいただいていました。
Titanic問題は、過去にもKaggleのチュートリアルを片手に取り組んだことはありましたが記憶が薄れつつあり。積読化していた本書を読みながら再度取り組むことで、記憶を蘇らせるのが今回の目的。
本書の内容(振り返り用メモ)
- 第1章 Kaggleを知る
- 1.1 Kaggleとは
- 1.2 Kaggleで用いる機械学習
- 1.3 Kaggleのアカウントの作成
- 1.4 Competitionsページの概要
- 1.5 環境構築不要な「Notebooks」の使い方
- 1.6 第1章のまとめ
第1章はKaggle+機械学習の概要説明。 基本的には、Kaggleのチュートリアルに記載されていた内容とほぼ同じ。
- 第2章 Titanicに取り組む
第2章は本書の主軸で、実際に手を動かしながらTitanic問題を解いていく。 ベースラインを作成した上で、EDA→特徴量エンジニアリング→アルゴリズム選定→パラメータ調整→CVによるモデル評価→アンサンブル学習という順序で学んでいく。
特にCVやアンサンブル学習に関しては、図解を交えながら解説しているのでわかりやすかった。 また、Random Seed Averageなどの手法についても補足されていたり、次のステップアップになる情報が散りばめられていてよかった。
- 第3章 Titanicの先に行く
- 3.1 複数テーブルを扱う
- 3.2 画像データを扱う
- 3.3 テキストデータを扱う
Titanic問題は単一テーブルデータが与えられる初歩的な問題のため、次の一歩を進めるための内容が書かれている。 第2章までは手を動かしながら進めていくが、第3章はキーとなる用語の解説が主軸となっている。
おおよそのイメージを掴んだら、他の書籍等で勉強するのがよさそう。
- 第4章 さらなる学びのために
- 4.1 参加するコンペの選び方
- 4.2 初学者にお勧めの戦い方
- 4.3 分析環境の選択肢
- 4.4 お勧めの資料・文献・リンク
第1章の続きに相当するパート。 Kaggleに取り組むうえで知っておいたほうがよい細かい情報がまとめられている。
また、随所で紹介されている各資料や文献についてもまとめられている。 全部読むと骨は折れそうだが、参考になる資料はかなり多そう。
読んでみて
当初掲げていた目的は達成できる内容でした。
また、本書を読みながら自身でもTitanic問題に取り組みました。 基本的には第2章の内容をベースとしながら、先駆者たちが取り組んでいた特徴量エンジニアリングを模倣しながら取り組みました。
- 欠損値の多いAgeをランダムフォレストで予測し補完する
- Nameから敬称を抽出し特徴量とする
- Cabinの先頭文字をトリムし特徴量とする
- etc...
Submit時のベストスコアは約0.8でした。本当はもっとスコアを上げられるものだと思いますが、開催中のコンペで学んだほうが効率的かと思いましたので、サクッと切り上げました。 (本書にも「Titanic問題はデータ件数が少なく、乱数等によるスコアのブレも大きい」とありましたので。)
自身で作成したコードはGithubにもPush済み。
冒頭記載した通り、Titanic問題は過去にもトライしていました。 当時は新卒で働きだした当初ということもあり特に気にも留めていなかったのですが、今回は取り組むなかで「実務とKaggelの異なる点」も多く感じました。 実務ですとQCDの観点を意識しながら成果を出していく必要がありますが、スコアを少しでも良くするために競うKaggleはQの観点にかなり比重が多いと感じました。
とはいえ、Kaggleや他データ分析コンペの内容は実務に活かせる部分も非常に多いので、実務で求められるスキルとKaggleで求められるスキルが完全イコールではないということを留意しながら、今後も取り組んでいこうと思います。
このブログについて
はじめに
このブログは、私自身にとっての備忘録です。 何かを勉強した、取り組んだ内容をまとめています。
注意事項
投稿される記事は、勉強中、取り組み中の内容も多く含まれます。そのため、誤りも多いと想定されます。 後学のため、誤りを見つけた場合はコメント欄などでお知らせいただけると非常に助かります。
また、すべての内容は個人の意見・見解であり、所属組織の意見・見解ではございません。