*本文数据从沪江网校爬取,共爬取课程条数1474条。(截至2018.10.12)

前言

本文以沪江网校为案例进行数据分析,旨在深入研究在线教育。希望通过本文和大家分享数据分析的一些方法,欢迎和我沟通交流。

用Xmind梳理数据分析流程

可以看到,数据分析主要分为四个步骤:明确目标、获取数据、数据处理以及数据展示。根据不同的场景,有些时候还可能会需要构建模型,或者有些人还会把数据处理分成观察数据和数据清洗。这里不多讨论。

概述

本文将从以上几个部分整理本次数据分析的过程。

涉及知识点:结构化思维、描述性分析、相关性分析、数据清洗、mysql、数据可视化等。

第一部分:明确目标

明确目标是为了解决问题,企业之所以重视数据分析也是因为它能解决增长、留存、提高效率等至关重要的问题。而数据分析要做到「如何将一个命题转化拆分为一个可用数据分析的问题」。

我们先从这几个问题入手:

问1:分析沪江网校的目的?要解决什么问题?

答:沪江网校的课程内容覆盖3-70岁全年龄段的学习人群,种类齐全,可以部分反映在线盈利教育的现状、需求和趋势。

与此同时,通过未来和其他在线学习平台的对比,可以掌握更全面的行业信息。

问2:能否用数据分析解决上述问题?

答:数据分析是最好的方法之一,对「沪江网校」课程进行拆解为以下几个部分:课程、师资、价格、目标客户等。

明确目标之后,还需要做的一件事情就是通过描述性分析相关性分析建立起对获取数据的初步思考:

Xmind

需要说明的是,由于沪江网校没有公开报名课程人数,因此我们无法通过用户、营收等数据来洞察其业务,略微可惜。

沪江招股书显示,2015、2016、2017年营收分别为1.85亿元、3.40亿元、5.55亿元;与高速增长的营收同样显著的是,净亏损的持续增加,三年分别为2.8亿元、4.22亿和5.37亿。

2015至2017年间,沪江网校付费课程学生人次分别为204,686人次、232,583人次和293,557人次。客单价也依次上涨至1966.1元,2836.4元和3170.1元。

第二部分:数据获取

经过第一部分的分析后,我们著手进行数据的爬取。在爬取数据前,需要对页面进行分析:

爬取数据的思路

一、观察网页

课程索引

从索引中我们发现两个问题:

  1. 二级课程分类划分不清晰,例如「中小幼教育>小学」和「中小幼教育>青少儿英语」,界限不明显,无法应用金字塔原理
  2. 不同类型课程有重复,例如「中小幼教育>Hitalk Kids」和「英语口语>Hitalk Kids」

解决思路:

本案例中将不会采用沪江网校提供的二级分类(后面将予以说明)

单个课程索引

二、爬虫层级结构

如图所示,红色部分是我们可以在第三部分数据清洗环节得到的数据。

由於单个课程页面没有提供更多信息,因此我们不进行深度采集。

三、爬虫代码

本次爬虫使用的是「后羿采集器」,无相应代码

四、爬取结果

第三部分:数据处理

一、数据清洗(Excel)

由于数据量较小,我们选择用Excel(Spreadsheet)进行数据清洗工作。

数据清洗逻辑

1、一致化处理

正如我们在第二部分「爬虫层级结构」中分析的,可以从原始数据中截取更多信息:

截取独一无二的「课程ID」栏位

截取「课时」栏位

增加「一对一」栏位,0值代表非一对一(大班课)

增加栏位「老师数量」

2、删除重复值

将课程ID排序,查看是否有重复的值

「英语口语」和「K12」分类模糊

「财会金融」和「职场兴趣」分类模糊

共发现40条重复数据,其中「英语口语」和「K12」分类模糊划分为「英语口语」(因为严格意义上不能算作K12),「财会金融」和「职场兴趣」分类模糊划分为「财会金融」。

3、缺失值处理

「老师」栏位缺失值

课程落地页显示「暂无师资介绍内容」,用"Not Available"填充

4、异常值处理

试学班学费

通过低价试学班吸引学生是常见操作,但是把它列为「一对一」课程有失偏颇,因此将这些课程的「一对一」栏位设置为0值。

5、选择子集

经过上述处理,我们选择以下栏位进行数据提取操作:

备份,将部分列删除

6、重命名列

为了方便书写MySQL语句,我们将列名重命名,并导出csv文件:

使用英文列名,方便写MySQL语句

二、数据提取(MySql)

处理好数据之后,下一步就是根据实际的数据需求提取数据。

将csv文件导入Navicat for MySQL:

1、课程分布

(1)不同课程类型的课程数量

SELECT type AS "课程类型", COUNT(*) AS "课程数量", CONCAT(ROUND(COUNT(*)*100/1433,2),"%") AS "占比"
FROM hj_cleaned
GROUP BY type
ORDER BY COUNT(*) DESC

(2)不同课程形式(「一对一」)的课程数量

SELECT type AS "课程类型", COUNT(*) AS "一对一课程数"
FROM hj_cleaned
WHERE 1v1 !=0
GROUP BY type
ORDER BY COUNT(*) DESC

2、师资分布

(1)老师数量最多的课程

SELECT type, title, price, hours, num_teacher
FROM hj_cleaned
ORDER BY num_teacher DESC, hours DESC
LIMIT 10

超过10位老师上课的课程

(2)不同课程类型平均上课老师数量

SELECT type, AVG(num_teacher) AS "平均授课老师数"
FROM hj_cleaned
GROUP BY type
Order BY AVG(num_teacher) DESC

不同科目需要不同老师,术业有专攻

3、价格分布

(1)不同课程类型平均学费

SELECT type AS "课程类型", ROUND(AVG(price),0) AS "平均学费"
FROM hj_cleaned
GROUP BY type
Order BY AVG(price) DESC

(2)不同课程课时费

SELECT type AS "课程类型", ROUND(AVG(price/hours),0) AS "平均课时费"
FROM hj_cleaned
GROUP BY type
Order BY AVG(price/hours) DESC

(3)不同课程形式(「一对一」)的平均学费

SELECT *
FROM (SELECT ROUND(AVG(price/hours),0) AS "大班课平均课时费" FROM hj_cleaned WHERE 1v1=0) AS tabel1,(SELECT ROUND(AVG(price/hours),0) AS "一对一平均课时费" FROM hj_cleaned WHERE 1v1!=0) AS tabel2

以上SQL语句基本上满足了大部分的提数需求。

第四部分:数据展示

考虑到我们需要展示的数据主要目的为比较和构成,因此我选择条形图、柱状体、饼图等基本图形来进行展示。

小结

本篇文章主要讨论了对沪江网校获取的数据进行清洗和提数的过程。在清洗数据时利用Excel简化流程,在提数过程中先使用Xmind确定提数需求,再使用SQL语句完成提数。


推荐阅读:
相关文章