Python数据分析项目
——学生成绩预测
一.数据源
阿里云天池公开数据集:学生成绩预测数据集
https://tianchi.aliyun.com/dataset/dataDetail?dataId=6785
特征(Features)介绍:
- Gender: 性别
- Nationality: 国籍
- PlaceofBirth:出生地
- StageID:学校级别(小学,中学,高中)
- GradeID:年级 (G01 - G12)
- SectionID: 班级
- Topic:学科科目
- Semester: 学期 (春学期,秋学期)
- Relation: 孩子家庭教育负责人(父亲,母亲)
- RaisedHands: 学生该学期上课举手的次数
- VisitedResources: 学生浏览在线课件的次数
- AnnoucementsView: 学生浏览学校公告的次数
- Discussion: 学生参与课堂讨论的次数
- ParentAnsweringSurvey: 家长是否填写了关于学校的问卷调查 (是,否)
- ParentSchoolSatisfaction: 家长对于学校的满意度 (好,不好)
- StudentAbsenceDays: 学生缺勤天数 (大于7天,低于7天)
结果(Response Variable)介绍:
- Class: 根据学生最后的学术评测分数,学生会被分为3个等级
- Low-Level: 分数区间在0-60
- Middle-Level:分数区间在70-89
- High-Level:分数区间在90-100
二.数据预览
import pandas as pd
df=pd.read_csv('datalab/6785/students_data.csv')
df.head()
读了前五行,看看数据情况
三.数据预处理
看看数据是否有缺失值
df.isnull().sum()
没有缺失值
四.描述性统计
df.describe(include='all')
看看类别变量包含的内容:
print('gender',df.gender.unique())
看看数据集结果是否平衡:
import seaborn as sns
sns.countplot(x='Class',data=df)
五.可视化
可视化的目的是为了探索数据规律,发现数据之间的关系,比如特征与目标变量之间的相关性。
可视化可以使用seaborn和matplotlib库进行,不过我不喜欢编程,所有比较喜欢用tableau,类别变量的可视化结果为tableau做的效果。
首先看看类别变量:
性别与得分:
国籍与得分:
班级与得分:
数值型变量:
相关性分析:
corr=df[['raisedhands','VisITedResources','AnnouncementsView','Discussion']].corr()
corr
Discussion与其他三个相关性较低,其他三个变量的相关性都比较高
以上结论从热力图也可以看出来:
sns.heatmap(corr, xticklabels=corr.columns,yticklabels=corr.columns)
六.模型建立
使用逻辑回归模型进行预测,并计算准确率
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
#建立特征和目标变量
x=df.drop('Class',axis=1)
x= pd.get_dummies(x)#对类别变量进行one-hot编码,即建立虚拟变量
y=df['Class']
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size = 0.2,random_state = 10)#建立训练集和测试集
#模型训练
logit=LogisticRegression()
logit.fit(x_train,y_train)
#预测
predict=logit.predict(x_test)
print('predict',predict)
#准确率评分
Score = accuracy_score(y_test, predict)
Score
七.模型优化
从可视化图表探索发现SectionID与Class关系不大,所以尝试剔除再进行建模:
x=df.drop(['Class','SectionID'],axis=1)
x= pd.get_dummies(x)
y=df['Class']
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size = 0.2,random_state = 10)
logit=LogisticRegression()
logit.fit(x_train,y_train)
predict=logit.predict(x_test)
print('predict',predict)
Score = accuracy_score(y_test, predict)
Score
可以看到准确率得到提升。