数据分析作业(一)利用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