• R语言高级数据管理


    高级数据管理

    一个数据处理难题,由于每一门成绩的量纲不同,无法根据成绩进行排名。

    image-20221022185908608

    标准差

    标准差(Standard Deviation) ,是离均差平方的算术平均数(即:方差)的算术平方根,用σ表示。标准差也被称为标准偏差,或者实验标准差,在概率统计中最常使用作为统计分布程度上的测量依据。

    标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同。

    image-20221022190120176

    image-20221022190202744

    标准差的意义

    例1:A、B两组各有6位学生参加同一次语文测验,A组的分数为95、85、75、65、55、45,B组的分数为73、72、71、69、68、67。这两组的平均数都是70,但A组的标准差约为17.08分,B组的标准差约为2.16分。

    结论:说明A组学生之间的差距要比B组学生之间的差距大得多。

    例2:选基金:衡量基金波动程度的工具就是标准差(StandardDeviation)。标准差是指基金可能的变动程度。标准差越大,基金未来净值可能变动的程度就越大,稳定度就越小,风险就越高。

    绝对中位差

    在统计学中,绝对中位数MAD是对单变量数值型数据的样本偏差的一种鲁棒性测量。

    对于单变量数据集X1,X2,…,Xn, MAD定义为数据点到中位数的绝对偏差的中位数:

    image-20221022190410778

    也就是说,先计算出数据与它们的中位数之间的残差(偏差),MAD就是这些偏差的绝对值的中位数。

    MAD与标准差的关系

    为了能将MAD当作标准差σ估计的一种一致估计量,使用

    image-20221022190510466

    其中 k 为比例因子常量,值取决于分布类型。对于正态分布数据,k的值为:1.4826

    在R语言中,计算MAD的函数是stats包中的mad(),不同的是它默认乘上了一个比例因子1.4826,为了达到渐进正态一致性。

    mad(x, center = median(x), constant = 1.4826, na.rm = FALSE, low = FALSE, high = FALSE) 
    
    • 1

    Description:

    Compute the median absolute deviation, i.e., the (lo-/hi-) median of the absolute deviations from the median, and (by default) adjust by a factor for asymptotically normal consistency.

    low: if TRUE, compute the ‘lo-median’, i.e., for even sample size, do not average the two middle values, but take the smaller one.

    high: if TRUE, compute the ‘hi-median’, i.e., take the larger of the two middle values for even sample size.

    > x<-c(1,2,3,4,5)
    > median.x<-median(x)
    > median.x
    [1] 3
    > diff.x<-abs(x-median.x)
    > diff.x
    [1] 2 1 0 1 2
    > mad(x)
    [1] 1.4826
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    绝对中位差有什么用?

    用途:

    MAD常用于异常值检测

    离群点:是数据集中的一个数据点,该数据点与所有其他观察值相距较远。 位于数据集总体分布之外的数据点。

    绝对中位差较标准差而言对“野”点(outlier)更加的鲁棒。在标准差的计算中,数据点到其均值的距离要求平方,因此对偏离较为严重的点偏离的影响得以加重,也就是说“野”点严重影响着标准差的求解,而少量的“野”点对绝对中位差的影响不大

    image-20221022204420879

    分位数

    定义1:分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。

    定义2:对一个有着连续分布函数的样本集X,分位数是将一个概率分布切分为有着相同概率的连续区间的切分点。

    image-20221022204401844

    分位数(Quantile),简言之,将数据按照数量均分后的边界值。

    二分位数:即中位数 quantile(x,0.5)=median(x)

    四分位数(Quartile):是统计学中分位数的一种,即把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。

    分位数的分类

    1)第一四分位数(Q1),又称“较小四分位数”,或“下四分位数”,等于该样本中所有数值由小到大排列后第25%的数字;

    2)第二四分位数(Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字;

    3)第三四分位数(Q3),又称“较大四分位数”,或“上四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。

    第三四分位数与第一四分位数的差距又称四分位距。

    image-20221022204625556

    image-20221022204659336

    quantile()函数

    数据总量: 6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36

    排序结果: 6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49

    Q1 的位置=(11+1) × 0.25=3,

    Q2 的位置=(11+1)× 0.5=6,

    Q3的位置=(11+1) × 0.75=9

    Q1 = 15,Q2 = 40,Q3 = 43

    > x<-c(6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36)
    > y<-x[order(x)]
    > y
     [1]  6  7 15 36 39 40 41 42 43 47 49
    > q1<-quantile(x,0.25)
    > q1
     25% 
    25.5 
    > q2<-quantile(x,0.50)
    > q2
    50% 
     40 
    > q3<-quantile(x,0.75)
    > q3
     75% 
    42.5 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    > quantile(x)
      0%  25%  50%  75% 100% 
     6.0 25.5 40.0 42.5 49.0 
    
    
    • 1
    • 2
    • 3
    • 4

    百分位数

    百分位数百分位数,统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。如:30%分位点

    观测数据的第n个百分位数指在升序排列的数据中划分前n%的数据的值。

    为什么要用分位数?

    统计学中分位数的作用想必要追溯到很深入的层次,但就当下理解分位数的阶段,分位数起到的就是一个“临界值”的作用。

    随机产生一组学生成绩X=(44 58 69 61 68 74 50 54 62 60),想让10个学生中淘汰35%,请设定分数线?

    > X<-c(44,58,69,61,68,74,50,54,62,60)
    > quantile(X,0.35)
     35% 
    58.3 
    
    • 1
    • 2
    • 3
    • 4

    image-20221022205741925

    数据预处理

    在我们做数据的时候,一个数据会有很多特征;比如在描述影响房价的因素,有房子面积,房间数量等。而不同的特征存在不同的量纲,为了消除量纲、数值差异等,我们就需要对数据进行中心化和标准化

    中心化

    所谓中心化就是将数据减去均值后得到的,比如有一组数据(1,2,3,4,5,6,7),它的均值是4,中心化后的数据为(-3,-2,-1,0,1,2,3)

    标准化 (Standardization)

    scale函数标准化处理原理是计算每组的平均值和标准差,再求组内各个数值与其平均值的差(中心化后),与其标准差的比值,作为该数值在组内的相对数值。(考虑均值和离散程度)

    公式:

    y<-(x-mean(x))/sd(x)

    image-20221022205954242

    均值为0,标准差为1,一定是标准正态吗?

    任何分布的随机变量进行“标准化”后的均值都为0,方差都为1。所以你可以很轻松的构建出一个均值为0,方差为1的随机变量出来,然后去验证下它是否符合“标准正态分布”。标准正态分布的均值是0,标准差是1,但并不意味着均值为0,标准差为1的分布是标准正态分布。T分布的均值也0,标准差也可以为1。决定一个分布是否是标准正态分布的参数还有峰度和偏度,最重要的还是看概率密度函数吧。

    实例

    > x<-trunc(runif(20,400,600))
    > x
     [1] 580 494 531 597 410 434 457 441 454 574 432 497 551 599 585 469 487 557 488 518
    > y<-(x-mean(x))/sd(x)
    > y
     [1]  1.1895629 -0.2263874  0.3828005  1.4694600 -1.6094086 -1.2142597 -0.8355753
     [8] -1.0990079 -0.8849689  1.0907756 -1.2471887 -0.1769938  0.7120913  1.5023891
    [15]  1.2718855 -0.6380008 -0.3416392  0.8108785 -0.3251746  0.1687615
    > y<-round(y,2)
    > mean(y)
    [1] -0.001
    > sd(y)
    [1] 0.9997258
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    > y<-as.vector(scale(x))
    > y
     [1]  1.1895629 -0.2263874  0.3828005  1.4694600 -1.6094086 -1.2142597 -0.8355753
     [8] -1.0990079 -0.8849689  1.0907756 -1.2471887 -0.1769938  0.7120913  1.5023891
    [15]  1.2718855 -0.6380008 -0.3416392  0.8108785 -0.3251746  0.1687615
    > y<-(x-mean(x))/sd(x)
    > y
     [1]  1.1895629 -0.2263874  0.3828005  1.4694600 -1.6094086 -1.2142597 -0.8355753
     [8] -1.0990079 -0.8849689  1.0907756 -1.2471887 -0.1769938  0.7120913  1.5023891
    [15]  1.2718855 -0.6380008 -0.3416392  0.8108785 -0.3251746  0.1687615
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    数据中心化和标准化的区别

    中心化和标准化意义一样,都是消除量纲的影响

    中心化:数据-均值

    标准化:(数据-均值)/标准差数据

    中心化: scale(data,center=T,scale=F)

    数据标准化: scale(data,center=T,scale=T)或默认参数scale(data)

    归一化(Normalization)

    归一化:

    1)把数据变成(0,1)或者(-1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。

    2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。

    (1)Min-Max Normalization   x’ = (x - X_min) / (X_max - X_min)

    (2)平均归一化   x’ = (x - μ) / (MaxValue - MinValue)

    说明:(1)和(2)有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。

    (3)非线性归一化

    1)对数函数转换:y = log10(x)

    2)反正切函数转换:y = atan(x) * 2 / π

    说明:(3)经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。

    标准化和归一化

    (1)如果对输出结果范围有要求,用归一化。

    (2)如果数据较为稳定,不存在极端的最大最小值,用归一化。

    (3)如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。

    总结:对于数据进行预处理的操作包括:

    • 归一化(Min-Max Normalization、平均归一化,非线性归一)
    • 标准化 (Z-score规范化(标准差标准化 / 零均值标准化))
    • 中心化(x’ = x - μ)

    概率函数

    分布名称缩写分布参数名称
    Beta分布beta
    二项分布binom
    柯西分布cauchy
    (非中心)卡方分布chisq
    指数分布exp
    F分布f
    Gamma分布gamma
    几何分布geom
    超几何分布hyper
    对数正态分布lnorm
    Logistics分布logis
    多项分布multinom
    正态分布norm
    泊松分布pois
    Wilcoxon符号秩分布signrank
    t分布t
    均匀分布unif
    Weibull分布weibull
    Wilcoxon秩和分布wilcox

    image-20221022211935614

    image-20221022212020451

    协方差

    为什么需要协方差?

    标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集。如,要统计多个学科的考试成绩。

    协方差表示的是两个变量的总体的误差。

    如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。

    如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。

    二维问题的协方差

    image-20221022212210735

    三维问题的协方差矩阵

    image-20221022212223586

    协方差矩阵是个对称矩阵

    实例:

    > x<-c(2, 4, 6, 4)
    > y<-c(8, 10, 6, 12)
    > cov(x,y)
    [1] -1.333333
    
    > x.mean<-mean(x)
    > y.mean<-mean(y)
    > sum1<-sum((x-x.mean)*(y-y.mean))
    > sum1/(length(x)-1)
    [1] -1.333333
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    控制流

    语句(statement):一条单独的R语句或者一组复合语句(包含在花括号{}中的一组语句,分号分隔)

    条件(condition):一条最终被解析为真或假的表达式

    表达式(expression):一条数值或者字符串的求值语句

    序列(sequence):一个数值或字符串序列

    分支结构

    1) if-else结构

    x<-1
    if(x>0) print("positive")  else  print("negative")
    
    • 1
    • 2

    2)ifelse结构

    score<-c(50,60,90,46,89)
    ifelse(score>=60,"passed","failed")   
    [1] "failed" "passed" "passed" "failed" "passed"
    
    • 1
    • 2
    • 3

    image-20221022212901016

    3)switch结构:用于多分支情况

    switch(expression,list)
    
    • 1

    如果expr的取值在1-length(list)之间,则函数返回列表相应位置的值。如果expr的值超出范围,则无返回值。

    y<-3
    switch(y,fruit="apple",meat="beaf",vegetable="patato")
    [1] "patato"
    
    • 1
    • 2
    • 3

    重复和循环

    1)for结构

    for(var in seq) statement

    for循环将接受一个迭代器变量和一个向量参数。在每次循环中,迭代器变量会从向量中取得一个值。

    > for(i in 1:5) message("i=",i)
    i=1
    i=2
    i=3
    i=4
    i=5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2)while结构

    while(condition)   statement
    
    • 1
    i<-10
    while(i>0){
      print("hello");
      i<-i-1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用for循环和NULL,建立10以内的偶数向量,其中每次迭代均在向量上增加一个元素。

    z<-NULL
    for (i in seq(0,10,2)){
      z<-c(z,i)
    }
    z
    
    • 1
    • 2
    • 3
    • 4
    • 5

    自定义函数

    R语言中,自定义函数的基本格式为:

    myfun<-function(arglist){
       statements
        return(object)
                        }
    
    • 1
    • 2
    • 3
    • 4

    其中,myfun为函数名称;arglist为参数列表;大括号中的部分为函数体。

    例题:

    定义一个函数first1,找出向量中第一个1出现的位置。

    first1<-function(x){
      for(i in 1:length(x))
        if(x[i]==1){
          return(i)
        }
    }
    print(first1(c(2,2,1,1)))  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    first1<-function(x){
      return(which(x==1)[1])
    }
    print(first1(c(2,2,1,1))) 
    
    • 1
    • 2
    • 3
    • 4

    说明:which()产生x中所有值为1的索引,即位置向量。然后取位置向量的第一个元素。

    自定义函数,输出向量x中能被3整除的数的个数。

    count1<-function(x){
      cnt<-0
      for (i in x) {
        if(i%%3==0){
          cnt<-cnt+1
        }
      }
      return(cnt)
    }
    x<-1:25
    count1(x)#8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    count1<-function(x){
      cnt<-length(which(x%%3==0))
      return(cnt)
    }
    x<-1:25
    count1(x)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    编写R函数,输入一个整数n,如果n<=0,则中止运算,并输出“Please input a positive integer.”否则,如果n是偶数,则将n除以2,并赋值给n;否则,将3n+1赋值给n,不断循环,直到n=1,停止运算。并输出“Success”.

    #角谷定理
    first2<-function(n){
      if(n<=0){
        return("Please input a positive interger.")
      }
      while(n!=1){
        if(n%%2==0){
           n=n/2 
        }else{
          n=3*n+1
        }
      }
      return("Success")
    }
    first2(0)
    first2(25)
    first2(14)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    自定义函数,计算斐波那契数列的第n项,并进行调用,输出数列的第5项和前5项。

    fib<-function(n){
      if(n==1||n==2)
        return(1)
      else
        return(fib(n-1)+fib(n-2))
    }
    print(fib(5))
    
    for (i in 1:5)
      print(fib(i))
    
    sum=0
    for (i in 1:5)
      sum=sum+fib(i)
    print(sum)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    自定义函数,返回X的n次幂,并进行调用,输出5的3次幂。 递归函数。

    first3<-function(x,n){
      if(n==1){
        return(x)
      }else{
        return(x*first3(x,n-1))
      }
    }
    first3(5,3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    自定义函数,计算斐波那契数列的第n项,并进行调用,输出数列的第5项和前5项。

    fib<-function(n){
      if(n==1||n==2)
        return(1)
      else
        return(fib(n-1)+fib(n-2))
    }
    print(fib(5))
    
    for (i in 1:5)
      print(fib(i))
    
    sum=0
    for (i in 1:5)
      sum=sum+fib(i)
    print(sum)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    7.java项目-尚医通(7)
    泛型的类型擦除
    Python安装指南:安装Python、配置Python环境(附安装包)
    Pandas+Pyecharts | 上海市餐饮数据分析可视化
    python调用c++版本dll06-返回数组结构体
    30岁以上的程序员该何去何从?
    [自然语言处理] 基于pycorrector实现文本纠错
    纽禄美卡Neuromeka亮相美国FABTECH,展示用于焊接的3D视觉协作机器人
    Linux文件基本权限
    redis中springboot的redisTemplate简单的增删查
  • 原文地址:https://blog.csdn.net/W_chuanqi/article/details/127699893