大数据时代的“小数据”系列1 cox-stuart趋势检验

####为什么要用趋势检验
在客观世界存在各种各样随时间变动的数据,很多时候我们都想要知道数据变化随时间的发展趋势如何,常用的方式是我们使用回归的参数方法拟合出一条直线,然后判断其趋势。这样的方法往往受多方面的因素影响,比如单调的趋势不一定是线性的,也不一定能有一个显函数来表达。其次参数检验的方法受限于数据量,有时候我们得到的数据很少,不适合做回归等参数方法。比如当我们开发的APP上线新功能,我们需要在短时间内判断其是否带来用户的增长,流量的增长,以便做出相应的策略;或者当出现某种疫情的时候,我们迫切希望了解到疫情是否得到控制等… Cox和Stuart提出的基于符号检验的非参数方法就能有效的解决之一问题

举个例子说明
以下是天津机场从1995年1月到2003年12月的108个月旅客吞吐量数据
天津机场从1995年1月到2003年12月的108个月旅客吞吐量

天津机场从1995年1月到2003年12月的108个月旅客吞吐量

光从数字和趋势图看,我们能否说这个趋势是增长还是减少,还是都不明显呢,似乎是增长,但是又不总是增长。

对此我们可以做如下处理

step1 做出假设
这里写图片描述

step2 取数据对
(X1,X1+c)… (X(n-c),Xn)
这里 当n为偶数 c=n/2 ; 当n为奇数 c= (n+1)/2

step3 计算符号
计算 Dt = Xt -X(t+c)
计算 S+ (Dt为正)和 S-(Dt为负) 的个数
显然,当无趋势时 S+ 或S- 服从p=0.5 的二项分布,如果S+大,则可能存在下降趋势。
所以有该检验的统计量如下:
检验统计量

Scala 版本

import breeze.stats.distributions._
import scala.collection.mutable.ListBuffer

 /**
    *  计算二项分布的分布函数
    * @param binomial
    * @param n
    * @return
    */
  def pbinom(binomial: Binomial, n: Int) = {
    var p = 0.0
    if (n >= binomial.n) {
      p = 1
    } else {
      for (i <- 0 to n) {
        p += binomial.probabilityOf(i)
      }
    }
    p
  }
  
/**
    * CoxStuart趋势检验
    * @param timeSeries
    * @param AlternativeHypothesis
    * @return
    */
  def CoxStuart(timeSeries: Seq[Double],
               AlternativeHypothesis: String = hypothesis.GROWTHREND) = {
    
    val length = timeSeries.length

    val ts = if (length % 2 != 0) {
      timeSeries.drop(length / 2 + 1)
    } else timeSeries

    val pre = ts.slice(0, ts.length / 2)
    val pro = ts.slice(ts.length / 2, ts.length)
    val sign = new ListBuffer[Double]()
    for (i <- 0 until length / 2   ) {
      sign.append(pre(i) - pro(i))
    }
    val spositive = sign.count(_ > 0)
    val snagtive = sign.count(_ < 0)

    def min(n: Int, g: Int) = {
      if (n > g) g else n
    }

    val binomial = Binomial((length / 2), 0.5)

    val p = AlternativeHypothesis.toUpperCase match {
      case "REDUCETREND" => pbinom(binomial, snagtive)
      case "NOTREND" => pbinom(binomial, min(snagtive, spositive)) * 2
      case _ => pbinom(binomial, spositive)
    }
    coxstuer((ts.length / 2), spositive, snagtive, p)
  }

    val source: BufferedSource = Source.fromFile("TJAir.csv")
    val data = source.getLines().map(_.toDouble)
    val coxstuer1 = CoxSturt(data.toSeq)
    println("p-value =" + coxstuer1.pvalue)


Scala 算法得出 p-value = 0.004536670169793693


R 语言版本

#数据加载
TJair <- read_csv("TJAir.csv")
#绘制趋势图
plot(TJair$TJair,type = "l")
# cox_stuert 趋势检验
#  假设检验
#h0:无趋势 ,h1:上升趋势
len <- length(TJair$TJair)  

clen <-if(len%%2 == 0){
  len/2
} else{
  (len+1)/2
}

pvcont <- TJair$TJair
D <- pvcont[1:clen] - pvcont[(clen+1):len]
## 符号计算
spositive <- sum(sign(D) == 1)
snegative <- sum(sign(D) == -1)
## 结果检验
pbinom(spositive,clen,0.5)
pbinom(spositive,54,0.5)


[1] 0.00453667

R语言 计算结果 p-value = 0.00453667

参考资料:《非参数统计》第四版 吴喜之 赵博娟

一. 课程介绍本课程结合Python进行统计与数据分析的原理讲解与实战,涵盖了大部分统计&数据分析模型,特别是当前比较主流的算法:参数估计、假设检验、线性回归、广义线性回归、Lasso、岭回归、广义可加模型、回归样条等;机器学习经常用到的主成分分析、因子分析、典型相关分析、聚类分析等;各种非参数统计模型,包括非参数统计推断、尺度推断、位置推断、非参数核密度估计、非参数回归等。本课程主要针对有一定Python编程基础、即将毕业参加工作的的大三大四学生,或者已经参加工作需要提升自己数据分析能力以及转行从事IT行业尤其是数据&大数据分析工作的初入职场者,或者正在攻读硕博士学位需要学习和掌握量化研究方法的研究生。本课程对于即将从事机器学习、深度学习&人工智能相关工作的程序员也有很大帮助,有利于打好坚实的理论基础。二. 课程目录第0章 课程导学第1章 数据描述性分析1.1 描述统计量1.2 数据的分布1.3 概率分布函数的图形1.4 直方图、经验分布函数与QQ图1.5 多元数据数据特征与相关性分析1.6 多元数据的基本图形表示第2章 参数估计2.1 点估计2.2 区间估计第3章 假设检验3.1 基本原理3.2 参数检验第4章 回归分析4.1 回归分析的概念与一元线性回归4.2 多元线性回归及统计量解析4.3 逐步回归与模型选择4.4 回归诊断4.5 广义线性回归4.6 非线性回归第5章 方差分析5.1 单因素方差分析5.2 双因素方差分析第6章 判别分析与聚类分析6.1 判别分析6.2 聚类分析第7章 主成分分析、因子分析与典型相关分析7.1 主成分分析7.2 因子分析7.3 典型相关分析第8章 非参数统计8.1 经验分布和分布探索8.2 单样本非参数统计推断8.3 两独立样本的位置与尺度判断8.4 多组数据位置推断8.5 分类数据的关联分析8.6 秩相关与分位数回归8.7 非参数密度估计8.8 一元非参数回归三. 讲师简介主讲人李进华博士,本、硕、博皆就读于武汉大学信息管理学院,2005年获博士学位进入211高校任教,2012年受聘为教授。从事信息管理与数据分析方面的教学、科研与系统开发工作20余年,具备深厚理论修养和丰富实战经验。是中国最早从事Java开发的程序员和Oracle数据库的DBA之一。曾带领团队开发《葛洲坝集团三峡工程指挥中心三期工程施工管理系统》、《湖北省财政厅国有企事业单位资产管理系统》等大型MIS。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值