【Rで多変量解析#4】判別分析(マハラノビスの距離)

記事の目的

判別分析をRを使用して実装していきます。データの作成から実装するので、コピペで再現することが可能です。

 

目次

  1. ライブラリ
  2. 単変量の場合
  3. 多変量の場合

 

1 ライブラリ

library(dplyr)
library(ggplot2)
library(MASS)

 

2 単変量の場合

2.1 データ

set.seed(1)
売り上げ <- c(rnorm(100, 2000, 70), rnorm(100, 1700, 70)) %>% round(1)
顧客 <- c(rep("顧客", 100), rep("退会", 100))
data <- data.frame(売り上げ, 顧客)
data %>% head()

 

2.2 データの可視化

data %>%
  ggplot(aes(売り上げ, fill=顧客))+
  geom_histogram(col="white")+
  theme_classic(base_family = "HiraKakuPro-W3")+
  theme(text=element_text(size=30)) +
  labs(title="ヒストグラム")+
  scale_x_continuous(breaks=seq(1600,2100, 200))+
  geom_vline(xintercept = mean(filter(data, 顧客=="退会")$売り上げ), size=2) +
  geom_vline(xintercept = mean(filter(data, 顧客=="顧客")$売り上げ), size=2)

 

2.3 判別分析

data1 <- filter(data, 顧客=="顧客")$売り上げ
data2 <- filter(data, 顧客=="退会")$売り上げ
D1 <- (data$売り上げ - mean(data1))^2/var(data$売り上げ)
D2 <- (data$売り上げ - mean(data2))^2/var(data$売り上げ)
data$D1 <- D1
data$D2 <- D2
data$判別 <- D1 < D2
data %>% sample_n(5)

 

3 多変量の場合

3.1 データ

set.seed(1)
売り上げ <- c(rnorm(50, 2000, 200), rnorm(50, 1700, 200)) %>% round(1)
利用回数 <- c(rpois(50, 30), rpois(50, 20))
顧客 <- c(rep("顧客", 50), rep("退会", 50))
data <- data.frame(売り上げ, 利用回数, 顧客)
data %>% sample_n(5)

 

3.2 データの可視化

data %>%
ggplot()+
geom_point(aes(売り上げ, 利用回数, col=顧客))+
geom_point(aes(mean(filter(data,顧客=="顧客")$売り上げ), mean(filter(data,顧客=="顧客")$利用回数)),
col="red", size=5)+
geom_point(aes(mean(filter(data,顧客=="退会")$売り上げ), mean(filter(data,顧客=="退会")$利用回数)),
col="blue", size=5)+
theme_classic(base_family = "HiraKakuPro-W3")+
theme(text=element_text(size=30)) +
labs(title="散布図")

 

3.3 判別分析

X <- data[,c(1,2)]
mu1 <- apply(filter(data[,c(1,2)], 顧客=="顧客"), 2, mean)
mu2 <- apply(filter(data[,c(1,2)], 顧客=="退会"), 2, mean)
V <- cov(X)
D1 <- t(t(X)-mu1) %*% solve(V) %*% (t(X)-mu1)
D2 <- t(t(X)-mu2) %*% solve(V) %*% (t(X)-mu2)
D1 <- mahalanobis(X,mu1,V)
D2 <- mahalanobis(X,mu2,V)
data$D1 <- D1
data$D2 <- D2
data$判別 <- D1 < D2
data %>% sample_n(5)