文章目录
前言
该文章为连载的第三篇:学生成绩分析
某家在线教育机构拥有自己开发的教育产品VLE,该教育机构提供了他们四个学期里,开展的七门课的数据,接下来我会根据这些数据,为该教育机构做一系列的数据分析,包括用户的RFM模型、用户分群特征、用户成绩分析等等。
该教育机构部分数据库结构如下
如下这三篇文章为:用户成绩分析
做用户成绩分析,主要是把学生特征和学生使用产品习惯,与成绩结果做关联,所以会用到如下几个表:
- studentInfo 学生信息表 (总数据量三万多,记为stu)
- studentVle 学生产品交互行为表 (总数据量一千多万,记为vle)
- studentAssessment 学生成绩表 (总数据量十七余万,记为stu_ass)
- assessments 作业/考试表(总数据量两百多,记为ass)
注意assessment意为作业,但涵盖Exam的考试信息,因为在国外,作业和考试都有一个权重分值,都会占最终成绩的一部分,并不是考试占最终成绩的100%。
用户数据:学生编号,性别,学生居住区,最高学历,多重剥夺指数范围(衡量学生所在区的城市贫富等情况),年龄段,是否残疾,学生尝试该课程次数,当前课程的学分,最终成绩
行为数据:学习时长,点击次数
课程数据:课程编号,开课时间,使用产品的ip编码,作业/考试编号、日期等
一、导入库
import pandas as pd
import numpy as np
import datetime
import time
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['Arial Unicode MS']
matplotlib.rcParams['axes.unicode_minus']=False
import matplotlib.pyplot as plt
import seaborn as sns
import sklearn
from sklearn.preprocessing import LabelEncoder
np.set_printoptions(suppress=True)
pd.set_option('display.float_format', lambda x: '%.4f' % x)
二、数据处理
1、用户特征数据标签化
用df.isna().sum()的方法,查看三个表的空缺值情况
学生信息表里:
只有多重剥夺指数范围有1111条空值(总数据量32593,空缺占比3.4%)
学生成绩表里:
只有分数有173条空缺值,总数据量173912,空缺占比极低,会用该学期该门课的平均值填补。
考试或作业表:
只有考试日期有11条空缺值,是因为部分考试/作业无日期限制。
先看一下学生信息表大概长什么样子
把object类型的重要字段标签化
#性别
stu["gender"]=stu["gender"].map({
"M":1,"F":2})
#最高教育程度
highest_education_dict={
"No Formal quals":0,"Lower Than A Level":1,"A Level or Equivalent":2,"HE Qualification":3,"Post Graduate Qualification":4}
stu["highest_edu_label"]=stu['highest_education'].map(highest_education_dict)
#多重剥夺指数范围
#先去中间值,把范围转成数值
imd_band_dict={
'0-10%':5,
'10-20':15,
'20-30%':25,
'30-40%':35,
'40-50%':45,
'50-60%':55,
'60-70%':65,
'70-80%':75,
'80-90%':85,
'90-100%':95}
stu["imd_band_label"]=stu['imd_band'].map(imd_band_dict)
#平均数填补空值
stu["imd_band_label"].fillna(stu["imd_band_label"].mean(),inplace=True)
#年龄:
age_encoder = LabelEncoder()
age_encoder.fit(stu['age_band'].value_counts().sort_index(