2020 年“泰迪杯”数据分析职业技能大赛A 题教育平台的线上课程智能推荐策略
完整代码请私聊 博主
一、 背景
近年来,随着互联网与通信技术的高速发展,学习资源的建设与共享呈现出新的发展趋势,各种网课、慕课、直播课等层出不穷,各种在线教育平台和学习应用纷纷涌现。尤其是 2020 年春季学期,受新冠疫情影响,在教育部“停课不停学”的要求下,网络平台成为“互联网+教育”成果的重要展示阵地。因此,如何根据教育平台的线上用户信息和学习信息,通过数据分析为教育平台和用户提供精准的课程推荐服务就成为线上教育的热点问题。
本赛题提供了某教育平台近两年的运营数据,希望参赛者根据这些数据,为平台制定综合的线上课程推荐策略,以便更好地服务线上用户。
二、 目标
- 分析平台用户的活跃情况,计算用户的流失率。
- 分析线上课程的受欢迎程度,构建课程智能推荐模型,为教育平台的线上
推荐服务提供策略。
三、 任务
附件是某教育平台 2018 年 9 月至 2020 年 6 月的线上课程运营数据,请根据附件数据,自行选择分析工具完成以下任务,并撰写报告(报告的要求详见: 四、竞赛成果提交说明)。如使用“TipDM 大数据挖掘建模平台”实现,使用方式详见附录二。
任务 1 数据预处理
任务 1.1
对照附录 1,理解各字段的含义,进行缺失值、重复值等方面的必要处理,将处理结果保存为“task1_1_X.csv”(如果包含多张数据表,X 可从 1 开始往后编号),并在报告中描述处理过程。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
data_login = pd.read_csv('../../login.csv', encoding='gbk')
data_login
data_study_information = pd.read_csv('../../study_information.csv', encoding='gbk')
data_study_information
data_users = pd.read_csv('../../users.csv', encoding='gbk')
data_users
# 任务1.1 login处理
data_users = data_users.drop('school', axis=1)
data_users = data_users.dropna()
data_users = data_users[data_users['user_id'].duplicated() == False]
data_users.to_csv('../../result/task1_1_X.csv', encoding='gbk', index=None)
# 任务1.1 study_information处理
data_study_information['price'] = data_study_information['price'].fillna(0)
data_study_information.to_csv('../../result/task1_1_X1.csv')
data_users
user_id register_time recently_logged number_of_classes_join number_of_classes_out learn_time
0 用户44251 2020/6/18 9:49 2020/6/18 9:49 0 0 41.25
1 用户44250 2020/6/18 9:47 2020/6/18 9:48 0 0 0
2 用户44249 2020/6/18 9:43 2020/6/18 9:43 0 0 16.22
3 用户44248 2020/6/18 9:09 2020/6/18 9:09 0 0 0
4 用户44247 2020/6/18 7:41 2020/6/18 8:15 0 0 1.8
... ... ... ... ... ... ...
43978 用户6 2018/9/11 16:13 2018/9/11 16:14 0 0 0
43979 用户5 2018/9/10 15:48 2020/6/15 17:13 9 5 2,116.15
43980 用户4 2018/9/10 14:15 2020/6/5 9:50 4 0 341.2
43981 用户3 2018/9/4 13:32 2020/6/18 9:18 2 1 370.35
43982 用户1 2018/9/3 10:00 2018/11/4 11:20 0 0 0
43908 rows × 6 columns
data_study_information
user_id course_id course_join_time learn_process price
0 用户3 课程106 2020-04-21 10:11:50 width: 0%; 0.0
1 用户3 课程136 2020-03-05 11:44:36 width: 1%; 0.0
2 用户3 课程205 2018-09-10 18:17:01 width: 63%; 0.0
3 用户4 课程26 2020-03-31 10:52:51 width: 0%; 319.0
4 用户4 课程34 2020-03-31 10:52:49 width: 0%; 299.0
... ... ... ... ... ...
194969 用户44245 课程76 2020-06-17 22:16:56 width: 0%; 0.0
194970 用户44246 课程76 2020-06-17 22:36:41 width: 4%; 0.0
194971 用户44247 课程19 2020-06-18 07:54:07 width: 100%; 499.0
194972 用户44247 课程32 2020-06-18 07:41:38 width: 0%; 499.0
194973 用户44247 课程76 2020-06-18 08:15:52 width: 4%; 0.0
194974 rows × 5 columns
任务 1.2
对用户信息表中 recently_logged 字段的“–”值进行必要的处理,将处理结果保存为“task1_2.csv”,并在报告中描述处理过程。
# 任务1.2
def def1_2(table, row, clounm):
dict1_2 = {}
def sel(x):
if x in data_null:
return True
else:
return False
data_null = data_users[data_users['recently_logged'] == '--']['user_id']
data_null = list(data_null)
table_select = table[table['user_id'].map(sel)]
for i in table_select.groupby('user_id'):
dict1_2[i[0]] = i[1].iloc[row][clounm]
for i in dict1_2:
data_users.loc[data_users['user_id'] == i, 'recently_logged'] = dict1_2[i]
# print(dict1_2)
def1_2(data_login, -1, 1)
def1_2(data_study_information, 0, 2)
data_users_ = data_users[data_users['recently_logged'] != '--']
data_users_.to_csv('../../result/task1_2.csv', encoding='gbk')
data_users_
user_id register_time recently_logged number_of_classes_join number_of_classes_out learn_time
0 用户44251 2020/6/18 9:49 2020/6/18 9:49 0 0 41.25
1 用户44250 2020/6/18 9:47 2020/6/18 9:48 0 0 0
2 用户44249 2020/6/18 9:43 2020/6/18 9:43 0 0 16.22
3 用户44248 2020/6/18 9:09 2020/6/18 9:09 0 0 0
4 用户44247 2020/6/18 7:41 2020/6/18 8:15 0 0 1.8
... ... ... ... ... ... ...
43978 用户6 2018/9/11 16:13 2018/9/11 16:14 0 0 0
43979 用户5 2018/9/10 15:48 2020/6/15 17:13 9 5 2,116.15
43980 用户4 2018/9/10 14:15 2020/6/5 9:50 4 0 341.2
43981 用户3 2018/9/4 13:32 2020/6/18 9:18 2 1 370.35
43982 用户1 2018/9/3 10:00 2018/11/4 11:20 0 0 0
43732 rows × 6 columns
任务 2 平台用户活跃度分析
任务 2.1
分别绘制各省份与各城市平台登录次数热力地图,并分析用户分布情况。
df2=df2.sort_values(by='数量',ascending=False)
df2=df2.head()
df2.to_csv('任务2.1主要省份表格.csv')
df4=df4.sort_values(by='数量',ascending=False)
df4=df4.iloc[:,1:3].head()
df4.to_csv('任务2.1主要城市表格.csv')
任务 2.2
分别绘制工作日与非工作日各时段的用户登录次数柱状图,并分析用户活跃的主要时间段。
非工作日的用户登录次数: [1538, 628, 323, 148, 96, 118, 297, 1131, 3854, 6422, 7555, 6592, 5506, 6100, 7198, 7663, 7162, 6250, 5470, 7245, 8138, 7448, 6019, 3781]
工作日的用户登录次数: [3520, 1315, 612, 350, 215, 242, 786, 3734, 13963, 20203, 23028, 17284, 13662, 17104, 21117, 21165, 19934, 15860, 14446, 17668, 17535, 16278, 12654, 7787]
任务 2.3
记𝑇𝑇𝑒𝑒𝑒𝑒𝑒𝑒为数据观察窗口截止时间(如:赛题数据的采集截止时间为2020 年 6 月 18 日),𝑇𝑇𝑖𝑖为用户 i 的最近访问时间,𝜎𝜎𝑖𝑖 = 𝑇𝑇𝑒𝑒𝑒𝑒𝑒𝑒 − 𝑇𝑇𝑖𝑖,若𝜎𝜎𝑖𝑖 > 90天,则称用户 i 为流失用户。根据该定义计算平台用户的流失率。
# 计算流失用户的数量与总用户数量的比例,得到流失率
churn_rate = churned_users['user_id'].nunique() / task['user_id'].nunique()
# 输出流失率
print(f"流失率: {churn_rate}")
流失率: 0.577746272752218
任务 2.4
根据任务 2.1 至任务 2.3,分析平台用户的活跃度,为该教育平台的线上管理决策提供建议。
建议 1: 在工作日的高峰时段增加课程发布和推广活动。
建议 2: 实施用户挽留策略,如发送优惠券或免费课程体验。
任务 3 线上课程推荐
任务 3.1
根据用户参与学习的记录,统计每门课程的参与人数,计算每门课程的受欢迎程度,列出最受欢迎的前 10 门课程,并绘制相应的柱状图。受欢迎程度定义如下:𝛾𝛾𝑖𝑖 = 𝑄𝑄𝑖𝑖 − 𝑄𝑄min/𝑄𝑄max− 𝑄𝑄min其中,𝛾𝛾𝑖𝑖为第 i 门课程的受欢迎程度,𝑄𝑄𝑖𝑖为参与第 i 门课程学习的人数,𝑄𝑄max和𝑄𝑄min分别为所有课程中参与人数最多和最少的课程所对应的人数。
任务 3.2
根据用户选择课程情况,构建用户和课程的关系表(二元矩阵),使用基于物品的协同过滤算法计算课程之间的相似度,并结合用户已选课程的记录,为总学习进度最高的 5 名用户推荐 3 门课程。
用户 推荐课程
0 用户18436 (课程40, 课程152, 课程236)
1 用户4 (课程29, 课程133, 课程60)
2 用户24 (课程48, 课程104, 课程236)
3 用户33203 (课程66, 课程20, 课程65)
4 用户29672 (课程80, 课程20, 课程137)
任务 3.3
在任务 3.1 和任务 3.2 的基础上,结合用户学习进度数据,分析付费课程和免费课程的差异,给出线上课程的综合推荐策略。
用户18436 推荐课程: ['课程167', '课程101', '课程70']
用户4 推荐课程: ['课程165', '课程166', '课程167']
用户24 推荐课程: ['课程106', '课程70', '课程167']
用户33203 推荐课程: ['课程78', '课程78', '课程70']
用户29672 推荐课程: ['课程167', '课程52', '课程117']
四、 竞赛成果提交说明
- 登录方式
请使用队员 1 的账号登录数睿思,进入第三届技能大赛页面。为保证成功提交,请使用谷歌浏览器无痕模式。 - 报告提交
报告以 PDF 格式提交,文件名为“report.pdf”。要求逻辑清晰、条理分明,内容包括每个任务的完成思路、操作步骤、必要的中间过程、任务的结果及分析。针对各子任务,报告中应包含但不限于如下要点:
(1) 任务 1.1 应包含每个表中缺失值和重复值的记录数以及有效数据的记录数。
(2) 任务 1.2 应包含 recently_logged 字段的“–”值的记录数以及数据处理的方法。
(3) 任务 2.1 应包含各省份与各城市的热力地图以及主要省份和主要城市的数据表格,并进行分析。
(4) 任务 2.2 应包含工作日与非工作日各时段的柱状图,并进行分析。
(5) 任务 2.3 应包含对流失率的定义,并给出流失率的结果。
(6) 任务 2.4 应根据计算结果给出合理的建议。
(7) 任务 3.1 应包含最受欢迎的前 10 门课程的参与人数、受欢迎程度及柱状图。
(8) 任务 3.2 应包含相应推荐算法的描述,并给出总学习进度最高的 5 个用户的课程推荐数据。
(9) 任务 3.3 应包含数据分析的方法、算法描述以及主要结果。 - 附件提交
3.1 如使用编程实现,将任务 1、2、3 的源程序分别保存到“program1”,“program2”,“program3”文件夹,然后存放到“program”文件夹中;如使用TipDM 大数据挖掘建模平台实现,将使用平台建立的工程截图保存到“program”文件夹中。
3.2 将任务 1、2、3 所产生的结果文件,分别保存到“result1”,“result2”,“result3”文件夹,然后存放到“result”文件夹中。
3.3 将 “program” 、 “result” 及 报 告 的 word 版本打包成 文 档“appendix.zip”作为附件提交。 - 提交界面
4.1 在依次上传完“竞赛承诺书”、“作品”、“附件”后,点击“提交”。
4.2 待页面弹出“上传成功”对话框,点击“确定”,在相应位置可以看到“已上传 XXX”字样,表示相关文件提交成功。
4.3 在比赛当天 20:00 竞赛成果截止提交之前,可多次上传相关文件,系统默认以最后上传的文件为准。
附录 1 数据说明
赛题附件包含三张数据表,分别为 users.csv ( 用 户 信 息 表 )、study_information.csv(学习详情表)和 login.csv(登录详情表),它们的数据说明分别如表 1、表 2 和表 3 所示。
附录二 TipDM 大数据挖掘建模平台使用说明
TipDM 大数据挖掘建模平台(以下简称平台)是由广东泰迪智能科技股份有限公司提供的一个数据挖掘建模工具(官网:http://python.tipdm.org/)。基于该平台,参赛者可在没有编程基础的情况下,通过拖拽的方式进行操作,将数据输入输出、数据预处理、挖掘建模等环节通过流程化的方式进行连接,以达到数据分析挖掘的目的。
竞赛专用平台访问网址(请使用谷歌浏览器无痕模式,该链接仅供竞赛期间使用,竞赛之后链接自动失效):eb.tipdm.org:10011
竞赛专用平台访问账号:jn+队伍号(如队号为 2020200001,则平台访问账号为 jn2020200001)
竞赛专用平台初始密码:Jn123456(为保证账户安全,请尽快修改密码。修改密码方式详见“修改平台登录密码.PDF”)
赛题数据已通过公共数据集的方式,分享给所有参赛者,如图 1 所示,参赛者可以直接在公共数据集中查看并复制数据集到我的数据集中,然后在工程中配置“输入源”使用,无需上传数据