2. 在线教育课程推荐分析
背景介绍
最近几年在线教育特别火, 我们可以通过便捷的互联网知识付费就可以多渠道的获取丰富多彩的知识与理论。对于平台方来说,吸引培养优秀的老师,打造高质量的课程,是非常关键的,在线教育拼 的就是教学质量和口碑,只有有了口碑,在线教育平台才能有更好的收入。
这里涉及的业务知识与数据模型对象: 在线教育业务的用户有:“学员”,”教师” 。教师 讲授 “课程”,学员看课程 有 行为 “用户课程观看时长”。
那我们如何来分析哪些学员对于平台来讲是高质量的学员,这些学员高质量的学员是每天坚持学习 的,有很好的课程完成度,非常有学习欲望的学员。我们可以给他们来持续推荐优质的课程,那什么样 课程对他们来说会更有吸引力的,这涉及到推荐策略的选择,我们这里介绍其中一种推荐策略,推荐所 学课程老师的另外一门销量特别好的一门课程。
以上就是我们要做的一个分析和推荐的过程。当然这里的推荐策略可以有很多种的常识,我们可以 进行ABtest试验 (这个在后面统计学知识里会给大家介绍), 选择最好的推荐策略。使得推荐后学员购买成交率更高。
数据准备
学员课程订单表 (user_course_order) |
备注 |
---|---|
id | 主键 |
order_no | 订单号 |
user_id | 用户id |
course_id | 课程id |
activity_course_id | 活动课程id |
source_type | 订单来源类型: 1 用户下单购买 2 后台添加专栏 |
status |
当前状态: 0已创建 10已支付 20已完成 30已取消 40已过期 |
create_time | 创建时间 |
update_time | 更新时间 |
is_del | 是否删除 |
课程播放历史记录(course_play_history) | 备注 |
---|---|
id | id |
user_id | 用户id |
course_id | 课程id |
section_id | 部分id |
lesson_id | 课时id |
history_node | 历史播放节点(s) 5 |
history_highest_node | 最高历史播放节点 10:25 |
create_time | 记录创建时间 2020-3-20 10:15:15 |
update_time | 更新时间 2020-3-20 10:30:1 |
is_del | ‘是否删除’ |
课程信息表(course) | 备注 |
---|---|
id | id |
course_name | 课程名 |
brief | 课程一句话简介 |
price | 原价 |
price_tag | 原价标签 |
discounts | 优惠价 |
discounts_tag | 优惠标签 |
course_description_mark_down | 描述markdown |
course_description` longtext | 课程描述 |
course_img_url | 课程分享图片url |
is_new | 是否新品 |
is_new_des | 广告语 |
last_operator_id | 最后操作者 |
auto_online_time | 自动上架时间 |
create_time | 记录创建时间 |
update_time | 更新时间 |
is_del | 是否删除 |
total_duration | 总时长(分钟) |
course_list_img | 课程列表展示图片 |
status | 课程状态,0-草稿,1-上架 |
sort_num | 课程排序,用于后台保存草稿时用到 |
preview_first_field | 课程预览第一个字段 |
preview_second_field | 课程预览第二个字段 |
sales | 销量 |
课程部分表(course_section) | 备注 |
---|---|
id | id |
course_id | 课程id |
section_name | 章节名 |
description | 章节描述 |
create_time | 记录创建时间 |
update_time | 更新时间 |
is_de | 是否删除 |
order_num | 排序字段 |
status | 状态,0:隐藏;1:待更新;2:已发布 |
课程章节表(course_lesson) | 备注 |
---|---|
id | id |
course_id | 课程id |
section_id | 部分id |
theme | 课时主题 |
duration | 课时时长(分钟) |
is_free | 是否免费 |
create_time | 记录创建时间 |
update_time | 更新时间 |
is_del | 是否删除 |
order_num | 排序字段 |
status | 课时状态0-隐藏,1-未发布,2-已发布 |
需求查询
所购课程学完, (总课时 0.95) 小于等于 学习总时长(同一章节听课时长大于章节总时长的,按章节时长计算)
2. 课程在未来一周内能够完成 (总课时 0.95) 小于等于 (7+ 学习总时长)
3. 为每个学员推荐一个所学课程教师的一门课程
要求:以老师课程占比顺序, 老师课程销量 为顺序进行推荐
create table temp as select from (
select a.,(select sum(course_lesson.duration) from course_lesson where a.course_id = course_lesson.course_id) as total_duration from(
select uco.user_id,uco.course_id,if(day(max(play.create_time)- max(uco.create_time))<1 ,1, day(max(play.create_time)-max(uco.create_time))) as day_count,sum(day(play.update_time - play.create_time)) * 24 + sum(hour(play.update_time - play.create_time)) as play_count from user_course_order as uco
inner join course_play_history as play on uco.user_id = play.user_id and uco.course_id = play.course_id
group by uco.user_id,uco.course_id) as a where play_count/day_count >=1 ) as b
where total_duration/60 0.95 <= day_count or total_duration/60 0.95<=7+ day_count
create table teacher_id as
select last_operator_id from temp
inner join course on temp.course_id = course.id
create table teacher_course as
select distinct last_operator_id, course.id,count(distinct course.id) over(partition by last_operator_id) as course_count,count(distinct user_course_order.id) over(partition by last_operator_id, course.id) as quntanty from course
left join user_course_order on course.id = user_course_order.course_id order by course_count desc, quntanty desc;
where last_operator_id in (select last_operator_id from teacher_id)
select user_id, course_id as user_course_id,last_operator_id,id as teacher_course_id from temp,teacher_course
where last_operator_id in (select last_operator_id from teacher_id) and id not in(select a.course_id from temp as a where a.user_id =
temp.user_id )
and last_operator_id = (select last_operator_id from course as b where b.id = course_id)
同一章节听课时长大于章节总时长的,按章节时长计算 这个条件同学们可以尝试添加到语句中