和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】

文章目录

  • 和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】
    • 一、前言
    • 二、数据读取和初步探索
    • 三、数据预处理
      • 1、处理缺失值
      • 2、类别变量转换
    • 四、学业表现可视化
      • 1、绘制数学成绩分布图
      • 2、绘制相关性矩阵
    • 五、学生成绩影响因素分析
    • 六、学生成绩预测分析
    • 七、确定最重要的影响因素

一、前言

本周的挑战内容为:学生成绩影响因素分析

大家可以去我的工作台运行这个项目。

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第1张图片

下面是和鲸社区活动报名地址:https://www.heywhale.com/home/activity/detail/60ffe026e9eceb001727cfac/content/1

数据集来源本次活动提供:

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第2张图片

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第3张图片

二、数据读取和初步探索

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 加载数据集
data = pd.read_csv('D:\和鲸社区数据分析每周挑战\第九十二期:学生成绩影响因素分析\Students_Exam_Scores.csv', encoding='gbk')
data.head()  # 查看前几行数据

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第4张图片

data.info()  # 查看数据的基本信息
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 30641 entries, 0 to 30640
Data columns (total 15 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   序号        30641 non-null  int64  
 1   性别        30641 non-null  object 
 2   分组        28801 non-null  object 
 3   父母教育背景    28796 non-null  object 
 4   午餐类型      30641 non-null  object 
 5   完成备考课程    28811 non-null  object 
 6   父母婚恋状态    29451 non-null  object 
 7   参与运动的频率   30010 non-null  object 
 8   是否是第一个孩子  29737 non-null  object 
 9   兄弟姐妹数量    29069 non-null  float64
 10  上学交通工具    27507 non-null  object 
 11  每周自习时间    29686 non-null  object 
 12  数学成绩      30641 non-null  int64  
 13  阅读成绩      30641 non-null  int64  
 14  写作成绩      30641 non-null  int64  
dtypes: float64(1), int64(4), object(10)
memory usage: 3.5+ MB

三、数据预处理

1、处理缺失值

data.fillna({'分组': 'Unknown', '每周自习时间': 'Unknown'}, inplace=True)

2、类别变量转换

data = pd.get_dummies(data, columns=['性别', '分组', '父母教育背景', '午餐类型', '完成备考课程', '父母婚恋状态', '参与运动的频率', '是否是第一个孩子', '上学交通工具', '每周自习时间'])
data.head()

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第5张图片

四、学业表现可视化

1、绘制数学成绩分布图

#隐藏警告
import warnings
warnings.filterwarnings("ignore")               #忽略警告信息
plt.rcParams['font.sans-serif']  = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False      # 用来正常显示负号
plt.rcParams['figure.dpi']  = 100        #分辨率

data[['数学成绩', '阅读成绩', '写作成绩']].plot(kind='hist', bins=10, alpha=0.5)
plt.xlabel('成绩')
plt.ylabel('频数')
plt.title('学业表现分布')
plt.show()

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第6张图片

2、绘制相关性矩阵

correlation_matrix = data[['数学成绩', '阅读成绩', '写作成绩']].corr()
plt.imshow(correlation_matrix, cmap='coolwarm', interpolation='nearest')
plt.colorbar()
plt.xticks(range(len(correlation_matrix.columns)), correlation_matrix.columns, rotation=45)
plt.yticks(range(len(correlation_matrix.columns)), correlation_matrix.columns)
plt.title('相关矩阵')
plt.show()

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第7张图片

五、学生成绩影响因素分析

# 相关性分析
correlation = data[['数学成绩', '阅读成绩', '写作成绩']].corr()
correlation

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第8张图片

六、学生成绩预测分析

from sklearn.impute import SimpleImputer

features = data.drop(columns=['数学成绩', '阅读成绩', '写作成绩'])
target = data[['数学成绩', '阅读成绩', '写作成绩']]

# 处理缺失值
imputer = SimpleImputer(strategy='mean')
features = imputer.fit_transform(features)

# 数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=42)

# 构建线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
print('均方误差:', mse)

# 绘制预测值与真实值的散点图
plt.scatter(y_test['数学成绩'], y_pred[:, 0], alpha=0.5)
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.title('数学成绩预测')
plt.show()
均方误差: 162.8193907568781

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第9张图片

七、确定最重要的影响因素

# 获取特征重要性(系数)
# 获取特征列名
feature_names = data.columns[:-3]
feature_importance = pd.DataFrame({'特征': feature_names, '重要性': model.coef_[0]})
feature_importance.sort_values(by='重要性', ascending=False, inplace=True)
feature_importance

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第10张图片

# 绘制特征重要性条形图
plt.barh(feature_importance['特征'], feature_importance['重要性'])
plt.xlabel('重要性')
plt.ylabel('特征')
plt.title('特征-重要性')
plt.show()

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第11张图片

top_features = feature_importance.nlargest(3, '重要性')  # 获取最重要的3个特征
top_features

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】_第12张图片

你可能感兴趣的:(和鲸社区数据分析每周挑战,数据分析,python,数据挖掘)