适合人群
- 已经忘记统计学基础的
- 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】
平均数
统计学基础公式,只要把求和符号搞清楚就不难搞清楚这个公式!
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
中位数
中位数也是平均数的一种
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
方差
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
标准差
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 培训勿扰!!!