자유게시판

빅데이터/데이터 처리/데이터마이닝법을 배워보자 1편-변수 선택

yoon 작성일 : 04-19 16:46:27 조회수 : 845

데이터는 21세기의 금이다라는 얘기가 있다.  좋은 데이터만 있으면 원하는 결과를 예측 할 수 있기 때문이다.  그 상점의 위치 유동인구 날씨 등등 많은 정보만 넣으면 매출액을 유사하게 추론 할 수 있다면 사업을 시작하기 전에 많은 도움이 되지 않겟는가?

요즘 4차 산업혁명의 시대에 빅 데이터와 데이터 사이언스에 대한 관심이 많다.

한번 주마간산으로 배워보자.

준비물  

(1) 으-지

(2)R studio--완전유용한 데이터처리 플랫폼 control enter로 줄단위로 프로그램을 돌릴 수 있다.

(3)원하는 데이터셋 - kaggle.com 에서 데이터를 가지고 와서 공부하는것도 도움이 된다.

변수가 너무 많다고 할 때, 이를 처리해줘야한다. 예를들어 매출을 서명하는데 유동인구 날씨, 상품의 인기, 브랜드, ... 100개의 변수가 있다고 할때  다중 회귀분석을 하면서

Forward selection - 가장 의미가 있어보이는 것부터 선택하는 기법

Backward elimination - 가장 의미가 없어보이는 변수들을 버리는 기법

Stepwise selection - Forward와 백워드를 한번씩 하는 기법

을 통해 변수를 선택할 수 있다.

두 변수간에 상관관계가 높으면 효과가 엄청나게 떨어진다. 예를 들어서 날씨와 사람들의 불쾌지수는 서로 영향을 미치는 관계인데 둘 다 들어가 버리면 결론을 내리는데 더블 카운팅이 되어서 원하는 결과를 도출하지 못한다. 이를 다중공선성이라고 한다.

이를 줄이기 위해서 Ridge Regression , Lasso Regression 등을 쓴다.

또한 chi square analysis 를 통해 독립성을 관측해 볼 수 있다


#데이터 불러오기
german<-read.csv("German_credit.csv")

# regression
reg <- lm(Credit_amount ~ Duration_in_month + Installment_rate + Present_residence + Age +
Num_of_existing_credits + Num_of_people_liable, data=german)
summary(reg)

# Other useful functions
coefficients(reg) # model coefficients
confint(reg, level=0.95) # CIs for model parameters
fitted(reg) # predicted values
residuals(reg) # residuals
anova(reg) # anova table
vcov(reg) # covariance matrix for model parameters

# diagnostic plots
layout(matrix(c(1,2,3,4),2,2)) # optional 4 graphs/page
plot(reg)

german1<-cbind(german$Credit_amount,german$Duration_in_month,german$Installment_rate, german$Present_residence, german$Age
,german$Num_of_existing_credits,german$Num_of_people_liable)
colnames(german1)<-c("Credit_amount","Duration_in_month","Installment_rate", "Present_residence", "Age",
"Num_of_existing_credits", "Num_of_people_liable")

german1<-as.data.frame(german1)

 


# variable selection
install.packages('MASS')
library(MASS)

reg <- lm(Credit_amount ~ Duration_in_month + Installment_rate + Present_residence + Age +
Num_of_existing_credits + Num_of_people_liable, data=german1)
null <- lm(Credit_amount ~ 1, data = german1)
full <- lm(Credit_amount ~ ., data = german1)

# Partial F-test
reduced_model = lm(Credit_amount ~ Duration_in_month + Installment_rate + Present_residence +
Num_of_existing_credits + Num_of_people_liable, data=german1)
anova(reduced_model, full)

reduced_model = lm(Credit_amount ~ Duration_in_month + Installment_rate + Present_residence + Age +
Num_of_existing_credits, data=german1)
anova(reduced_model, full)

 

#전진선택법
forward <- step(null, direction = "forward",scope = list(lower=null, upper=full))
formula(forward)
summary(forward)


#후진소거법
backward <- step(reg, direction = "backward")
backward$anova
formula(backward)
summary(backward)


#교차선택법
stepwise <- step(null, direction = "both", scope = list(lower=null, upper=full))
stepwise$anova
formula(stepwise)
summary(stepwise)


# chi-square test
tab <- table(german$Checking_account, german$Saving_accout)
tab # the contingency table
chisq.test(tab)

# data partition
install.packages('caret')
library(caret)
train <- createDataPartition(german$ID, p=0.7, list=FALSE)
#분류,트레이닝비율, 결과를 리스트로 반환할지 행렬할지

training_data <- german[train,]
validation_data <- german[-train,]

# sampling
random_sampling <- german[sample(1:nrow(german), 300, replace = FALSE),]

install.packages('sampling')
library(sampling)
stratified_sampling <- strata(german, stratanames = c("Credit_status"), size =c(100,100),
method="srswor")
#srswor=simple random sampling without replacement
st_data <- getdata(german, stratified_sampling)
summary(st_data) #100개, 100개

#ridge, lasso, elastic
install.packages("tidyverse"); install.packages("broom"); install.packages("glmnet"); install.packages('dplyr');
library(tidyverse); library(broom); library(glmnet);
library('dplyr');

prostate<-read.csv("Prostate_Cancer_data.csv")
head(prostate)
y <- prostate$lpsa
x <- prostate %>% select(lcavol, lweight, age, lbph, svi, lcp, gleason, pgg45) %>% data.matrix()
lambdas <- seq(0, 0.3, by = .05)
cv_fit <- cv.glmnet(x, y, alpha = 0, lambda = lambdas)
#nfold = 10 (default)
#alpha =0 ridge, =1, lasso, =0.5 elasticnet
#cv.glmnet() uses cross-validation to work out how well each model generalises, which we can visualise as:
plot(cv_fit)
#그려지는 그림에서 가장 낮은 점이 최적의 람다이다
#CV에서 오차를 가장 최소화하는 로그 람다값

opt_lambda <- cv_fit$lambda.min
opt_lambda #테스트 set이 시행할때마다 바뀔수 있어 값이 바뀐다.
fin<-glmnet(x,y,alpha=0, lambda = opt_lambda)
coef(fin)


좋아요 수 :       0