Google Calendar에 추가한 Goal Alarm이 오질 않네요 여튼 그래서 수동으로 다시 시작합니다. 5일차때 다룬 Rossmann Store Sales 풀이 이어서 나가도록 하겠습니다. 저번에 제공 데이터를 str. summary 등의 함수를 가지고 한번 훑어보았데 train데이터만 보여줬는데 마저 test 데이터도 조회해보죠
summary(test)
## Id Store DayOfWeek Date
## Min. : 1 Min. : 1.0 Min. :1.000 Min. :2015-08-01
## 1st Qu.:10273 1st Qu.: 279.8 1st Qu.:2.000 1st Qu.:2015-08-12
## Median :20544 Median : 553.5 Median :4.000 Median :2015-08-24
## Mean :20544 Mean : 555.9 Mean :3.979 Mean :2015-08-24
## 3rd Qu.:30816 3rd Qu.: 832.2 3rd Qu.:6.000 3rd Qu.:2015-09-05
## Max. :41088 Max. :1115.0 Max. :7.000 Max. :2015-09-17
##
## Open Promo StateHoliday SchoolHoliday
## Min. :0.0000 Min. :0.0000 Length:41088 Length:41088
## 1st Qu.:1.0000 1st Qu.:0.0000 Class :character Class :character
## Median :1.0000 Median :0.0000 Mode :character Mode :character
## Mean :0.8543 Mean :0.3958
## 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :1.0000 Max. :1.0000
## NA's :11
test[is.na(test$Open), ] # Only store 622
## Id Store DayOfWeek Date Open Promo StateHoliday SchoolHoliday
## 1: 10752 622 6 2015-09-05 NA 0 0 0
## 2: 9040 622 1 2015-09-07 NA 0 0 0
## 3: 8184 622 2 2015-09-08 NA 0 0 0
## 4: 7328 622 3 2015-09-09 NA 0 0 0
## 5: 6472 622 4 2015-09-10 NA 0 0 0
## 6: 5616 622 5 2015-09-11 NA 0 0 0
## 7: 4760 622 6 2015-09-12 NA 0 0 0
## 8: 3048 622 1 2015-09-14 NA 1 0 0
## 9: 2192 622 2 2015-09-15 NA 1 0 0
## 10: 1336 622 3 2015-09-16 NA 1 0 0
## 11: 480 622 4 2015-09-17 NA 1 0 0
test$Open[test$Store == 622]
## [1] 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0
## [24] 1 1 1 1 1 1 0 1 1 1 1 1 NA 0 NA NA NA NA NA NA 0 NA NA
## [47] NA NA
여기에서 보면 위에 제가 볼드체로 표시한 부분 즉 실제 rows수를 보면 train데이터가 월등히 많네요. 1017209rows에 비해 test데이터는 턱없이 부족하고 그리고 dashboard에 issue로 올라온 것보면 622개의 데이터가 Open 컬럼이 NA로 되어있어 못쓴다라고 올라와있는데요. 하지만 이 row를 못쓰는건 아닙니다. 여기를 보면 아시다시피 Sale라는 컬럼이 닫혀있다면 0일수가 없으니 1로 간주하면 될거 같습니다. 이런걸 data munging이라고도 하는데 저희가 도메인을 파악하고 어떤 이유에서인지 알수 없거나 정리가 안된걸 직접 수정하여 trim처리를 하는 센스는 있어야 합니다. 게다가 테스트 데이터에는 Customers컬럼이 아예 빠져있는걸 알수 있습니다. 사후 데이터이기 때문이라네요 ?
여튼 그래서 아래와 같은 처리 합니다. NA인 녀석들을 싹다!!!! 1로 만들어버립시다
test[is.na(test)] <- 1
위의 문법은 test의 컬럼중 NA를 다 1로 채우는걸로 이해하면 됩니다
그다음에 다시
test[is.na(test$Open), ]
# Unique values per column
train[, lapply(.SD, function(x) length(unique(x)))]
## Store DayOfWeek Date Sales Customers Open Promo StateHoliday
## 1: 1115 7 942 21734 4086 2 2 4
## SchoolHoliday
## 1: 2
test[, lapply(.SD, function(x) length(unique(x)))]
## Id Store DayOfWeek Date Open Promo StateHoliday SchoolHoliday
## 1: 41088 856 7 48 2 2 2 2
# All test stores are also in the train data
sum(unique(test$Store) %in% unique(train$Store))
## [1] 856
# 259 train stores are not in the test data
sum(!(unique(train$Store) %in% unique(test$Store)))
## [1] 259
table(train$Open) / nrow(train) # Percent Open Train
##
## 0 1
## 0.1698933 0.8301067
table(test$Open) / nrow(test) # Percent Open Test
##
## 0 1
## 0.1456386 0.8543614
table(train$Promo) / nrow(train) # Percent of the time promo in train
##
## 0 1
## 0.6184855 0.3815145
table(test$Promo) / nrow(test) # Percent of the time promo in test
##
## 0 1
## 0.6041667 0.3958333
table(train$StateHoliday) / nrow(train) # Percent of the time holiday in train
##
## 0 a b c
## 0.969475300 0.019917244 0.006576820 0.004030637
table(test$StateHoliday) / nrow(test) # no b and c = no easter holiday and no christmas
##
## 0 a
## 0.995619159 0.004380841
table(train$SchoolHoliday) / nrow(train) # Percent of the time school holiday in train
##
## 0 1
## 0.8213533 0.1786467
table(test$SchoolHoliday) / nrow(test) # Percent of the time school holiday in test
##
## 0 1
## 0.5565129 0.4434871
plot(train$Date, type = "l")

plot(test$Date, type = "l")

# As expected all 856 stores to be predicted daily
all(table(test$Date) == 856)
## [1] TRUE
hist(train$Sales, 100)
hist(aggregate(train[Sales != 0]$Sales,
by = list(train[Sales != 0]$Store), mean)$x, 100,
main = "Mean sales per store when store was not closed")
hist(train$Customers, 100)

hist(aggregate(train[Sales != 0]$Customers,
by = list(train[Sales != 0]$Store), mean)$x, 100,
main = "Mean customers per store when store was not closed")
가게 넘버가 500~1000으로 부여된것이 실적이 좋네요 ㅎㅎ
그리고 ggplot으로 이제 뿌릴건데요 boxplot도 안에 껴서 그릴수가있습니다.
학교 휴일이냐 아니냐에 따라서 판매량을 한번 볼게요
ggplot(train[Sales != 0], aes(x = factor(SchoolHoliday), y = Sales)) +
geom_jitter(alpha = 0.1) +
geom_boxplot(color = "yellow", outlier.colour = NA, fill = NA)
box plot으로는 차이가 별로 없고 판매량은 휴일이 아닌경우 가 확실히 더 많네요. 까만영역이 더 높죠?!
후배님께서 술먹자고 가자고 하네요. 후아. 오늘도 여기까지. 아직 반도 안왔네요. 이거 !! 그래도 다음 차에는 확 끝내겠습니다!
'데이터분석' 카테고리의 다른 글
Kaggler's Day #8 (0) | 2016.06.10 |
---|---|
Kaggler's Day #7 (0) | 2016.06.08 |
Kaggler's Day #5 (0) | 2016.05.27 |
Kaggler's Day #3 (0) | 2016.05.16 |
Kaggler's Day #1 (0) | 2016.05.12 |