数据集:https://www.kaggle.com/datasets/mirzayasirabdullah07/student-exam-scores-dataset/data
代码、数据集、结果图:链接
关键词:学生成绩预测;线性回归;数据可视化;特征重要性
一、引言
在教育领域,了解哪些因素对学生成绩产生影响以及如何进行成绩预测具有重要意义。本研究利用线性回归模型,结合数据可视化方法,对学生成绩进行预测分析。
二、数据加载与初探
2.1 数据加载
通过pandas库的read_csv函数加载名为student_exam_scores.csv的数据集,并使用info方法查看数据集的基本信息,包括数据类型、非空值数量以及内存使用情况。同时,使用head方法展示数据集的前5行,以便快速了解数据结构。
df = pd.read_csv('student_exam_scores.csv')
print("数据集基本信息:")
print(df.info())
print("\n数据集前5行:")
print(df.head())数据集基本信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 6 columns):
 #   Column              Non-Null Count  Dtype  
---  ------              --------------  -----  
 0   student_id          200 non-null    object 
 1   hours_studied       200 non-null    float64
 2   sleep_hours         200 non-null    float64
 3   attendance_percent  200 non-null    float64
 4   previous_scores     200 non-null    int64  
 5   exam_score          200 non-null    float64
dtypes: float64(4), int64(1), object(1)
memory usage: 9.5+ KB
None
数据集前5行:
  student_id  hours_studied  ...  previous_scores  exam_score
0       S001            8.0  ...               45        30.2
1       S002            1.3  ...               55        25.0
2       S003            4.0  ...               86        35.8
3       S004            3.5  ...               66        34.0
4       S005            9.1  ...               71        40.3
[5 rows x 6 columns]2.2 数据结构与信息分析
从输出结果可知,数据集包含6列,分别为学生ID(student_id)、学习时间(hours_studied)、睡眠时间(sleep_hours)、出勤率(attendance_percent)、往期成绩(previous_scores)和考试成绩(exam_score)。其中,student_id为对象类型,其余数值型特征为float64或int64类型,且无缺失值。
三、数据可视化
3.1 特征与目标变量关系可视化
使用seaborn库绘制散点图及回归线,展示学习时间、睡眠时间、出勤率和往期成绩这4个特征与考试成绩之间的关系。每个特征对应一个子图,在子图中通过散点图展示数据分布,同时添加回归线辅助观察变量间的线性关系。
plt.figure(figsize=(15, 10))
features = ['hours_studied','sleep_hours', 'attendance_percent', 'previous_scores']
for i, feature in enumerate(features, 1):
    plt.subplot(2, 2, i)
    sns.scatterplot(x=df[feature], y=df['exam_score'], alpha=0.7)
    sns.regplot(x=df[feature], y=df['exam_score'], scatter=False, color='red')
    plt.title(f'{feature} 与 exam_score 的关系')
    plt.xlabel(feature)
    plt.ylabel('考试成绩')
plt.tight_layout()
plt.show()
 hours_studied 与 exam_score 的关系
- 规律:学习时间(hours_studied)与考试成绩(exam_score)呈正相关关系。即学习时间越长,考试成绩越高。
- 范围:在学习时间从约1小时到12小时的范围内,这一正相关关系较为明显。
sleep_hours 与 exam_score 的关系
- 规律:睡眠时间(sleep_hours)与考试成绩(exam_score)也呈正相关关系。即睡眠时间越长,考试成绩越高。
- 范围:在睡眠时间从约4小时到9小时的范围内,这一正相关关系较为显著。
attendance_percent 与 exam_score 的关系
- 规律:出勤率(attendance_percent)与考试成绩(exam_score)呈正相关关系。即出勤率越高,考试成绩越高。
- 范围:在出勤率从约50%到100%的范围内,这一正相关关系较为稳定。
previous_scores 与 exam_score 的关系
- 规律:以往成绩(previous_scores)与当前考试成绩(exam_score)呈正相关关系。即以往成绩越高,当前考试成绩也越高。
- 范围:在以往成绩从约40分到100分的范围内,这一正相关关系较为明显。
3.2 相关性热力图绘制
计算特征与考试成绩之间的相关性矩阵,并通过seaborn库的heatmap函数绘制相关性热力图。热力图中使用不同颜色表示相关程度,同时标注具体相关系数,有助于直观判断特征间的相关性以及是否存在多重共线性问题。
plt.figure(figsize=(10, 8))
correlation = df[features + ['exam_score']].corr()
sns.heatmap(correlation, annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5)
plt.title('特征间相关性热力图')
plt.show()
四、回归模型构建
4.1 特征与目标变量准备
选取hours_studied、sleep_hours、attendance_percent和previous_scores作为特征变量X,考试成绩exam_score作为目标变量y。
X = df[features]
y = df['exam_score']4.2 数据集划分
使用train_test_split函数将数据集按80%训练集和20%测试集的比例进行划分,设置随机种子random_state = 42以确保结果的可重复性。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)4.3 模型训练
创建线性回归模型对象model,并使用训练集数据进行模型训练。
model = LinearRegression()
model.fit(X_train, y_train)五、模型评估
5.1 评估指标计算
利用测试集数据进行预测,并计算均方误差(MSE)、均方根误差(RMSE)和R²分数,以评估模型的预测性能。
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
print("\n模型评估指标:")
print(f"均方误差(MSE):{mse:.2f}")
print(f"均方根误差(RMSE):{rmse:.2f}")
print(f"R² 分数:{r2:.2f}")模型评估指标:
- 均方误差(MSE):7.76
- 均方根误差(RMSE):2.79 R²
- 分数:0.85
5.2 预测值与真实值对比可视化
绘制预测值与真实值的对比散点图,并添加一条理想线(预测值 = 真实值),直观展示模型的预测效果。
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.7)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--')
plt.xlabel('真实考试成绩')
plt.ylabel('预测考试成绩')
plt.title('预测值与真实值对比')
plt.grid(alpha=0.3)
plt.show()
5.3 残差分布可视化
计算残差(真实值 - 预测值),并绘制残差分布图,同时添加一条垂直于x轴的红线(x = 0)。理想情况下,残差应符合均值为0的正态分布,通过残差分布图可检验模型的合理性。
residuals = y_test - y_pred
plt.figure(figsize=(10, 6))
sns.histplot(residuals, kde=True)
plt.axvline(x=0, color='r', linestyle='--')
plt.xlabel('残差')
plt.title('残差分布(理想应为均值0的正态分布)')
plt.grid(alpha=0.3)
plt.show()
 残差主要集中在 0 右侧(残差为正的区间柱子更高),说明模型整体低估了真实值(因为残差 = 真实值 - 预测值,正残差多意味着 “真实值> 预测值” 的情况更普遍)。
六、特征重要性分析
6.1 特征重要性量化
获取模型的系数,并构建一个包含特征名称、系数以及系数绝对值(表示影响程度)的数据框coefficients,然后按影响程度绝对值进行降序排序。
coefficients = pd.DataFrame({
    '特征': features,
    '系数': model.coef_,
    '影响程度(绝对值)': abs(model.coef_)
})
coefficients = coefficients.sort_values(by='影响程度(绝对值)', ascending=False)
print("\n特征重要性(按影响程度排序):")
print(coefficients)特征重要性(按影响程度排序):
 特征 系数 影响程度(绝对值)
 0 hours_studied 1.549341 1.549341
 1 sleep_hours 0.884156 0.884156
 3 previous_scores 0.183034 0.183034
 2 attendance_percent 0.108949 0.108949
6.2 特征系数可视化
使用seaborn库的barplot函数绘制条形图,展示各特征对考试成绩的影响(系数),并添加一条垂直于x轴的黑线(x = 0)辅助观察系数正负。
plt.figure(figsize=(10, 6))
sns.barplot(x='系数', y='特征', data=coefficients, palette='coolwarm')
plt.axvline(x=0, color='black', linestyle='--')
plt.title('各特征对考试成绩的影响(系数)')
plt.grid(alpha=0.3, axis='x')
plt.show()
七、关键结果解读
7.1 模型效果评估
R²分数约为0.85,表明模型能够解释85%的成绩变异,说明模型具有较好的预测效果。
7.2 特征影响分析
- 学习时间(hours_studied):系数为1.549341,意味着每增加1小时的学习时间(在1~12小时之内),学生的考试成绩平均提高约1.55分,对成绩影响最大。
- 睡眠时间(sleep_hours):系数为0.884156,每增加1小时睡眠时间(在4~9小时之间),成绩平均提高约0.88分,对成绩也有较为显著的影响。
- 往期成绩(previous_scores):系数为0.183034(以往成绩在40~100分之间),对当前成绩有正向影响,但权重相对较低。
- 出勤率(attendance_percent):系数为0.108949(出勤率在50%~100%之间),在这几个特征中对成绩的影响相对最小。
实验结果仅是通过此数据集链接实现,可能与现实有较大差距。
                
 
 
                     
            
        













 
                    

 
                 
                    