[Python]学生成绩分析, 可视化以及建模--在线教育行业分析案例连载3

本文是在线教育行业分析案例的第三篇,主要介绍如何对学生数据进行处理,包括特征标签化、数据合并、异常值处理等,并进行学生成绩的相关性分析和多种模型(KNN、Logistic回归、决策树、随机森林)的建模,以探究影响最终成绩的因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

该文章为连载的第三篇:学生成绩分析

某家在线教育机构拥有自己开发的教育产品VLE,该教育机构提供了他们四个学期里,开展的七门课的数据,接下来我会根据这些数据,为该教育机构做一系列的数据分析,包括用户的RFM模型、用户分群特征、用户成绩分析等等。

该教育机构部分数据库结构如下

在这里插入图片描述


如下这三篇文章为:用户成绩分析

做用户成绩分析,主要是把学生特征和学生使用产品习惯,与成绩结果做关联,所以会用到如下几个表:

  1. studentInfo 学生信息表 (总数据量三万多,记为stu)
  2. studentVle 学生产品交互行为表 (总数据量一千多万,记为vle)
  3. studentAssessment 学生成绩表 (总数据量十七余万,记为stu_ass)
  4. 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(
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值