关于数据可视化:应用可视化探索在线教育业务中的数据

6次阅读

共计 4777 个字符,预计需要花费 12 分钟才能阅读完成。

缘起

    疫情以来,越来越多的家长和学生开始被动或者被动的承受在线这种教学方式。在线教育行业迎来了一波流量增长,积攒的数据也越来越多。与此同时,越来越的创业者开始进入这个行业,行业内的竞争也越来越强烈。是否高效的利用这些数据,成为一个公司是否装上涡轮发动机顶风腾飞的关键因素。

一. 业务背景

在线教育的成交转化流程个别如下:用户报名 -> 上体验课 -> 付费购课。体验课个别蕴含 3 – 5 节,每天 1 节。每节课程有若干个模块,模块中会蕴含各种模式的互动问题。问题是封闭式的,都会有正确答案,用户的每次答题后果会保留下来。

二. 数据维度和数据结构

数据维度划分

  • 用户维度

    • 家长信息,包含性别、年龄、报名工夫、地区信息、报名渠道
    • 孩子信息,包含性别、年龄、用户报名之前是否购买过本公司的其余科目的课程
  • 用户课程维度

    • 是否学完某个课节、模块、问题
    • 某个问题是否答对
  • 时序维度

    • 每一道题的答题反应时间(听完 / 看完题目到最终作出答复的工夫)
    • 第一次答题是否正确,第二次、第三次答题是否正确(答错之后的能够重试)

三. 数据收集和整顿

设计矩形数据的字段

为了不便统计,采纳最常见的矩形数据来作为剖析的根底。具体来说,每个用户在某个体验课下会有一行记录,每一列就是一个特色数据。针对体验课可能有 N 天,N 并不相同的状况,在须要的字段上通过增加数字编号来解决。例如:d1s (day one state) 示意第 1 天的课程实现状况,当残缺上完时字段值为 2,未开始时值为 0,已开始未实现时是 1。顺次类推。数据表共计  40 列。

采集数据

通常数据采集有推流和拉流两种形式,各自的优缺点这里不再赘叙。感兴趣的同学能够画一个损益矩阵抉择本人实用的形式。这里咱们采纳了拉流的形式实现数据采集,每次在业务流量低峰时跑脚本。脚本会先拉取指标用户群,而后循环抽取每个用户的具体数据。在抽取具体数据时并没有大量应用数据库表 join,也没有过多的应用 where 条件,把计算和逻辑放到本地进行离线计算。得益于 Golang 弱小的 GMP 调度器,纯 CPU 计算并不会成为瓶颈。

数据荡涤

  1. 每次剖析时先将指标维度的空值字段所在行删除,例如剖析孩子年龄时将 0 岁、大于 15 岁的行删除。应用 Pandas 的 dropna 能够很不便的实现数据荡涤。
df.dropna(subset=[column_a, column_b])
  1. 删除 outlier。应用 Pandas 删除异常值,
clean_df = df.loc[df[column_a] > column_a_bound]

其中 column_a_bound 能够通过 4 分位数、方差、均值等得出。抉择适合的值即可;

可视化摸索

  1. 单维度数据的摸索

     通常性别是一个单维度的数据,适宜用饼图来示意:

对应的代码:

plt.figure(figsize=(5,5))
vc = df[‘gender'].value_counts()
y = [vc.values[0], vc.values[1]]
patches,l_text,p_text = plt.pie(y,labels=['女', '男'],
                                explode=(0.1,0),
                                colors=['pink','yellowgreen'],
                                labeldistance = 1.1,
                                autopct = '%3.1f%%',
                                shadow = True,
                                startangle = 90,
                                pctdistance = 0.6)
for t in l_text:
    t.set_size=(30)
for t in p_text:
    t.set_size=(20)
# 设置 x,y 轴刻度统一,这样饼图能力是圆的
plt.axis('equal')
plt.legend()
plt.show()

相似能够摸索一下不同性别在样本用户中的比例、在成交用户中的比例。体现多个比例数据适宜矩状图。

代码如下:

df_gender_deal = df.loc[df['deal'] == 1]
gender_rate = df['gender'].value_counts()
gender_deal_rate = df_gender_deal['gender'].value_counts()
gender_dist = pd.DataFrame({'all': gender_rate, 'deal': gender_deal_rate})
gender_dist['all_rate'] = gender_dist['all'].apply(lambda x: x / gender_dist.shape[0] * 100)
gender_dist['deal_rate'] = gender_dist['deal'].apply(lambda x: x / df_gender_deal.shape[0] * 100)
x = gender_dist.index
bar_width = 0.35
plt.figure(figsize=(10,5))
plt.bar(x, gender_dist['all_rate'], bar_width, align="center", color="c", label="样本占比", alpha=0.5)
plt.bar(x+bar_width, gender_dist['deal_rate'], bar_width, color="b", align="center", label="成交占比", alpha=0.5)
plt.xlabel("Gender")
plt.ylabel("Percentage")
plt.xticks(x+bar_width/2, x)
plt.legend()
plt.show()

从比照中能够提出假如,男性用户在成交中的比例回升了。回升的比例并不显著,所以咱们能够认为性别对成交没有显著的影响。

  1. 多维度联结摸索

繁多维度提供的信息无限,有些数据须要跟工夫维度一起察看变化趋势。例如:为了掂量第二天的课程有多少人可能保持到课,咱们须要比照第一天的到课用户数占比和第二天的到课用户占比。

其中完课比是到课用户中实现所有课程内容的用户占比,这个数字能够掂量有课程内容和教学环节是否存在问题。上图中能够得出结论:第一天课程的完课比偏低,须要排查起因。

折线图很适宜做这种趋势变动的体现,多条折线叠加到同一个图上可能更直观的体现数据。

def course_brief(df):
    active_rate = []
    finish_rate = []
    finish_at_active = []
    for i in range(4):
        vc = df['d{}'.format(i+1)].value_counts()
        n = sum(vc.values)
        active_rate.append((vc[1]+vc[2])/n * 100)
        finish_rate.append((vc[2])/n * 100)
        finish_at_active.append(vc[2]/(vc[1]+vc[2]) * 100)
    plt.figure(figsize=(10, 5))
    dayx = ['Day_1', 'Day_2', 'Day_3', 'Day_4']
    plt.plot(dayx, active_rate, color="r", label="到课率", linestyle='solid', alpha=0.5)
    plt.plot(dayx, finish_rate, color="b", label="完课率", alpha=0.5, linestyle='dotted')
    plt.plot(dayx, finish_at_active, color="g", label="完课比", alpha=0.5, linestyle='dashed')
    plt.legend()

course_brief(df)  
  1. ** 降维和特色结构
    **

还有一些信息必须用多维数据体现,可视化成果并不好,咱们须要结构特色进行降维。例如:咱们想验证封闭式问题的答对率的变化趋势是否和成交有关联,也就是说咱们想晓得课堂体现越来越好的人更违心成交还是越来越差的人更违心成交。

基于原始数据形象出“首次答对率”的特色,统计每节课的所有首次答题记录中答对的题目数,该数目在答复过的题目中的比例即视为“首次答对率”。计算出每节课的首次答对率,失去下列数据:

为了掂量这个数字的变化趋势,咱们能够结构两列新的数据,startFR 和 endFR。其中 startFR = (d1fr + d2fr + d3fr) / 3,endFR = (d3fr + d4fr + d5fr) / 3。通过 pandas 能够很容易计算出两列新特色:

df['startFR'] = (df['d1fr'] + df['d2fr'] + df['d3fr']) / 3
df['endFR'] = (df['d3fr'] + df['d4fr'] + df['d5fr']) / 3

胜利的将 5 维数据降到 2 维,然而还不够,还能够持续。

df['upRate'] = (df['startFR'] - df['endFR']) * 100 / df['startFR']

这里结构了一个新特色 upRate 来示意“首次答对率”的变化趋势,为正时示意“首次答对率”处于回升趋势,为负时示意降落。数值示意变动的斜率,数字越大示意变动越显著。联合其余数据列,能够画出下列图来摸索数据:

上图中灰色的 x 点示意未成交用户,蓝色圆点示意成交用户。X 轴为 upRate,Y 轴为第一节课的首次答对率。虚线为中位数所在的地位。散点图适宜摸索数据分布,察看数据的关联性。

df_deal = df.loc[df['deal']==1]
df_none = df.loc[df['deal']==0]
plt.scatter(df_deal['upRate'], df_deal['av1'], marker = 'o',color = 'blue', label = 'Deal')
plt.scatter(df_none['upRate'], df_none['av1'], marker = 'x',color = 'gray', label = 'Deal')
plt.axhline(y=df['av1'].median(),ls=":",c="black")# 增加程度直线
plt.axvline(x=df['upRate'].median(),ls=":",c="green")# 增加垂直直线
plt.show()

四. 总结和问题

  1. 数据可视化能够更直观的体现出数据趋势、开掘数据的价值;
  2. 精细化经营须要从业务的各种环境开始收集数据;例如下面的数据中不足无效的数据来体现客户的购买力。

五. 瞻望

能够从一下几个方向深刻的开掘和应用数据,让数据的价值施展进去。

产品端:
  1. 数据可视化是精细化经营的根底,通过可视化数据大盘能够及时发现产品设计、内容、经营策略上存在的问题
  2. 可视化数据的比照,能够为策略调整提供决策信息;
  3. 配合数据基线进行数据可视化,能够验证产品计划调整的成果;
销售端:
  1. 依靠数据进行机器学习建模,实现高潜客户的预测和辨认,进步销售人员的人效;
  2. 课程数据的开掘能够给销售提供钩子信息、促成用户跟销售的对话;
用户端:
  1. 能够依靠数据和算法进行成果外化
  2. 提供个性化的难度曲线、课程内容、学习门路
正文完
 0