教育平台的线上课程智能推荐策略
题目来自:http://www.tipdm.org
一、 背景
近年来,随着互联网与通信技术的高速发展,学习资源的建设与共享呈现出
新的发展趋势,各种网课、慕课、直播课等层出不穷,各种在线教育平台和学习
应用纷纷涌现。尤其是 2020 年春季学期,受新冠疫情影响,在教育部“停课不
停学”的要求下,网络平台成为“互联网+教育”成果的重要展示阵地。因此,
如何根据教育平台的线上用户信息和学习信息,通过数据分析为教育平台和用户
提供精准的课程推荐服务就成为线上教育的热点问题。
提供了某教育平台近两年的运营数据,希望根据这些数据,为平台制定综合的线上课程推荐策略,以便更好地服务线上用户。
二、 目标
1. 分析平台用户的活跃情况,计算用户的流失率。
2. 分析线上课程的受欢迎程度,构建课程智能推荐模型,为教育平台的线上推荐服务提供策略
任务 1 数据预处理
任务 1.1 对照附录 1,理解各字段的含义, 进行缺失值、重复值等方面的必要处理,将处理结果保存为“task1_1_X.csv”(如果包含多张数据表,X 可从 1 开始往后编号), 并在报告中描述处理过程。
- login数据没有空值,无重复项,不用额外处理。
- study_information 表格,无重复项,price字段有缺失值,占比很小,可直接舍弃,school字段有大量缺失值,为非重要字段,因此不做处理。
- users表格,无重复项,user_id有部分缺失,占比很小,可直接舍弃。
import pandas as pd
import numpy as np
#分别导入三个数据表
login_data=pd.read_csv('login.csv',encoding='gbk')
study_information_data=pd.read_csv('study_information.csv',encoding='gbk')
users_data=pd.read_csv('users.csv',encoding='gbk')
#查看数据信息和数据空值统计,可以看到三个字段都没有缺失值
print(login_data.isnull().sum())out:user_id 0
login_time 0
login_place 0
dtype: int64print(login_data.info())out:<class 'pandas.core.frame.DataFrame'>
RangeIndex: 387144 entries, 0 to 387143
Data columns (total 3 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 user_id 387144 non-null object1 login_time 387144 non-null object2 login_place 387144 non-null object
dtypes: object(3)
memory usage: 8.9+ MB#统计重复值的数量,结果为0
print(login_data.duplicated().sum())out:0-----------------------------------------------------------------------------------------print(study_information_data.isnull().sum())out:user_id 0
course_id 0
course_join_time 0
learn_process 0
price 4238
dtype: int64#查看数据信息,可以看到['user_id','course_id ','course_join_time','learn_process']字段都没有缺失值,price字段有数据缺失,数量为4238
print(study_information_data.info())out:<class 'pandas.core.frame.DataFrame'>
RangeIndex: 194974 entries, 0 to 194973
Data columns (total 5 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 user_id 194974 non-null object 1 course_id 194974 non-null object 2 course_join_time 194974 non-null object 3 learn_process 194974 non-null object 4 price 190736 non-null float64
dtypes: float64(1), object(4)
memory usage: 7.4+ MB#统计重复值数量,可得到为0
print(study_information.duplicated().sum())out:0#去掉price为空的数据
study_information_data=study_information_data.loc[~study_information_data['price'].isna()]-----------------------------------------------------------------------------------------print(users_data.isnull().sum())out:
user_id 67
register_time 0
recently_logged 0
number_of_classes_join 0
number_of_classes_out 0
learn_time 0
school 33412
dtype: int64#查看数据信息,可以看到['register_time','recently_logged','number_of_classes_join'
# ,'number_of_classes_out','learn_time ']字段都没有缺失值,['user_id','school']字段有缺失值
print(users_data.info())out:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 43983 entries, 0 to 43982
Data columns (total 7 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 user_id 43916 non-null object1 register_time 43983 non-null object2 recently_logged 43983 non-null object3 number_of_classes_join 43983 non-null int64 4 number_of_classes_out 43983 non-null int64 5 learn_time 43983 non-null object6 school 10571 non-null object
dtypes: int64(2), object(5)
memory usage: 2.3+ MB#统计user_id缺失值的占比
print(users_data.user_id.isnull().sum()/users_data.shape[0])out:0.0015233158265693563#由于user_id是表的主键,且占比很小,因此直接舍弃
users_data=users_data.loc[~users_data['user_id'].isna()]#统计重复值数量,可得到为0
print(user_data.duplicated().sum())out:0
任务 1.2 对用户信息表中 recently_logged 字段的“--”值进行必要的处理,
users 数据中 recently_logged 字段存在异常值“–”,该数据可能为缺失值,也可能是用户注册后不再进行登,结合后续分析与其余表格的可关联性,对“–”进行分类处理。对于在 study_information 中出现的选课信息的用户,采用其选课的最后时间来替换“–”。剩余的“–”异常值用注册时间来替换。
import pandas as pd
import numpy as np
#分别导入三个数据表
login_data=pd.read_csv('login.csv',encoding='gbk')
study_information_data=pd.read_csv('study_information.csv',encoding='gbk')
users_data=pd.read_csv('users.csv',encoding='gbk')#查看'recently_logged'字段中'--'的相关信息,可以看到有5376条记录
print(users_data[users_data['recently_logged']=='--'].info())out:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5376 entries, 11 to 43955
Data columns (total 7 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 user_id 5376 non-null object1 register_time 5376 non-null object2 recently_logged 5376 non-null object3 number_of_classes_join 5376 non-null int64 4 number_of_classes_out 5376 non-null int64 5 learn_time 5376 non-null object6 school 3252 non-null object
dtypes: int64(2), object(5)#如果用study_information的加入课程时间来填充'--',则需要连接表格
users_study_information=users_data.merge(study_information_data,how='inner',on='user_id')#需要找出每个user_id最近的登录时间,由于'course_join_time'是object类型,需要转换成datetime类型
study_information_data['course_join_time']=pd.to_datetime(study_information_data['course_join_time'])#找到每个用户加入课程的最近时间
user_recently_select=study_information_data.groupby('user_id')['course_join_time'].max()#将加入课程最近时间与主表连接
users_study_information=users_study_information.merge(user_recently_select,left_on='user_id',right_index=True,suffixes=('','_last'))users_study_information['course_join_time_last']=users_study_information['course_join_time_last'].astype(str)#将'--'填充为最近加入课程的时间
users_study_information['recently_logged']=users_study_information[['recently_logged','course_join_time_last']].apply(lambda row: row['course_join_time_last']
if row['recently_logged']=="--" else row['recently_logged'],axis=1)#检查所有的'--'全部被填充,不需要再用注册时间来填充.
# print(users_study_information[users_study_information['recently_logged']=='--'].count())out:user_id 0
register_time 0
recently_logged 0
number_of_classes_join 0
number_of_classes_out 0
learn_time 0
school 0
course_id 0
course_join_time 0
learn_process 0
price 0
course_join_time_last 0
dtype: int64#输出指定表格
names=['user_id','register_time','recently_logged','number_of_classes_join','number_of_classes_out','learn_time','school']
task1_2=users_study_information.loc[:,names]
print(task1_2.info())out:<class 'pandas.core.frame.DataFrame'>
Int64Index: 190796 entries, 0 to 190795
Data columns (total 7 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 user_id 190796 non-null object1 register_time 190796 non-null object2 recently_logged 190796 non-null object3 number_of_classes_join 190796 non-null int64 4 number_of_classes_out 190796 non-null int64 5 learn_time 190796 non-null object6 school 38013 non-null object
dtypes: int64(2), object(5)
memory usage: 11.6+ MBtask1_2.to_csv('task1_2.csv')
任务 2 平台用户活跃度分析
任务 2.1 分别绘制各省份与各城市平台登录次数热力地图,并分析用户分布情况。
由热力图可以看出广东为登录次数最多的省份
选出登录最多的四个省份分析各城市登录情况,可以看出登录分布在省份之间存在一定的集中性,例如广东主要集中在广州,湖北主要集中在武汉,贵州主要集中在贵阳,河南主要分布在周口和郑州。
分析和建议如下:
首先,对于用户数相对较为庞大的地区而言,该线上平台可以在此处加大宣传力度,进一步打开市场,增加顾客黏性。更为重要的是,对于这些重点地区增加调查,摸清该地区用户的特点和与其他地区的核心差异所在,为以后指定营销方案提供基础。其次,对于目前仍未重点开放的省市而言,不可盲目夸大范围, 投入资本。需要在保证重点地区人员稳定的情况下,再进行逐一攻破。与此同时,在调查中不难发现,线上教育平台用户的数量与相应地区的经济发展水平和互联网发展水平存在高度的相关关系,因此这些客观的因素也应该被纳入到相应的考虑范围中去
任务 2.2 分别绘制工作日与非工作日各时段的用户登录次数柱状图,并分析用户活跃的主要时间段。
2018年6月到2020年12月国家假期安排与调休表格,制作假期调休表格holiday
2018年节假日
中秋节:9月24日放假,与周末连休。
国庆节:10月1日至7日放假调休,共7天。9月29日(星期六)、9月30日(星期日)上班。
2019年节假日
一、元旦:2018年12月30日至2019年1月1日放假调休,共3天。2018年12月29日(星期六)上班。
二、春节:2月4日至10日放假调休,共7天。2月2日(星期六)、2月3日(星期日)上班。
三、清明节:4月5日放假,与周末连休。
四、劳动节:5月1日至4日放假调休,共4天。4月28日(星期日)、5月5日(星期日)上班。
五、端午节:6月7日放假,与周末连休。
六、中秋节:9月13日放假,与周末连休。
七、国庆节:10月1日至7日放假调休,共7天。9月29日(星期日)、10月12日(星期六)上班。
2020年节假日
一、元旦:2020年1月1日放假,共1天。
二、春节:1月24日至2月2日放假调休,共10天。 [2]
三、清明节:4月4日至6日放假调休,共3天。
四、劳动节:5月1日至5日放假调休,共5天。4月26日(星期日)、5月9日(星期六)上班。
五、端午节:6月25日至27日放假调休,共3天。6月28日(星期日)上班。
六、国庆节、中秋节:10月1日至8日放假调休,共8天。9月27日(星期日)、10月10日(星期六)上班。
import pandas as pd
import numpy as np
#导入登录数据
login_data=pd.read_csv('login.csv',encoding='gbk')
print(login_data.info())out:<class 'pandas.core.frame.DataFrame'>
RangeIndex: 387144 entries, 0 to 387143
Data columns (total 3 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 user_id 387144 non-null object1 login_time 387144 non-null object2 login_place 387144 non-null object#查看'login_place'字段可以看出有些登录只有国家,有些只有省份信息,没有城市信息
print(login_data.login_place)out:0 中国广东广州
1 中国广东广州
2 中国广东广州
3 中国广东广州
4 中国广东广州...
387139 中国湖北武汉
387140 中国湖北
387141 中国天津
387142 中国北京
387143 中国江西南昌#生成省份和城市信息
login_data['login_province']=login_data.login_place.apply(lambda x : x[2:4] if len(x)>2 else np.NaN)
login_data['login_city']=login_data.login_place.apply(lambda x : x[4:6] if len(x)==6 else np.NaN)
print(login_data.info())out:<class 'pandas.core.frame.DataFrame'>
RangeIndex: 387144 entries, 0 to 387143
Data columns (total 5 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 user_id 387144 non-null object1 login_time 387144 non-null object2 login_place 387144 non-null object3 login_province 379413 non-null object4 login_city 268935 non-null object#将'login_time'改成datetime类型
login_data['login_time']=pd.to_datetime(login_data['login_time'])
login_data['week']=login_data['login_time'].apply(lambda x :x.weekday())
day_list=[1,2,3,4,5]
#先划分周一到周五为工作日,周六周日为非工作日
login_data['work_or_not']=login_data['week'].apply(lambda x : '工作日' if x in day_list else '非工作日' )
print(login_data['work_or_not'])out:0 工作日
1 工作日
2 工作日
3 工作日
4 工作日...
387139 工作日
387140 工作日
387141 工作日
387142 工作日
387143 工作日
Name: work_or_not, Length: 387144, dtype: object#根据国家节假日信息生成节假日表
holiday=pd.read_excel('D:/Python数据分析与挖掘实战/赛题A:教育平台的线上课程智能推荐策略''/holiday.xls')
#查看前5条记录
print(holiday.head())out:日期 节假日 remark 星期
0 2019-09-24 中秋 非工作日 周五
1 2019-09-25 中秋 非工作日 周六
2 2019-09-26 中秋 非工作日 周日
3 2019-10-01 国庆 非工作日 周一
4 2019-10-02 国庆 非工作日 周二#要合并表,需要将'日期'类型转换成相同
login_data['login_time']=login_data['login_time'].astype(str)
holiday['日期']=holiday['日期'].astype(str)
#分别取到日期和时间
login_data['日期']=login_data['login_time'].apply(lambda x : x.split(' ')[0])
login_data['时间']=login_data['login_time'].apply(lambda x : x.split(' ')[1])login_data_work=login_data.merge(holiday,how='left',on='日期')
#将之前的工作日与非工作日根据节日信息更正
login_data_work['day']=login_data_work.apply(lambda row : row['work_or_not'] if pd.isnull(row['remark']) else row['remark'],axis=1)
#查看最终表信息
print(login_data_work.info())out:
0 user_id 392089 non-null object1 login_time 392089 non-null object2 login_place 392089 non-null object3 login_province 384338 non-null object4 login_city 272437 non-null object5 week 392089 non-null int64 6 work_or_not 392089 non-null object7 日期 392089 non-null object8 时间 392089 non-null object9 节假日 17082 non-null object10 remark 17082 non-null object11 星期 15166 non-null object12 day 392089 non-null object
dtypes: int64(1), object(12)
memory usage: 41.9+ MB
#保存数据
login_data_work.to_csv('login_data_work.csv',index=False)
由以上可以分析出:
1.工作日的登录次数明显大于非工作日。
2.用户登录时间主要集中在8点-22点之间。
3.从早上7点用户登录数开始增加。
4.用户登录数有三次回落,11点-13点,可能是由于午休造成,17点-19点可能是由于下班引起
22点-24点可能是由于睡眠引起。
5.非工作日的最高登录频次为9075,为4点-5点时间段,工作日的最低登录频次为21878,是非工作日的两倍多,为10点-11点时间段。
6.非工作日的最低登录频次为89,为10点-11点时间段,工作日的最高登录频次为225,是非工作日的两倍多,为4点-5点时间段。
分析和建议如下:
工作日和非工作日的登陆频次基本一致,均在上午 8:00-11:00,下午 14:00-17:00,晚上 20:00-21:00 出现三个高峰,波动趋势基本一致。并且工作日登陆最高峰值在上午 10:00-11:00 出现最高峰值,非工作日在夜间出现峰值,所以根据出现峰度的区间,在线教育平台可以在该时间段加强系统维护,保证课程流畅度,并在该时间段多植入相关课程广告以及相关课程销售活动,以此留住更多客户,提高课程的吸引力和销售额。
任务 2.3 记
教育平台的线上课程智能推荐策略相关推荐
- 教育平台的线上课程智能推荐策略-Python
1 背景 近年来,随着互联网与通信技术的高速发展,学习资源共享与建设呈现出新的发展趋势,多样化的线上教育平台如雨后春笋般争相涌入大众视野.尤其是自2020年初,受新冠肺炎疫情的冲击,学生返校进行线下 ...
- Python数据分析实践项目 教育平台的线上课程智能推荐
嗨喽! 大家好,我是"流水不争先,争的是滔滔不绝"的翀,欢迎大家来交流学习,一起入坑数据分析,希望我们一起好好学习,天天向上,目前在社会毒打中~~ 文章目录 摘要 关键词:数据分析 ...
- 教育平台的线上课程推荐策略——课程分级
文章列表 篇1:<在线教育平台的数据分析--用户精细化运营> 篇2:<在线教育平台的数据分析--课程分级> 篇3:<在线教育平台的数据分析--业务流程指标的计算> ...
- 教育平台线上课程数据分析
教育平台的线上课程数据分析 一.项目背景 在线教育一般指基于互联网的线上学习行为,与传统的线下教育机构.培训班.学校相比,在线教育在时间和空间上有很多优势. 近年来,随着互联网与通信技术的高速发展,各 ...
- 深度学习入门:10门免费线上课程推荐
Dive into Deep Learning,深度学习一直在音视频业内也是非常受到关注的热点,这里推荐10个免费的优质线上课程. 推荐大家开源项目Class Central,里面有31个在线课程(其 ...
- 教育平台线上课程用户行为分析
教育平台线上课程用户行为分析 一. 分析的背景和目的 因为新冠疫情的影响,越来越多的教育平台开启了线上课程.线上课程相较于传统的线下课程,不论时间还是地点都更加的灵活,人们开始更加倾向于选择线上学习. ...
- 线上课程直播平台做推广的方式有哪几种?
随着移动互联网时代的到来,在线教育平台如雨后春笋一般出现.根据相关数据的预测,2020年在线教育市场规模将会达到4330亿.然而线上课程直播平台的竞争是很激烈的,想要在这局面中脱颖而出,教育机构只能花 ...
- 7所大学提供区块链、加密货币及金融科技相关线上课程
点击上方"蓝色字"可关注我们! 暴走时评:在区块链和加密货币这个相对年轻的市场中,找到特定主题的准确信息可能非常耗时,甚至结果也不尽如人意.目前,部分大学提供了一些线上课程,并与e ...
- 浙江嘉兴计算机学校排名,嘉兴计算机考研线上课程实力排名
嘉兴计算机考研线上课程实力排名 冲刺分清主次现在各科的复习已经进入**后的收尾工作了,现在基本上就是扫除知识盲区,进行知识点的查缺补漏非法学法律硕士考研报考条件 而且,妥协次就会有第二次,所以一开始就 ...
最新文章
- jupyter 多个python版本
- Linux vim 梳理
- wxpython组件SplitterWindow 的简单使用
- 从实例入手学习Shiro与Web的整合
- 中标麒麟/NeoKylin 安装QT开发环境
- mysql 导入.sql文件_MySQL导入.sql文件及常用命令
- Jenkins 配置邮箱 530Authentication required ,535 uthentication failed 的解决方法
- 苹果:两个 M1 Max 拼一块儿,“史上最强 PC 芯片”M1 Ultra 就出来了!
- Centos使用Cacti监控你的网络
- 华为鲲鹏HCIA认证笔记总结三(附题库)
- 算法——排序——归并排序图解动画
- 贯穿时域与频域的方法——傅立叶分析(直观理解+Matlab实现)
- 因特尔显卡自定义分辨率_Win10创建自定义分辨率的方法教程
- 数据指标是什么?必知必会的数据指标类型都在这了
- 多伦多大学Self-Driving Cars自动驾驶专项课程(十八)Proportional-Integral-Derivative(PID) Control
- Java零基础学习记录09(飞机躲避炮弹游戏实现)
- CF卡插到时显示函数不正确请问咋才能修复?
- (python 3)1018 锤子剪刀布 (20分)
- 哈工大SCIR出品《自然语言处理》新书,无套路送5本!
- 初中信息技术说课稿_小学信息课说课稿范文(精选6篇)