통계 이야기

빅데이터 분석 ; LDA(선형판별분석) QDA(2차판별분석)

창이 2021. 7. 20.
728x90
반응형

data는 kaggle에 있는 고객데이터 사용하였습니다.

  • customer id ; 연속형 (고객아이디)
  • Gender : 이산형(성별)
  • Age : 여기서는 연속형으로 사용 (나이)
  • Annual Income : 연속형(소득)
  • Spending Score ; 연속형 (소비점수)

탐색

data <- read.csv('Mall\_Customers.csv')  
attach(data)  
str(data)

자료 구조 파악 ; 5개 변수, 200개의 행들

barplot(table(data$Gender))

이산형 변수 그래프로 탐색

par(mfrow= c(2, 2))  
hist(data$Age)  
hist(data$Annual.Income..k..)  
hist(data$Spending.Score..1.100.)

summary(data)

200개 중 70%를 train, 나머지를 test로 지정한다.

index <- sample(nrow(data),nrow(data)\*0.7)  
train<-data\[index,\]  
test<-data\[-index,\]

선형판별함수 사용

ld1 <- lda(formula = Gender~Age + Annual.Income..k..+ Spending.Score..1.100., data = data)

y1 <- table(pred1$class,test$Gender)  
y1

Result
Female Male
Female 34 20
Male 3 3

accuracy<-function(x){
sum(x\[row(x) == col(x)\])/sum(x)
}accuracy(y1)

정분류율 검사

0.6166667

오분류율 검사

1-accuracy(y1)

0.3833333

(여러 사전확률에 따른 모델의 성능 확인)

set.seed(NULL)  
acc <- c()  
for (x in 1:10){
index <- sample(nrow(data),nrow(data)\*0.7)
train<-data\[index,\]
test<-data\[-index,\]
ld1 <- lda(formula = Gender ~ ., data = train)
pred1 <- predict(ld1,test)
y1 <- table(pred1$class,test$Gender)
acc<-c(acc,accuracy(y1))
}
acc

0.5000000 0.5000000 0.5500000 0.5333333 0.5666667 0.4833333 0.4333333 0.5500000 0.5000000 0.4500000

mean(acc)

0.5066667

sd(acc)

0.04388537

사전확률 = 7:3로 랜덤샘플 10회 반복 시행

acc1 <- c()  
for (x in 1:10){
index <- sample(nrow(data),nrow(data)\*0.7)
train<-data\[index,\]
test<-data\[-index,\]
ld1 <- lda(formula = Gender ~ Age + Annual.Income..k..+ Spending.Score..1.100., data = train,prior = c(0.7,0.3))
pred1 <- predict(ld1,test)
y1 <- table(pred1$class,test$Gender)
acc1<-c(acc1,accuracy(y1))
}
acc1

0.5000000 0.5666667 0.5000000 0.5833333 0.5166667 0.5666667 0.5166667 0.5166667 0.5166667 0.5500000

mean(acc1)

0.5333333

sd(acc1)

0.03042903

사전확률 = 3:7로 랜덤샘플 10회 반복 시행

acc2 <- c()  
for (x in 1:10){
index <- sample(nrow(data),nrow(data)\*0.7)
train<-data\[index,\]
test<-data\[-index,\]
ld1 <- lda(formula = Gender ~ Age + Annual.Income..k..+ Spending.Score..1.100., data = train,prior = c(0.3,0.7))
pred1 <- predict(ld1,test)
y1 <- table(pred1$class,test$Gender)
acc2<-c(acc2,accuracy(y1))
}
mean(acc2)

0.4133333

sd(acc2)

0.06226189

acc2

0.3666667 0.3666667 0.5000000 0.4666667 0.4500000 0.3500000 0.3166667 0.4333333 0.4833333 0.4000000

boxplot(list(acc,acc1,acc2),names = c("default","7:3","3:7"),
main = "Accuracy Box-plot" )

                 반복 수       average accuracy      sd

Bayes(default) 10 0.5066667 0.04388537
Bayes(7:3) 10 0.5333333 0.03042903
Bayes(3:7) 10 0.4133333 0.06226189

728x90
반응형

댓글

추천 글