R

[빅분기 실기] 작업형 2번문제 EDA(데이터 뜯어보기)

한번해보즈아 2021. 6. 11. 18:32

현재 별다른 전처리 과정없이 랜덤포레스트 수행후 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이며 또 다른 아이디어가 생각나는데로 계속하여 추가해보겠습니다.