Blog
プログラミング教育サービスPlaygramのユーザーデータ分析
本記事は2022年夏季インターンシッププログラムで勤務された土佐祐介さんによる寄稿です.
PFN2022夏季インターンシップに参加させていただいた京都大学修士1年の土佐と申します。
約1ヶ月半参加させていただいた今回のインターンシップでは、PFNが開発運用を行なっているプログラミング学習サービス「Playgram」の開発チームに加わり、教室長・コーチの負担軽減を通じたユーザー満足度向上をテーマとするデータ分析・機能実装を行いました。
概要
- Playgramについて
- 取り組んだ課題の概要
- 保護者面談ツールの開発
- 通知システム開発
- まとめ
Playgramについて
Playgramとは、Preferred Networks(以下PFN)が開発運用を行なっているプログラミング学習サービスです。主に小学生から高校生のプログラミング初心者をターゲットにしています。3Dのフィールド上でキャラクターを操作し、プログラミングを駆使してミッションをクリアしていくというストーリーで、プログラミング初学者でもスモールステップで着実に学べる工夫がされています。
Playgramでは、いくつかのプレイスタイルとプレイモードを選択できます。
プレイスタイルはプログラミングに使う言語を指定するもので、以下の3つが選択可能です。
- ブロック
積み木のようにブロックを積み上げることでプログラムを構築していく方法です。視覚的に分かりやすく、また平易な日本語でブロックの特徴を把握しながら進めることができるため、最も初学者に馴染みやすいスタイルです。 - Pythonブロック
ブロックを用いてプログラムを構築する点はブロックモードと変わりませんが、ブロックの解説文がプログラミング言語のPythonに準拠したものになっています。ブロックプログラミングからPythonによるテキストプログラミングへの架け橋となるスタイルで、プログラミングの思考法をより実務に近い形で養成することができます。 - Pythonテキスト
Pythonを用いて、通常のテキストプログラミングを行います。ブロックプログラミングと違い一文字ずつキーボードでタイプするため高難易度ですが、最も実務に近いプログラミング力をつけることができます。
プレイモードは与えられたフィールドでミッションをクリアするミッションモードを含め、以下の3つが選択可能です。
- ミッションモード
プログラミングを駆使して与えられたミッションをクリアしていくモードです。20以上のチャプターそれぞれに修得可能なスキルが設定されているため、効率よく必要なプログラミングスキルを身に付けることができます。また、チャプター内の各ステージにはクリア条件が設定されていて、高いスコアでクリアした場合はSランクが与えられます。 - クリエイトモード
プレイヤーの好きな作品を作ることができるモードです。ミッションモードで習得した知識を応用して自由に創作する場として活用することができます。 - タイムアタックモード
制限時間内にできるだけ多くのミッションをクリアするモードです。各チャプターの理解度を確認するために利用できます。
また、Playgramはやる気スイッチグループ様とPFNの合併会社であるYPスイッチによる、プログラミング教室HALLOを通じてユーザーにコンテンツを提供しています。多くのユーザーはHALLOに入会し、教室でコーチのサポートを受けながらプレイしています。
取り組んだ課題の概要
Playgram開発チームはユーザーが快適にプログラミング学習を行えるようにするため、継続的にコンテンツ改善に取り組んでいます。教室のコーチ達はLMS(Learning Management System)と呼ばれるツールを用いて担当生徒の学習状況を把握することができます。今回のインターンではLMSに機能追加を行うことで、主に教室で生徒のサポートを行っている教室長・コーチの負担軽減になるような改善を行いました。具体的には、以下の2つの課題に取り組みました。
- 保護者面談ツールのLMS統合
- 生徒の学習の停滞を検知しコーチに通知するシステムの開発
これらの改善によりコーチの負担が軽減され、より生徒や保護者とのコミュニケーションに注力することができるようになります。その結果、ユーザー全体の満足度向上に繋がると考え、このテーマを選びました。
保護者面談ツールのLMS統合
教室では、数ヶ月に一度教室長と保護者の面談の機会が設けられています。面談に向けて、従来は専用のツールを用いて生徒の学習過程シートを準備していましたが、今回の改善でシートのLMS統合を行いました。この改善によって、シートの準備にかかるコーチの手間を減らすことができるだけでなく、生徒の学習過程をLMSで常時把握できるようになりました。
以下が実装後のページの例です。画像のデータはダミーデータとなります。
シートを実装するに当たり、生徒が今までにクリアしたチャプターに加え、今後取り組むべきチャプターをユーザーフレンドリーな見た目で表現することを意識しました。
プロダクトへの実装まで担当したことで、初めて触れるプロジェクトのソースコードを理解し、既存のコンポーネントを利用しながら適度に独立性を保って実装を進める力が身についたと思います。
通知システム開発
Playgramを使用しているプログラミング教育 HALLOの各教室ではコーチが担当の生徒を受け持っており、生徒の状況を把握しながら適切なサポートを行なっています。多くの教室では一人のコーチが複数の生徒を担当しているため、生徒の学習状況を把握するコストが大きくなると適切なサポートを行えない可能性が高まります。そこで、生徒のプレイ記録を用いてサポートが必要な生徒を検知し、教室長・コーチへ通知するシステムの開発を行いました。
この改善によって教室長・コーチが生徒お一人お一人の学習状況をスピーディに把握しサポートが必要な生徒を早期に発見する手助けを行うことができます。
教室長へのヒアリングを通じて、サポートが必要な生徒を、「学習意欲が低下している可能性のある生徒」と定義し、データを用いて検知する方法を検討しました。
仮説の立案
最初に、生徒の学習意欲が低下する原因を分析し、通知基準を設計するための仮説を立てました。
学習意欲の低下は、具体的には学習の停滞として現れると推測されます。
さらに、学習の停滞は、大きく二つの原因が考えられます。
- 環境の変化
生徒の進学、家庭の事情、習い事の追加など。 - 生徒の心理的な変化
コンテンツの難易度が高すぎることによる学習意欲の低下、学習内容への興味の喪失など。
このうち対策可能な原因は2番であるため、詳細な分析を行いました。その結果、以下の2点に注目することで生徒の学習意欲を定量評価できると考えました。
- プレイ時間及びログイン率が急激に低下している生徒は学習意欲が低下している。
- 特定のステージで躓いている生徒は学習意欲が低下する。
次に、これらの仮説の検証と具体的な通知条件の設計についての分析結果を述べます。
仮説の検証
現在在籍中のユーザーと既に退会したユーザーからなる2群を考え、両群の比較を通じて仮説の検証を行いました。
仮説1:プレイ時間及びログイン率が急激に低下している生徒は学習意欲が低下している
生徒の学習意欲の低下は最終的には退会に繋がります。従って、退会済みユーザーが退会直前にプレイ時間/ログイン率の低下を示していれば仮説が成立すると考えられます。
退会するユーザーと学習意欲が低下しているユーザーは厳密には一致しませんが、学習意欲の低下そのものは定量評価できないため、大きな相関を持つと考えられる退会直前の期間を集計対象としました。
日次のプレイ時間/ログイン率の推移を可視化する上で、グラフの平滑化のため、該当日から過去30日間の移動平均をとったグラフを表示します。
プレイ時間/ログイン率の両方で、退会済みユーザーは退会3ヶ月前から値の減少が急激になっています。従って、退会直前のユーザーはプレイ時間/ログイン率にその兆候を示すことが確認できました。
また、クリエイトモード及びミッションモードのプレイ時間に差があるか検証します。
ミッションモード、クリエイトモード共に退会直前はプレイ時間が減少していることが確認できました。
この結果から、プレイ時間/ログイン率の急激な低下が学習意欲の低下の評価指標として有効であることが示されました。
仮説2:特定のステージで躓いている生徒は学習意欲が低下する
退会済みユーザーが退会直前にステージ離脱率(ステージに挑戦した後に、クリアせず退出した割合)の上昇を示していれば、仮説の成立を示せます。
以下に、退会者のステージ離脱率を退会までの月ごとに集計した結果を示します。
仮説の通り、退会者は退会直前になるとステージ離脱率が上昇することが分かりました。仮説1で示したプレイ時間/ログイン率の減少割合が急激になる時期と、ステージ離脱率が上昇する時期が合致している点がとても興味深いです。
評価指標の設計
前節の結果から、生徒の学習の停滞を検知する指標としてプレイ時間/ログイン率及びステージ離脱率が有効であることが分かりました。次のステップは通知の条件を設計することです。
実運用のフローを考えると、教室長・コーチにとって可解性の高い通知条件にすることが必要です。従って、まず人間にとって納得感のある指標を選び、閾値をデータから決定することで最も適切な通知条件を探索しました。
これまでの分析の結果から、プレイ時間/ログイン率の急激な低下に注目することは個々の生徒の学習の停滞の検知に有効であり、また直感的にも受け入れやすいと分かりました。従って、個々の生徒のプレイ時間/ログイン率の推移を用いて、「X日前と比較してY%プレイ時間またはログイン率が低下したら通知する」というフォーマットで通知条件を設計しました。
この通知条件を決定する上で、以下のパラメータを決定する必要があります。
- 何日間の移動平均を取るか
- 何日前と比較するか(フォーマットのX)
- どの程度の値が下がったら通知するか(フォーマットのY)
これらのパラメータを決定した方法について以下で説明します。
何日間の移動平均を取るか
多くの教室では月周期で学習プログラムを組んでいるため、30日間の移動平均を取ることで周期性をキャンセルできます。
何日前と比較するか(フォーマットのX)
退会者は3ヶ月前にプレイ時間/ログイン率の減少が急激になるため、それより短い期間で比較する必要があります。また、移動平均を取ることによるデータの被り、漏れを最小限にするため30日前と比較するのが最適と考えました。
どの程度の値が下がったら通知するか(フォーマットのY)
30日前と比較したプレイ時間/ログイン率の分布について、在籍者と退会者の分離を最大にする閾値を求めます。まず、プレイ時間の閾値を決定します。以下に、退会者と在籍者の30日前比プレイ時間の分布を示します。想定している通知条件と通知頻度に合致させるため、以下の条件で値を収集しました。
- 退会者は退会30日~90日の間の期間の値を用いる。
- 30日間の移動平均を取った後の値を用いる。
- 各ユーザー期間内(60日間)の下位10個の値を用いる。
最後の条件は、「プレイ時間が急激に低下した時にのみ通知する」という仕様を反映したものです。
(左:退会者、右:在籍者)
退会者の分布は在籍者の分布と比べ左に寄っていることが分かります。この分布を基に、退会者視点のF-scoreが最大となる境界を決定します。サンプル数の不均衡を考慮し、F-scoreの算出にはサンプル数で調整した重み付き和を利用しました。以下に、閾値を変化させた時のF-scoreの値、及びROC曲線を示します。
閾値が約0.3のときにF-scoreが最大になっています。従って、0.3を決定境界としたときに在籍者と退会者の分離が最も良いことが分かります。分布と重ねてみると、0.3を境界とすることで最適な分離になっていることが確認できます。
(左:退会者、右:在籍者)
ログイン率についても同様にF-scoreを最大にする閾値を求めます。
およそ閾値が0.5のときにF-scoreが最大になっています。
(左:退会者、右:在籍者)
分布と重ねてみても正しい分離境界を設定できていそうです。以上の結果から、最終的な通知条件を以下のように決定しました。
「30日前と比較して50%プレイ時間が低下、または70%ログイン率が低下したら通知する」
補足情報の選定
通知条件を前節で決定しましたが、プレイ時間/ログイン率の低下を通知するだけではコーチは適切な打ち手を考えることができません。従って、補足情報として以下の情報を表示するようにしました。
- ミッションモードで離脱率が高いステージ
- 過去60日の記録の中でステージ離脱率が70%以上かつSランククリアしていないステージを表示
- クリエイトモードプレイ時間の30日前比
- タイムアタックモードでスコアが低いチャプター
- 過去60日の記録の中でスコアが1200未満のチャプターを表示
いずれも生徒の学習意欲や教材理解度を反映した指標であり、生徒へのサポート方針を決定する上で重要な情報となります。指標内の変数は教室長・コーチの知識や可解性をヒアリングした上で選定しました。
実装
最後に、設計した評価指標をプロダクトに実装しました。実装を行う上で、コーチにとって分かりやすく使いやすいUIになるよう工夫しました。
以下に、実装後のUIを示します。通知は時系列グラフ中の赤い点及びテキストメッセージで確認できるようにしました。また、データはダミーデータを用いました。
感想
今回のインターンを通じて、問題設定からプロダクト実装まで、実務で必要とされるデータ分析のフローを体験することができました。ユーザーが本当に必要としている機能を提供すること、短い時間で最大の成果を出せることを意識して適切な問題設定を考えることが非常に難しく、またやりがいのある工程だと感じました。
大学院卒業後はデータ分析に関わる仕事をしたいと考えているので、今後経験する事例で良い成果を出せるよう今回の経験を糧にしていきたいと思います。
謝辞
今回のインターンを通じて、テーマ設定から成果のレビューまで綿密にサポートしてくださった丸山さん、西澤さんに深謝致します。また、分析の方針について様々なご意見をくださったやる気スイッチグループの皆様、Educationチームの皆様、金井さんにも感謝を申し上げます。