데이터 분석 (Data Analysis)/R
[데이터분석기사 실기] 예시문제 풀이 - 로지스틱 회귀 (Logistric Regression) - 실기 작업 2유형
apdo
2021. 7. 8. 19:54
- 설명
아래는 백화점 고객의 1년 간 구매 데이터이다.
데이터 출처는 https://www.dataq.or.kr/www/main.do 입니다.
(가) 제공 데이터 목록
① y_train.csv : 고객의 성별 데이터 (학습용), CSV 형식의 파일
② X_train.csv, X_test.csv : 고객의 상품구매 속성 (학습용 및 평가용), CSV 형식의 파일
(나) 데이터 형식 및 내용
① y_train.csv (3,500명 데이터)
custid: 고객 ID
gender: 고객의 성별 (0: 여자, 1: 남자)
② X_train.csv (3,500명 데이터), X_test.csv (2,482명 데이터)
고객 3,500명에 대한 학습용 데이터(y_train.csv, X_train.csv)를 이용하여 성별예측 모형을 만든 후,
이를 평가용 데이터(X_test.csv)에 적용하여 얻은 2,482명 고객의 성별 예측값(남자일 확률)을
다음과 같은 형식의 CSV 파일로 생성하시오.(제출한 모델의 성능은 ROC-AUC 평가지표에 따라 채점)
답안 제출 예시
수험번호.csv 생성
write.csv(dataframe, "0000.csv")
library(dplyr)
setwd(".../kdata") # 워킹 디렉토리 설정
x.train <- read.csv("X_train.csv")
y.train <- read.csv("Y_train.csv")
x.test <- read.csv("X_test.csv")
x.train %>% tail(5)
y.train %>% head(5)
x.test %>% head(5)
# 트레이닝 셋
x.train %>% dim()
y.train %>% dim()
# 테스트 셋
x.test %>% dim()
# 학습할 데이터셋 병합
train <- merge(x.train, y.train, by='cust_id')
train %>% head(10)
# 결측값 처리
train %>% is.na() %>% sum() # sum(is.na(x.train))
train$환불금액 %>% is.na() %>% sum() # 환불금액에서 결측값이 있음을 알 수 있음
# - 결측값이 3500개 값 중 2295나 되기 때문에 삭제방법은 안됌. 대체방법을 강구
## 환불금액 변수 결측치 처리하기 위해 환불금액과 가장 관련있을 것 같은 변수 찾기
train$환불금액 %>% mean(na.rm=T)
train$환불금액 %>% summary()
ggplot(data=train, mapping=aes(x=환불금액)) +
geom_histogram(size=2, na.rm = T)
# 그래프 여러개 그려보고 찾아봤지만 관련없음. 다만 환불금액의
# 히스토그램을 그려보니 오른쪽으로 꼬리가 긴 분포로 형성
# 수치요약도 결측값 빼고 해보았는데 큰 특이사항이 없음
# 환불금액의 결측값 수가 많다는 건 환불 하지 않다고 생각할수도
# 있기 때문에 결측값을 0으로 대체하기로 판단
# 결측값 0으로 대체
train$환불금액[is.na(train$환불금액)== TRUE] = 0
train$환불금액 %>% head()
x.test$환불금액[is.na(x.test$환불금액)== TRUE] = 0
ggplot(data=train, mapping=aes(x=환불금액)) + # ggplot
geom_histogram(size=2, na.rm=T) + # 히스토그램
xlab("환불금액") + ylab("빈도수") + # 축 이름
coord_cartesian(xlim = c(0, 2.0e+08), ylim = c(0, 3000)) # 축 길이 설정
# 로지스틱 회귀분석
## 가정
plot(train$gender)
ggplot(train, aes(x=cust_id ,y=gender)) +
geom_point(size=0.5)
## 반응변수 별 병렬구조의 상자그림
train %>% ggplot(aes(factor(gender), 주말방문비율)) +
geom_boxplot()
## 반응변수에 따른 관심공변량과의 plot
train %>% ggplot(aes(주말방문비율, gender)) +
geom_point()
plot(train$gender, df$주구매상품)
model <- glm(gender ~주말방문비율, data = train, family = binomial (link = "logit"))
summary(model)
probabilities <- predict(model, type = "response")
train <- train %>%
mutate(logit = log(probabilities/(1-probabilities))) %>%
gather(key = "predictors", value = "predictor.value", -logit)
## 모형화
model <- glm(gender ~1 , data = train, family = binomial (link = "logit"))
final <- step(model, scope = list(lower = ~1, upper = ~총구매액+최대구매액+환불금액+주구매상품+주구매지점+내점일수+내점당구매건수+주말방문비율+구매주기), direction = "both")
summary(final)
final_predict <- predict(final, x.test, type="response")
write.csv(final_predict,"예측값 정답 제출.csv")
- 분석 특이사항
- 환불 변수 결측값 처리 -> 데이터를 유심히 보고 환불하지않은 값으로 처리했습니다.
- plot은 시험에 쓸 일이 없기 때문에 안보셔도 됩니다. 공부할때 데이터 이해하려고 사용했습니다
- step( )함수를 이용하여 변수선택은 단계적 선택법(전진+후진)으로 채택했습니다.
- 유심히 살펴보니까 test set으로 AUC값을 산출하지 못하더라고요. 따라서 다음 분석에는 AUC값 산출을 위해 train set에서 validataion set을 임의로 나누고 분석하기로 했습니다. (교차검증)