반응형

귀농을 결정하게 되었다면 작목을 정하는것이 가장 먼저 이루어집니다.

작목을 정하는 기준은 여러가지가 있습니다.

지역을 먼저정한다면 지역에 맞는 작물을 선택하는 것이 유리할 것이고 소득을 위주로 결정할수도 있을것 같습니다.

또 노동의 강도나 목적에 따라 다양한 가공품을 목적으로 작물을 결정할수도 있습니다.

공공데이터로 제공하는 농작물소득자료는 총수입,생산비,노동비,지출비용(여러종류) 등 제공하고 있기는 하지만 조금 부족한 감이 없지는 않습니다. 하지만 간단하게 작물의 기대수익이나 경영설계를 해보기에는 충분할 수 있다고 생각하였고 python을 통해 어떤작물이 수익이 많이나는지 또는 앞으로 기대가 되는지 알아볼 예정입니다.

 

 

들어가기 전에 문제점

일단 데이터가 API에서는 2013년까지밖에 제공되지 않습니다.(이것 또한 관리가 되지않아 데이터를 제공해주는 링크에 문제가 있었습니다.) 문의를 해보니 이번년말에 API를 다시 개발할 예정에 있다고 하였으며 그때 데이터를 사용할수 있도록 해준다고합니다. 조금 더 데이터의 형식이나 제공하는 방식도 편하게 바뀌었으면 합니다. 매년 제공해주는 데이터 형식이 조금씩 달라져 데이터를 받아오는데도 힘들었습니다.데이터의 정확도나 측정방식은 아마 통계학을 전공하신 분들이 최대한 잘 해놓았다고 생각하고 이용할 계획입니다.

어찌됬든 저는 개발하기 위해 이후 자료(2014~2019)는 pdf파일로 제공하고 있어 데이터를 추출할 방법이 없어서 직접 입력하였고 쓰여진 데이터는 총수입,생산비,자가노동비를 사용하였습니다.이렇게 순이익을 총수입-생산비로 측정하였습니다.

 

공공데이터 활용사이트

www.nongsaro.go.kr/portal/ps/psz/psza/contentNsMain.ps?menuId=PS03954

2014~2019년 농작물소득자료

amis.rda.go.kr/portal/ap/mn/incomeAnalysisLst/lst

 

 

 

 

 

개발 순서

데이터 받아오기 -> 필요한 데이터만 추출하여 그래프로 표시해보기

 

 

데이터 받아오기

데이터를 받아오기 위해서는 먼저 공공데이터 활용사이트에서 데이터이용신청을 하여야하며 승인이 나게되면 키를 주게됩니다. 그키를 이용하여 데이터를 받아올수 있습니다.

수익데이터는 가축의 경우 마리수당 작물인 경우 1000m^2(100a 300평)을 기준으로 하는 데이터입니다.

import requests, xmltodict, json
import pandas as pd

key = "20210203GYLHK6YDEQ85NIYBHUYRA"
ori_url = "http://api.nongsaro.go.kr/service/farmPrdtIncome/farmPrdtIncomeDetailList?apiKey=20210203GYLHK6YDEQ85NIYBHUYRA&svcCode=05010001&atptCode=9900000000&year="

#xml 받아오기
for i in range(2003,2014):
    url=ori_url+str(i)
    content = requests.get(url).content
    # xml 파싱
    dicta = xmltodict.parse(content)
    # xml json파일로 만들기
    jsonString = json.dumps(dicta['response']['body'], ensure_ascii=False)
    # json파일 읽어오기
    jsonObj = json.loads(jsonString)

    # 파이썬 파일 열기 모드 https://securityspecialist.tistory.com/90
    # json파일 저장하기
    file = open("./"+str(i)+".json", "w+", encoding='utf-8')
    file.write(json.dumps(jsonObj['items']['item'], ensure_ascii=False))
    file.close()

    ##################################################################################################################

    #json 읽어서 데이터 프레임 만들기
    df = pd.read_json('./'+str(i)+'.json', encoding='utf-8')
    #필요한 데이터만 골라 데이터프레임만들기
    df_sample = df.loc[:, ['eqpNm', 'listNm', 'incomeTotAmount']]
    df_sample = df_sample.sort_values(by='listNm', ascending=False)


    #작목추가
    plants = []
    for k in df_sample.index:
        plants.append(df_sample['eqpNm'][k])
    plants=list(set(plants))



    # 딕셔너리 조작하기 https://dojang.io/mod/page/view.php?id=2307
    # 딕셔너리 만들기
    accountlist = ['주산물가액','부산물가액','생산비합계','자가노동비']
    plants_dic = dict.fromkeys(plants, dict.fromkeys(accountlist))
    print(plants_dic)

    # 딕셔너리 안에서 딕셔너리 https://dojang.io/mod/page/view.php?id=2310
    #필요한 데이터만 딕셔너리에 담기
    for j in df_sample.index:
        # 주산물가액,부산물가액,생산비합계,상품화율
        # 상품화율이 낮을경우 높이면 수익을 늘릴수 잇다.
        name = df_sample['eqpNm'][j]
        print(name)
        if df_sample['listNm'][j] == '주산물가액':
            c = df_sample['incomeTotAmount'][j]
            c = int(df_sample['incomeTotAmount'][j].replace(',', ''))
            plants_dic[name] = {'주산물가액': c}
        if df_sample['listNm'][j] == '부산물가액':
            c = df_sample['incomeTotAmount'][j]
            c = int(df_sample['incomeTotAmount'][j].replace(',', ''))
            plants_dic[name]['부산물가액'] = c
        if df_sample['listNm'][j] == '자가노동비':
            if df_sample['incomeTotAmount'][j]==None:
                plants_dic[name]['자가노동비'] = 0
                continue
            c = df_sample['incomeTotAmount'][j]
            c = int(df_sample['incomeTotAmount'][j].replace(',', ''))
            plants_dic[name]['자가노동비'] = c
        if df_sample['listNm'][j] == '생산비합계':
            if df_sample['incomeTotAmount'][j]==None:
                plants_dic[name]['생산비합계'] = 0
                continue
            c = df_sample['incomeTotAmount'][j]
            c = int(df_sample['incomeTotAmount'][j].replace(',', ''))
            plants_dic[name]['생산비합계'] = c
    #print(plants_dic)

    #리스트를 담는 리스트
    plants_list = []
    # 딕셔너리에서 데이터 추출해서 리스트에 넣기
    for key, value in plants_dic.items():
        if key == None or value['주산물가액']==None:
            continue
        plant = [key]
        #print(key)
        sum = value['주산물가액']+value['부산물가액']
        sub = value['생산비합계']
        result = sum - sub
        plant.append(sum)
        plant.append(value['생산비합계'])
        plant.append(value['자가노동비'])
        plant.append(result)
        plants_list.append(plant)

    #정리된 리스트를 이용해서 데이터 프레임 만들기
    df = pd.DataFrame(plants_list, columns=['작목', '수익', '생산비합계','노동비', '순이익'])
    print(df)

    #엑셀로 저장
    df.to_excel('./' + str(i) + '.xlsx', sheet_name='new_name')

 

 

데이터를 활용해 그래프 그리기

2014~2019년까지의 데이터는 위에서 받은 pdf를 엑셀에 직접 입력하였습니다. 잘못적은 부분이 있을수 있으며 필요한 최소의 데이터만 입력하였습니다. y축의 경우 1000만을 곱했을때 수익이 나옵니다.

import sys
from matplotlib import pyplot as plt
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout,QCheckBox
from matplotlib.backends.backend_qt5agg import FigureCanvas as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import collections
import pandas as pd


class MyApp(QMainWindow):
  global plants_dic
  plants_dic={}
  def __init__(self):
      super().__init__()

      self.main_widget = QWidget()
      self.setCentralWidget(self.main_widget)
      canvas = FigureCanvas(Figure(figsize=(4, 3)))
      vbox = QVBoxLayout(self.main_widget)
      vbox.addWidget(canvas)
      #파일에서 데이터 받아오기
      for i in range(2003, 2020):
          # excel->dataframe
          df = pd.read_excel('./' + str(i) + '.xlsx', engine='openpyxl')

          # 모든데이터 더하기
          for j in df.index:
              if df['작목'][j] in plants_dic:
                  plants_dic[df['작목'][j]][0].append(df['순이익'][j])
                  plants_dic[df['작목'][j]][1].append(i)
              else:
                  plants_dic[df['작목'][j]] = [[df['순이익'][j]], [i]]
      # 딕셔너리 정렬
      ordered_plants_dic = dict(collections.OrderedDict(sorted(plants_dic.items())))

      ###################################################################################
      #체크박스 리스트 만들기
      self.boxes = []
      self.addToolBar(NavigationToolbar(canvas, self))
      bn=0
      for key, value in ordered_plants_dic.items():
          #plant_checklist.append(key)
          self.boxes.append(QCheckBox(key,self))
          #체크박스가 넘치기전에 다음줄로 넘어갈수 있도록 위치조정
          if 50+bn*20<=970:
              self.boxes[bn].move(10, 50+bn*20)
          else:
              self.boxes[bn].move(100, 50 + (bn-47) * 20)
          #체크박스 크기조정
          self.boxes[bn].resize(150, 30)
          #체크박스 눌렀을시 동작
          self.boxes[bn].stateChanged.connect(self.checkBoxState)
          bn=bn+1

      #한글나오게
      #http://doc.mindscale.kr/km/python/11.html
      plt.rc('font', family='Malgun Gothic')
      plt.xlabel('년도')
      plt.ylabel('수익')
      plt.axis([2003,2019 , -100000, 15000000])  # X, Y축의 범위: [xmin, xmax, ymin, ymax]
      self.ax = canvas.figure.subplots()
      #화면가득차게
      self.showMaximized()
      self.show()



  #그래프 업데이트
  #https://codetorial.net/articles/matplotlib_in_pyqt5.html
  def checkBoxState(self):
      #그래프 리셋
      self.ax.clear()
      #체크리스트 받기
      check_list=[]
      #print(plants_dic)
      for cn in range(len(self.boxes)):
          if self.boxes[cn].isChecked() == True:
             self.ax.plot(plants_dic[self.boxes[cn].text()][1],plants_dic[self.boxes[cn].text()][0])
             check_list.append(self.boxes[cn].text())
      #self.ax.rc('font', family='Malgun Gothic')
      self.ax.legend(check_list)
      self.ax.set_xlabel('년도')
      self.ax.set_ylabel('순수익')

      #x축 y축 고정지정
      #https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.axis.html
      self.ax.set(xlim=(2003, 2019), ylim=(-3000000, 15000000))
      #보여주기
      self.ax.figure.canvas.draw()


if __name__ == '__main__':
  app = QApplication(sys.argv)
  ex = MyApp()
  sys.exit(app.exec_())

 

 

결과확인

원하는 작물의 체크박스를 클릭하면 확인할수 있습니다.(두번째 세번째 이미지는 값을 조금씩 수정하여 구해봤습니다.)

순이익(생산비에 자가노동비도 포함)

순수익 순위(300평기준)

시설감귤(2016년기준)>인삼>시설포도>토마토(촉성)>생강>시설고추>오이(촉성)>느타리버섯(100평)>시설가지>착색단고추>딸기(촉성)>당근>나머지

 

대충 소득이 높은것 위주로 골라봤습니다.300평기준 가장 순수익이 큰 작목은 인삼일 것으로 예상됩니다. 인삼은 4년근 기준이며 4년근을 키우는데 6년이 필요하다고 하며 연작이 불가능한 작목으로 알고있습니다. 나머지의 경우 시설에서 키우는 작목들이 차지하고 있는데 300평당 100~400만원 정도의 순수익이 예상됩니다.(너무 적다고 생각합니다.)  

마이너스 수익을 내는경우도 있었으며 우상향하는 농산물을 찾을 수 없었습니다.

이유로는 인건비의 상승이 큰 것으로 보입니다. 그럼에도 저의 생각에는 농업의 메리트는 충분할 것으로 예상됩니다.

화폐 가치의 하락,AI에 의한 자동화로 인한 일자리 감소,기술의 발전으로 인해 농업의 인력해소,탄소배출에 의한 지구환경문제,교통의 발전으로 인한 인구의 분산 등 미래가치를 봤을때는 충분히 도전해 볼 수 있는 업종이라고 생각됩니다.

또한 통계학상으로는 충분한 표본이라고 할 수 있으나 표본이 작은 통계자료이고 평균데이터인 만큼 모든 농가를 대변해주는 데이터는 아니므로 너무 부정적으로 볼 필요는 없으나 귀농을 쉽게 생각하시는 분들이라면 다시 한번 생각해 보시기 바랍니다.

 

순이익+자가노동비(생산비에 자가노동비 미포함)

자가노동을 제외했을때 순수익순위

오이(촉성)>시설감귤>토마토>딸기>느타리버섯>인삼>시설가지>시설장미>시설고추>나머지

 

600~1200만원대를 형성하고 있으며 수익이 많아진 작물은 오이,토마토,딸기,시설가지 등이다.

시설에서 키워지는 작물들이 노동력이 많이 드는것을 알 수 있다.또 생산비에 포함되어있으나 초기 시설비가 많이든다는점도 고려해야한다.

 

 

 

생산대비노동비율(낮을수록 일을덜함)

생산비대비노동비비율 낮은순위(낮을수록 일을 덜함)

착색단고추>인삼>쌀보리>당근>쌀>고랭지무>고랭지배추>시설장미>토마토(촉성)

 

낮을수록 규모를 키우기 좋은 작물이라고 생각할 수 있다.

 

 

 

추후 개발예정

->분석->가중치를 토대로 맞춤형 작목을 정하기->질의응답을 통해 각각개인에 맞는 작목을 추천해주는 페이지 만들기

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기