适合人群
已经忘记统计学基础的
Scala刚刚入门的
通过对统计学入门公式的实践编程,你可以对Scala做到入门,其他语言也类似!
注意点
公式不要怕
统计学复习
建议去看 可汗的统计学视频,我们这里实践的是统计学的最基础公式,不然为啥叫入门呢
1, 平均数 2, 中位数 3,众数 注意,这几个都是表示一组数的集中程度的!
4,方差 5 标准差 这几个都是表示一组数的离散程度的!
先把我们要统计的数据放出来
【98,83,65,72,79,76,75,94,91,77,63,83,89,69,64,78,63,86,91,72,71,72,70,80,65,70,62,74,71,76】
平均数
image.png
统计学基础公式,只要把求和符号搞清楚就不难搞清楚这个公式!
Scala代码
scala> val data = Array[Int](98,83,65,72,79,76,75,94,91,77,63,83,89,69,64,78,63,86,91,72,71,72,70,80,65,70,62,74,71,76) data: Array[Int] = Array(98, 83, 65, 72, 79, 76, 75, 94, 91, 77, 63, 83, 89, 69, 64, 78, 63, 86, 91, 72, 71, 72, 70, 80, 65, 70, 62, 74, 71, 76) scala> var sum = 0sum: Int = 0scala> for ( xi <- data ) { | sum += xi | } scala> sum res17: Int = 2279scala> val n = data.length n: Int = 30scala> sum / n res18: Int = 75
中位数
image.png
中位数也是平均数的一种
Scala代码
scala> val data = Array[Int](98,83,65,72,79,76,75,94,91,77,63,83,89,69,64,78,63,86,91,72,71,72,70,80,65,70,62,74,71,76) data: Array[Int] = Array(98, 83, 65, 72, 79, 76, 75, 94, 91, 77, 63, 83, 89, 69, 64, 78, 63, 86, 91, 72, 71, 72, 70, 80, 65, 70, 62, 74, 71, 76) scala> val sorted = data.sorted sorted: Array[Int] = Array(62, 63, 63, 64, 65, 65, 69, 70, 70, 71, 71, 72, 72, 72, 74, 75, 76, 76, 77, 78, 79, 80, 83, 83, 86, 89, 91, 91, 94, 98) scala> val n = sorted.length n: Int = 30scala> if ( n % 2 == 0 ) { | val a = sorted ( (n/2) ) | val b = sorted ( (n/2 - 1) ) | } scala> ( a + b ) /2res37: Int = 74scala> if ( n % 2 != 0 ) { | sorted( (n/2) ) | } res38: AnyVal = () scala>
众数
众数是在一组数据中,出现次数最多的数据,是一组数据中的原数据,而不是相应的次数。 一组数据中的众数不止一个,如数据2、3、-1、2、1、3中,2、3都出现了两次,它们都是这组数据中的众数。 一般来说,一组数据中,出现次数最多的数就叫这组数据的众数。 例如:1,2,3,3,4的众数是3。 但是,如果有两个或两个以上个数出现次数都是最多的,那么这几个数都是这组数据的众数。 例如:1,2,2,3,3,4的众数是2和3。
Scala代码
scala> val data = Array[Int](98,83,65,72,79,76,75,94,91,77,63,83,89,69,64,78,63,86,91,72,71,72,70,80,65,70,62,74,71,76) data: Array[Int] = Array(98, 83, 65, 72, 79, 76, 75, 94, 91, 77, 63, 83, 89, 69, 64, 78, 63, 86, 91, 72, 71, 72, 70, 80, 65, 70, 62, 74, 71, 76) scala> var dataCount : Map[Int, Int] = Map() dataCount: Map[Int,Int] = Map() scala> for ( xi <- data ) { | if ( !dataCount.contains(xi) ) { | dataCount += (xi -> 1) | } else { | var count = dataCount(xi) | count += 1 | dataCount += (xi -> count) | } | } scala> dataCount res60: Map[Int,Int] = Map(69 -> 1, 78 -> 1, 89 -> 1, 74 -> 1, 70 -> 2, 65 -> 2, 77 -> 1, 64 -> 1, 71 -> 2, 86 -> 1, 76 -> 2, 98 -> 1, 91 -> 2, 80 -> 1, 63 -> 2, 72 -> 3, 75 -> 1, 79 -> 1, 94 -> 1, 62 -> 1, 83 -> 2) scala> var dataSeq = dataCount.toSeq.sortBy(_._2) dataSeq: Seq[(Int, Int)] = Vector((69,1), (78,1), (89,1), (74,1), (77,1), (64,1), (86,1), (98,1), (80,1), (75,1), (79,1), (94,1), (62,1), (70,2), (65,2), (71,2), (76,2), (91,2), (63,2), (83,2), (72,3)) scala> var (a , b ) = dataSeq(dataSeq.length-1) a: Int = 72b: Int = 3scala> a res74: Int = 72
方差
image.png
Scala代码
scala> val data = Array[Int](98,83,65,72,79,76,75,94,91,77,63,83,89,69,64,78,63,86,91,72,71,72,70,80,65,70,62,74,71,76) data: Array[Int] = Array(98, 83, 65, 72, 79, 76, 75, 94, 91, 77, 63, 83, 89, 69, 64, 78, 63, 86, 91, 72, 71, 72, 70, 80, 65, 70, 62, 74, 71, 76) scala> def avg( data : Array[Int] ) : Int = { | var sum = 0 | for ( xi <- data ) { | sum += xi | } | | return (sum / data.length) | } avg: (data: Array[Int])Int scala> avg(data) res75: Int = 75scala> val N = data.length N: Int = 30scala> val u = avg(data) u: Int = 75scala> var sum = 0sum: Int = 0scala> var sum = 0.0sum: Double = 0.0scala> for ( xi <- data ) { | sum += Math.pow ( (xi - u) , 2) | } scala> sum res86: Double = 2827.0scala> sum / N res87: Double = 94.23333333333333
标准差
image.png
Scala代码
scala> def FangCha( data : Array[Int], u : Int) : Double = { | var sum = 0.0 | for ( xi <- data ) { | sum += Math.pow( (xi - u) , 2) | } | return sum / data.length | }FangCha: (data: Array[Int], u: Int)Double scala> FangCha(data, u)res88: Double = 94.23333333333333Math.sqrt( FangCha(data, u) )res89: Double = 9.707385504518369
总结一下
这组数围绕 72,74,75 前后范围 10左右的一组数!是不是经过统计学分析,能比较简要的描述一组数据?
实现过程的坑提示
求数组长度
数组元素访问 () 不是 []
排序
map添加,更新 ( i -> j)
map的排序
函数注意用 = , 理解一切都是变量
Math的一些方法借助
作者:api1024
链接:https://www.jianshu.com/p/c2f46b9b1013
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦