Yappli Tech Blog

株式会社ヤプリの開発メンバーによるブログです。最新の技術情報からチーム・働き方に関するテーマまで、日々の熱い想いを持って発信していきます。

データサイエンティスト初心者🔰のインターン生がSQLを用いてアプリログから分析した話

はじめに

はじめまして!

2023年12月の1ヶ月間、ヤプリのデータサイエンティストのインターンに参加しました、京都大学大学院1回生の鍋岡 (@nabeshinabe) です!私は京都に住んでいるため、インターンは基本リモートで参加していましたが、最後は実際に東京のオフィスに出社させていただきました。

今回インターンに参加したことで、データサイエンティストとしての成長に加えて、ヤプリの雰囲気、データ活用について理解を深めることができ、大変濃密な1ヶ月を過ごすことができました!*1

本ブログでは、ヤプリのインターンに参加した経緯、業務内容、学んだことを中心にまとめていきます。

要約

  • ヤプリのインターンは楽しい!
  • イチからデータサイエンティストとして成果出すことを頑張った!
  • たくさんの社員の方と話せた!

ヤプリとは

アプリ開発・運用・分析をノーコード(プログラミング不要)で提供するアプリプラットフォームYappliを主に開発しています。 よく知っている企業のアプリも実はこのYappliを用いて作られているというパターンもあり、かなり驚かされる場面も多かったです。事業について更に詳しく知りたい方は、こちらのリンクに飛んでもらうのが良いかなと思います。

ヤプリのインターンに参加するまで

就活を始めた2023年春頃の当初、大学や現在の大学院で専門としている情報学を生かせるようにエンジニア系の仕事をしたいというざっくりとした内容以上のことは絞っておらず、夏頃まで様々な企業説明会に参加したり、就活サイトに登録したりして情報を集めて、ひとまず夏インターンに向けての準備や選考を受けていました*2

そんな就活生活真っ只中の7月下旬頃、登録していた逆求人サービスからの紹介により、初めてヤプリと出会いました。この紹介まではヤプリという企業を知らなく、ノーコードのアプリプラットフォームについても詳しく知らない状況でした。ただアプリ自体ではなく、アプリのプラットフォームを作っているという点が面白そうという直感的な考えから実際に選考に進むことを決断し、職種についても大学や大学院の研究においてデータを扱った研究を行なっていたことから*3、データを扱う職種であるデータサイエンティストを志望しました。

選考のエントリー後、まずカジュアル面談として、ヤプリのデータサイエンティストの方とお話しする機会を設けていただきました。その方は後にインターン中にも大変お世話になることになる方です。この時に、ヤプリにおけるデータサイエンティストの業務などを詳しく知り、さらに興味をもち、そのまま選考に進むことにしました。

選考期間の合間も人事の方が非常に親切に接してくださり、面談という形でどのようなエンジニアが合っているのか、どのような就活の軸にすべきかを一緒に考えてくださり、選考以外の面でも手厚いサポートをしてくださいました。

そして10月頃に無事にインターン前の最終選考を突破し、インターン内定をいただきました! データサイエンティストとしての実務経験がなく、ましてや就業型インターンの形式自体初めてで合ったにも関わらず、このように実務現場で働くチャンスを頂けたことに対し、感謝の限りです...!

そして12月の1ヶ月間でインターンに参加するということで調整していただきました。

インターンにて

12月に入りインターンが開始しました。この章では、実際にインターンで行ったことをまとめていきます。

目標設定

まずインターンに参加するにあたって、 選考時からお世話になっている人事の方とお話をしながら次の3つを目標として決めました。

  1. データ分析周りの実務を経験する
  2. 会社のカルチャー、社風を知る
  3. 多くの社員の方と交流する

インターン中はこれらを意識する形で取り組みました。

研修

ヤプリのインターンはまず研修から始まります。この研修では、ヤプリのメインプロダクトであるノーコードプラットフォームのYappliを用いてお題に沿ったアプリを作ります。 約300ページにわたる研修資料を読み込みながら、Yappliで現状可能なほぼ全ての機能を活用して1つのアプリを作り上げていきました。ボリュームが大きく大変ではありましたが、自分の手を動かしながらYappliというプロダクトを理解することができ、データ分析のテーマを考える際の重要なステップであったように感じます。3日分ほどの時間がかかりました。

加えて、私は"Yappli 勉強会"にも参加しました。この勉強会では、Yappliが実際にビジネス側でどのような形で宣伝され、活用されていくかということを知る機会となりました。データサイエンティストとして、実際にビジネスに活かせるような分析をする視点を持つ上で、 仕組みを理解しておくことは重要であり、これを学べる機会となりました。

以上より研修は、Yappliというものを多角的に捉えるために充実したプログラムであったように感じます。

データサイエンティスト(DS)としてのインターン

インターンの残りの期間は、 実際にテーマを設定して、その内容に取り組むというものでした。 今回のインターンでは、 現在運用されているYappliのログを活用した分析に取り組みました。

テーマ設定

まずヤプリのKPIツリーを書く課題から始まり、そこから求められていそうな分析を考え、テーマ設定をする流れとなりました。この際にデータサイエンティストとしての業務が初めてということもあり、蓄積した大量のアプリログから分析でき、かつアプリという特徴を活かしたような分析であることを条件として考えを洗い出すことにしました。

テーマを考えていくにあたって、ふと"上手なアプリとは何か?"と考えました。上手なアプリを考えると、"ボタンの配置の仕方が良い"や"デザインが今っぽい"、"使いたい機能がついている"等と様々な考え方ができますが、私はそこで、"使いたい機能まで早く辿り着くことができるアプリ"が上手なアプリではないかと考えて、分析を進めることにしました。これは使いたい機能に素早くアクセスできるアプリこそが利便性が高く評価されやすいのではないかという仮説に基づくものです。

加えて、この分析はKPIツリーのいくつかの部分にも効果があると考えています。例えば、カスタマーサクセス部(以下、CS)に対してです。CSではサービスを購入した顧客に対して能動的に関わり続けて顧客の成功体験を実現させる取り組みを行います。目的として例えば解約を阻止する役割があり、SaaS事業等ではよくある部署です。ヤプリの場合はYappli等のサービスを導入した後に持続してもらえるように、活用やアップデートの相談とサポートをしていく役割となります。そこで今回のテーマのデータが得られた場合、目的機能のボタン配置が迷いの無いものになっているか、わかりやすい配置になっているかを定量的に評価することが可能になり、顧客に改善点を提案する際の根拠となるデータのひとつとなるのではないかと考えられます。

ということで、"目的機能までの到達時間から分析する上手なアプリ"というテーマでインターン課題に取り組むことにしました。

問題設定

テーマの中の"目的機能""到達時間"を次のように設定しました。

"目的機能"は使いたい目標となる機能です。しかしインターンの時間の制約上、Yappli上で実現されている全ての機能をゴールとして分析することは難しく、また分析がややこしくなるため、 よく使用されるポイントカードやクーポンといった特定の機能をゴール機能として設定しました。

次に、"到達時間"は各"セッション"の開始時間から指定した目的機能に1回目に到達するまでの時間と設定しました。ここで"セッション"とはアプリ別のユーザー毎に、最終ログから30分以上空いた後に最初のログが送られてきたタイミングから、そのログ以降が30分以上空くことになる最後のログのタイミングまでの範囲を一つのセッションと設定しました。すなわち、アプリ別のユーザー毎に、その各"セッション"内で指定した目的機能に1回目に到達するまでの時間を"到達時間"として記録すると定義しました。

なお今回は"到達時間"の定義にある通り、同一セッション内の2回目以降の目的機能に到達した時間はカウントしないものとして実装しました。

到達時間の定義

実装

ヤプリのデータ分析基盤はGoogle Cloudで提供されているBigQueryを用いて運用されています。BigQueryはデータ処理が非常に高速である特徴を持ち、SQLのクエリを実行することで、ビッグデータの解析が可能です。今回は初心者ながら、目的に合うデータを得られるように実際にSQLを書いて分析することになりました。

手順として、次のような3段階に分割しました。

  1. 指定した期間の必要な情報を生データから取り出す
  2. 各アプリ毎のユーザー毎の到達機能別に、到達時間を出力する
  3. 各アプリ毎の機能別に平均値などを処理する
実際に活用した便利だったSQL構文 8選

まず、便利だったSQL文を紹介していきたいと思います。アドバイスを受けて実際に使ってみると便利であると感じるものが多かったです。

まず1つ目は、WITH句です。 一時的にサブクエリに名前をつけて別管理をすることができる機能です。

WITH
  final AS (
  SELECT
    A,
    B
  FROM
    tableA
  )
SELECT
  *
FROM
  final
ORDER BY
  B

tableAから連鎖的に色々加工して取り出して出力したい時に、この構文が便利でした。可読性も上がり、デバッグする時にも重宝しました。

2つ目は、JSON_VALUEを用いてJSONを加工する方法です。STRING型でJSON形式で書かれている文字列からAの要素を取り出せます。

JSON_VALUE(DATA, "$.A")

元々JSON_EXTRACT(DATA, "$.A")を用いて加工しようとしていましたが、これだとSTRING型の文字の中の"'"なども一緒に出力されてしまったので、アドバイスを受けてJSON_VALUEを用いることにしました。

3つ目、4つ目はSPLIT関数とSUBSTRING関数です。文字列として"-"などの特定の文字を用いて繋がれているデータから特定の文字列を抽出したい時に便利でした。

# EFGH が出力される
SPLIT("ABCD-EFGH-IJKL-MNOP", "-")[SAFE_OFFSET(1)]

# GH が出力される
SUBSTRING(SPLIT("ABCD-EFGH-IJKL-MNOP", "-")[SAFE_OFFSET(1)], 3)

SPLIT関数を用いることで、第2引数の文字で分割し、[SAFE_OFFSET(n)]で指定されたn個目(一番初めが0)の文字列を返すことができます。そして、SUBSTRING関数を用いると、第1引数で設定した文字列から第2引数で設定した数字nのn番目以降の文字列を取り出せます。

5つ目はCASE文です。条件文が書けます。以下の例では、AがBと等しいなら1、そうでなければ0という書き方です。

CASE 
  WHEN A = B THEN 1
  ELSE 0
END

SELECT文内にも使え、ラベル付けするために便利でした。

6つ目、7つ目はウィンドウ関数とLAG関数です。以下の例では、属性A別にtimestampの要素の順番に並び替えたものから、timestampのLAG関数の第2引数で指定されている数だけ前の行の要素を持って来れる関数です。なおLAGの代わりにLEADを使えば、反対に後ろの行を持って来れます。

LAG(timestamp, 1) OVER (PARTITION BY A ORDER BY timestamp)

ユーザー別などで時間差を計算するときに使用しました。

8つ目は関数ではありませんが、INTERVAL型という型です。時間差を表現する時にこの型を用いました。

ちなみに、INTERVAL型から秒(FLOAT型)に直す時は以下の関数で変換できました。INTERVAL型のAを秒数に変換するものです。

EXTRACT(SECOND FROM A)

他にも様々なSQL関数を駆使しましたが、 本当に便利な関数がたくさん用意されていると感じました。

SQLのクエリ作成

以上の様々なSQL関数を駆使して、具体的に進めていきました。

まずデータを抽出しました。クエリを実行して実際に1ヶ月分を対象としてデータを抽出しましたが、分析したデータの数は莫大で圧倒されました...!

次に各アプリ毎のユーザー毎の到達機能別に、到達時間を出力するということで、次のような流れで進めていきました。

  1. LAG関数を駆使して、各ユーザー別の全ての時間差を算出
  2. 30分以上の時間差があるものにフラグを立てて、各セッションを特定
  3. 同一セッションに連番をつけ、各セッションで異なるIDを付与
  4. 特定の目的機能を含むログにフラグ
  5. フラグが1本以上あるセクションを抽出
  6. 同一セクションの1本目以降のログはカット
  7. セクションの開始から最初に目的機能に達するまでの範囲のログを抽出
  8. 機能にたどり着くまでの到達時間を算出

この流れで行いました。 WINDOW関数を用いてSUMを出力したり、条件に合うセクションを抽出したりする部分が大変でした...

そして、各アプリ毎の機能別に平均値などの処理を行うクエリを書きました。

可視化

上記で出力したデータは、Google CloudのBIツールである Looker Studioを用いて可視化を行いました。このLooker Studioでは、価値ある情報を視覚化するために様々な機能があります。可視化においては、出力された結果から各機能別の到達時間等の表示を行って整理してまとめました。

分析

実際にLooker Studioで可視化したテーブルから、例えば、2つの次のようなことが読み取れる結果が得られました。

1つ目は、運用期間が長いアプリほど、目的機能までへの到達時間が短い傾向を表すこと。2つ目は、実際に到達時間が最速のアプリを見た際に、その目的機能の位置がわかりやすい配置になっていたり、よく使う機能であるが故にトップページにその機能が含まれていたりすると言えそうなことです。

もちろん様々な要因が絡んでおり、上記の分析内容になるような改善方法をとることで良いアプリになるとは限りませんが、一つの指針を与えられたのではないかと考えています。また、アプリのプラットフォームを作るヤプリだからこそ可能な分析ではないかと考えています。

これらの分析結果は、社内にて発表機会を設けてくださり、成果発表を行いました。この際に多くの方に関心を持っていただけて、嬉しかったです*4!!

バトンランチでの社員の方との交流

今回のインターンにおいて、データサイエンティストとして技術的に成長するという目標以外にも目標を設定していました。それは、初めの目標の章でも書いています通り、可能な限り多くの社員の方とお話をすることです。現場で働く実際の社員の方々とお話をすることで、その企業の雰囲気やその企業の業務内容の生の声を聞くことができると考えているためです。

ヤプリでは「バトンランチ」という文化があります。この制度は、面談を受けた方から次に他の社員を紹介していただき、連鎖的に個別面談を設定していただくものです。この制度により、開発職の方のみならず、ビジネス職の方とも繋いでいただき、加えて役職も様々な方と繋いでいただき、本当にたくさんの方と交流してお話できました。これを通して、ビジネス側の仕組みの理解にも繋がりました。

バトンランチを通してヤプリの文化や働き方、キャリア感等、現場社員の方々の生の声や考えを伺うことができました。企業理解のみならず今後のキャリアの考え方を深めることができるような、とても面白い話が多かったです!

まとめ

1ヶ月という短い期間、ましてや実際に出社した日数で数えると更に少ない期間ではありましたが、はじめに立てた3つの目標を達成できたような大変濃い充実した経験を積むことができました。インターンといってもチームの会議や全体の報告会に参加させていただいたり、オフィスに出社して業務をする機会を与えてくださったりと、社員の一員として業務に取り組めて、具体的な業務のイメージが掴めるインターンでほんまに参加する価値ありました!!この記事をきっかけに、多くの方にデータサイエンティスト職やヤプリのインターンに興味を持っていただきたいと思っています。

ありがとうございました!!

インターン期間の過ごし方(週3日程度で勤務しました)

最終日に納会に参加してきました!盛り上がり凄い!!

*1:実際には1ヶ月と言っても、大学院の授業や研究室のゼミが合間にあり、週2.5〜3日程度の時間で出勤していました。

*2:今思うと、大学院の研究や9コマの授業とよく上手くやっていたなと思います。

*3:大学時代は音楽情報処理×深層学習をテーマとした自動編曲の研究、現在の大学院ではSNS投稿における画像やテキストの分析

*4:開発チーム向けに加えて、全体向けの計2回発表し、出社した際にも多くの感想をいただけました。