【python】python学生学科成绩分析(源码+数据+报告)【独一无二】

请添加图片描述


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


系列文章目录



一、实验目标

考核旨在让学生使用学习的大数据分析技术,对学生学科成绩进行全面、深入的分析。通过对数据的分析和处理,希望了解学生的基本情况、学校、家庭背景、个人素质、学习情况等方面与成绩关系。

👇👇👇 关注公众号,回复 “学生学科成绩分析” 获取源码👇👇👇

包括学生的学校、性别、父母教育情况、学习时间、挂科情况、提升情况、身体素质等方面的数据。
以下是数据字段中的类型数据字段描述信息:
性别 “F” 女 or “M” 男
母亲教育情况 0: 无, 1: 小学, 2: 初中, 3:高中 ,4:大学
父亲教育情况 0: 无, 1: 小学, 2: 初中, 3:高中 ,5:大学
每周学习时间 1:低,2:中,3:高,4:很高
挂科次数 0:无,1:低,2:中,3:高,4:很高
课外教育提升情况 1:有,0:无
健康状况 1:很差,2:差,3:一般,4:好,5:很好

  1. 数据预处理
    在数据预处理阶段,对数据进行清洗和整理,包括删除重复数据、处理缺失值、转换数据类型等。可以观察数据进行征工程,提取了与问题相关的特征,并对特征进行了归一化和标准化处理。
  2. 数据分析方法
    在数据分析阶段,可以采用多种分析方法,包括描述性统计、可视化分析、机器学习和深度学习等。通过这些方法,对数据进行了深入的分析和处理,挖掘出其中隐藏的信息和知识。
  3. 数据可视化
    在数据可视化阶段,根据需要采用合适的图表展现数据蕴含的规律。

一、分析过程

  1. 数据加载和初步观察:
    通过使用pandas库的read_csv函数加载了名为"某学校学生成绩分析.csv"的数据文件,并将其存储在DataFrame对象df中。然后使用print(df.head())查看了数据的前几行,以了解数据的基本结构和内容。
    在这里插入图片描述

👇👇👇 关注公众号,回复 “学生学科成绩分析” 获取源码👇👇👇

  1. 数据清洗和处理:
    删除了重复的数据行,确保每个数据点是唯一的。
    处理了缺失值,将缺失值用字符串"unknown"填充。
    在这里插入图片描述

对某些列进行了数据类型转换,例如将"每周学习时间"列从文本数据转换为数值数据,并使用了映射字典对其他列进行了数值化处理。
使用MinMaxScaler对"缺课次数"和"挂科次数"列进行了归一化处理,将它们的值缩放到0到1之间。

  1. 数据可视化:
    绘制了男女比例的饼状图,用于展示学生性别的分布情况。
    在这里插入图片描述

👇👇👇 关注公众号,回复 “学生学科成绩分析” 获取源码👇👇👇

使用PCA进行降维,将"缺课次数"和"挂科次数"两个特征降维到二维空间,并使用K均值聚类算法对降维后的数据进行聚类。
绘制了PCA降维后的数据的散点图,并根据K均值聚类的结果对数据点进行了着色,以显示聚类效果。
在这里插入图片描述

👇👇👇 关注公众号,回复 “学生学科成绩分析” 获取源码👇👇👇

  1. 距离热力图:
    计算了K均值聚类的聚类中心和每个数据点到各个聚类中心的距离。
    创建了一个热力图,用于可视化数据点与聚类中心之间的距离,以进一步分析聚类效果。
    在这里插入图片描述

👇👇👇 关注公众号,回复 “学生学科成绩分析” 获取源码👇👇👇

二、代码实现

数据加载和初步观察:通过以下代码加载数据文件,并查看前几行数据:

   df = pd.read_csv('某学校学生成绩分析.csv')
   print(df.head())

这一部分的目的是加载数据集,使其可用于后续的分析。pd.read_csv函数用于读取CSV文件,并将数据存储在DataFrame对象df中。df.head()用于查看DataFrame的前几行,以便初步了解数据的结构和内容。

数据清洗和处理:
删除重复数据行,确保每个数据点是唯一的。这通过df.drop_duplicates()来实现。处理缺失值,将缺失值用字符串"unknown"填充。这通过df.fillna(“unknown”)来实现。对特定列进行数据类型转换,例如将"每周学习时间"列从文本数据转换为数值数据,以及使用映射字典对其他列进行数值化处理。使用MinMaxScaler对"缺课次数"和"挂科次数"列进行归一化处理,将它们的值缩放到0到1之间。

数据可视化:
在数据清洗和处理后,进行了以下数据可视化步骤:
绘制了男女比例的饼状图,以展示学生性别的分布情况。这通过以下代码实现:

 # 其余代码略.....
 gender_counts = df['性别'].value_counts()
 plt.figure(figsize=(6, 6))
 plt.pie(gender_counts, labels=gender_counts.index, autopct='%1.1f%%', startangle=140)
 plt.title('Gender Distribution')
 plt.show()

👇👇👇 关注公众号,回复 “学生学科成绩分析” 获取源码👇👇👇

使用PCA将"缺课次数"和"挂科次数"两个特征降维到二维空间,并使用K均值聚类对降维后的数据进行聚类。这是通过以下代码实现的:

 # 其余代码略.....
 pca = PCA(n_components=2)
 reduced_data = pca.fit_transform(df[['缺课次数', '挂科次数']])
 kmeans = KMeans(n_clusters=3, random_state=0)
 clusters = kmeans.fit_predict(reduced_data)

绘制了PCA降维后的数据的散点图,根据K均值聚类的结果对数据点进行了着色,以展示聚类效果。这通过以下代码实现:

 # 其余代码略.....
 plt.scatter(reduced_data[:, 0], reduced_data[:, 1], c=clusters, cmap='viridis')
 plt.xlabel('Principal Component 1')
 plt.ylabel('Principal Component 2')
 plt.title('PCA and K-Means Clustering')
 plt.show()
 

👇👇👇 关注公众号,回复 “学生学科成绩分析” 获取源码👇👇👇

距离热力图:
最后,计算了K均值聚类的聚类中心和每个数据点到各个聚类中心的距离,然后创建了距离热力图,用于可视化数据点与聚类中心之间的距离。这部分的实现如下:

   # 其余代码略.....
   cluster_centers = kmeans.cluster_centers_
   distances = np.array([np.linalg.norm(reduced_data - center, axis=1) for center in cluster_centers])
   distance_matrix = distances.T
   plt.figure(figsize=(10, 8))
   sns.heatmap(distance_matrix, cmap='viridis')
   plt.title('Heatmap of Distances to Cluster Centers')
   plt.xlabel('Cluster Centers')
   plt.ylabel('Data Points')
   plt.show()

以上是代码的主要实现过程,涵盖了数据加载、清洗、处理、可视化以及聚类分析等多个步骤,以便更好地理解和分析学生成绩数据。每个部分都有其具体的目标和实现方式,共同构建了一个完整的数据分析流程。

👇👇👇 关注公众号,回复 “学生学科成绩分析” 获取源码👇👇👇

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本文介绍的是利用Python语言,做成绩分析并生成成绩分析动态图表。Python语言可以利用Pandas、Pyecharts等各种类库,进行数据分析。 本文介绍的成绩分析大体分为三步: 一、拼合单科成绩,合成学年成绩,计算总分,按总分成绩排名次,然后由学年成绩筛选出各个班级的成绩,将学年成绩,各班级成绩存入一个Excel文件中,工作表分别命名为学年成绩,高三(1)班……等 二、利用生成的第一步生成的Excel文件,做成绩分析,保存成绩分析表格。 三、利用成绩分析表格,做成绩分析动态图。 下面是部分源代码: 1、成绩整理与合并 import glob import os import pandas as pd from functools import reduce inputPath="./原始成绩/" writer_lk = pd.ExcelWriter('./整理后的成绩/2020一模理科总成绩及各班级成绩.xlsx') writer_wk = pd.ExcelWriter('./整理后的成绩/2020一模文科总成绩及各班级成绩.xlsx') inputWorkbook=glob.glob(os.path.join(inputPath,"*.xls")) #====================读取全部学生的所有科目成绩=================================== yw_score = pd.read_excel(inputWorkbook[2]) sxlk_score = pd.read_excel(inputWorkbook[1]) sxwk_score = pd.read_excel(inputWorkbook[0]) yy_score = pd.read_excel(inputWorkbook[5]) yy_score['英语'] = (yy_score['英语'] * 1.25).round(0)#英语成绩不计算听力成绩*1.25 lkzh_score = pd.read_excel(inputWorkbook[4]) wkzh_score = pd.read_excel(inputWorkbook[3]) #======================================================================= #====================整理出理科成绩及分班成绩、计算总分、总分排名、班级排名============================= lk_class = ['高三(1)班','高三(2)班','高三(3)班','高三(4)班'] wk_class = ['高三(5)班','高三(6)班'] lk_yw = yw_score.loc[(yw_score.班级.isin(lk_class)), ['班级','姓名','语文']] lk_sx = sxlk_score[['姓名','数学']] lk_yy = yy_score.loc[(yy_score.班级.isin(lk_class)), ['姓名','英语']] lk_k3 = lkzh_score[['姓名','物理','化学','生物','理综']] lk_list = [lk_yw, lk_sx, lk_yy, lk_k3] score_lk = (reduce(lambda left, right: pd.merge(left, right, on='姓名'), lk_list)) score_lk['总分'] = (score_lk['语文'] + score_lk['数学'] + score_lk['英语'] + score_lk['理综']).round(0) def sort_grade(score): score_sort = score.sort_values(by=['总分'], ascending=False) score_sort['年级排名'] = score_sort['总分'].rank(ascending=0,method='min') return score_sort def sort_class_lk(score_garde,name): class_sort = score_garde.loc[score_garde.班级 == name, :] class_sort = class_sort.sort_values(by=['总分'], ascending=False) class_sort['班级排名'] = class_sort['总分'].rank(ascending=0,method='min') class_sort.to_excel(writer_lk, index=None, sheet_name=name) lk_grade_sort = sort_grade(score_lk) lk_grade_sort.to_excel(writer_lk, index=None, sheet_name='学年成绩') for lk in lk_class: class_sort = sort_class_lk(score_lk, lk) writer_lk.save() writer_lk.close() # #============整理出文科成绩及分班成绩、计算总分、总分排名、班级排名================== wk_yw = yw_score.loc[(yw_score.班级.isin(wk_class)), ['班级','姓名','语文']] wk_sx = sxwk_score[['姓名','数学']] wk_yy = yy_score.loc[(yy_score.班级.isin(wk_class)), ['姓名','英语']] wk_k3 = wkzh_score[['姓名','政治','历史','地理','文综']] wk_list = [wk_yw, wk_sx, wk_yy, wk_k3] score_wk = (reduce(lambda left, right: pd.merge(left, right, on='姓名'), wk_list)) score_wk['总分'] = (score_wk['语文'] + score_wk['数学'] + score_wk['英语'] + score_wk['文综']).round(0) def sort_class_wk(score_garde,name): class_sort = score_garde.loc[score_garde.班级 == name, :] class_sort = class_sort.sort_values(by=['总分'], ascending=False) class_sort['班级排名'] = class_sort['总分'].rank(ascending=0,method='min') class_sort.to_excel(writer_wk, index=None, sheet_name=name) wk_grade_sort = sort_grade(score_wk) wk_grade_sort.to_excel(writer_wk, index=None, sheet_name='学年成绩') for wk in wk_class: class_sort = sort_class_wk(wk_grade_sort, wk) writer_wk.save() writer_wk.close() 2、成绩区间分割与统计 #coding:utf-8 import numpy as np import pandas as pd from functools import reduce fpath_lk="./整理后的成绩/2020一模理科总成绩及各班级成绩.xlsx" fpath_wk="./整理后的成绩/2020一模文科总成绩及各班级成绩.xlsx" writer_lk = pd.ExcelWriter('./整理后的成绩/2020一模理科成绩区间分布统计.xlsx') writer_wk = pd.ExcelWriter('./整理后的成绩/2020一模文科成绩区间分布统计.xlsx') lk = pd.read_excel(fpath_lk, None) #获取表格中的所有工作表的内容 wk = pd.read_excel(fpath_wk, None) #===================1.定义区间分割函数===================================== def cut_750(score_750,len): bins_750= [0,370,380,390,400,410,420,430,440,450,460,470,480,490,500,510,520,530,540,550,560,570,580,590,600,620,640,660,750] labels_750 = ['0-370','370-379','380-389','390-399','400-409','410-419','420-429','430-439','440-449','450-459','460-469','470-479','480-489','490-499','500-509','510-519','520-529','530-539','540-549','550-559','560-569','570-579','580-589','590-599','600-619','620-639','640-659','660-750'] cut_750 = pd.cut(score_750, bins_750, labels=labels_750, right=False) qj = pd.DataFrame({'区间':pd.value_counts(cut_750).index,'人数':pd.value_counts(cut_750),'百分比':((pd.value_counts(cut_750))/len).round(3).apply(lambda x: format(x, '.2%'))}).sort_values(by='区间', ascending=False) qj = qj.reset_index(drop=True) return qj def cut_150(score_150,len): bins_150 = [0,30,60,90,120,150] labels_150 = ['0-30', '30-60', '60-90', '90-120', '120-150'] cut_150 = pd.cut(score_150, bins_150, labels=labels_150, right=False) qj = pd.DataFrame({'区间':pd.value_counts(cut_150).index,'人数':pd.value_counts(cut_150),'百分比':((pd.value_counts(cut_150))/len).round(3).apply(lambda x: format(x, '.2%'))}).sort_values(by='区间') 其他源代码及始数据已上传,欢迎各位借鉴,第一次编程,希望网友们能指点不足之处,联系qq:912182988

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米码收割机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值