精华内容
下载资源
问答
  • 用VB+SQL开发的成绩分析系统,主要针对信息技术基础课程,可实现学生、课程、成绩信息的录入、修改、删除以及学生成绩的横向纵向对比、按班级、专业、院系统计每次考试最高分、最低分、平均分,以及具体班级单位的...
  • 群体对比分析提供柱形图展示,个体跟踪对比提供折线图展示,其他数据或报表提供了功能更为强大的中文图表展示,一组数据可以用多至36图形演示,能满足任何用户的需求。 3.提供更为自由的自定义项目包括:考试名称、...
  • 2.群体对比分析提供柱形图展示,个体跟踪对比提供折线图展示,其他数据或报表提供了功能更为强大的中文图表展示,一组数据可以用多至36图形演示,能满足任何用户的需求。 3.提供的自定义项目包括:考试名称、班级...
  • 是一款学生成绩分析系统,供各中,小学及院校的老师使用,借助此软件老师可轻松管理和分析学生的成绩。不仅大大提高了老师的工作效率,而且同时还能通过报表对比,查询和图表解析快速的对一个学生或一个班级的成绩...
  • 针对一个级部各学科各班级的成绩对比,以及各班各科年级优生数、各班各科年级差生数。由excle导入数据。可以简便置零作弊学生的成绩。只有exe,需要源码联系qq2254346758
  •    对成绩进行分段统计,可以非常直观地看到各班各分数段的人数,有利于老师们快速了解本次考试结果,对考试情况作全方位的对比分析。 2.1 利用数据透视数据表统计分数段 实例2-1 1、操作步骤    ...

    第2章 统计分数段人数

    • 2.1 利用数据透视数据表统计分数段
      • 实例2-1
        • 1、操作步骤
    • 2.2利用countifs函数统计各分数段人数
      * 实例2-2
    • 2.3用其它函数统计分数段人数

       对成绩进行分段统计,可以非常直观地看到各班各分数段的人数,有利于老师们快速了解本次考试结果,对考试情况作全方位的对比分析。

    2.1 利用数据透视数据表统计分数段

    实例2-1
    1、操作步骤

       单击学生成绩中的任意一个单元格,选择【插入】-【数据透视表】,弹出【创建数据透视表】面板,添加要分析的数据范围,选择放置数据透视表的位置为“新工作表”,单击【确定】,进入数据透视表工作表。
       在右边【数据透视表字段列表】中选择【总分】,将它拖放到下面【行标签】的方框中,用同样的方法将【班级】选项分别选中并拖放到下面的【列标签】和【数值】方框中,将【数值】中的班级值改为计数。
    图2.1.01
       单击左边的“行标签”下的总分,按右键选择“创建组”,在弹出的【组合】对话框中输入步长,这里是100,意思是每100分为一个段,如图2.1.01,单击“确定”后得到如表2.1.01的分数段表。
    表2.1.01 总分分数段分布表
       表中第一行是班级,第一列是分数段,最后一行是各班人数统计,最后一列是各分数段的人数统计。从表中可以直观地看到各分数段在各班中所占的人数,如一班:0-99分的有1人,100-199的有3人……。其他各科的分数段也可以用这样的方法快速统计出来,特别注意的是如果是缺考的学生,其分数所在单元格不能用中文表示,可以留空白,否则不能进行分组设置。

    2.2利用countifs函数统计各分数段人数

    实例2-2

       Countifs函数在EXCEL中是一个带多个条件的计数函数,设定各班后(注意的是班级单元的值要与成绩总表的班级的值相同,比如成绩总表的1班的值为1,则统计表中1班的值也为1)。
       在“人数”下方输入公式“COUNTIFS(D:D,">0",A:A,N3)”,回车后就可计算出1班的人数,说明:D列是总分,“>0”表示排除了总分为0的极端情况,A列是班级,N3是本表中1班所在的单元格地址。往下拖拉,即可计算出各班的人数。要计算小于100的人数,只需将公式中的条件改为“<100”即可,用同样的方法即可计算出各学科各分数段的人数,如表2.2.01。
    表2.2.01 用函数统计各分数段人数

    2.3用其它函数统计分数段人数

       在EXCEL中,除了上面的方法外,还有其它的函数统计分数段人数[11]。其过程来源于网络,大家可以通过【参考文献】中的链接进去学习。
       方法一:用COUNTIF函数统计
       方法二:用DCOUNT函数统计
       方法三:用FREQUENCY函数统计
       方法四:用SUM函数统计

    展开全文
  • 基于Spark的学生成绩分析系统

    千次阅读 2018-07-02 17:33:00
    本文是本人硕士期间云计算课程的一次大...但是也正因为此,本文对一些基础概念描述的也挺详细,包括但不限于Spark简介、Spark与Hadoop对比、Spark架构介绍、Pearson相关系数简介、Spark中的combineByKey函数简介等。

    本文首发于我的个人博客QIMING.INFO,转载请带上链接及署名。

    本文是本人硕士期间云计算课程的一次大作业,所以可能部分内容有充字数的嫌疑,还望各位看官无视。。。但是也正因为此,本文对一些基础概念描述的也挺详细,包括但不限于Spark简介、Spark与Hadoop对比、Spark架构介绍、Pearson相关系数简介、Spark中的combineByKey函数简介、Spark中提交并运行作业的方法等。

    问题说明

    提出问题及目标

    学生成绩是评价学生学习效果和老师教学效果的重要指标,如何充分利用已有的学生成绩数据,发现其中的规律,提高教学质量是广大教育工作者普遍关注的问题。

    一般而言,学生各科成绩之间或多或少都存在联系,例如一个学习好的学生各科成绩普遍都比较高。研究者们对此进行了大量的数据采集、统计工作,从他们的研究结果来看,学生各科成绩之间的确存在一定的相关性,只是不同课程之间相关性的强弱不同而已。

    通过对学生成绩进行统计分析,可以发现学生成绩中隐藏的课程关联规则和模式,这些知识可以帮助老师更加合理地安排教学内容,从而对教学起到促进作用。

    现有西工大某学院2006级至2015级学生的全部成绩,我们想利用这些数据统计出:①各学科的整体情况;②各课程之间的相关性

    目标细化及难点

    经过讨论,我们决定用每个年级的各科平均成绩来反映该学科的整体情况,并分年级计算各个课程之间的Pearson相关系数以反映各课程间的相关性。并最后将分析的结果保存在HDFS上。

    要做到这些工作,我们需要解决以下难点:
    ① 2006至2015学生人数众多,且课程种类多,为分析带来了极大困难
    ② 用单机运行处理大量数据需要大量的时间
    所以我们便考虑使用分布式计算引擎Spark来克服这些难点。

    背景

    Spark简介

    Spark是专为大规模数据处理而设计的快速通用的计算引擎,最初在2009年由加州大学伯克利分校的AMP实验室用Scala语言开发,并于2010年成为Apache的开源项目。

    Spark是基于MapReduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是中间过程的输出和结果可以保存在内存中,从而不再需要读写HDFS,大大提高了速度。

    Spark和Hadoop的关系图如下:

    官方资料介绍,和Hadoop相比,Spark可以让你的程序在内存中运行时速度提升100倍,就算在硬盘上,运行速度也能提升10倍。

    Spark架构

    Spark的架构示意图如下:

    如图可见,Spark主要有以下模块:
    ① Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的。
    ② Spark SQL:提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。
    ③ Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据
    ④ MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
    ⑤ GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。

    Spark RDD简介

    RDD(Resilient Distributed Dataset)即弹性分布式数据集。

    RDD是Spark的核心,在Spark中,对数据的所有操作不外乎创建RDD、转化已有RDD以及调用RDD操作进行求值。每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上。RDD可以包含Python、Java、Scala中任意类型的对象,甚至可以包含用户自定义的对象。

    RDD是Spark中的抽象数据结构类型,任何数据在Spark中都被表示为RDD。从编程的角度来看,RDD可以简单看成是一个数组。和普通数组的区别是,RDD中的数据是分区存储的,这样不同分区的数据就可以分布在不同的机器上,同时可以被并行处理。因此,Spark应用程序所做的无非是把需要处理的数据转换为RDD,然后对RDD进行一系列的变换和操作从而得到结果。

    更多内容可参考本站的这篇文章Spark RDD的简单使用

    Pearson相关系数简介

    Pearson相关系数 (Pearson Correlation Coefficient)是用来衡量两个数据集合是否在一条线上面,它用来衡量定距变量间的线性关系。Pearson是一个介于-1和1之间的值,用来描述两组线性的数据一同变化移动的趋势。

    Pearson系数的计算公式如下:

    注:Cov(X,Y)表示X和Y的协方差,E(X ) 表示X的平均值。

    Pearson 相关系数大小的含义如下表所示:

    相关性 负相关 正相关
    -0.09 至 0.0 0.0 至 0.09
    -0.3 至 -0.1 0.1 至 0.3
    -0.5 至 -0.3 0.3 至 0.5
    -1.0 至 -0.5 0.5 至 1.0

    实现步骤

    源数据是在MySQL数据库中存储的,所以在进行统计分析工作前要先将数据从MySQL数据库中读取出来。

    平均成绩分析

    取数据

    根据课程id取出每个年级的各个学生此门课程的成绩,SQL语句如下:

    def sqlStr(courseId: Int): String = {
      s"""SELECT c.gradeId,sc.score FROM tb_student st
          LEFT JOIN tb_score sc ON st.studentId = sc.studentId
          LEFT JOIN tb_class c  ON st.classId = c.classId
          WHERE sc.courseId = $courseId
          ORDER BY sc.studentId"""
    }

    转化数据

    从MySQL中取得的数据在Spark中是DataFrame类型的,为了方便计算,我们需要将其转化为一个键值对RDD,键为“科目+年级”,值为每个学生成绩,如( C语言2006级,89.0),代码如下:

    val scoreRdd = scoreDataFrame.map(x => (courseStr(courseId) + gradeStr(x.getLong(0).toInt), x.getDecimal(1).doubleValue)).rdd

    计算平均成绩

    调用RDD的combineByKey()方法来计算平均数,此方法先将相同键的值加起来,之后除以这个键的个数,得到这个键对应的平均成绩,代码如下:

    val averageScoreRdd = scoreRdd.combineByKey(
      createCombiner = (v: Double) => (v: Double, 1),
      mergeValue = (c: (Double, Int), v: Double) => (c._1 + v, c._2 + 1),
      mergeCombiners = (c1: (Double, Int), c2: (Double, Int)) => (c1._1 + c2._1, c1._2 + c2._2),
      numPartitions = 3
    ).map { case (k, v) => (k, v._1 / v._2) }

    代码说明:

    • createCombiner即当遇到一个新键时,创建一个此键对应的累加器,如第一次遇到(C语言2006级,89.0)时,创建(C语言2006级,(89.0,1));
    • mergeValue即当遇到之前已遇到过的键时,将该键的累加器与当前值合并,如再遇到(C语言2006级,90.5)时,合并为(C语言2006级,(179.5,2));
    • mergeCombiners即将各个分区的结果进行合并,得到每门课程对应不同年级的总成绩和总人数,如(C语言2006级,(19173.7,241));
    • numPartitions即表示Spark分了3个分区来并行处理数据;

    代码最后一行的map即为将每个键的累加器的总成绩除以总人数,得到一个值为平均成绩的RDD,如(C语言2006级,79.559)。

    保存结果

    调用saveAsTextFile()方法将计算出的平均成绩存储在HDFS中,每个科目的平均成绩保存在用该科目名命名的文件夹中,代码如下:

    averageScoreRdd.sortByKey().saveAsTextFile("hdfs://localhost:9000/user/hadoop/output/score-avg/" + courseStr(courseId))

    相关性分析

    取数据

    根据年级id取出当前年级每个学生所有科目的成绩,SQL语句如下:

    def allScoreSqlStr(gradeId: Int): String = {
      s"""SELECT
            MAX(case cou.courseId when '1' THEN IFNULL(sc.score, 0) END) '高等数学',
            MAX(case cou.courseId when '2' THEN IFNULL(sc.score, 0) END) '外语',
            MAX(case cou.courseId when '3' THEN IFNULL(sc.score, 0) END) '离散数学',
            MAX(case cou.courseId when '4' THEN IFNULL(sc.score, 0) END) 'C语言' ,
            MAX(case cou.courseId when '5' THEN IFNULL(sc.score, 0) END) '数据结构',
            MAX(case cou.courseId when '6' THEN IFNULL(sc.score, 0) END) '组成原理',
            MAX(case cou.courseId when '7' THEN IFNULL(sc.score, 0) END) '操作系统'
          FROM  tb_student st
          LEFT JOIN tb_score sc on st.studentId = sc.studentId
          LEFT JOIN tb_course cou on cou.courseId = sc.courseId
          LEFT JOIN tb_class cla ON  st.classId = cla.classId
          WHERE cla.gradeId = $gradeId
          GROUP BY st.studentId
          ORDER BY st.studentId"""
    }

    转化数据

    先将此DataFrame类型的数据转化成数值类型的RDD:

    val data = scoreDataFrame.map(x => x.toString).rdd.
      map(x => x.substring(1, x.length - 1).split(",")).
      map(x => x.map(x => x.toDouble))

    计算Pearson相关系数可以调用Spark MLlib库中的方法,但是该方法要求RDD为向量类型的RDD,所以继续转化:

    val data1 = data.map(x => Vectors.dense(x))

    计算Pearson相关系数

    直接调用Spark MLlib库中的Statistics.corr方法进行计算:

    val corr = Statistics.corr(data1, "pearson")

    保存结果

    经过上述计算,得到的corr是一个矩阵,我们想将结果保存成CSV以便于查看,所以应先将corr转化成一个数值类型的RDD,再将RDD转化成DataFrame以便于保存为CSV文件,最后将结果保存到HDFS上,每个年级的各科相关系数保存在以该年级命名的文件夹中,代码如下:

    val tmpRdd = sc.parallelize(corr.rowIter.toArray.map(x => x.toArray)).map(x => (x(0), x(1), x(2), x(3), x(4), x(5), x(6)))
    val tmpDF = tmpRdd.toDF("高等数学", "外语", "离散数学", "C语言", "数据结构", "组成原理", "操作系统")
    tmpDF.write.format("csv").save("hdfs://localhost:9000/user/hadoop/output/score-pearson/" + gradeStr(gradeId))

    提交运行

    代码编写完成后,我们需要将代码打包成jar文件(打包过程略),然后提交到spark集群上运行,有以下三步:

    启动master

    进入spark的安装目录,输入:

    ./sbin/start-master.sh

    启动worker

    ./bin/spark-class org.apache.spark.deploy.worker.Worker spark://localhost:7077  

    这里的地址为:启动master后,在浏览器输入localhost:8080,查看到的master地址:

    启动成功后,用jps查看进程:

    因本实验中还用到了HDFS,所以也必须启动它(使用start-dfs.sh),启动后再用jps查看一下进程:

    提交作业

    ./bin/spark-submit --master spark://localhost:7077 --class ScoreAnalysis /home/hadoop/scoreanalysis.jar

    注:这里将打包好的jar包放在了/home/hadoop/目录下

    可以在4040端口查看作业进度:

    结果展示

    上文说过,我们将结果保存在了HDFS中,所以当程序运行完成后,要查看结果,必须用Hadoop HDFS提供的命令或者进入namenode管理页面进行查看。

    在控制台上输入以下命令:

    $ hadoop fs –ls /user/hadoop/output/

    结果如下图:

    为了便于查看,我们也可以进入namenode管理页面。

    查看平均成绩

    进入score-avg文件夹,可以看到每个科目创建了一个文件夹。

    进入外语文件夹,可以看到有四个文件,_SUCCESS表示文件存储成功,其他三个文件即Spark保存时有三个分区,分别进行了保存。

    为了方便查看,我们使用cat命令,将所有文件内容整合到一个本地文件中,如下图所示:

    查看Pearson相关系数

    进入score-pearson文件夹,可以看到,我们将不同课程的相关性按年级分成了不同的文件夹。

    以2006级为例说明,进入2006级文件夹,看到5个文件,_SUCCSESS说明保存成功,其余四个文件即Spark保存时有四个分区,分别进行了保存。

    同样,我们用cat命令将其合并到一个文件中,即在控制台中输入:

    hadoop fs -cat /user/hadoop/output/score-pearson/2006级/part-* >  //home/hadoop/score-pearson/2006级.csv

    之后打开2006级.csv,便能清晰的看到2006级学生成绩各科的pearson相关系数了:

    从图中可以看出,组成原理和操作系统的Pearson相关系数最高,达到了0.62,说明组成原理和操作系统的相关性较强。

    总结

    在本次实验中,我们小组共同合作,完成了用Spark进行对西工大某学院学生2006级至2015级各课程的成绩统计与分析。

    在这个过程中,我们学习到了Hadoop、Spark环境的搭建,Spark RDD的使用,Scala语言的用法,以及分布式开发的思想,并成功得出了各课程的平均成绩与相关性。

    这次实践我们收获到了很多,但由于能力与时间有限,本实验还有很多可以改进的地方。以后还有很多值得学习与研究的地方,我们会再接再厉,努力做得更好。

    附完整代码

    import java.util.Properties
    
    import org.apache.spark.mllib.linalg.Vectors
    import org.apache.spark.mllib.stat.Statistics
    import org.apache.spark.sql.SparkSession
    
    /**
      * xu qi ming
      * 2018.06.15
      */
    object ScoreAnalysis {
    
      /**
        * 根据课程id查找每个学生的成绩和所在年级的SQL语句
        *
        */
      def sqlStr(courseId: Int): String = {
        s"""SELECT c.gradeId,sc.score FROM tb_student st
              LEFT JOIN tb_score sc ON st.studentId = sc.studentId
              LEFT JOIN tb_class c ON  st.classId = c.classId
              WHERE sc.courseId = $courseId
              ORDER BY sc.studentId"""
      }
    
      /**
        * 查找当前年级每个学生所有科目的成绩的SQL语句
        *
        */
      def allScoreSqlStr(gradeId: Int): String = {
        s"""SELECT
              MAX(case cou.courseId when '1' THEN IFNULL(sc.score, 0) END) '高等数学',
              MAX(case cou.courseId when '2' THEN IFNULL(sc.score, 0) END) '外语',
              MAX(case cou.courseId when '3' THEN IFNULL(sc.score, 0) END) '离散数学',
              MAX(case cou.courseId when '4' THEN IFNULL(sc.score, 0) END) 'C语言' ,
              MAX(case cou.courseId when '5' THEN IFNULL(sc.score, 0) END) '数据结构',
              MAX(case cou.courseId when '6' THEN IFNULL(sc.score, 0) END) '组成原理',
              MAX(case cou.courseId when '7' THEN IFNULL(sc.score, 0) END) '操作系统'
            FROM  tb_student st
            LEFT JOIN tb_score sc on st.studentId = sc.studentId
            LEFT JOIN tb_course cou on cou.courseId = sc.courseId
            LEFT JOIN tb_class cla ON  st.classId = cla.classId
            WHERE cla.gradeId = $gradeId
            GROUP BY st.studentId
            ORDER BY st.studentId"""
      }
    
    
      /**
        * 将年级id转换成字符串
        *
        */
      def gradeStr(gradeId: Int): String = {
        gradeId match {
          case 1 => "2006级"
          case 2 => "2007级"
          case 3 => "2008级"
          case 4 => "2009级"
          case 5 => "2010级"
          case 6 => "2011级"
          case 7 => "2012级"
          case 8 => "2013级"
          case 9 => "2014级"
          case 10 => "2015级"
        }
      }
    
      /**
        * 将课程id转换成相应课程名字符串
        *
        */
      def courseStr(corseId: Int): String = {
        corseId match {
          case 1 => "高等数学"
          case 2 => "外语"
          case 3 => "离散数学"
          case 4 => "C语言"
          case 5 => "数据结构"
          case 6 => "组成原理"
          case 7 => "操作系统"
        }
      }
    
      def main(args: Array[String]): Unit = {
    
        // 生成SparkSession对象
        val spark = new SparkSession.Builder().appName("ScoreAnalysis").getOrCreate()
        //生成SparkContext对象
        val sc = spark.sparkContext
    
        //建立与mysql数据库的连接
        val connProperties = new Properties()
        connProperties.put("driver", "com.mysql.jdbc.Driver")
        connProperties.put("user", "root")
        connProperties.put("password", "Root_1234")
        connProperties.put("fetchsize", "100")
    
        import spark.implicits._
    
        /**
          * 计算指定课程的每个年级的平均成绩
          *
          */
        def averageScore(courseId: Int): Unit = {
    
          //连接数据库,将取得的成绩保存成DataFrame
          val scoreDataFrame = spark.read.jdbc(
            "jdbc:mysql://localhost:3306/db_score",
            s"(${sqlStr(courseId)}) as table01",
            connProperties)
    
          //将DataFrame转化成一个键值对RDD,键是科目+年级,值是每个学生的成绩
          val scoreRdd = scoreDataFrame.map(x => (courseStr(courseId) + gradeStr(x.getLong(0).toInt), x.getDecimal(1).doubleValue)).rdd
    
          //计算每个年级的平均成绩
          val averageScoreRdd = scoreRdd.combineByKey(
            createCombiner = (v: Double) => (v: Double, 1),
            mergeValue = (c: (Double, Int), v: Double) => (c._1 + v, c._2 + 1),
            mergeCombiners = (c1: (Double, Int), c2: (Double, Int)) => (c1._1 + c2._1, c1._2 + c2._2),
            numPartitions = 3
          ).map { case (k, v) => (k, v._1 / v._2) }
    
          //保存到HDFS中
          averageScoreRdd.sortByKey().saveAsTextFile("hdfs://localhost:9000/user/hadoop/output/score-avg/" + courseStr(courseId))
        }
    
        //循环这7门课,求每个课程每个年级的平均成绩
        for (i <- 1 to 7) {
          averageScore(i)
        }
    
        /**
          * 计算指定年级的所有科目的pearson相关系数
          *
          */
        def pearsonCorr(gradeId: Int): Unit = {
    
          //连接数据库,将取得的成绩保存成DataFrame
          val scoreDataFrame = spark.read.jdbc(
            "jdbc:mysql://localhost:3306/db_score",
            s"(${allScoreSqlStr(gradeId)}) as table01",
            connProperties)
    
          //将DataFrame转成数值类型的RDD
          val data = scoreDataFrame.map(x => x.toString).rdd.
            map(x => x.substring(1, x.length - 1).split(",")).
            map(x => x.map(x => x.toDouble))
    
          //将数值RDD转为Vector类型的RDD
          val data1 = data.map(x => Vectors.dense(x))
    
          //调用机器学习库的统计学习中的算法计算pearson相关系数
          //将结果返回成一个矩阵
          val corr = Statistics.corr(data1, "pearson")
    
          //保存计算的结果到HDFS
          val tmpRdd = sc.parallelize(corr.rowIter.toArray.map(x => x.toArray)).map(x => (x(0), x(1), x(2), x(3), x(4), x(5), x(6)))
          val tmpDF = tmpRdd.toDF("高等数学", "外语", "离散数学", "C语言", "数据结构", "组成原理", "操作系统")
          tmpDF.write.format("csv").save("hdfs://localhost:9000/user/hadoop/output/score-pearson/" + gradeStr(gradeId))
        }
    
        //循环这10个年级,求每个年级的各科相关系数情况
        for (i <- 1 to 10) {
          pearsonCorr(i)
        }
      }
    
    }
    展开全文
  • 鉴于当代大学实行学分制教学,学生成绩的关注越来越转向学分绩点,但是并非对其计算公式熟悉,而且计算起来相对复杂,同时对总体成绩的发展趋势的分析对比,有助于学生认识并把握最低分、均方差、及格率的统计,...
  • 清晨,与您相约今天讲一讲如何用Excel制作学生成绩正态分布图,对学生成绩、分数段分布、试题难易程度、教学效果等进行分析。实现方法示例数据如下:结果如下:正态分布图中:成绩分数段直方图,显示各个分数段的...

    清晨,与您相约

    b6386ee7acb4fcb3bd420cd5d4868507.png

    今天讲一讲如何用Excel制作学生成绩正态分布图,对学生成绩、分数段分布、试题难易程度、教学效果等进行分析。

    实现方法

    示例数据如下:

    cf5f6f758948ae560376d07563d7c14c.png

    结果如下:

    c06c0939255eea3170340adb5eab66c8.png

    正态分布图中:

    1. 成绩分数段直方图,显示各个分数段的人数;

    2. 正态分布曲线的高峰位于平均成绩位置,由平均成绩所在处开始,分别向左右两侧逐渐均匀下降;

    3. 直方图与曲线的对比分析,可以得到各种信息。

    第一步:分析成绩

    对成绩进行分析,分析出最大值、最小值、极差(最大值—最小值)、成绩分段数量、分段间距。

    下图是分析的结果及对应公式:

    839a41da9cf546b431733bdabf8b495c.png

    第二步:确定分数段

    “分段点”就是确定直方图的横轴坐标起止范围和每个分数段的起止位置。第一个分段点要小于等于最小成绩,然后依次加上“分段间距”,直到最后一个数据大于等于最高成绩为止。实际分段数量可能与计算的“分段数”稍有一点差别。如下图:

    d81fd1ed65cb7f716c230d8cac14c79c.png

    第一个分段点7是手工输入,在第二个分段点H2处输入公式=H2+$D$6,往下填充,填出各个分段点。

    第三步:计算段内人数

    选中I2:I9,输入公式:

    =FREQUENCY(A2:A44,H2:H9),三键结束,即可算出各分数段人数。

    277bc665b75f7feab65995218d1cfb28.png

    关于FREQUENCY函数,请参考:Excel108 | FREQUENCY函数分段计数)

    第四步:计算成绩正态分布值

    选中J2,输入公式:

    =NORMDIST(I2,AVERAGE($A$2:$A$44),STDEV($A$2:$A$44),0),确定并往下填充,即可得到每个成绩段的正态分布值,

    e2a7d5a6e7527b017c09740dea39be54.png

     正态分布概率密度正态分布函数“NORMDIST”获取。

    NORMDIST 函数

    • 返回指定平均值和标准偏差的正态分布函数

    语法

    • NORMDIST(x,mean,standard_dev,cumulative)

    • NORMDIST 函数语法具有下列参数:

    • X    必需。需要计算其分布的数值。

    • Mean    必需。分布的算术平均值。

    • standard_dev    必需。分布的标准偏差。

    • cumulative    必需。决定函数形式的逻辑值。如果 cumulative TRUE,则NORMDIST 返回累积分布函数;如果为FALSE,则返回概率密度函数。

    在本公式中:

    • 以分段点值为“X”来计算:

    • Mean=AVERAGE($A$2:$A$44)(数据算术平均)

    • Standard_dev=STDEV($A$2:$A$44)(数据的标准方差)

    • Cumulative=0(概率密度函数)

    第五步:插入正态分布图

    【插入】菜单内选择【其他图表】,在【所有图表】中找【组合】图中的【自定义组合】,将正态分布值选择折线,勾选【次坐标轴】,如下:

    a552a4ab21fca07cee06dae480b4d9c3.png

    选定正态曲线,【设置数据系列格式】,勾选【平滑】:

    5bd5d0c76b524ac7a74b18937e5accc1.png

    第六步:美化加工

    如果想直观看出人数对应的分数段,可以在数据表中将“分数段”列出,通过添加数据添加到横坐标轴,如下图:

    0597af7762bb9a1111f5662cd143f8a1.png

    展开全文
  • 系统有丰富统计功能,能按照多种条件,对不同学校、年级、班级等进行对比分析,并以图表的形式呈现出来。 三、操作便捷,系统充分考虑了用户使用的便捷性。系统能够很好的利用已有的学生信息如EXCEL等资料,实现...
  • 9、班级设置:在录入学生成绩之前,用户必须在“设置”页面中的“班级区域”设置本次考试的所有班级名称,系统才能在班级成绩分析中自动生成各页面信息。 10、你可以根据你校平时的习惯,在“全年级成绩统计表”中...
  • 由于学生英语写作成绩预测受诸多因素影响,具有高维、非线性特点,本文基于广义回归神经网络(GRNN)算法原理,构建了GRNN学生英语写作成绩预测模型,并与弹性BP算法改进的BP神经网络模型的预测结果进行对比分析。...
  • 2020年11月19日,高三年级在阶梯...通过对比分析高分段的人数,发现学生在本次考试中存在的问题。力争在下次考试中,通过大家的共同努力,实现质的飞跃。通过对比班级平均分、班级众数、班级临界、目标人数、全统...

    48273079dd76b7df0e9e2550bb703b2d.png

    2020年11月19日,高三年级在阶梯教室四召开期中考试成绩分析会,会上张贵忠主任详细分析了各班的成绩。

    8bd5326257f0850daf6b15bc0f6edea3.png

    张贵忠主任详细分析了期中考试的成绩。并对成绩背后反应的问题做了解读并提出了要求。从年级整体情况对教学和学生情况进行了分析。通过对比分析高分段的人数,发现学生在本次考试中存在的问题。力争在下次考试中,通过大家的共同努力,实现质的飞跃。通过对比班级平均分、班级众数、班级临界、目标人数、全统临界分数、全统临界率等,分层次分析了各班的成绩情况和各学科的成绩情况。公布了班级成绩的指标完成情况,公布了获得特别突出奖、突出奖、优秀奖的班级。在成绩分析中,特别对10班进行了表扬,对22班进行了批评。张主任强调,班级的各科成绩均靠前并且完成情况较好,能够体现出一个班级的总体学习状态。相反,一个班级的班风、学风出现了问题,班级的成绩是不会靠前的,也会和其它的班级的成绩拉开差距。会上,按照衔接物理方向、衔接历史方向、实验物理方向、实验历史方向4个层次的顺序宣布了各个层次内部总体完成指标的情况,并依次按语文、数学、英语、物理、历史、化学、生物、政治、地理的学科顺序逐一分析了均分及临界率。其中,数学、物理学科班级间的均分过大,需要在今后的学科教学上引起注意。张主任强调,期中考试考完,学期已经过半,尤其是没有达到目标的学科、班级,要利用好有限的时间查找问题并及时解决。随着一轮复习的进一步完善,我们的成绩一定会有较大幅度的提高。

    68fe1478566c5a171e5cac590b18fc86.png

    9c2b7c70a507fe5f53dd844f86bde758.png

    展开全文
  • 【 ee21.cn - excel 】用Excel条件格式给成绩不及格同学亮黄牌教师们通常会利用Excel电子表格对学生成绩做系统的对比分析。为了查看方便,我们可以利用Excel提供的条件格式功能,为不及格同学先亮一下黄牌。1、...
  •  初见此题,有人会想到先将所有成绩存入数组,查询某一分数时一一对比得到人数。但是这样效率太低。  在这里我们发现,学生的分数是有一个严格的范围的,从0到100,而且还是整数,只有101种可能的分数。我们只要...
  • 摘 要 近十几年来,我国大学生体质健康状况呈下降趋势的严峻问题,引起社会各界的高度关注。本文针对此问题研究我校12级至14级学生...再用关联规则Apriori算法综合对比分析,以体质测试的各个指标为前项,“总分等级...
  • 产品利益相关者: 用户:南通大学各任课老师。 顾客:南通大学(教务处) ...个人账户登录,能进行学生成绩的录入. 扩展性:提供方便的修改,查找,分类,统计,对比等操作. 创新性:增加有管理学生信息的功...
  • 前言:正如市实验专题上篇所提到的,青岛市实验初中的中考成绩与通过市实验看各区域小学成绩差异前言 。...江苏路小学毕业生17年摇号和特长优待共被市实验录取43名学生,那么我们来看看江苏路小...
  • vb加vsflex和access数据库开发的小学成绩录入与分析系统,是表格形式录入,可分学校、班级、考次进行查询和分析,数据库分学生成绩和统计三张表,能自动对同一考次的不同学校按照巩固率...能对比分析学生的每次成绩
  • 0. 来源&简介 B站视频-【数据分析】- SQL面试50题 - 跟我一起打怪升级 一起成为数据科学家-https://www.bilibili.com/video/av55971363?p=4 ...查询课程01比课程02成绩高的学生的...因为要对比两门课程的成绩,所...
  • 需求分析

    2016-04-18 17:31:00
    [利益相关者] 用户:南通大学所有任课老师 顾客:南通大学(教务...基础性:每人独占一个账号,账户登录时,能进行学生成绩的录入. 扩展性:提供方便的修改,查找,分类,统计,对比等操作. 创新性:增加有管理...
  • 继《多源分片报表》后,我们继续考察这些报表工具对复杂报表的支持程度。 排名与跨行组运算也是典型的中国复杂报表形式,这类报表的源数据集通常比较简单,但在表格的单元格...1、 报表中根据学生成绩既要做班级内排

空空如也

空空如也

1 2 3 4
收藏数 76
精华内容 30
关键字:

学生成绩对比分析