도매시장 경락 데이터의 이해 - 대파
이번 post에서는 대파 도매시장 경락 데이터를 가공해 보고자 한다. 데이터는 앞서 배추 post에서 언급되었듯이 농림축산식품교육문화정보원에서 수집하여 공공데이터포털을 통해 제공되는 농수축산물 도매시장 상세 경락가격 Open API에서 수집한 데이터로 AWS S3 Agdata Lab 저장소에서 다운로드할 수 있다. 다만 수집 기간은 배추와 달리 2015년 1월부터 2018년 7월 30일까지이며, 배추와 마찬가지로 해당 기간 전국 농산물 공영도매시장에서 거래된 모든 대파 품목의 데이터가 기록되어 있다.
앞선 배추 관련 post들에서 데이터 가공 및 시각화와 관련된 R코드와 설명은 충분히 된 것으로 생각하고 이번 post는 대파 데이터 설명에 필요한 코드를 제외한 부분은 생략하고 결과를 중심으로 간략하게 작성하였다.
먼저 대파 중에서도 어떤 대파를 분석할 지를 정해야 한다. 해당 데이터에 분류된 대파의 세부품목은 대파(일반), 대파(수입), 깐대파, 기타, 중파 이렇게 총 5가지이다. 각 품목을 거래량 순서대로 아래와 같이 나열하면 거래량이 대파(일반), 깐대파, 기타, 대파(수입), 중파 순임을 알 수 있다.
dat <- read.csv('bigonion_2015_2018.csv')
## # A tibble: 5 x 2
## spename n
## <fct> <int>
## 1 대파(일반) 1348008
## 2 깐대파 37151
## 3 기타 8446
## 4 대파(수입) 7341
## 5 중파 5935
이때 대파(일반)의 거래량이 다른 품목들에 비해 거래량이 압도적으로 많고 각 품목별 평균 가격을 살펴보면 이상치 제외 및 단위 통일을 시켜주지 않아 실제 평균값과는 큰 차이가 있겠지만 각 품종별로 가격의 특성이 다른 것을 볼 수 있다. 따라서 이번 분석에는 대파(일반) 데이터만을 필터링하여 사용하였다.
필터링 된 일반 대파 데이터 측정치의 총 개수는 1,348,008개이다. 이는 하루 평균 1560건 정도의 거래가 일어났다는 것을 뜻하고 상위 거래 건수에 해당되는 날짜를 찾아보면 2015년 가을쯤 거래량이 많은 경우에는 2000건 이상의 거래가 하루에 이루어졌다는 것을 알 수 있다.
dat <- dat %>%
filter(spename == '대파(일반)')
dat %>% group_by(date) %>% tally() %>% arrange(desc(n)) %>% head()
## # A tibble: 6 x 2
## date n
## <int> <int>
## 1 20150921 2445
## 2 20150922 2209
## 3 20150924 2177
## 4 20151005 2169
## 5 20151019 2127
## 6 20150923 2123
gh1 <- ggplot(dat, aes(x = price_per_kg)) + geom_histogram(fill = "red", color = "red", bins = 1000)
gh2 <- ggplot(dat %>% filter(price_per_kg<=5000), aes(x = price_per_kg)) + geom_histogram(fill = "firebrick2", color = "firebrick2", bins = 1000)
grid.arrange(gh1, gh2, ncol=1, nrow=2)
날짜, 지역 변수 추가, 단위 통일(kg) 등의 처리 과정을 거쳐 분석에 필요한 변수를 생성한다. 필요한 변수가 다 생성되었으니 이제 데이터를 한번 살펴보도록 하자. Price_per_kg 변수를 활용해 Kg 당 가격을 히스토그램으로 그려보면 전체적인 모습은 다음과 같다. 대체로 1000원에서 2000원 사이에 집중되어 있지만 배추의 경우와 마찬가지로 kg 당 가격이 60만원을 호가하는 금대파가 존재하는 것을 볼 수 있다. 이러한 비정상적인 가격을 보이는 거래들을 살펴보면 모두 단위가 kg이지만 0.1kg 미만인 경우가 많았다. 거래가 100g 단위로 이루어진다고 보기 힘들기 때문에 ton 단위를 모두 kg 단위로 입력했을 것이라는 추측을 해볼 수 있다. 실제로 무게가 0.1 이하인 즉, ton 단위인데 kg으로 기록 됐을 가능성이 큰 데이터들을 필터링해서 순서대로 나열해보면 데이터 개수가 많지는 않지만 터무니 없이 높은 가격을 보이는 데이터가 존재했다. 따라서 이러한 이상값들을 제외 시키기 위해 100g 미만의 거래단량을 가진 데이터는 삭제하였다.
subplot(ggplotly(g3b), ggplotly(g3c), ggplotly(g3d),ggplotly(g3a), margin = 0.05, nrows=2)
이렇게 일부 이상치들을 제외시키더라도 극히 일부에 불과하기 때문에 다시 한번 데이터를 정제할 필요가 있다. 그러나 명확한 기준이 정해져 있지 않기 때문에 약 1700개에 해당하는 Kg당 가격이 5000원 이상인 데이터는 제외하고 시각화 분석을 진행했다. 분석을 진행하는 데에 필요한 코드에 대한 설명은 도매시장 경락 데이터의 이해 – 배추(2/3)을 참고하면 된다.
연도-월 반입량
먼저 연도-월 반입량이다. 배추 분석과 같이 3D 그래프와 색을 활용해 반입량을 나타내었다. 대파의 경우 월별로 큰 차이는 보여지지 않지만 주로 봄과 가을에 반입량이 많음을 확인할 수 있다. 또한 전체적으로 2017년의 반입량 다른 연도에 비해 많다는 것도 알 수 있다.
input_year_month <- data3 %>% group_by(year,month) %>% summarise(input=sum(weight,na.rm=T)) %>% spread(month,input,fill=0) %>% ungroup()
d5 <- as.matrix(input_year_month[,-1])/1000
hist3D(z = d5, x = as.numeric(t(input_year_month[,1])), y = 1:12, scale = F, expand = 0.00005,
bty = "g", phi = 30, theta = 20, col = jet.col(100), alpha = 0.5, border = "black",
shade = 0.2, ltheta = 90, space = 0.4, ticktype = "detailed", d = 2, xlab='year',ylab='month',zlab='ton')
연도-월 가격
다음은 연도-월 가격이다. 대파의 경우 2015년부터의 데이터를 사용했기 때문에 실질가격과 명목가격을 구분할 필요는 없다. 2015년의 경우 예외이지만 대체로 겨울, 초봄의 대파 가격이 가장 높은 것으로 보인다.
price_year_month <- data3 %>% group_by(year,month) %>% summarise(price=mean(price_per_kg,na.rm=T)) %>% spread(month,price,fill=0) %>% ungroup()
d6 <- as.matrix(price_year_month[,-1])
hist3D(z = d6, x = as.numeric(t(price_year_month[,1])), y = 1:12, scale = FALSE, expand = 0.001,
bty = "g", phi = 30, theta = 20, col = jet.col(100), alpha = 0.5, border = "black", shade = 0.2,
ltheta = 90, space = 0.4, ticktype = "detailed", d = 2, xlab='year',ylab='month',zlab='nominal_price')
산지-월 출하량
결측치를 포함한 상위 10개 지역의 출하량을 비교해 보았다. 한 눈에 보기에도 전남과 경기에 대부분의 출하량이 집중되어 있고 특히 대파 최대 산지인 신안, 진도 등이 밀집되어 있는 전남이 압도적으로 많은 출하량을 보인다. 전남의 경우 1~4월, 12월이 주출하기이고 경기는 전남의 출하가 없는 5~11월이 주출하기이다. 나머지 지역들은 전남의 출하가 멈추는 5~11월에 경기 출하량으로 부족한 나머지 부분을 조금씩 공급해 전체적인 수급을 맞추는 형세를 보인다. 전남과 경기의 뒤를 잇는 강원은 특이하게 8~11월 사이에 집중적으로 대파를 출하하는 것을 알 수 있다. 또 다른 대파 산지로 알려진 부산의 경우 총 출하량은 강원에 뒤지지만 사시사철 꾸준하게 출하량을 유지하고 있다
input_sanji_month <- data3 %>% group_by(sanji_wide2,month) %>% summarise(input=sum(weight,na.rm=T)) %>% spread(month,input,fill=0) %>% ungroup()
input_sanji_month <- input_sanji_month %>% mutate(total=apply(input_sanji_month[,-1],1,sum)) %>% arrange(desc(total))
d8 <- as.matrix(input_sanji_month[1:10,2:13])/1000
hist3D(z = d8, x=1:10, y=1:12, scale = FALSE, expand = 0.0001, bty = "g", phi = 40, theta = 15,
col = jet.col(100), alpha = 0.5, border = "black", shade = 0.2, ltheta = 90, space = 0.4,
ticktype = "detailed", d = 2, xlab="전남 경기 결측 강원 부산 충북 경남 충남 전북 인천", ylab="month", zlab='ton', cex.lab=1.1)
산지별 명목가격
산지별 월별 가격도 마찬가지로 실질가격과 명목가격으로 구분하지 않았다. 먼저 산지별로 살펴보면 출하량이 집중된 1~3월의 경우 출하량이 가장 많은 전남, 경기, 강원의 대파 가격이 하위권인 것을 볼 수 있는데 이는 물량이 다른 지역에 비해서 많기 때문으로 추정된다. 나머지 기간은 지역별로 주목할만한 차이가 보이진 않는다. 다만 월별로 살펴보면 기간별로 가격이 확연하게 차이남을 볼 수 있다. 1~3월은 대체로 가격이 높게 형성되며 4~7월에 급락한 후 8월부터 다시 상승하는 추세를 보인다. 정확한 이유는 알 수 없으나 앞서 산지-월 출하량 그래프에서 보았듯이 4~7월의 경우 이 시기 주산지인 경기뿐만 아니라 여러 지역에서 고르게 생산되기 때문으로 해석할 수 있다.
price_sanji_month <- data3 %>% group_by(sanji_wide2,month) %>% summarise(price=mean(price_per_kg,na.rm=T)) %>% spread(month,price,fill=0) %>% ungroup()
price_sanji_month <- merge(input_sanji_month[,c(1,14)],price_sanji_month, by='sanji_wide2',all.x=T) %>% arrange(desc(total))
d8b <- as.matrix(price_sanji_month[1:10,3:14])
hist3D(z = d8b, x=1:10, y=1:12, scale = FALSE, expand = 0.002, bty = "g", phi = 40, theta = 15, col = jet.col(100), alpha = 0.5,
border = "black", shade = 0.2, ltheta = 90, space = 0.4, ticktype = "detailed", d = 2,
xlab="전남 경기 결측 강원 부산 충북 경남 충남 전북 인천", ylab="month", zlab='ton', cex.lab=1.1)
산지-월 출하량+가격
산지별, 월별 출하량, 가격을 종합적으로 나타내면 다음과 같다.
dat_sanji_month_long <- melt(input_sanji_month[1:10,-14], id=c('sanji_wide2'), variable.name = 'month',value.name = 'input')
tmp4 <- melt(price_sanji_month[,-2], id=c('sanji_wide2'), variable.name = 'month', value.name = 'price')
dat_sanji_month_long <- merge(dat_sanji_month_long,tmp4, by=c('sanji_wide2','month'),all.x=T)
dat_sanji_month_long$month <- as.numeric(dat_sanji_month_long$month)
ggplot(dat=dat_sanji_month_long) + geom_bar(aes(x=month, y=input , fill= sanji_wide2, color=sanji_wide2),stat="identity",position=position_dodge(), colour="black") +
geom_line(aes(x=month, y=price*30000, group= sanji_wide2, color=sanji_wide2), color='blue', size=0.8, alpha=0.4) + scale_y_continuous(sec.axis = sec_axis(~./30000, name = "price")) +
facet_grid(vars(sanji_wide2), scales="free_y")
도매시장 데이터 가공과 시각화 - 배추(1/2)에 해당되는 내용은 사용 데이터만 다를 뿐 코드는 모두 같기 때문에 거래단위별 가격을 나타내는 막대그래프 결과물만 나타내었다. 대파는 단, 상자 모두 1,2,4kg 단위가 가장 많이 거래되었는데(순서는 각각 다름) 주 거래단량은 각 도매시장 별로 상이하다. 가령 가락시장에서는 단은 1kg가 상자는 10kg가 가장 많이 거래된다.
subplot(ggplotly(gg1.4a,tooltip = c("x", "y")),ggplotly(gg1.4b,tooltip = c("x", "y")),ggplotly(gg1.4c,tooltip = c("x", "y")),ggplotly(gg1.4d,tooltip = c("x", "y")),ggplotly(gg1.4e,tooltip = c("x", "y")), margin = 0.05, nrows=5)
법인별 반입량과 가격, 거래 방법별 반입량과 가격대를 살펴보자. 먼저 법인별 반입량을 살펴보면 출하량이 가장 많은 경기권 및 수도권과 전남권 법언들이 가장 많은 물량을 확보하고 있다. 한편 가격은 대전중앙청과가 유난히 높은 가격을 보이고 있지만 정상값인지에 대해 의심해 볼 필요가 있다.
formattable(tab_2_1, list(
mkt_short=formatter(
"span",
style = x ~ ifelse(x == substr(mkt_sel,1,4), style(font.weight = "bold", color = 'blue'), NA)),
amt_ton = color_tile("white", "orange"),
area(col = c(price_l1w, price_l2w, price_l3w)) ~ normalize_bar("pink", 0.2, na.rm=T)
))
mkt_short | insname | amt_ton | price_l1w | price_l2w | price_l3w |
---|---|---|---|---|---|
서울가락 | 대아청과 | 1054 | 1071 | 1094 | 1252 |
서울가락 | 동화청과 | 380 | 1004 | 1044 | 1225 |
서울가락 | 한국청과 | 310 | 1004 | 1072 | 1235 |
서울강서 | 서부청과 | 138 | 860 | 966 | 1032 |
서울강서 | 강서청과 | 100 | 859 | 833 | 990 |
서울가락 | 서울청과 | 91 | 1023 | 1030 | 1232 |
부산엄궁 | 농협부산(공) | 73 | 926 | 729 | 1125 |
부산반여 | 농협반여(공) | 70 | 1033 | 824 | 1171 |
인천삼산 | 삼산원협(공) | 65 | 872 | 876 | 945 |
서울강서 | 농협강서(공) | 55 | 889 | 1043 | 1026 |
인천삼산 | 부평농산 | 55 | 951 | 910 | 1001 |
서울가락 | 중앙청과 | 52 | 1086 | 1084 | 1255 |
구리도매 | 농협구리(공) | 47 | 1153 | 1093 | 928 |
인천삼산 | 경인농산 | 45 | 970 | 960 | 1015 |
안양도매 | 안양원협(공) | 41 | 1109 | 1170 | 1279 |
구리도매 | 인터넷청과 | 40 | 1147 | 1193 | 961 |
대구북부 | 대양청과 | 37 | 922 | 1044 | 1142 |
부산반여 | 부산중앙청과 | 37 | 944 | 896 | 1321 |
부산반여 | 동부청과 | 36 | 840 | 891 | 1101 |
천안도매 | 천안청과 | 36 | 1052 | 958 | 1168 |
ggplotly(g, tooltip = c("x","y"), height = 600)