教育平台的线上课程数据分析
一、项目背景
在线教育一般指基于互联网的线上学习行为,与传统的线下教育机构、培训班、学校相比,在线教育在时间和空间上有很多优势。
近年来,随着互联网与通信技术的高速发展,各种在线教育平台和学习应用纷纷涌现,各种网课、慕课、直播课等层出不穷。尤其是 2020 年春季学期,受新冠疫情影响,在教育部**“停课不停学”** 的要求下,网络平台成为“互联网+教育”成果的重要展示阵地。
因此, 如何根据教育平台的线上用户信息和学习信息,通过数据分析为教育平台和用户提供精准的课程推荐服务就成为线上教育的热点问题。本项目从数据集给出字段出发,围绕用户登录注册→开始试听课程,免费试学→试听后开始付费学习→结束课程学习→推荐其他课程的完整业务流程,深入到各个阶段,通过数据分析为产品部门、运营部门提供可落地的建议,赋能业务增长。
二、分析目标
- 用户登录注册阶段:
分析平台用户活跃情况,地域分布以及登录时间统计; - 免费试学阶段:
用户学习行为路径进行漏斗分析,计算各阶段转化率;
分析拉新效果,计算拉新购课转化率; - 付费上课学习阶段:
用户付费行为分析,计算月度ARPU和ARPPU;
分析用户学习时长,查看学习时长分布; - 课程结束阶段:
计算每门课程结课率,查看课程完成情况;
计算课程受欢迎程度,找到最受欢迎的课程TOP10; - 构建RFM模型,实现用户精细化运营;
- 分析用户流失情况,计算流失率;
- 课程推荐阶段:
协同过滤算法进行线上课程智能推荐
三、数据探索与预处理
3.1 字段解释
用户信息表
users_data = pd.read_csv('./users.csv',encoding='gbk')
users_data.head()
学习信息表
study_information_data = pd.read_csv('./study_information.csv',encoding='gbk')
study_information_data.head()
登录信息表
login_data = pd.read_csv('./login.csv',encoding='gbk')
login_data.head()
3.2 缺失值处理
- 用户信息表
# 查看数据的简要信息
users_data.info()
user_id字段和school字段均有缺失值,缺失用户占比少,故直接舍弃;school字段也有缺失值,但是该字段意义不大,故不做处理
users_data.isnull().sum() #查看缺失值个数
#统计缺失值占比
print(users_data['user_id'].isnull().sum()/users_data.shape[0])
#缺失用户占比少,故直接舍弃;school字段也有缺失值,但是该字段意义不大,故不做处理
users_data.dropna(subset=['user_id'],axis= 0 ,inplace = True)
users_data.shape #处理后数据大小
# (43916, 7)
- 学习信息表
study_information_data.info()
price价格字段有缺失值,但缺失数据比较少,直接用0值进行填充
# 用0值进行填充
study_information_data['price'].fillna(0,inplace= True)
- 登录信息表
login_data.info()
登录信息表无缺失值
3.3 重复值处理
#用户信息表
users_data.duplicated().sum()
#删去重复值
users_data.drop_duplicates('user_id',inplace= True)
# 学习详情表
study_information_data.duplicated().sum()
结果为0
#登录详情表
login_data.duplicated().sum()
结果为0
3.4 异常值处理
users_data数据中 recently_logged 字段存在异常值“–-”,该数据可能为缺失值,也可能是用户注册后不再进行登录,结合后续分析与study_information表格进行联结,对“–”进行分类处理。
对于在 study_information 中出现的选课信息的用户,采用其选课的最后时间来替换“–”;剩余的“–”异常值用注册时间来替换。
users_data[users_data['recently_logged']=='--'].info()
有5375个异常数据
#将course_join_time列进行日期转换
pd.to_datetime(study_information_data['course_join_time'])
#找到每个用户加入课程的最近时间
users_recently_select = study_information_data.groupby('user_id')['course_join_time'].max()
# 将加入课程最近时间与主表连接
users_study_information = pd.merge(users_data,users_recently_select,on='user_id',how='left')
# 新增course_join_time应与recently_join_time同类型
users_study_information['course_join_time'] = users_study_information['course_join_time'].astype(str)
#将'--'填充为最近加入课程的时间
users_study_information['recently_logged'] = users_study_information[['recently_logged','course_join_time']].apply(
lambda row:row['course_join_time'] if row['recently_logged']=='--' else row['recently_logged'],axis=1)
#检查是否填充成功
users_study_information[users_study_information['recently_logged']=='--'].count()
四、 用户登录阶段
4.1 用户地域分布分析
对用户的登录信息,尤其是地理位置信息的分析,能够帮助我们了解使用我们产品的用户集中分布在哪些省份、哪些城市,为运营部门指定推广计划,进行广告精准投放指明方向。
# 构建省份变量
province = ['新疆','西藏', '青海', '甘肃', '四川','云南','宁夏','内蒙古','黑龙江','吉林','辽宁','河北','北京','天津','陕西','山西','山东','河南','重庆','湖北','安徽','江苏','上海','贵州','广西', '湖南', '江西', '浙江', '福建','广东', '海南','台湾','澳门', '香港']
def get_provice(x):
'''
提取省份数据
param x:用户登录地址
'''
for i in province:
if i in x:
return i
#调用函数提取省份
login_data['province'] = login_data['login_place'].apply(get_provice)
login_data['province'].head()
#查看省份缺失数据占原始数据的比重
len1 = login_data['province'].isnull().sum()
len2 = login_data.shape[0]
print('省份缺失数据占原始数据的比重:',len1/len2)
# 构建城市变量
def get_city(x):
'''
提取城市数据
param x:用户登录地址
'''
# 两个特殊的三个字符的省份
if (x[2:5]=='黑龙江') or (x[2:5]=='内蒙古'):
return x[5:]
else:
return x[4:]
login_data['city'] = login_data['login_place'].apply(get_city)
login_data['city']
#将直辖市与行政区的省份名与城市名进行替换
ind = login_data['province'].str.contains('北京|上海|重庆|天津|澳门|香港')
login_data.loc[ind,'city'] = login_data.loc[ind,'province']
#查看城市空数