15  数据挖掘

15.1 基本概念

数据挖掘(data mining)是利用相关的分析方法来实现一些

数据挖掘的核心思想是在寻找相关性。这种相关性就不仅仅局限于统计意义上的相关,更多会指向数据之间的相关性,无论是横向还是纵向的相关性。

15.2 认识数据

数据集是由数据对象组成。一个数据对象代表一个实体,通常来说数据对象用属性来描述。数据对象又称样本、实例、数据点或对象。若放在数据库中,则称为是数据元组。

15.2.1 什么是属性

属性(attribute)是一个数据字段,表示数据对象的一个特征。术语“维”一般用在数据仓库中。机器学习文献更倾向于使用术语“特征”,而统计学家则更愿意使用术语“变量”。数据挖掘和数据库的专业人士一般使用术语“属性”,我们也使用术语“属性”。

一个属性的类型由该属性可能具有的值的集合决定。属性可以是标称的、二元的、序数的或数值的。下面我们介绍每种类型。

15.2.1.1 标称属性

标称属性的值是一些符号或事物的名称。每一个值代表的是某种类别、编码或状态等。标称属性又是看做是分类的。

15.2.1.2 二元属性

是一个特殊的标称属性,只有两个状态:0和1。0表示该属性不出现,1表示的是该属性出现。 一个二元属性并非对称,若其状态的结果不是一样的。为方便,我们用1表示的是重要的结果。

15.2.1.3 序数属性

15.2.1.4 数值属性

R中的一些检验方式

apropos("\\.test$")
 [1] "ansari.test"          "bartlett.test"        "binom.test"          
 [4] "Box.test"             "chisq.test"           "cor.test"            
 [7] "fisher.test"          "fligner.test"         "friedman.test"       
[10] "kruskal.test"         "ks.test"              "mantelhaen.test"     
[13] "mauchly.test"         "mcnemar.test"         "mood.test"           
[16] "oneway.test"          "pairwise.prop.test"   "pairwise.t.test"     
[19] "pairwise.wilcox.test" "poisson.test"         "power.anova.test"    
[22] "power.prop.test"      "power.t.test"         "PP.test"             
[25] "prop.test"            "prop.trend.test"      "quade.test"          
[28] "shapiro.test"         "t.test"               "var.test"            
[31] "wilcox.test"         

15.3 相关分析

相关系数:

cor函数可直接计算相关系数,method包括kendallpearsonspearman

library(ggcor)
Warning: package 'ggcor' was built under R version 4.1.2
Registered S3 methods overwritten by 'ggcor':
  method from     
  &.gg   patchwork
  *.gg   patchwork

********************************************************
Note: As of version 0.9.8, ggcor does not change the
  default ggplot2 continuous fill scale anymore. To
  recover the previous behavior, execute:
    set_scale()
  Instead of using the set_scale() function, we
  recommend adding the 'scale_fill_*()' function
  to the plot as needed.
********************************************************

Attaching package: 'ggcor'
The following object is masked from 'package:stats':

    filter
corr <- cor(mtcars) 
knitr::kable(corr)
mpg cyl disp hp drat wt qsec vs am gear carb
mpg 1.0000000 -0.8521620 -0.8475514 -0.7761684 0.6811719 -0.8676594 0.4186840 0.6640389 0.5998324 0.4802848 -0.5509251
cyl -0.8521620 1.0000000 0.9020329 0.8324475 -0.6999381 0.7824958 -0.5912421 -0.8108118 -0.5226070 -0.4926866 0.5269883
disp -0.8475514 0.9020329 1.0000000 0.7909486 -0.7102139 0.8879799 -0.4336979 -0.7104159 -0.5912270 -0.5555692 0.3949769
hp -0.7761684 0.8324475 0.7909486 1.0000000 -0.4487591 0.6587479 -0.7082234 -0.7230967 -0.2432043 -0.1257043 0.7498125
drat 0.6811719 -0.6999381 -0.7102139 -0.4487591 1.0000000 -0.7124406 0.0912048 0.4402785 0.7127111 0.6996101 -0.0907898
wt -0.8676594 0.7824958 0.8879799 0.6587479 -0.7124406 1.0000000 -0.1747159 -0.5549157 -0.6924953 -0.5832870 0.4276059
qsec 0.4186840 -0.5912421 -0.4336979 -0.7082234 0.0912048 -0.1747159 1.0000000 0.7445354 -0.2298609 -0.2126822 -0.6562492
vs 0.6640389 -0.8108118 -0.7104159 -0.7230967 0.4402785 -0.5549157 0.7445354 1.0000000 0.1683451 0.2060233 -0.5696071
am 0.5998324 -0.5226070 -0.5912270 -0.2432043 0.7127111 -0.6924953 -0.2298609 0.1683451 1.0000000 0.7940588 0.0575344
gear 0.4802848 -0.4926866 -0.5555692 -0.1257043 0.6996101 -0.5832870 -0.2126822 0.2060233 0.7940588 1.0000000 0.2740728
carb -0.5509251 0.5269883 0.3949769 0.7498125 -0.0907898 0.4276059 -0.6562492 -0.5696071 0.0575344 0.2740728 1.0000000
library(tidyverse)
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
✔ ggplot2 3.4.0     ✔ purrr   1.0.1
✔ tibble  3.1.8     ✔ dplyr   1.1.0
✔ tidyr   1.3.0     ✔ stringr 1.5.0
✔ readr   2.1.4     ✔ forcats 0.5.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks ggcor::filter(), stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(patchwork)
library(broom)
# 生成已知参数的服从正态分布的随机数
rnorm_fixed <- function(N, mu = 0, sd = 1)
  scale(rnorm(N)) * sd + mu
y <- c(rnorm(15), exp(rnorm(15)), runif(20, min = -3, max = 0)) # Almost zero mean, not normal
x <- rnorm_fixed(50, mu = 0, sd = 1) # Used in correlation where this is on x-axis
y2 <- rnorm_fixed(50, mu = 0.5, sd = 1.5) # Used in two means
# Long format data with indicator
value <- c(y, y2)
group <- rep(c("y1", "y2"), each = 50)
signed_rank = function(x) sign(x) * rank(abs(x))

a <- cor.test(y, x, method = "pearson") # Built-in
b <- lm(y ~ 1 + x) # Equivalent linear model: y = Beta0*1 + Beta1*x
c <- lm(scale(y) ~ 1 + scale(x)) # On scaled vars to recover r
summary(a,b,c)
            Length Class  Mode     
statistic   1      -none- numeric  
parameter   1      -none- numeric  
p.value     1      -none- numeric  
estimate    1      -none- numeric  
null.value  1      -none- numeric  
alternative 1      -none- character
method      1      -none- character
data.name   1      -none- character
conf.int    2      -none- numeric  

15.3.1 spearman相关系数

这里将斜率理解为对于每一rank的变化,所获得的y的秩的变化。

a <- cor.test(y, x, method = "spearman") # Built-in
b <- lm(rank(y) ~ 1 + rank(x)) # Equivalent linear model

ggcor包内的函数as_cor_tbl将相关系数以tibble的格式显示。

df <- as_cor_tbl(corr)
df
# A tibble: 121 × 5
   .row.names .col.names      r .row.id .col.id
 * <chr>      <chr>       <dbl>   <int>   <int>
 1 mpg        mpg         1          11       1
 2 cyl        mpg        -0.852      10       1
 3 disp       mpg        -0.848       9       1
 4 hp         mpg        -0.776       8       1
 5 drat       mpg         0.681       7       1
 6 wt         mpg        -0.868       6       1
 7 qsec       mpg         0.419       5       1
 8 vs         mpg         0.664       4       1
 9 am         mpg         0.600       3       1
10 gear       mpg         0.480       2       1
# … with 111 more rows

还有更直接的方式,可以直接调用fortify_cor()可以对原始数据进行相关系数的计算。

df2 <- fortify_cor(mtcars)
df2
# A tibble: 121 × 5
   .row.names .col.names      r .row.id .col.id
 * <chr>      <chr>       <dbl>   <int>   <int>
 1 mpg        mpg         1          11       1
 2 cyl        mpg        -0.852      10       1
 3 disp       mpg        -0.848       9       1
 4 hp         mpg        -0.776       8       1
 5 drat       mpg         0.681       7       1
 6 wt         mpg        -0.868       6       1
 7 qsec       mpg         0.419       5       1
 8 vs         mpg         0.664       4       1
 9 am         mpg         0.600       3       1
10 gear       mpg         0.480       2       1
# … with 111 more rows

15.3.2 绘图

ggcor() package介绍

  • 其本质是调用来ggplot来进行绘图。

  • parameter xy: 可以使用的是cor_tbl 或原始数据;

  • mapping 和ggplot中的mapping的参数一致

其中的quickcor函数可以直接使用使用原始数据,而ggcor()并不能传入原始数据。

quickcor(mtcars, type = "upper") + geom_circle2()

quickcor(df,aes(.col.id,.row.id,fill=r))

在默认下的输出颜色为蓝色。

df02 <- fortify_cor(mtcars, type = "upper")
quickcor(df02,fill=r)

quickcor(mtcars, type = "lower", show.diag = FALSE) +  geom_square()

可以对对角元素(方差)进行颜色、大小等参数的设定。

quickcor(mtcars, cor.test = TRUE) +
  geom_square(data = get_data(type = "lower")) +
  geom_mark(data = get_data(type = "upper")) +
  # add_diag_label(size = 5, colour = "red") +
  remove_axis()

data("varespec", package = "vegan")
data("varechem", package = "vegan")
df <- mantel_test(varespec, varechem)
library(ggplot2)
df <- df %>%
  mutate(lty = cut(r, breaks = c(-Inf, 0, Inf),
                   labels = c("r <= 0", "r > 0")),
         col = cut(p.value, breaks = c(0, 0.01, 0.05, 1),
                   labels = c("< 0.01", "< 0.05", ">= 0.05"),
                   right = FALSE, include.lowest = TRUE))
quickcor(varechem, type = "upper") +
  geom_square() +
   # add_diag_label() +
  add_link(df, mapping = aes(colour = col,
                             size = r,
                             linetype = lty),diag.label = TRUE) +
  scale_fill_gradient2n() +
  scale_size_area(max_size = 3) +
  scale_linetype_manual(values = c("dotted", "solid")) +
  guides(
    fill = guide_colourbar(title = "corr", order = 1),
    colour = guide_legend(title = "Mantel's p", order = 2),
    size = guide_legend(title = "Mantel's r", order = 3),
    linetype = "none"
  )
Warning: `add_link()` is deprecated. Please see `?anno_link()` for more detail.

15.4 分类

分类在经典多元统计中就是一个判别(discrimination)。分类的目的与回归类似,但这时因变量是一个分类变量。

  • 当分类变量只有两个属性时候,可以采用logistic和probit回归

15.4.0.1 logistic 回归

对于一系列有两个结果的随机实验,最为简单的概率模型为伯努利概率模型。

15.4.0.2 Probit回归

15.4.1 导入数据

library("ISLR")
library("caret")

导入的数据需要有一些特征,对于分类数据

15.4.2 数据预处理

第一步就是要将我们的二元变量,有一些需要进行转换。 利用包caret中的函数dummyVars()

15.5 多元统计

多元正态分布是一个常见的多元概率分布,除此之外,还有多元对数分布,多项式分布。

15.5.1 随机向量

随机向量\(X=(X_1,X_2,\cdots ,X_n)\)

资料矩阵: \[ X=\begin{bmatrix} {a_{11}}&{a_{12}}&{\cdots}&{a_{1p}}\\ {a_{21}}&{a_{22}}&{\cdots}&{a_{2p}}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {a_{n1}}&{a_{n2}}&{\cdots}&{a_{np}}\\ \end{bmatrix} =(x_1,x_2,\cdots,x_p)=\begin{bmatrix}x_{(1)}\\x_{(2)}\\\vdots\\x_{(p)} \end{bmatrix} \] 其中\(x_1,x_2,\cdots,x_p\)即为p个随机变量

  • 欧氏距离:就是一个简单的二范数
  • 马氏距离:克服量纲差异造成的影响 定义X,Y两点之间的马氏距离: \[ d^2_m(X,Y)=(X-Y)'^\Sigma{-1}(X-Y) \] 定义X与总体之间的马氏距离: \[d^2_m(X,G)=(X-^\mu)'\Sigma{-1}(X-\mu) \] 其中的协方差是总体的协方差矩阵,其中的均值是总体的均值。

一元正态分布的密度函数

\[ f(x)=\frac{1}{2\pi} \]

\(X\sim N_p(\mu,\Sigma)\)

若p元随机变量\(X=(X_1,X_2,\cdots,X_p)\)的概率密度函数为 则称X遵从p元正态分布。

多元正态分布还可以用特征函数进行定义。

15.5.2 定义与说明

若正态随机向量\(X=(X_1,X_2)\)相互独立的随机变量,

多元正态分布的随机分量之集,多元正态分布并不一定。 \[ f(x_1,x_2)=\frac{1}{2\pi} \]

正态分布的条件分布仍然是:

以细分的元素进行证明。