농작물 데이터 분석 및 예측 (개인 프로젝트 공부) https://www.kaggle.com/datasets/siddharthss/crop-recommendation-dataset
- 데이터 분석
- 머신러닝을 통한 분류
- 딥러닝을 통한 분류
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df=pd.read_csv("crop.csv")
df
- 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
print("label 개수 : ",len(df['label'].value_counts()))
df['label'].value_counts()
- 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()
- P와 K의 상관관계가 가장 높음
sns.jointplot(x= 'rainfall',y = 'ph', data = df, hue='label')
sns.jointplot(x= 'rainfall',y = 'humidity', data = df[df['rainfall'] >= 150], hue='label')
- 강우량 150mm 이상의 범위에서 쌀의 습도는 80% 임
- 쌀 제외 작물의 강우량은 150~200mm
sns.jointplot(x= 'rainfall',y = 'ph', data = df[df['rainfall'] >= 150], hue='label')
- 쌀의 강우량 분포는 굉장히 넓음
sns.jointplot(x= 'rainfall',y = 'humidity', data = df[df['temperature'] >= 30], hue='label')
- 열대과일의 습도는 80% 이상 분포
- pigeonpeas의 습도, 강우량 분포는 넓음
sns.jointplot(x= 'rainfall',y = 'ph', data = df[df['temperature'] >= 30], hue='label')
- 열대과일의 ph는 보통 4 ~ 10 사이에 분포
sns.jointplot(x= 'K',y = 'P', data = df[df['temperature'] >= 30], hue='label')
- 온도가 30도 이상일 때, 포도가 k,p 둘다 높음
sns.jointplot(x= 'K',y = 'P', data = df[df['temperature'] >= 30], hue='label')
- 강우량이 120mm 이상일 때, 사과가 k,p 둘다 높음
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)
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)
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()
학습할 모델 : '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