見出し画像

書道とサッカーに明け暮れていた文系学生がゴリゴリSQLを書けるようになるまで

初めに

この記事はRetty Advent Calendar 2021 Part2 21日目の記事です。

こんにちは、Rettyでデータアナリストをしているだいきちです。
22卒入社で今は内定者インターンを週3-5でしています。

こんな感じの時系列です。

この記事では簡単な自己紹介をした後に、今年の2月の入社から今まで、「SQLを書く」上でぶち当たった壁とその壁をどう乗り越えたかをお話しできたらなと思います。

こんな方に読んでいただきたいです!↓

  • データアナリストを目指している方

  • SQLを書こうと思っているが、何から始めたらいいかわからない方

  • SQLを書いているが、何か壁にぶち当たっている方

  • 将来の分析チームの後輩

自己紹介

学生時代は書道部で、書道パフォーマンスや作品作りをしていました。
趣味はサッカー観戦でManchester United一筋15年です。

SQLはもちろん、どのプログラミング言語にも触れたことのない文系学生でした。

SQLとは

SQLとはデータベース向けのプログラミング言語です。
クエリ(命令)を書いて実行することで、膨大なデータから必要なデータだけを取れます。

下のようなクエリ(命令)を書くと、データを取ってくることができます。

baseというテーブル(データが入ってるもの)からuser.idという列だけ取り出そうとしているクエリ

RettyではBigQueryというGoogleのプロダクトを使ってSQLを使っています。

壁にぶち当たるまで

主にやったことはこの2つです。

  • Progateでまずは自学自習

  • 社内プログラムBigQuery Expertで実践問題に挑戦

Progateでまずは自学自習

内定承諾から入社までに時間があったのでProgateというオンラインプログラミング学習サービスをやっていました。

テキスト読んで→演習という形を、かわいい動物のキャラクターと一緒に何回も繰り返していくので、続けやすくて良かったです。

社内プログラムBigQuery Expertで実践問題に挑戦

BigQuery ExpertとはRettyの社内で用意されているプログラムです。
必要な関数が与えられた上で、問題文で求められているデータを出すためのクエリを書くというものです。
これを60問くらい解くと大分SQLに慣れてきます。

社内でこんな問題集ないよ!という方は、データ出しを担当されている人に「簡単なデータ出しの問題出してください!」と言ってみて、実際に解いて答え合わせしてもらうといいかもしれません。

BigQuery問題集
フルリモートでのインターンだったので実況中継しながら問題集を解いていました。

ここからは、この4つの壁に対してどう取り組んだかを書いていきます。

1つ目の壁 テーブルの理解が進まない

上で紹介したBigQuery Expertを1ヶ月くらいして、 SQLに大分慣れてきました。やっと実務に取り掛かります。ここでひとつ目の壁にぶち当たります。

タスクが全然終わらない. . .!!

そう、タスクが決まった期限までに終えることができないんです。
なぜかというと、テーブルの理解が全然できておらず、必要なデータが入っているテーブルがどこにあってどのように格納されているかわからなかったからです。

例を挙げると、
「二郎系ラーメン」カテゴリのお店に1日で2回投稿してるユーザーIDを出す
というお題があるとします。

その時に、テーブルの理解ができていないと…

テーブルの理解ができると…

この課題に対して、主にやったことは1つです。

  • 何回も中身を確認する

何回も中身を確認する

めちゃゴリ押しですが、慣れが一番大事だと思います。
何度もデータを確認して中身のイメージが頭の中でできるようにしました。

そのために覚えておきたいデータベースというNotionのページを作成して、よく使うなあというテーブルはスクショして保存していきました。

モザイクのせいで情報量ゼロになってしまったNotionページ

2つ目の壁 関数が全然わからない

1つ目の壁を越えると簡単なクエリは結構書けるようになってきます。
ただ、指定された日付の前の日のログを取るデータ出しや、条件をつけるようなクエリを書き始めると、次の壁が現れます。

どんな関数が存在するかも、関数の使い方もわからない!!

 SQL以外のプログラミング言語を書いた経験のある方は大体これ使えばいいだろう、他の言語ではこういう書き方だけど SQLはこんな書き方なんだ、と理解することができると思いんますが、自分は全く触ったことがなく、上のような状況になりました。
この課題に対して、主にやったことは2つです。

  • 先人のクエリを読む

  • 公式ドキュメントを読む

先人のクエリを読む

まず、どんな関数が存在するかを把握する必要があったので、分析チームの先輩が残してきたクエリを読みました。
具体的には、取り組むタスクに関連のあるクエリをいただいて、一つづつ読み解いていく作業です。

それでも難しい場合は、やりたいことを明示して使える関数をチームに聞いたりしていました。

公式ドキュメントを読む

先人のクエリを読んでいても、関数の意味が理解できないと話になりません。そこでよく見ていた(今も見ている)のがBigQueryの公式ドキュメントです。
具体的にはやりたいことを英語で検索します。(元々の公式ドキュメントは英語しかないので。)

するとこんな感じで検索結果が現れます。
日本語で書かれたQiitaなどもあり、参考になるのですが、まずは公式ドキュメントを見ましょう!

何度もアクセスしているので紫色になっている

もともとは英語のページなんですが、Googleがいい感じで日本語に訳してくれています。
公式ドキュメントを確認して書いていくことで正しい関数を覚えることができます。
最初の頃は読みにくいと思っていた公式ドキュメントですが、今は困った時に頼る辞書のような存在です。

3つ目の壁 正しいデータが出せない

テーブルの中身も理解し、関数を使うことにも慣れてきたので、クエリマスターになったと思い、意気揚々とデータ出しをしていた自分が次に陥ったのがこの壁でした。

正しいデータ出しができない!!!

具体的にいうと、
ある条件Aに当てはまるユーザーさんの数を出すタスクにおいて、
数字は出したものの、詳しく見てみると、その数字の中身のユーザーさんは、条件Aに当てはまっていないユーザーさんということが発覚し、データ出しをやり直す。
のようなことを何回も繰り返してしまいました。

間違いを発見
起きた原因をマネージャーとの1on1で相談していた

これが起きた原因は上にある2点だったので、それに対して主にやったことは2つです。

  • データ出しの目的と次のアクションを理解する

  • どのくらい信用して良いデータであるかを説明する

データ出しの目的と次のアクションを理解する

データ出しはあくまでも、分析や意思決定のための手段であり、データ出しの目的を理解しておかないことには分析や意思決定につながるデータ出しをすることはできません。
そのため、データ出しの目的と、データ出しができた後のアクションを確認することを徹底しました。

これらを仕組み化するために、Notionでテンプレートを作成し、To doの中に、目的の理解と次のアクションの確認を追加しました。
そうすることで習慣として身につき、今ではタスクを受けるときに必ず、目的と次のアクションについて確認するようになりました。

タスクをする際のNotionテンプレート

どのくらい信用して良いデータであるかを説明する

目的と次のアクションを確認することで、正確なデータを出せるようになったとしても、完璧に正確なデータというのはないと思います。

ログが欠損しているかもしれないし、消費するデータ量の関係でスキャンする期間が限られるかもしれません、使っている元テーブルが間違っている可能性もあります。
そんな時に大事なのは、データの信憑性や、目的と照らした時にどれくらいこのデータを信用して良いか、まで依頼者に伝えることができていることだと思います。
そのため、データ出しを確認してもらうときは、懸念ポイントも正直に伝えるようにしました。

4つ目の壁 読みやすいクエリが書けない

いろんな壁を越えて、自分はクエリマスターになった!と思っていたそんな時、メンターにこんなことを言われてしまいました。

だいきちのクエリ、もっと上手く書けるよね?
他の人がこのクエリを見たり使ったりする時、どんな工夫ができるだろう?

メンター本田さんからの言葉

よくよく自分のクエリを見てみると、こんな問題点がありました。

  • 一時保存したテーブルを参照しているので、半年後に同じクエリデータを出そうとするとできない。

  • クエリに関する説明が少なく、他の人がクエリを読み解く時に時間がかかる。

  • どの元テーブルを使ってデータを出しているかがぱっと見でわからない。

これらの課題に対してやったことを下で説明したいと思います。

そもそもいいクエリとは?

いいクエリとはなんでしょうか?

いいクエリとは、うまい、安い、早いを満たしているクエリではないでしょうか?

うまいクエリとは?

うまいクエリとは、データの精度が高いクエリのことです。
冷凍したカレーのように、長時間立った後でも解凍すればすぐに使えるようなクエリのことだと思います。
そのためには、一時保存のテーブルを使用するのではなく、1つのクエリで求められるデータを出せる必要があります。

安いクエリとは? 

安いクエリとは、扱いやすく誰でも解読しやすいクエリのことです。
具体的にいうと、コメントアウトでクエリの説明を丁寧にできていたり、読み手を意識して、インデントを意味ごとに設定したりすることだと思います。

早いクエリとは? 

早いクエリとは汎用性が高く、加工するコストが低いクエリのことです。
時系列や、集計、平均、セグメントごとのデータを、少しクエリをいじるだけで出せるようなクエリだと色んな場面で素早く対応できると思います。

意識していること

まとめるとこんなことを意識してクエリを書いています↓

  • 一時保存のテーブルを使用するのではなく、1つのクエリで求められるデータを出す

  • コメントアウトでクエリの説明を丁寧にする

  • インデントを意味ごとに設定する

  • どの元テーブルからデータを引用しているかすぐにわかるように、最初に使っているデータを明示する

終わりに

2月から今までのクエリを書く上でぶち当たった壁とその壁をどう乗り越えたかをお話ししてきましたが、どうだったでしょうか?

4つの壁を乗り越えた今は、前述のBigQuery Expertの講師をしたり、施策の効果測定やプロダクトディスカバリーに関わる分析をしています。
これらの分析をすることで、より精度の高い施策を動かしてRettyの目指す世界を実現していきたいと思っています。

ちなみにこちらのページで僕がどんなふうに食を楽しんでいるか紹介しています!もし良かったらご覧ください!!

宣伝

そんなRetty ですが、データアナリストやPMなどを募集中です!

とりあえず分析チームの話を聞いてみたいという方は、マネージャーの平野さんがやってるMeetyを!

選考受けたいという方はこちらからどうぞ!

僕でもよければいつでもお話しさせていただきたいので、TwitterのDMからどうぞ!

最後まで読んでいただきありがとうございました!


この記事が気に入ったらサポートをしてみませんか?