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】

平均数

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 = 0
sum: Int = 0

scala> for ( xi <- data ) {
     |    sum += xi
     | }

scala> sum
res17: Int = 2279

scala> val n = data.length
n: Int = 30

scala> 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 = 30

scala> if ( n % 2 == 0 ) {
     |    val a = sorted ( (n/2) )
     |    val b = sorted ( (n/2 - 1) )
     | }

scala> ( a + b ) /2
res37: Int = 74

scala> 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 = 72
b: Int = 3

scala> 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 = 75

scala> val N = data.length
N: Int = 30

scala> val u = avg(data)
u: Int = 75

scala> var sum = 0
sum: Int = 0

scala> var sum = 0.0
sum: Double = 0.0

scala> for ( xi <- data ) {
     |     sum += Math.pow ( (xi - u) , 2)
     | }

scala> sum
res86: Double = 2827.0

scala> 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.23333333333333

Math.sqrt( FangCha(data, u) )
res89: Double = 9.707385504518369

总结一下

这组数围绕 72,74,75 前后范围 10左右的一组数!是不是经过统计学分析,能比较简要的描述一组数据?

实现过程的坑提示

  • 求数组长度
  • 数组元素访问 () 不是 []
  • 排序
  • map添加,更新 ( i -> j)
  • map的排序
  • 函数注意用 = , 理解一切都是变量
  • Math的一些方法借助

需要源代码 联系 "api1024"

大数据自学群 829163554 培训勿扰!!!

你可能感兴趣的:(100天自学大数据:我用Scala复习学统计基础公式)