文章中的素材StudentPerformance.csv下载链接
链接:https://pan.baidu.com/s/1gYIIqOyHLWfl21KaJsZvFA
提取码:7br2
实训的目的:学生数据可视化分析
1、导入模块
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']
plt.rcParams['font.serif'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
from matplotlib.font_manager import FontProperties
myfont=FontProperties(fname=r'C:\Windows\Fonts\SimHei.ttf',size=12)
2、获取数据
(1)导入数据---read_csv
df = pd.read_csv('data//StudentPerformance.csv')
print(df.head(20))
(2)修改表的列名--rename
df.rename(columns={'gender':'性别','NationalITy':'国藉','PlaceofBirth':'出生地','StageID':'学段','GradeID':'年级','SectionID':'班级','Topic':'科目','Semester':'学期','Relation':'监管人','raisedhands':'举手次数','VisITedResources':'浏览课件次数','AnnouncementsView':'浏览公告次数','Discussion':'讨论次数','ParentAnsweringSurvey':'父母问卷','ParentschoolSatisfaction':'家长满意度','StudentAbsenceDays':'缺勤次数','Class':'成绩'},inplace=True)
(3)显示学期和学段的取值---- unique(去重)
print('学段取值:',df['学段'].unique())
print('学期取值:',df['学期'].unique())
(4)修改数据---replace(替换)
df.replace({'lowerlevel':'小学','MiddleSchool':'中学','HighSchool':'大学'},inplace=True)
df.replace({'M':'男','F':'女'},inplace=True)
df.replace({'S':'春季','F':'秋季'},inplace=True)
print(df)
(5)查看空值数据情况
#各列的空值数量
print(df.isnull().sum())
print('性别空值的数量为:',df['性别'].isnull().sum())
3、可视化展示
(1)按成绩绘制计数柱状图
sns.countplot(x='成绩',order=['L','H','M'],data=df,linewidth=2,edgecolor=sns.color_palette('dark',4))
plt.show()
(2)按性别绘制计数柱状图
sns.set_style('whitegrid')
sns.countplot(x='性别',order=['男','女'],data=df)
plt.show()
输出结果:
(3)按科目绘制计数柱状图
sns.set_style('whitegrid')
#设置画布大小 16*8英寸
sns.set(rc={'figure.figsize':(16,8)},font=myfont.get_name())
sns.countplot(x='科目',data = df)
plt.show()
输出结果:
(4)按科目绘制不同成绩的计数柱状图
sns.set_style('whitegrid')
sns.set(rc={'figure.figsize':(20,10)},font=myfont.get_name())
sns.countplot(x='科目',hue='成绩',hue_order=['L','M','H'],data=df)
plt.show()
输出结果:
(5)按性别和成绩绘制计数柱状图
sns.countplot(x='性别',hue='成绩',order=['女','男'],hue_order=['L','M','H'],data=df)
plt.show()
输出结果:
(6)按班级查看成绩的分布比例
sns.countplot(x='班级',hue='成绩',hue_order=['L','M','H'],data=df)
plt.show()
输出结果:
(7)分析四个表现和成绩的相关性---barplot
#2行2列的子画布,尺寸14*10英寸,
fig,axes = plt.subplots(2,2,figsize=(14,10))
#axes代表两个轴的位置:第几行,第几列 (索引从0开始)
sns.barplot(x='成绩',y='浏览课件次数',data=df,order=['L','M','H'],ax=axes[0,0])
sns.barplot(x='成绩',y='浏览公告次数',data=df,order=['L','M','H'],ax=axes[0,1])
sns.barplot(x='成绩',y='举手次数',data=df,order=['L','M','H'],ax=axes[1,0])
sns.barplot(x='成绩',y='讨论次数',data=df,order=['L','M','H'],ax=axes[1,1])
plt.show()
输出结果:
(8)分析不同成绩学生的讨论情况
sns.set(rc={'figure.figsize':(8,6)},font=myfont.get_name())
sns.barplot(x='成绩',y='讨论次数',data=df,order=['L','M','H'])
plt.show()
输出结果:
(9)分析举手次数和参加讨论次数的相关性
sns.regplot(x='举手次数',y='讨论次数',order=4,data=df)
plt.show()
输出结果:
(10)分析浏览课件课件次数,举手次数,浏览公告次数,讨论次数之间的相关性
corr = df[['浏览课件次数','举手次数','浏览公告次数','讨论次数']].corr()
print(corr)
输出结果:
(11)将相关矩阵可视化
corr = df[['浏览课件次数','举手次数','浏览公告次数','讨论次数']].corr()
sns.heatmap(corr,xticklabels=corr.columns,yticklabels=corr.columns)
plt.show()
输出结果: