本周的挑战内容为:学生成绩影响因素分析
大家可以去我的工作台运行这个项目。
下面是和鲸社区活动报名地址:https://www.heywhale.com/home/activity/detail/60ffe026e9eceb001727cfac/content/1
数据集来源本次活动提供:
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() # 查看前几行数据
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
data.fillna({'分组': 'Unknown', '每周自习时间': 'Unknown'}, inplace=True)
data = pd.get_dummies(data, columns=['性别', '分组', '父母教育背景', '午餐类型', '完成备考课程', '父母婚恋状态', '参与运动的频率', '是否是第一个孩子', '上学交通工具', '每周自习时间'])
data.head()
#隐藏警告
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()
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()
# 相关性分析
correlation = data[['数学成绩', '阅读成绩', '写作成绩']].corr()
correlation
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
# 获取特征重要性(系数)
# 获取特征列名
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
# 绘制特征重要性条形图
plt.barh(feature_importance['特征'], feature_importance['重要性'])
plt.xlabel('重要性')
plt.ylabel('特征')
plt.title('特征-重要性')
plt.show()
top_features = feature_importance.nlargest(3, '重要性') # 获取最重要的3个特征
top_features