编程语言
首页 > 编程语言> > 数据分析作业(一)利用Python分析学生成绩

数据分析作业(一)利用Python分析学生成绩

作者:互联网

利用Python分析学生成绩

一、题目描述

个人构造一个30名学生的班级,每名学生有三门课程,学生的学号和各门成绩形如:

学号 高数 英语 Python
1001 85 90 96
1002 96 92 95
1003 78 87 83
为了输入数据方便,请保存在如student_score.csv文件中。
(1)请计算三门课程的总分,此班级每门课程的平均分和最高分及最低分,并绘制相应的图形来统计三门课程的成绩分布。
(2)各图形自拟。
(3)坐标轴标签,图例等属性设置完整。
(4)使用中文标题及标签。

二、解题步骤

运行环境

Anconda3.X Spyder(Python 3.7)

题目分析

步骤一:创建csv文件以保存实验所需数据。
本文使用使用Excel创建CSV文件。操作步骤如下:
1)新建一个Excel表,(使用WPS和Microsoft都是一样的)
2)打开Excel进行编辑。
3)生成.csv文件。
方式一:WPS表格-另存为-其它格式-选择文件类型-命名文件名,最后保存。
方式二:保存文档后直接修改“新建 Microsoft Excel 工作表.xlsx”为“使用Excel创建CSV文件.csv”。
4)点击保存后有相应警告提醒,则选“确定”或“是”即可

步骤二:读取csv文件
在Spyder中读取student_score.csv为DataFrame字符流,并且赋值给df,需要设置编码格式为GBK格式。本文将数据文件放置在同一目录下。作者在使用UFT-8编码会无法正确读出数据。

score = pd.read_csv('./student_score.csv',encoding = 'gbk')#这里使用的是相对路径
#获取文件绝对路径
#import os
#file_path = os.path.abspath('students_score.csv')
#print(file_path)

步骤二:导入所需要的库

import pandas as pd	#进行文件读取
import matplotlib.pyplot as plt #绘图

步骤三:提取所需数据
此步骤中涉及到DataFrame的一些操作。本文在提取相关数据时使用“访问属性的方式访问DataFrame单列数据。

score = pd.read_csv('./student_score.csv',encoding = 'gbk')
#最高分
Math_Max = score.高数.max()
English_Max = score.英语.max()
Python_Max = score.Python.max()
#最低分
Math_Min = score.高数.min()
English_Min = score.英语.min()
Python_Min = score.Python.min()
#成绩方差
Math_Var = score.高数.var()
English_Var = score.英语.var()
Python_Var = score.Python.var()
#成绩均值
Math_Avg = score.高数.mean()
English_Avg = score.英语.mean()
Python_Avg = score.Python.mean()
#学生总成绩
Total_Score = score.高数 + score.英语 + score.Python

步骤四:设置字体
由于默认的pyplot字体并不支持中文字符的显示,因此需要通过设置font.sans-serif参数来改变绘图时的字体,使得可以正常显示中文。同时,由于更改字体后会导致坐标轴中的字体无法显示,因此要同时更改axes.unicode_minus参数

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

步骤五:数据可视化
本文只所有学生总成绩的直方图,折线图,散点图和每门课程的箱线图,其他部分的图形数据较少只给出直方图。

plt.title('学生总成绩分布直方图')
plt.xlabel('学号')
plt.ylabel('总分')
plt.bar(score.学号,Total_Score)
plt.show()

plt.title('学生总成绩分布折线图')
plt.xlabel('学号')
plt.ylabel('总分')
plt.plot(score.学号,Total_Score)
plt.show()

plt.title('学生总成绩分布散点图')
plt.xlabel('学号')
plt.ylabel('总分')
plt.scatter(score.学号,Total_Score)
plt.show()

plt.title('每门课程箱线图')
plt.xlabel('课程名')
plt.ylabel('分数')
label = ['高数','英语','Python']
s = (score.高数,score.英语,score.Python)
plt.boxplot(s,labels = label)
plt.show()

plt.title('每门课程平均分直方图')
plt.xlabel('课程名')
plt.ylabel('平均分')
plt.bar('Python',Python_Avg)
plt.bar('高数',Math_Avg)
plt.bar('英语',English_Avg)
plt.show()

plt.title('每门课程最高分直方图')
plt.xlabel('课程名')
plt.ylabel('最高分')
plt.bar('Python',Python_Max)
plt.bar('高数',Math_Max)
plt.bar('英语',English_Max)
plt.show()

plt.title('每门课程最低分直方图')
plt.xlabel('课程名')
plt.ylabel('最低分')
plt.bar('Python',Python_Min)
plt.bar('高数',Math_Min)
plt.bar('英语',English_Min)
plt.show()

也可以通过创建子图的方式显示,此时需要创建画布。

p1=plt.figure()#创建画布
a1=p1.add_subplot(2,2,1)#绘制第一幅子图
plt.title('学生总成绩分布直方图')
plt.xlabel('学号')
plt.ylabel('总分')
plt.bar(score.学号,Total_Score)

a2=p1.add_subplot(2,2,2)#绘制第二幅子图
plt.title('学生总成绩分布折线图')
plt.xlabel('学号')
plt.ylabel('总分')
plt.plot(score.学号,Total_Score)

a3=p1.add_subplot(2,2,3)#绘制第三幅子图
plt.title('学生总成绩分布散点图')
plt.xlabel('学号')
plt.ylabel('总分')
plt.scatter(score.学号,Total_Score)

a4=p1.add_subplot(2,2,4)#绘制第四幅子图
plt.title('每门课程箱线图')
plt.xlabel('课程名')
plt.ylabel('分数')
label = ['高数','英语','Python']
s = (score.高数,score.英语,score.Python)
plt.boxplot(s,labels = label)
plt.show()

三、完整代码

import pandas as pd
import matplotlib.pyplot as plt

#读取文件
score = pd.read_csv('./student_score.csv',encoding = 'gbk')

#最高分
Math_Max = score.高数.max()
English_Max = score.英语.max()
Python_Max = score.Python.max()
#最低分
Math_Min = score.高数.min()
English_Min = score.英语.min()
Python_Min = score.Python.min()
#成绩方差
Math_Var = score.高数.var()
English_Var = score.英语.var()
Python_Var = score.Python.var()
#成绩均值
Math_Avg = score.高数.mean()
English_Avg = score.英语.mean()
Python_Avg = score.Python.mean()
#学生总成绩
Total_Score = score.高数 + score.英语 + score.Python

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

plt.title('学生总成绩分布直方图')
plt.xlabel('学号')
plt.ylabel('总分')
plt.bar(score.学号,Total_Score)
plt.show()


plt.title('学生总成绩分布折线图')
plt.xlabel('学号')
plt.ylabel('总分')
plt.plot(score.学号,Total_Score)
plt.show()

plt.title('学生总成绩分布散点图')
plt.xlabel('学号')
plt.ylabel('总分')
plt.scatter(score.学号,Total_Score)
plt.show()

plt.title('每门课程箱线图')
plt.xlabel('课程名')
plt.ylabel('分数')
label = ['高数','英语','Python']
s = (score.高数,score.英语,score.Python)
plt.boxplot(s,labels = label)
plt.show()

plt.title('每门课程平均分直方图')
plt.xlabel('课程名')
plt.ylabel('平均分')
plt.bar('Python',Python_Avg)
plt.bar('高数',Math_Avg)
plt.bar('英语',English_Avg)
plt.show()

plt.title('每门课程最高分直方图')
plt.xlabel('课程名')
plt.ylabel('最高分')
plt.bar('Python',Python_Max)
plt.bar('高数',Math_Max)
plt.bar('英语',English_Max)
plt.show()

plt.title('每门课程最低分直方图')
plt.xlabel('课程名')
plt.ylabel('最低分')
plt.bar('Python',Python_Min)
plt.bar('高数',Math_Min)
plt.bar('英语',English_Min)
plt.show()

四、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过创建子图的方式显示:
在这里插入图片描述

五、参考文献

黄红梅,张良均.Python数据分析与应用[M].北京:人民邮电出版社,2018(4):52-89
python 计算均值、方差、标准差 Numpy,Pandas

标签:数据分析,plt,bar,Python,作业,score,ylabel,高数
来源: https://blog.csdn.net/qq_43613819/article/details/115637728