데이콘(생육 환경 최적화 경진대회) : EDA
최종결과1 : 케이스별 잎 면적(무게)
최종결과2 : 시간대별 생육환경의 변화
케이스별 잎 면적(무게) 변화
#### 1. 분석 준비 ####
pacman::p_load(tidyverse) # 데이터 전처리 관련 패키지
#### 2. 기본 데이터 로딩 ####
labels <- list.files(path="label", full.names = T) %>%
lapply(read_csv, show_col_types = F) %>% bind_rows
meta_train <- list.files(path="train_meta", full.names = TRUE) %>%
lapply(function(x) read_csv(x, show_col_types = F) %>%
mutate(img_name=x, .before=1)) %>% bind_rows()
#### 3. EDA ####
data1 <- data2 <- labels %>%
mutate(case=str_sub(img_name, 5, 6), time=as.integer(str_sub(img_name, 8, 9)))
names(data2)[3] <- "cases"
data1 %>% ggplot(aes(time, leaf_weight)) +
geom_line(data=data2, aes(time, leaf_weight, group=cases), color="gray50") +
geom_line(size=1) + facet_wrap(~case, ncol=10) + theme_bw()
회색선은 73개 전체 케이스의 데이터입니다. 그리고 각각의 굵은 선이 해당 케이스의 데이터들이 시간에 따라 어떻게 달라지는지를 나타냅니다. 대략적으로 볼 때 32~45는 매우 잘 자라는 경우에 해당하는 것 같습니다. 반면에 26, 70, 73번 경우의 경우 청경채가 말라 죽어가는 것 같습니다.
케이스별 평균 환경
ez_compare1 <- function(case="CASE01"){
data <- meta_train %>%
select(img_name, 시간, 내부온도관측치, 내부습도관측치, CO2관측치, EC관측치,
최근분무량, 총추정광량, 백색광추정광량, 적색광추정광량, 청색광추정광량) %>%
rename(temp=3, humi=4, CO2=5, EC=6, water=7, light=8, light_w=9, light_r=10, light_b=11) %>%
filter(grepl(case, img_name)) %>% select(-시간) %>%
group_by(img_name) %>% summarise_all(list(mean), na.rm=T)
col_name <- data %>% mutate(img_name=str_sub(img_name, 5,-1)) %>% pull(img_name)
data1 <- data %>% select(-1) %>% t() %>% data.frame() %>% na.omit()
colnames(data1) <- col_name
data1 <- data2 <- data1 %>% mutate(time=1:nrow(.)) %>% pivot_longer(-time)
colnames(data2)[2] <- "names"
p <- data1 %>% ggplot(aes(time, value)) +
geom_line(data=data2, aes(time, value, group=names), color="gray50") +
facet_wrap(~name) + geom_line(size=1) + theme_bw()
data <- head(data, 5) %>% bind_rows(tail(data, 5))
return(list(data, p))
}
ez_compare1("CASE18|CASE20")
## [[1]]
## # A tibble: 10 x 10
## img_name temp humi CO2 EC water light light_w light_r light_b
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 train_meta/CASE~ 25.0 35.3 539. 4.03 613. 565. 309. 99.3 157.
## 2 train_meta/CASE~ 24.1 34.5 499. 4.09 646. 565. 309. 99.3 157.
## 3 train_meta/CASE~ 24.5 34.4 503. 4.14 709. 565. 309. 99.3 157.
## 4 train_meta/CASE~ 24.6 40.9 521. 4.14 583. 565. 309. 99.3 157.
## 5 train_meta/CASE~ 24.6 43.7 538. 4.17 483. 565. 309. 99.3 157.
## 6 train_meta/CASE~ 25.4 65.6 801. 0.712 495. 187. 152. 13.3 21.7
## 7 train_meta/CASE~ 25.7 65.9 783. 0.664 622. 187. 152. 13.4 21.8
## 8 train_meta/CASE~ 25.5 68.4 782. 0.186 606. 187. 152. 13.4 21.7
## 9 train_meta/CASE~ 25.6 71.5 764. 0.0543 475. 187. 152. 13.4 21.7
## 10 train_meta/CASE~ 25.4 72.5 778. 0.381 593. 187. 152. 13.4 21.8
##
## [[2]]
그래프의 x축은 각각 1(실내온도), 2(실내습도), 3(CO2), 4(EC관측치), 5(최근분무량), 6(총광량), 7(백색추정광량), 8(적색추정광량), 9(청색추정광량)에 해당됩니다. 원래 막대 그래프로 그려야 옳은데 각각의 값이 어떻게 다른지 시각화하려다보니 꺾은 선으로 표현했네요.
18보다 20번 케이스에서 CO2 분량이 더 많다는 것을 알 수 있습니다. 반면에 20번은 18번에 비해 총광량이 적은 것 같네요. CASE 번호 별로 나름대로의 독특한 환경이 있는 것 같습니다. 이산화탄소, 물, 빛 등의 값이 조금씩 다른 것 같습니다. 그리고 같은 18번 케이스의 경우라도 시간이 지남에 따라 물의 양이 조금씩 바뀌고 있는 것도 확인할 수 있습니다.
이는 하루 동안의 평균에 해당하는 값으로 실제 시간, 분단위로 어떻게 다른지도 살펴보아야합니다.
시간에 따른 생육환경
ez_compare2 <- function(cases="CASE01_01|CASE01_02"){
data <- meta_train %>%
select(img_name, 시간, 내부온도관측치, 내부습도관측치, CO2관측치, EC관측치,
최근분무량, 총추정광량, 백색광추정광량, 적색광추정광량, 청색광추정광량) %>%
rename(temp=3, humi=4, CO2=5, EC=6, water=7, light=8, light_w=9, light_r=10, light_b=11) %>%
filter(grepl(cases, img_name)) %>%
mutate(시간=str_sub(시간, 12,13)) %>%
group_by(img_name, 시간) %>% summarise_all(list(mean), na.rm=T) %>% ungroup() %>%
mutate(img_name=paste0(paste0(str_sub(img_name, 5, 9)), ".", 시간)) %>% select(-c(2))
colname <- data %>% pull(img_name)
data1 <- data %>% select(-1) %>% t() %>% data.frame() %>% na.omit()
names(data1) <- colname
data1 <- data2 <- data1 %>% mutate(time=1:nrow(.)) %>% pivot_longer(-time) %>%
separate(name, into=c("case", "hour"), sep="\\.") %>%
mutate(hour=paste0("H", hour))
colnames(data2)[3] <- "names"
p <- data1 %>% ggplot(aes(time, value)) +
stat_summary(data=data2, aes(time, value, group=names, color=names),
color="gray50", fun=mean, geom = "line") +
facet_wrap(~hour) + geom_line(aes(color=case), size=1) + theme_bw()
return(p)
}
ez_compare2("CASE01_01")
앞에서와 마찬가지로 회색 선은 해당 변수의 변화를 나타냅니다. 그리고 붉은색 선은 해당 시간대에서의 값을 가리킵니다. 3번은 CO2, 6번은 총 광량을 가리킵니다. 5번은 물을 의미하는데 하루 종일 물은 주지 않았고, CO2의 경우 낮 시간대는 약간 줄이고 빛의 양은 조금 늘렸네요. 이렇게 해도 몇 일 동안이나마 청경채가 자라는 이유는 전이나 그 전에 준 물이 있었기 때문입니다. 단순히 하루 동안의 환경에 의해 청경채의 성장이 좌우되는 것만은 아니라는 뜻이기도 합니다. 하루전, 혹은 몇 일 전의 생육 환경까지 모두 알고 있어야 제대로 잎의 면적(무게) 변화를 예측할 수 있을 것 같습니다. 그런 맥락에서 딱 하루치의 정보만 제공하는 test 데이터를 바탕으로 잎의 면적(무게) 변화를 예측하는 것은 다소 무리가 있어 보입니다.
시간에 따른 생육환경의 비교1
ez_compare2("CASE01_01|CASE02_01")
1번 케이스와 2번 케이스를 비교해 보았습니다. 거의 완벽하게 일치합니다. 원래 하나의 데이터인데 억지로 2개로 구분한 것이 아닌가 생각됩니다.
시간에 따른 생육환경의 비교2
ez_compare2("CASE32_01|CASE70_01")
32번 케이스는 청경채가 매우 잘 자라는 환경입니다. 반면에 70번은 청경채가 말라 죽는 환경이죠. x축의 5번은 최근 분무량입니다. 즉 32번 케이스는 물을 풍부하게 제공하고 있다는 뜻입니다. 총광량의 경우 32번이나 70번이나 큰 차이가 없어 보입니다. 32번의 경우 9시와 10 때 갑자기 빛을 끊었는데 이것이 생장에 영향을 주었을지도 모르겠지만 가장 큰 차이는 물의 양에 있다는 생각이 듭니다.
시간에 따른 생육환경의 비교3
ez_compare2("CASE33_01|CASE55_01")
33번은 매우 잘 자라는 경우에 해당하고 55번은 잘 자라는 무리 중에서 가장 처지는 수준입니다. 자정 시간대에 물을 주는 지의 여부만 차이가 있을 뿐 나머지는 거의 똑같은 환경입니다. 32, 33번에서 55번까지 생육이 잘 되는 환경들은 거의 비슷한데 개체의 특성 때문에 어떤 것은 잘 자라고 어떤 것은 상대적으로 덜 자라는 것은 아닌가하는 생각도 듭니다.
이런 방식으로 다양한 생육 환경을 비교할 수 있습니다.
댓글남기기