为了账号安全,请及时绑定邮箱和手机立即绑定

100天自学大数据:我用Scala复习学统计基础公式

标签:
大数据

适合人群

  • 已经忘记统计学基础的

  • 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】

平均数

webp

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

中位数

webp

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

方差

webp

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

标准差

webp

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 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消