2020 年“泰迪杯”数据分析职业技能大赛A 题教育平台的线上课程智能推荐策略

2020 年“泰迪杯”数据分析职业技能大赛A 题教育平台的线上课程智能推荐策略

完整代码请私聊 博主

一、 背景

近年来,随着互联网与通信技术的高速发展,学习资源的建设与共享呈现出新的发展趋势,各种网课、慕课、直播课等层出不穷,各种在线教育平台和学习应用纷纷涌现。尤其是 2020 年春季学期,受新冠疫情影响,在教育部“停课不停学”的要求下,网络平台成为“互联网+教育”成果的重要展示阵地。因此,如何根据教育平台的线上用户信息和学习信息,通过数据分析为教育平台和用户提供精准的课程推荐服务就成为线上教育的热点问题。
本赛题提供了某教育平台近两年的运营数据,希望参赛者根据这些数据,为平台制定综合的线上课程推荐策略,以便更好地服务线上用户。

二、 目标

  1. 分析平台用户的活跃情况,计算用户的流失率。
  2. 分析线上课程的受欢迎程度,构建课程智能推荐模型,为教育平台的线上
    推荐服务提供策略。

三、 任务

附件是某教育平台 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. 登录方式
    请使用队员 1 的账号登录数睿思,进入第三届技能大赛页面。为保证成功提交,请使用谷歌浏览器无痕模式。
  2. 报告提交
    报告以 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. 附件提交
    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. 提交界面
    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 所示,参赛者可以直接在公共数据集中查看并复制数据集到我的数据集中,然后在工程中配置“输入源”使用,无需上传数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/933671.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT 中基于 TCP 的网络通信

基础 基于 TCP 的套接字通信需要用到两个类: 1)QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。 2)QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。 这两个套接字通信类…

企业级日志分析系统ELK之ELK概述

ELK 概述 ELK 介绍 什么是 ELK 早期IT架构中的系统和应用的日志分散在不同的主机和文件,如果应用出现问题,开发和运维人员想排 查原因,就要先找到相应的主机上的日志文件再进行查找和分析,所以非常不方便,而且还涉及…

SpringBoot教程(十四) SpringBoot之集成Redis

SpringBoot教程(十四) | SpringBoot之集成Redis 一、Redis集成简介二、集成步骤 2.1 添加依赖2.2 添加配置2.3 项目中使用之简单使用 (举例讲解)2.4 项目中使用之工具类封装 (正式用这个)2.5 序列化 &…

【Transformer序列预测】Pytorch中构建Transformer对序列进行预测源代码

Python,Pytorch中构建Transformer进行序列预测源程序。包含所有的源代码和数据,程序能够一键运行。此程序是完整的Transformer,即使用了Encoder、Decoder和Embedding所有模块。源程序是用jupyterLab所写,建议分块运行。也整理了.p…

基于LLM智能问答系统【阿里云:天池比赛】

流程: 1、分别识别问题及提供的资料文件中的公司名实体,有公司名的走语义检索,无公司名的走结构化召回 2、结构化召回:Qwen根据问题生成sql,执行sql获取结果数值,把结果数值与问题给到Qwen生成最终结果 …

商品期权开户条件是什么?

商品期权开户条件是什么? 商品期权是一种金融衍生品,它赋予期权持有者在特定日期(欧式期权)或在特定日期之前(美式期权),以特定价格(行权价格)买入或卖出一定数量的某种…

大文件分块上传后端服务器

一、背景: 后台系统需要上传大文件、大视频等数据,耗时过长,接口等待超时,故需优化通过前端多线程分片方式进行文件上传,显著提升上传速度。 二、流程: 前端逻辑: 前端使用分片技术&#xff…

docker部署seata

1.准备数据库表 Seata支持多种存储模式,但考虑到持久化的需要,我们一般选择基于数据库存储。 先准备seata-tc.sql脚本,在你的数据库中运行,内容复制粘贴即可。 CREATE DATABASE IF NOT EXISTS seata; USE seata;CREATE TABLE I…

java+ssm+mysql美妆论坛

项目介绍: 使用javassmmysql开发的美妆论坛,系统包含超级管理员,系统管理员、用户角色,功能如下: 用户:主要是前台功能使用,包括注册、登录;查看论坛板块和板块下帖子;…

Openlayers基础知识回顾(五)

1、GeoJSON数据的加载 GeoJSON是一种基于JSON的地理空间数据交换格式,它定义了几种类型JSON对象以及它们组合在一起的方法,以表示有关地理要素、属性和它们的空间范围的数据 2、GeoJSON转化为ol要素 new ol.format.GeoJSON().readFeatures() 一、canv…

使用 ASP.NET Core HttpLoggingMiddleware 记录 http 请求/响应

我们发布了一个应用程序,该应用程序运行在一个相当隐蔽的 WAF 后面。他们向我们保证,他们的产品不会以任何方式干扰我们的应用程序。这是错误的。他们删除了我们几乎所有的“自定义”标头。为了“证明”这一点,我构建了一个中间件&#xff0c…

后端工程搭建

后端工程通过maven聚合工程的形式来搭建 1.1创建spzx-parent工程(父工程) 存放公共依赖 锁定公共依赖版本 1.2创建spzx-common工程(公共模块) 存放一些工具类/公共服务 1.3创建spzx-model工程(数据模型) 存放实体类 1.4创建spzx-menager工程(后台管理系统) 后台管理系统服务模…

Flink Python作业快速入门

Flink Python快速入门_实时计算 Flink版(Flink)-阿里云帮助中心 import argparse # 用于处理命令行参数和选项,使程序能够接收用户通过命令行传递的参数 import logging import sysfrom pyflink.common import WatermarkStrategy, Encoder, Types from pyflink.data…

数字图像处理(15):图像平移

(1)图像平移的基本原理:计算每个像素点的移动向量,并将这些像素按照指定的方向和距离进行移动。 (2)平移向量包括水平和垂直分量,可以表示为(dx,dy)&#xff…

JAVA秋招面试题精选-第一天总结

目录 分栏简介: 问题一:订单表每天新增500W条数据,分库分表应该怎么设计? 问题难度以及频率: 问题导向: 满分答案: 举一反三: 问题总结: 问题二:解释…

Rnnoise和SpeexDsp两种降噪方式有什么区别?

在蒙以CourseMaker 7.0软件中,增加了两种降噪模式,一种是Rnnoise,一种是SpeexDsp,这两种降噪模式有什么区别呢? Rnnoise 基于神经网络。当噪声与 rnnoise 的模型训练的噪声匹配时,它的效果非常好。比如说&…

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案,如需获取博物馆导览系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花! 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中,博物馆作为文化传承和知…

福昕PDF低代码平台

福昕PDF低代码平台简介 福昕PDF 低代码平台是一款创新的工具,旨在简化PDF处理和管理的流程。通过这个平台,用户可以通过简单的拖拽界面上的按钮,轻松完成对Cloud API的调用工作流,而无需编写复杂的代码。这使得即使没有编程经验的…

Linux —— 管理文件

一、Linux的目录结构及用途 /bin:存放最常用的命令,如ls、cat等,所有用户都可以执行的命令。/boot:包含启动Linux系统所需的核心文件,如内核文件和引导加载程序。/dev:设备文件目录,包含系统中的…

NanoLog起步笔记-7-log解压过程初探

nonolog起步笔记-6-log解压过程初探 再看解压过程建立调试工程修改makefile添加新的launch项 注:重新学习nanolog的README.mdPost-Execution Log Decompressor 下面我们尝试了解,解压的过程,是如何得到文件头部的meta信息的。 再看解压过程 …