일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 숫자 짝꿍
- 딥러닝
- 주식가격
- 농정원
- netron
- DTW
- ML
- 유사도
- 농림수산식품교육문화정보원
- 농촌진흥청
- 데이터
- Algorithm
- 스마트팜코리아
- Python
- 생육
- solvesql
- rmse
- group by
- SQL
- 스마트팜
- MAPE
- 데이터분석
- join
- Pivot Table
- 평가지표
- minmaxscaling
- psycopg
- postgres sql
- Programmers
- report lab
- Today
- Total
Positive-Influence-Data
[SmartFarm] 스마트팜코리아 데이터로 생육 유사도 측정 (수집&처리편) 본문
✔ 필자의 환경
필자는 스마트팜코리아에서 직접 다운로드한 CSV 파일들을 활용했고
Python을 활용해 데이터 분석 및 DTW 알고리즘 적용을 했다.
이점 참고하시면 도움 될 것 같다.
✔ 스마트팜 코리아 데이터 마트에서 데이터 수집
필자는 데이터를 얻기 위함이 크므로 스마트팜코리아 데이터 마트에서 데이터를 수집해 보겠다.
필자가 판단하기에 농촌진흥청 데이터가 스마트팜 생육유사도를 측정하기 적합한 데이터이므로 농촌진흥청의 생육데이터를 바탕으로 생육유사도를 측정해 보겠다.
필자는 딸기, 오이, 방울토마토, 완숙토마토, 파프리카 총 5개의 품목과 2018년 ~ 2021년 농촌진흥청 우수농가 데이터를 활용할 예정이다.
위의 링크로 들어가면 농촌진흥청 '농업 빅데이터 수집 및 생산성향상모델개발' 사업에서 수집한 시설채소 농가 데이터로 토마토(방울), 딸기, 파프리카, 참외, 오이, 국화 품목의 환경, 생육, 생산(판매), 재배정보를 제공하고 있다.
이 중에서 딸기, 오이, 토마토, 방울토마토, 파프리카 5종 품목 생육 데이터를 활용한다.
✔ 데이터 확인
데이터 확인을 위해 필자는 Python을 활용하겠다.
엑셀로 데이터가 어떤 구조로 생겼는지 확인해 보겠다.
이런 식으로 도, 시군, 작기, 농가명으로 나눠져 있고 조사 일자에 따라 초장, 엽수, 엽장, 엽폭, 엽병장, 관부직경, 화방번호, 화방별착과수가 측정되어 있다.
엑셀로 데이터를 탐색해 보니
🔎 각 시군, 작기, 농가명마다 조사일자가 모두 다르다.
🔎 같은 품목끼리 2018년 ~ 2021년 데이터 포맷이 전부 같다.
🔎 농진청 데이터의 조사항목의 단위는 표시되어 있지 않지만 cm인 것으로 파악된다.
스마트팜코리아의 다른 데이터들은 mm단위인 것을 확인했다.(위의 예시로 딸기의 초장 26.2로 cm로 파악)
어떻게 할까?
👉필자는 Python 프로그래밍을 통해 품목별로 2018년 ~ 2021년 데이터를 합치는 작업을 하겠다.
👉 첫 번째 조사일자를 1주, 두 번째 조사일자를 2주 이렇게 해서 각 시군, 작기, 농가명에 따른 조사주차를 구하겠다.
👉 cm로 파악되는 조사항목들을 전부 mm로 바꿔준다.
✔ 데이터 전처리
데이터 확인 파트에서 발견한 것들을 토대로 전처리 코드를 만들어 실행한다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os
import warnings
from sklearn.preprocessing import LabelEncoder
from tqdm import tqdm
import re
warnings.filterwarnings("ignore")
os.chdir("./data/생육")
list_dir = os.listdir()
# 현재 폴더의 있는 파일들을 list_dir 변수에 넣는다.
crop_dfs = {}
# totals_df를 통해 농가명의 조사일자를 기준으로 주차를 만든다.(1주차, 2주차...)
# label encoder를 통해 유니크한 조사일자 순으로 1주차, 2주차 이런식으로 만들어준다.
def totals_df(data):
sigun = data['시군'].unique()
names = data['농가명'].unique()
totals = pd.DataFrame()
for s in sigun:
for j in names:
le = LabelEncoder()
df = data[(data['시군']==s) & (data['농가명']==j)]
df['주차'] = le.fit_transform(df['조사일자'])+1
df['주차'] = df['주차'].astype('int')
totals = pd.concat([totals, df])
return totals
# list_dir에 있는 csv 파일들을 불러오면서 컬럼에 연도를 붙이고 품목마다 하나의 데이터 프레임으로 합친다.
for file in tqdm(list_dir):
crop = file.split('_')[0]
year_match = re.search(r'\d{4}', file)
year = int(year_match.group()) if year_match else None
df = pd.read_csv(file, encoding='euc-kr')
df['crps_year'] = year
df = totals_df(df)
if crop not in crop_dfs:
crop_dfs[crop] = df
else:
crop_dfs[crop] = pd.concat([crop_dfs[crop], df], ignore_index=True)
# cm 단위를 mm로 바꾸는 함수
def convert_cm_to_mm(df, columns):
for col in columns:
if col in df.columns:
df[col] = pd.to_numeric(df[col], errors='coerce')
df[col] = df[col] * 10 # cm → mm
return df
convert_columns = ['초장','엽장','엽폭','엽병장','관부직경','화방높이','생장길이'] # 바꿀 컬럼을 지정해준다.
# for문을 통해 cm 단위를 mm단위로 바꾼다.
for crop, df in crop_dfs.items():
crop_dfs[crop] = convert_cm_to_mm(df, convert_columns)
print(f"{crop}: {df.shape}")
### 출력 ###
## 딸기: (71237, 18)
## 방울토마토: (86106, 21)
## 오이: (4250, 19)
## 완숙토마토: (98379, 23)
## 파프리카: (130138, 19)
👉 crop_dfs['딸기'] 이렇게 찍게 되면 2018년 ~ 2021년의 딸기 데이터 프레임이 출력되어 나온다.
필자가 원하는 대로 데이터가 전처리 되어 나왔다.
👉 다음 글에서 생육데이터 유사도 측정에 대해 다뤄보겠다.
📌 스마트팜코리아 데이터로 생육 유사도 측정 시리즈
👉다음편
2025.05.02 - [Analysis] - [SmartFarm] 스마트팜코리아 데이터로 생육 유사도 측정 (유사도 측정편)
👉이전편
2025.04.20 - [Analysis] - [SmartFarm] 스마트팜코리아 데이터로 생육 유사도 측정 (기획편)
'Analysis' 카테고리의 다른 글
[SmartFarm] 스마트팜코리아 데이터로 생육 유사도 측정 (유사도 측정편) (0) | 2025.05.02 |
---|---|
[SmartFarm] 스마트팜코리아 데이터로 생육 유사도 측정 (기획편) (0) | 2025.04.20 |