현재 별다른 전처리 과정없이 랜덤포레스트 수행후 pROC패키지로 점수를 매겼을때 0.64정도 나오는데 더 높이기 위해 데이터가 어떤 경향을 띄고 있는지 파악해보겠습니다. 원래 순서가 반대가 되야하는거 같은데 ... 현재는 자격증을 따기위해 점수높이기에 급급하기때문에 이런식으로 진행하겠습니다.
그리고 시험환경에서는 그래프를 그릴수가 없기떄문에 시각화를 통한 EDA는 못하고 자료를 통계내어서 수치형으로 살펴보는 방향으로 가겠습니다. (R에서 그래프를 빼는건 햄버거에 패티 안넣는거랑 똑같은거 같은데 ..?)
x_train <- read.csv("C:/R/[Dataset] 작업형 제2유형/X_train.csv")
y_train <- read.csv("C:/R/[Dataset] 작업형 제2유형/Y_train.csv")
full <- left_join(x_train, y_train, id="cust_id")
x_test <- read.csv("C:/R/[Dataset] 작업형 제2유형/X_test.csv")
summary(full)
> summary(full)
cust_id 총구매액 최대구매액 환불금액 주구매상품 주구매지점 내점일수
Min. : 0.0 Min. : -52421520 Min. : -2992000 Min. : 5600 Length:3500 Length:3500 Min. : 1.00
1st Qu.: 874.8 1st Qu.: 4747050 1st Qu.: 2875000 1st Qu.: 2259000 Class :character Class :character 1st Qu.: 2.00
Median :1749.5 Median : 28222700 Median : 9837000 Median : 7392000 Mode :character Mode :character Median : 8.00
Mean :1749.5 Mean : 91919252 Mean : 19664242 Mean : 24078216 Mean : 19.25
3rd Qu.:2624.2 3rd Qu.: 106507930 3rd Qu.: 22962500 3rd Qu.: 24120000 3rd Qu.: 25.00
Max. :3499.0 Max. :2323180070 Max. :706629000 Max. :563753000 Max. :285.00
NA's :2295
내점당구매건수 주말방문비율 구매주기 gender
Min. : 1.000 Min. :0.00000 Min. : 0.00 Min. :0.000
1st Qu.: 1.667 1st Qu.:0.02729 1st Qu.: 4.00 1st Qu.:0.000
Median : 2.333 Median :0.25641 Median : 13.00 Median :0.000
Mean : 2.835 Mean :0.30725 Mean : 20.96 Mean :0.376
3rd Qu.: 3.375 3rd Qu.:0.44898 3rd Qu.: 28.00 3rd Qu.:1.000
Max. :22.083 Max. :1.00000 Max. :166.00 Max. :1.000
summary결과 cust_id는 큰 영향을 미칠거같지 않아서 나중에 분석에 뺄것이며, 총구매액, 최대구매액에 음수가 있는걸로 봐서 자료를 좀더 면밀히 살펴봐야 할거같습니다. 그리고 숫자가 너무 크므로 단위를 10000원으로 나눠서 보는게 편할거같으며, 환불금액에는 na가 있는데 이건 아마도 min에 0인 값이 없는걸로 봐서 na는 0을 의미하는거같습니다.
그리고 총구매액, 최대구매액, 환불금액, 내점일수, 내점당구매건수,구매주기에서 이상치가 있을것으로 예상이 되는데 이부분을 어떻게 처리할지 고민해보겠습니다.( 현재는 표준화 할 예정)
full$최대구매액 <- full$최대구매액/10000
full$총구매액 <- full$총구매액/10000
full$환불금액 <- full$환불금액/10000
full$환불금액 <- ifelse(is.na(full$환불금액),0,full$환불금액)
full$주구매상품 <- as.factor(full$주구매상품)
full$주구매지점 <- as.factor(full$주구매지점)
full$gender <- as.factor(full$gender)
full <- full[,-1]
> summary(full)
총구매액 최대구매액 환불금액 주구매상품 주구매지점 내점일수
Min. : -5242.1 Min. : -299.2 Min. : 0.0 기타 : 595 본 점 :1077 Min. : 1.00
1st Qu.: 474.7 1st Qu.: 287.5 1st Qu.: 0.0 가공식품: 546 잠실점 : 474 1st Qu.: 2.00
Median : 2822.3 Median : 983.7 Median : 0.0 농산물 : 339 분당점 : 436 Median : 8.00
Mean : 9191.9 Mean : 1966.4 Mean : 829.0 화장품 : 264 부산본점: 245 Mean : 19.25
3rd Qu.: 10650.8 3rd Qu.: 2296.2 3rd Qu.: 264.2 시티웨어: 213 영등포점: 241 3rd Qu.: 25.00
Max. :232318.0 Max. :70662.9 Max. :56375.3 디자이너: 193 일산점 : 198 Max. :285.00
(Other) :1350 (Other) : 829
내점당구매건수 주말방문비율 구매주기 gender
Min. : 1.000 Min. :0.00000 Min. : 0.00 0:2184
1st Qu.: 1.667 1st Qu.:0.02729 1st Qu.: 4.00 1:1316
Median : 2.333 Median :0.25641 Median : 13.00
Mean : 2.835 Mean :0.30725 Mean : 20.96
3rd Qu.: 3.375 3rd Qu.:0.44898 3rd Qu.: 28.00
Max. :22.083 Max. :1.00000 Max. :166.00
주구매상품, 주구매지점을 factor로 변환해주고 환불금액 NA값을 0으로 바꿔주니 저런식으로 Min,Q1,Median값이 0으로 나옵니다 왜냐하면 3500개 자료중에서 약2200건의 자료값이 0인 비율이 약 60%가 넘기 때문입니다.
우리의 초점은 변수들을 이용하여 성별을 맞추는 것입니다. 여자는 0이고 남자는 1로 표현하였는데 여자가 남자보다 약 2배정도 많은것을 확인할수있습니다.
> full %>% filter(최대구매액 <0 | 총구매액 <0)
총구매액 최대구매액 환불금액 주구매상품 주구매지점 내점일수 내점당구매건수 주말방문비율 구매주기 gender
1 -299.200 -299.2 299.20 디자이너 본 점 1 1.000000 0.0000000 0 0
2 -5242.152 1361.6 9722.20 기타 본 점 18 4.444444 0.3375000 16 0
3 -1890.560 8230.6 52960.23 디자이너 부산본점 31 1.064516 0.2424242 11 0
> x_test <- read.csv("C:/R/[Dataset] 작업형 제2유형/X_test.csv")
> x_test %>% filter(최대구매액<0 | 총구매액 <0)
cust_id 총구매액 최대구매액 환불금액 주구매상품 주구매지점 내점일수 내점당구매건수 주말방문비율 구매주기
1 4079 -150000 -150000 150000 구두 분당점 1 1 0 0
2 4677 -37440000 -37440000 37440000 대형가전 본 점 1 1 0 0
개인적으로 여기가 해석하기가 제일 어려운 부분인거같습니다 ... 최대구매액과 총구매액이 음수로 나오는 사람은 train 데이터에서 총 3명인데 총구매액보다 환불금액이 많다는건 돈을 소비하고 온게 아니라 벌어왔다라는 의미로 보이는데 어떻게 이게 가능한건지 ??...
test데이터를 살펴보니 여기에도 음수가 있어서 날려버리지는 못할거같고... 어떤식으로 접근을 해야할까요 ?? 제발 알려주세요 (자료의 개수가 작아서 별 신빙성은 없지만 음수인값을 가지고 있는건 성별이 다 여자이네요)
> full %>% group_by(gender) %>%
+ summarise(mean_총구매액= mean(총구매액),
+ mean_최대구매액=mean(최대구매액),
+ mean_환불금액=mean(환불금액),
+ mean_내점당구매건수=mean(내점당구매건수),
+ mean_주말방문비율=mean(주말방문비율),
+ mean_구매주기=mean(구매주기))
# A tibble: 2 x 7
gender mean_총구매액 mean_최대구매액 mean_환불금액 mean_내점당구매건수 mean_주말방문비율 mean_구매주기
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0 11097. 2250. 1096. 2.90 0.291 20.2
2 1 6030. 1495. 386. 2.73 0.335 22.3
성별에 따른 평균값은 다음과 같습니다. 이게 자료가 이상값이 많고 오른쪽 꼬리가긴 분포라 평균을 쓰는게 맞나 싶지만 일단은 편의를 위해 평균으로 하였습니다. 참고로 평균이랑 중앙값 차이가 약 3배정도 났습니다..... 눈에 띄게 총구매액, 최대구매액, 환불금액에서 차이가 나네요
> full %>% filter(gender==0) %>%
+ group_by(주구매상품) %>%
+ summarise(count=n()) %>%
+ arrange(desc(count))
# A tibble: 41 x 2
주구매상품 count
<fct> <int>
1 기타 375
2 가공식품 317
3 농산물 247
4 화장품 196
5 시티웨어 169
6 디자이너 168
7 수산품 92
8 명품 61
9 캐주얼 60
10 섬유잡화 48
# ... with 31 more rows
> full %>% filter(gender==1) %>%
+ group_by(주구매상품) %>%
+ summarise(count=n()) %>%
+ arrange(desc(count))
# A tibble: 41 x 2
주구매상품 count
<fct> <int>
1 가공식품 229
2 기타 220
3 농산물 92
4 화장품 68
5 수산품 61
6 섬유잡화 50
7 골프 44
8 시티웨어 44
9 남성 캐주얼 42
10 캐주얼 41
# ... with 31 more rows
위에는 여자 밑에는 남자의 주구매 상품 탑10을 순서대로 나열한 자료입니다. 1~4위는 거의비슷하게 가공식품,기타, 농산물, 화장품으로 이루어져 있네요. 눈에 띄는 특징은 여자는 명품, 디자이너가 있고, 남자는 골프, 남성캐쥬얼이 있네요 주구매지점도 분석하였지만 눈에 띄는 특징은 없었습니다.
이제 종합해보면(2021.06.11기준)
1.cust_id 뺀다음 randomforest 돌려보기(AUC값: 0.6356 더 내려감)
2.정규화 보다는 이상값의 영향을 덜받는다는 표준화하여 randomforest돌려보기(AUC값: 0.6509 약간상승)
3. 위에서 살펴본 총구매액, 최대구매액, 환불금액 이 3가지만을 이용해서 randomforest, glm 돌려보기 (AUC값: 0.53 더 내려감)
이 세가지 방법을 통해서 돌려본다음 auc가 얼마나 상승하는지 알아보도록 하겠습니다. 현재는 0.647이며 또 다른 아이디어가 생각나는데로 계속하여 추가해보겠습니다.
'R' 카테고리의 다른 글
[빅분기 실기] 작업형2번 파생변수 추가후 랜덤포레스트 (0) | 2021.06.12 |
---|---|
[빅분기 실기] 작업형 2번 표준화후 RF AUC 0.6719 (0) | 2021.06.11 |
[빅분기 실기] pROC, ROCR의 차이점 (0) | 2021.06.11 |
[빅분기 실기대비] 단답형 예상 개념 ④ (0) | 2021.06.10 |
[빅분기 실기대비] 단답형 예상 개념 ③ (0) | 2021.06.10 |