데이터 분석 (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")
  • 분석 특이사항
  1. 환불 변수 결측값 처리 -> 데이터를 유심히 보고 환불하지않은 값으로 처리했습니다.
  2. plot은 시험에 쓸 일이 없기 때문에 안보셔도 됩니다. 공부할때 데이터 이해하려고 사용했습니다
  3. step( )함수를 이용하여 변수선택은 단계적 선택법(전진+후진)으로 채택했습니다.
  4. 유심히 살펴보니까 test set으로 AUC값을 산출하지 못하더라고요. 따라서 다음 분석에는 AUC값 산출을 위해 train set에서 validataion set을 임의로 나누고 분석하기로 했습니다. (교차검증)