class: center, middle, inverse, title-slide .title[ # 用 AARRR 與用戶分群促進教育平台產品發展 ] .author[ ### 陳柏銘 Alex Chen ] .date[ ### 2022-08 ] --- ## 目錄 > 完整內容,包含探索性數據分析和執行模型的細節。詳見 [Data Studio](https://datastudio.google.com/s/tqesWuS-GkY) - [資料來源與定義商業問題](#Problem_Definement) - [資料集說明](#Data_Prepation_Ch) - [資料清理](#Data_Cleaning) - [資料分析與視覺化](#Modeling) - [結論](#Conclusion) --- ### 資料集概述 - 資料來源:[均一教育平台用戶答題資料集(Junyi Academy Online Learning Activity Dataset on Kaggle)](https://www.kaggle.com/datasets/junyiacademy/learning-activity-public-dataset-by-junyi-academy?select=Info_Content.csv) - 願景:讓每一位孩子,不論出身,都有機會成為終身學習者 - 使命:透過科技與合作,提供所有孩子免費且優質的個人化學習內容與環境 .pull-left[ #### 科技-教育平台 - 產品開發 - 軟體工程 - 資料治理 ] .pull-right[ #### 合作-教育生態系 - 有效的關係 - 品牌認同 - 內容共創 ] --- name: Problem_Definement ### 定義商業問題 .left-column[ ![](./graphs/AARRR_Funnel.png) ] .right-column[ - Why(商業目標) - 如何 1 + 1 > 2,讓產品發揮影響力 - 非營利組織,營運仰賴大眾捐款 - How(執行方法) - **讓用戶的「說與行」對應的質化洞察與量化分析,成為產品發展的一對翅膀** - 用 AARRR 架構和用戶分群,思考不同用戶群在平台上,不同階段的斷點;以及探詢可做進一步驗證的行為誘因 ] ??? - 用 AARRR 架構拆解這個問題 --- ### 定義商業問題 .left-column[ ![](./graphs/AARRR_Funnel.png) ] .right-column[ - What(預期成果) - 尋求用戶分群模型的 best practice,驅動未來產品迭代發展,產品好用,同時搭配行銷與品牌經營,**期待長期可以聚焦小額募款轉換** - Performance-Tracking(成效指標) - 這題目前不容易對應到成效指標,會設想與行銷同仁協作,從小規模的專案開始,進一步確認關鍵指標 ] --- name: Data_Prepation_En ### 資料集說明(英文) > 資料集內含三個 Table:平台內容、用戶答題紀錄、用戶基本輪廓。 .pull-left[ .pull-left[ #### Info_Content - **ucid** - content_pretty_name - content_kind - difficulty - subject - learning_stage - level1_id - level2_id - level3_id - level4_id ] .pull-right[ #### Log_Problem - timestamp_TW - **uuid** - **ucid** - upid - problem_number - is_correct - total_sec_taken - total_attempt_cnt - is_hint_used - used_hint_cnt ] ] .pull-right[ .pull-left[ #### Info_UserData 1 ##### Basic_Info - **uuid** - gender - first_login_date_TW - user_grade - user_city ##### Gamification - points - badges_cnt ] .pull-right[ #### Info_UserData 2 ##### Instruction - has_teacher_cnt - belongs_to_class_cnt ##### Peer - has_student_cnt - has_class_cnt ##### Self-Learning & Peer - is_self_coach ] ] --- name: Data_Prepation_Ch ### 資料集說明(中文) > 用戶皆在 107 學年度(20180801~20190731 註冊均一);細分用戶基本輪廓 .pull-left[ .pull-left[ #### 平台內容 - **內容 id ** - 內容中文名稱 - 所屬類型 - 難度 - 科目 - 學齡層 - 題庫內第 1 階層 id - 題庫內第 2 階層 id - 題庫內第 3 階層 id - 題庫內第 4 階層 id ] .pull-right[ #### 用戶答題紀錄 - 時間戳(最接近 15 分鐘點) - **用戶 id ** - **內容 id ** - 題目 id - 答題該內容累積第幾題 - 是否答對 - 花費秒數 - 嘗試答題幾次 - 是否用提示 - 用了幾個提示 ] ] .pull-right[ .pull-left[ #### 用戶基本輪廓 1 ##### 基本資料 - **用戶 id ** - 性別 - 第一次登入日期 - 年級 - 所屬城市 ##### 學習遊戲化 - 能量點數 - 徽章數量 ] .pull-right[ #### 用戶基本輪廓 2 ##### 受引導學習特徵 - 有幾位老師 - 加入幾個班級 ##### 同儕共學特徵 - 有幾個學生 - 開幾個班級 ##### 自主學習特質&同儕共學特徵 - 是否為自己的老師? ] ] --- name: Data_Cleaning ### 資料清理 > 資料清理前 EDA 詳見 [DStudio](https://datastudio.google.com/u/0/reporting/09d5e65a-fbcc-4266-b8ea-e314b6d1dddb/page/oPJsC);可點擊小標題,瀏覽其 [BigQuery](https://replit.com/@pomingalexchen) .pull-left[ .pull-left[ #### [Info_Content](https://replit.com/@pomingalexchen/SideProjectJunyiKaggleBQExpression#Data_Cleaning_1/Get%20Info_Content_Ready.sql) - 拋棄「內容中文名稱」有重複者 - 拋棄高中、沒有定義難度的內容 - 另存為 `Info_Content_Ready`,剩餘 1265/1330 rows (95%) ] .pull-right[ #### [Log_Problem](https://replit.com/@pomingalexchen/SideProjectJunyiKaggleBQExpression#Data_Cleaning_1/Get%20Log_Problem_Ready.sql) - 「時間戳」切分 - `date_TW` - `time_TW` - Boolean 轉為 Integer 1/0 - 搭配其他兩個 Table,inner_join 為 `Log_Problem_Ready`,剩餘 93% rows ] ] .pull-right[ #### [Info_UserData](https://replit.com/@pomingalexchen/SideProjectJunyiKaggleBQExpression#Data_Cleaning_1/Get%20Info_UserData_Ready.sql) - 新建變數「用戶所屬學齡層」:國小中低、國小中高、國中 - 新建變數「縣市中文名稱」和「是否為六都」 - Boolean 轉為 Integer 1/0 - 新建變數「第一次登入,距離 20190801 還有多少日?」 (`first_login_date_TW_datediff_from_20190801`) - 配合 `Info_Cotent_Ready` 去掉高中生,剩餘 70596 / 72758 位用戶(97%) ] ??? [Info Content BQ 連結](https://console.cloud.google.com/bigquery?sq=762049208156:5145fa30708d42009022a916f8a6f3c2) [Log_Problem BQ 連結](https://console.cloud.google.com/bigquery?sq=762049208156:3a940659f23444b995b203ee3df7e34d)] [Info_UserData BQ 連結](https://console.cloud.google.com/bigquery?sq=762049208156:6df0d1bf173d4ac6b84e88945bb084cc) [DStudio 連結](https://datastudio.google.com/u/0/reporting/5cebed30-4aa1-4708-9f5e-617493f4f3c2/page/p_fpfrek80uc) --- name: LogProblem_Manipulation ### 新建答題相關變數 > 可點擊 Highlight,瀏覽其 [BigQuery](https://replit.com/@pomingalexchen) .pull-left[ #### 基本假設 - 從 [Log_Problem_Ready](https://replit.com/@pomingalexchen/SideProjectJunyiKaggleBQExpression#Data_Cleaning_1/Get%20Log_Problem_Ready.sql) 出發 - By 20190801 00:00:00 截止的橫斷面資料 - 用戶從第一次登入到截止日,使用平台的各式變數綜合累積成果,作為分群依據 - 有 1074 位完全沒有答題紀錄,將其拋棄。剩下 69522 / 72758 (95.5%) 用戶 ] .pull-right[ #### 新建變數 - [用戶有幾次答題 log?(log_cnt)](https://replit.com/@pomingalexchen/SideProjectJunyiKaggleBQExpression#Data_Wrangling_from_Log_Problem_Ready/Get%20user_log_cnt.sql) - [用戶總共答題了幾天?(log_dates_cnt)](https://replit.com/@pomingalexchen/SideProjectJunyiKaggleBQExpression#Data_Wrangling_from_Log_Problem_Ready/Get%20log_dates_cnt.sql) - [單日最多答了多少題?(maxlogdate_logcnt)](https://replit.com/@pomingalexchen/SideProjectJunyiKaggleBQExpression#Data_Wrangling_from_Log_Problem_Ready/Get%20maxlogdate_logcnt.sql) - [用戶最高連續答題幾日?(max_consecutive_days)](https://replit.com/@pomingalexchen/SideProjectJunyiKaggleBQExpression#Data_Wrangling_from_Log_Problem_Ready/Get%20max_consecutive_days.sql) ] ??? .footnote[[第一次登入日期,晚於第一次答題日期](https://console.cloud.google.com/bigquery?sq=762049208156:9767b61b0bde4abebce6362028cf8b4a)] .footnote[[Create log_cnt](https://console.cloud.google.com/bigquery?sq=762049208156:bf18fc17f25742c9837517ef6d4830ff)] .footnote[[Create logdates_cnt](https://console.cloud.google.com/bigquery?sq=762049208156:bab1250775a242ee85485846d2eb472e)] .footnote[[Create maxlogdate_logcnt](https://console.cloud.google.com/bigquery?sq=762049208156:2e31938cccea4646a9f77cf2c6528406)] .footnote[[Create max_consecutive_days](https://console.cloud.google.com/bigquery?sq=762049208156:949a2b7d6ef94ba98e655a0279c004b0)] .footnote[[DStudio 連結](https://datastudio.google.com/u/2/reporting/5cebed30-4aa1-4708-9f5e-617493f4f3c2/page/p_547jcp7mvc)] --- ### 資料清理小結
--- ### 整合 Info_UserData_withLog > 瀏覽其 [BigQuery](https://replit.com/@pomingalexchen/SideProjectJunyiKaggleBQExpression#Get%20Info_UserData_withLog.sql); 有 1388 位用戶,其[第一次答題日期,早於第一次登入日期](https://replit.com/@pomingalexchen/SideProjectJunyiKaggleBQExpression#Get%20user_firstlog_before_first_login_date_TW.sql)。應為訪客模式但官方說明不多,故排除。剩下 68134 / 72758 用戶 (93.6%)。 .pull-left[ .pull-left[ #### 基本資料 - 用戶 id - 第一次登入日期 - 第一次登入,距離 20190801 還有多少日? - 用戶年級 - 用戶所屬縣市中文名稱 ] .pull-right[ #### 類別變數 - 性別 - 用戶所屬學齡層 - 是否為六都的用戶 - 是否為自己的老師? ] ] .pull-right[ .pull-left[ #### 數值變數 1 ##### 受引導學習特徵 - 有幾位老師 - 加入幾個班級 ##### 同儕共學特徵 - 開幾個班級 - 有幾位學生 ] .pull-right[ #### 數值變數 2 ##### 學習遊戲化 - 能量點數 - 徽章數量 ##### 答題行為 - 有幾次答題紀錄? - 總共答題了幾天? - 單日最多答了多少題? ] ] ??? (有問再說)未放入最高連續答題幾日(`max_consecutive_days`)是考量學習著重長期,黏著度勝過於連續幾天。且敘述統計結果鑑別度不大。 `Info_UserData_withLog` https://console.cloud.google.com/bigquery?sq=762049208156:38aed845de3c4d569342fba8c6598778 --- ### 特徵工程 - 個別用戶「第一次登入,距離 20190801 還有多少日?」不同,個別可累積時間不同。 - **平均單日累積能量點數** = 能量點數 / 第一次登入,距離 20190801 還有多少日 - **平均單日累積徽章數量** = 徽章數量 / 第一次登入,距離 20190801 還有多少日 - **答題的黏著度(上站答題的比例)** - 總共答題了幾天 / 第一次登入,距離 20190801 還有多少日 - **答題的平均深度(每一次上站平均答多少題)** - 有幾次答題紀錄 / 總共答題了幾天 - **答題的最大深度(單日最高答題量,是平均的幾倍)** - 單日最多答了多少題 / 答題的平均深度 ??? 這邊仍然需要做特徵工程的理由主要是因為「個別用戶可累積的時間不同」,因此必須要除以其擁有的時間窗口長度。包含能量點數、徽章數量都是。 而答題的部分,也會轉換成黏著度,計算其上站答題的比例;平均深度則是計算每一次上站答題,平均會作答幾題;最大深度則是單日最高答題量,是平均的幾倍。 其次是因為有 1388 位用戶,他們第一次答題的時間,比第一次登入的時間還要早。應該是訪客模式。但是官方說明甚少。因此將其排除。 --- ### 去除離群值 & 變數說明 > 去除數值變數的平均數 + 6 個標準差以外的用戶。剩餘 66323 / 72758 位用戶 (91%)。 .pull-left[ .pull-left[ #### 基本資料 - 用戶 id - 第一次登入日期 - 用戶年級 - 用戶所屬縣市中文名稱 ] .pull-right[ #### 類別變數 - 性別 - 用戶所屬學齡層 - 是否為六都的用戶 - 是否為自己的老師? ] ] .pull-right[ .pull-left[ #### 數值變數 1 ##### 受引導學習特徵 - 有幾位老師 - 加入幾個班級 ##### 同儕共學特徵 - 開幾個班級 - 有幾位學生 ] .pull-right[ #### 數值變數 2 ##### 學習遊戲化 - 平均單日累積能量點數 - 平均單日累積徽章數量 ##### 答題行為 - 答題的黏著度 - 答題的平均深度 - 答題的最大深度 ] ] ??? 為什麼學習遊戲化的部分也要除呢?因為我們沒有看影片的資料。 先考慮不 show Info_UserData_withLog --- ### 資料清理總結
??? https://stackoverflow.com/questions/1806870/how-to-add-edge-labels-in-graphviz --- name: Modeling ### 變數間的相關性 - 「答題行為」與「學習遊戲化」等變數普遍存在相關性,需考量降維。 - 「受引導學習」和「同儕共學」等變數,與上述兩個面向相關程度不高。 - `性別_NA` 與其他變數皆為負相關。`是否為自己的老師` 僅與「同儕共學」有較大的關聯,與「答題行為」與「學習遊戲化」皆無關。
--- ### 非負主成份分析 nneg PCA - 主成份依序重點為:「用戶在受引導學習,與其答題平均深度之關聯」;「用戶在同儕共學和遊戲化累積能量點數,與其答題黏著度之關聯」 - 「用戶在受引導學習,與其答題黏著度之關聯」;「用戶在遊戲化收集徽章,與其答題平均深度之關聯」
??? 透過非負主成份分析,累積變異要超過 80%,因此取四個主成份。而這四個主成份的 **重點** (以下用網頁的熱力圖重點帶著看。) **重點** 這個詞,是大鼻那邊的。 --- ### Kmeans 分群 after PCA - 第 4~6 群是國小中低、國中、國小中高年級,且「性別 = 空值」的用戶群。其主成份表現明顯較低 - 第 2 群為國中,且「性別 != 空值」的用戶群。其主成份 4 與第 1、3 群用戶接近。可嘗試以遊戲化收集徽章吸引國中用戶;觀察第 1、3 群用戶的主成份 3 的平均表現 ,經營國小用戶的代理人(老師、家長等)相對是優先的 .pull-left[
] .pull-right[
] ??? 試著用游標,滑鼠移過去講講看。 觀察第 1 、 3 群用戶,先講 1 再講 3。 --- name: Conclusion ### 結論 .left-column[ ![](./graphs/AARRR_Funnel.png) ] .right-column[ - **性別為 NA** 反應著用戶 Acquisition 到 Activation,有許多可以思考的地方 - 可能是未有 User-onBoarding 規劃,使得其迷失在平台的諸多功能、課程影片等。未能理解平台價值,最終成為平台的過客? - 性別 NA 恰當地反應其為過客? - 嘗試設計註冊後登入,完成功能引導、基本資料填寫小任務可得特殊徽章的 A/B Testing - 多聚焦以遊戲化搜集徽章吸引國中用戶。促進其答題深度(Activation) - 多聚焦經營國小用戶的代理人(老師、家長)。促進其答題黏著度(Retention) - **是否為自己的老師** 僅與「同儕共學」甚至是「同儕社交」有關。較無反應其「答題學習」或「自主學習特質」。 ] ??? **是否為自己的老師** 不需要講到自己個人的經驗 - 針對個人基本資料標籤過於破碎,以及同儕共學多反應社交行為等現狀,可能可以透過機制設計,達到平台維運、用戶、學習累積的三贏局面。 - 基本規則:更新基本資料以及綁定(或使用)政策面提供的教育雲端帳號,經系統審核後才可以開班和收學生。 - 平台:用戶的學習軌跡、學習獎勵可以長期累積,不易有合併多元帳號或遺失問題,長期可以發展個人化。若有爭議也可以找到其用戶。 - 用戶:額外提供其特色徽章誘因。如星座徽章、所屬城市徽章。 --- ### 侷限 .left-column[ ![](./graphs/AARRR_Funnel.png) ] .right-column[ - 礙於沒有「看影片」的 Log 資料,無法更細緻地操作 AARRR 與分群模型。像是「學習遊戲化」的點數徽章並不是全都由答題而來,也包含看影片累積的。 - 要進入 AARRR 架構後段的 Revenue,需要建立針對老師、家長用戶的 AARRR 架構分析。像是觀察: - 獲客渠道(參加研習、社群媒體等) - 指派任務數量、頻率等 - 進而切入小額募款轉換 ] ??? 你若完成這題,要用什麼指標衡量,預計能帶來多少貢獻? --- class: center, middle # Thanks!