Skip to content

YoonSeonHoPref/Crop-Recommendation-Dataset-analysis-prediction

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 

Repository files navigation

Crop-Recommendation-Dataset-analysis-prediction

농작물 데이터 분석 및 예측 (개인 프로젝트 공부) https://www.kaggle.com/datasets/siddharthss/crop-recommendation-dataset

※ 목표

  1. 데이터 분석
  2. 머신러닝을 통한 분류
  3. 딥러닝을 통한 분류

※ 파일 로드 및 탐색

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df=pd.read_csv("crop.csv")
df

image

  • N - ratio of Nitrogen content in soil (토양 내 질소의 양)
  • P - ratio of Phosphorous content in soil (토양 내 인산의 양)
  • K - ratio of Potassium content in soil (토양 내 칼륨의 양)
  • temperature - temperature in degree Celsius (섭씨 온도)
  • humidity - relative humidity in % (습도 %)
  • ph - ph value of the soil (토지 ph)
  • rainfall - rainfall in mm (강우량 mm)

df.info

image

print("label 개수 : ",len(df['label'].value_counts()))

label 개수 : 22

df['label'].unique()
image

df['label'].value_counts()

image

  • columns : 8개 [N, P, K, temperature, humidity, ph, rainfall, label]
  • 총 2200개 데이터 ,22개의 label , label 별 100개씩 있음 , null 데이터는 x
  • 라벨 이름 : 'rice', 'maize', 'chickpea', 'kidneybeans', 'pigeonpeas', 'mothbeans', 'mungbean', 'blackgram', 'lentil', 'pomegranate', 'banana', 'mango', 'grapes', 'watermelon', 'muskmelon', 'apple', 'orange', 'papaya', 'coconut', 'cotton', 'jute', 'coffee'

본인이 서치한 데이터 관련 지식

  • 위 데이터는 인도에서 재배하는 농작물 데이터
  • 화학비료의 주성분은 크게 질소(N), 인산(P),칼륨(K) 등의 무기질 물질임
  • 작물의 생장,번식을 위해 꼭 필요한 양분은 16종으로 작물필수원소라고 하는데, 필수원소 가운데 작물에 많이 필요한 질소, 인산, 칼륨은 일반 농지에선 부족하기 쉬움
  • 위 데이터 간의 N,P,K의 양에 따라 농작물의 생장,번식의 차이가 있음
  • 토양 PH는 토양의 산성 또는 알칼리성의 측정이고, 0(산성) ~ 15(알칼리성)의 범위임
  • 많은 식물들과 농작물들의 형성은 알칼리성 또는 산성 조건을 선호함
  • ph는 토양 화학물질 사이의 복잡한 상호작용에 영향을 줄 수 있음
  • 예를 들어, 인산은 6.0과 7.5의 PH를 필요로 하며, 이 범위를 벗어나면 화학적으로 부동화됨
  • 비는 토양 습도와 토양 PH에 영향을 줌
  • 쌀 같은 경우 200mm 이상의 강우량과 80% 이상의 습도를 필요로 함
  • 강우량과 습도, 비의 상관관계를 봐도 됨
  • 열대과일은 온도와 습도에 영향을 받을 것이라고 생각함

※ 상관관계

x= data[['N','P','K','temperature','humidity','ph','rainfall']]
cor = x.corr()

fig, ax = plt.subplots( figsize=(5,5) )

mask = np.zeros_like(cor, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
plt.title("Correlation of Features", y = 1, size = 15)

sns.heatmap(cor, cmap = 'RdYlBu_r', annot = True,
mask=mask,
linewidths=.5,
cbar_kws={"shrink": .5}, vmin = -1,vmax = 1)
plt.show()
image

  • P와 K의 상관관계가 가장 높음

※ jointplot 을 이용한 데이터 분석

sns.jointplot(x= 'rainfall',y = 'ph', data = df, hue='label')
image

범위를 줄여서 분석 (강우량 >= 150mm, 온도 >= 30 )

sns.jointplot(x= 'rainfall',y = 'humidity', data = df[df['rainfall'] >= 150], hue='label')
image

  • 강우량 150mm 이상의 범위에서 쌀의 습도는 80% 임
  • 쌀 제외 작물의 강우량은 150~200mm

sns.jointplot(x= 'rainfall',y = 'ph', data = df[df['rainfall'] >= 150], hue='label')
image

  • 쌀의 강우량 분포는 굉장히 넓음

sns.jointplot(x= 'rainfall',y = 'humidity', data = df[df['temperature'] >= 30], hue='label')
image

  • 열대과일의 습도는 80% 이상 분포
  • pigeonpeas의 습도, 강우량 분포는 넓음

sns.jointplot(x= 'rainfall',y = 'ph', data = df[df['temperature'] >= 30], hue='label')
image

  • 열대과일의 ph는 보통 4 ~ 10 사이에 분포

sns.jointplot(x= 'K',y = 'P', data = df[df['temperature'] >= 30], hue='label')
image

  • 온도가 30도 이상일 때, 포도가 k,p 둘다 높음

sns.jointplot(x= 'K',y = 'P', data = df[df['temperature'] >= 30], hue='label')
image

  • 강우량이 120mm 이상일 때, 사과가 k,p 둘다 높음

※ boxplot을 이용한 데이터 분석

features = {'N', 'P', 'K', 'temperature', 'humidity', 'ph', 'rainfall'}

def crop_boxplot(X):

ax = sns.set_style('whitegrid')
plt.subplots(figsize=(15,8))
sns.boxplot(x=X,y='label',data=df)
plt.title("Crops Relation with " + str(X),fontsize=24)
plt.xlabel("values of " + str(X),fontsize=18)
plt.ylabel("Crops Name", fontsize=18)           

for x in features:

crop_boxplot(x)

image image image image image image image

※ pca 분석

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
x=df[df.columns[:-1]]
y=df
scaler = StandardScaler()
df_standardized = x.copy()
df_standardized
for col in df_standardized.columns:

df_standardized[col] = scaler.fit_transform(df_standardized[col].values.reshape(-1, 1))

df_standardized.head(10)

image

pca = PCA(n_components=3)
df_pcs = pca.fit_transform(df_standardized.values)
df_pca = pd.DataFrame(data = df_pcs, columns = ["pca_1", "pca_2", "pca_3"])

df_pca = pd.concat([df_pca, y], axis = 1)
df_pca

  • 3개의 주성분으로 변환
  • pca 변환

import plotly.express as px
df_avg_pca_proximity = df_pca.groupby('label')[['pc_1', 'pc_2', 'pc_3']].mean()

fig = px.scatter_3d(df_avg_pca_proximity, x='pc_1', y='pc_2', z='pc_3', color = df_avg_pca_proximity.index, text = df_avg_pca_proximity.index, title = "Which Crops Need Similar Conditions?", template = 'none')
fig.update_layout(showlegend=False)
fig.show()

image

※ 머신러닝을 이용한 분류

학습할 모델 : 'Naive Bayes', 'Logistic Regression', 'KNN', 'SVC', 'Decision Tree', 'Random Forest','XGB'

데이터 전처리

X=df[['N','P','K','temperature','humidity','ph','rainfall']]
c = df['label'].astype('category')
targets = dict(enumerate(c.cat.categories))
df['target'] = c.cat.codes
y = df['target']

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size = 0.2,random_state=48)
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
x_test_scaled = scaler.transform(X_test)

from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics

knn_accuracies = []

for k in range(1, 20):
knn = KNeighborsClassifier(n_neighbors=k) y_pred = knn.fit(X_train, y_train).predict(X_test) knn_accuracies.append(metrics.accuracy_score(y_test, y_pred)) k_best = knn_accuracies.index(max(knn_accuracies)) + 1
knn = KNeighborsClassifier(n_neighbors = k_best)
y_pred = knn.fit(X_train, y_train).predict(X_test)
knn_accuracy = metrics.accuracy_score(y_test, y_pred)

gnb = GaussianNB()
y_pred = gnb.fit(X_train, y_train).predict(X_test)

naive_bayes_accuracy = metrics.accuracy_score(y_test,y_pred)

log_reg = LogisticRegression()
y_pred = log_reg.fit(X_train, y_train).predict(X_test)

logistic_regression_accuracy = metrics.accuracy_score(y_test, y_pred)

svc = SVC(kernel='linear')
y_pred = svc.fit(X_train, y_train).predict(X_test)

svc_accuracy = metrics.accuracy_score(y_test, y_pred)

decision_tree = DecisionTreeClassifier()
y_pred = decision_tree.fit(X_train, y_train).predict(X_test)

tree_accuracy = metrics.accuracy_score(y_test, y_pred)

rfc = RandomForestClassifier(n_estimators = 100)
y_pred = rfc.fit(X_train, y_train).predict(X_test)

rfc_accuracy = metrics.accuracy_score(y_test, y_pred)

xgb=XGBClassifier()
y_pred=xgb.fit(X_train, y_train).predict(X_test)
xgb_accuracy = metrics.accuracy_score(y_test, y_pred)

classification_performance = {'Classification Procedure': ['Naive Bayes', 'Logistic Regression', 'KNN', 'SVC', 'Decision Tree', 'Random Forest','XGB'], 'Accuracy': [naive_bayes_accuracy, logistic_regression_accuracy, knn_accuracy, svc_accuracy, tree_accuracy, rfc_accuracy,xgb_accuracy]}

classification_performance = pd.DataFrame.from_dict(classification_performance)
classification_performance

image

Releases

No releases published

Packages

No packages published

Languages