大数据分析——山东土壤基础养分数据分类研究
一、选题背景 不同区域的种植土壤大有不同,不同农作物的生长习性的限制传统的种植与施肥方式会导致土地与肥料资源的浪费,影响作物产量,破坏农田环境质量,传统的施肥技术,落后的农业模式,已经不适合现代农业的发展。我们应该利用现代科学的数据分析手段,针对在农业种植和施肥存在的问题,实施精准农业。科学作物种植和管理施肥决策系统的存在变得尤为重要。
二、大数据分析设计方案
1.本数据集的数据内容与数据特征分析
本案例数据基于(地市名、县名、有机质、全氮、有效磷、速效钾、PH)、对土地情况进行分析。
字段名称 | 字段类型 | 字段说明 |
地市名 | 字符型 | 对应省份地市名 |
县名 | 字符型 | 地市名对应县名 |
有机质 | 浮点型 | 每千克土壤中含有有机质克数 |
全氮 | 浮点型 | 每千克土壤中含有氮克数 |
有效磷 | 浮点型 | 每千克土壤中含有有效磷毫克数 |
速效钾 | 浮点型 | 每千克土壤中含有速效钾毫克数 |
PH | 浮点型 | 土壤酸碱度 |
2.运用分层聚类方法
层次聚类(Hierarchical clustering)是在不同的“层次”上对样本数据集进行划分,一层一层地进行聚类。就划分策略可分为自底向上的凝聚方法(agglomerative hierarchical clustering),比如AGNES。自上向下的分裂方法(divisive hierarchical clustering),比如DIANA
三、数据分析步骤
1、 数据源数据来源中国农业大学2010年,发布的土壤基础养分数据集
2.数据表
四 、 算法实现
1. 数据读取与清洗
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 准备数据
data = pd.read_csv(r'shandong.csv',encoding='gbk',index_col=['地市名','县名'])
# print(data.head) #读取前五行数据
describe=data.describe() #观察数据数量 无缺失数据
# print(describe)
describe1=data.isnull().sum() #统计每列缺失值的个数
# print(describe1)
describe2=data.dropna() #删除任何含有缺失值的行
# print(describe2)
describe3=data.drop_duplicates() #移除重复数据实例
# print(describe3)
2.分层聚类算法参数的确定
#利用scipy进行分层聚类 引入 层次聚类模块 中的 制作谱系图的方法 设置类间距与样本间距计算矩阵的方法 利用矩阵进行聚类的方法
from scipy.cluster.hierarchy import dendrogram, linkage,fcluster
import pandas as pd
#导入极差标准化方法
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#读取数据
data = pd.read_csv(r'shandong.csv',encoding='gbk',index_col=['地市名','县名'])
#极差标准化变换 创建一个极差标准化对象
mm = MinMaxScaler()
mm_data = mm.fit_transform(data)#归一化后的数据
#层次信息method:类间距的设置 metric:样本间距离的设置
#具体参数内容可看https://scikit-learn.org/stable/index.html官方网站,此处参数的确定是经验,暴力法得出的,这是最好的设置参数
z0=linkage(mm_data, method='average', metric='euclidean') #计算数据间的矩阵关系
fig = plt.figure(figsize=(10, 6), dpi=80)
plt.title('谱系图')
dn = dendrogram(z0) #绘制谱系图
plt.savefig('./山东省数据谱系图.png')
plt.show()
结果如下:
由谱系图可知分类数需要设置在4-12类左右
山东省主要种植:小麦、玉米、地瓜、花生、大豆、谷子、高粱(主要是前四个作物)
小麦生长对有机质,全氮,有效磷,速效钾,PH的要求(360问答:小麦生长对土壤基础养分的要求)
高产麦田要求土壤有机质含量在1.2%(12)以上,含氮量≥0.10%(1),有效磷20~30毫克/千克(20-30),速效钾(120-150),pH6.5~7.5
玉米生长对有机质,全氮,有效磷,速效钾,PH的要求(360问答:玉米生长对土壤基础养分的要求)
高产麦田要求土壤有机质含量在1.2%(12)以上,含氮量≥0.16%(1.6),有效磷10毫克/千克以上,速效钾(120-150),pH7.0-8.1
3. 分层聚类算法建模
from scipy.cluster.hierarchy import linkage,fcluster
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
data = pd.read_csv(r'shandong.csv',encoding='gbk',index_col=['地市名','县名'])
mm = MinMaxScaler()
mm_data = mm.fit_transform(data)
#参数的设置由上可知
z0=linkage(mm_data, method='average', metric='euclidean')
#类个数t为8
f0=fcluster(z0, t=8, criterion='maxclust')
# print(f0) #分类结果
data1=pd.read_csv(r'shandong.csv',encoding='gbk')
f_0=f0.tolist()
f_0=pd.DataFrame(f_0,columns=["分类"])
f_0=data1.join(f_0)
f_0=f_0.sort_values(by="分类",ascending=True)
f_0['地市名-县名'] = f_0['地市名'] + "-" + f_0['县名']
f_0.to_csv("山东省数据分析后.csv",index=0) #得到数据分析后的数据
得到山东省数据分析后.csv数据
4.数据可视化
data = pd.read_csv(r'山东省数据分析后.csv',encoding='UTF-8')
x=[]
for i in range(8):
x.append("分类{}".format(i+1))
y1=[]
for i in range(8):
y11=data[data["分类"]==i+1].mean()[1:2].tolist()
y1.append(y11)
y1=[i for item in y1 for i in item]
y2=[]
for i in range(8):
y11=data[data["分类"]==i+1].mean()[2:3].tolist()
y2.append(y11)
y2=[i for item in y2 for i in item]
y3=[]
for i in range(8):
y11=data[data["分类"]==i+1].mean()[3:4].tolist()
y3.append(y11)
y3=[i for item in y3 for i in item]
y4=[]
for i in range(8):
y11=data[data["分类"]==i+1].mean()[4:5].tolist()
y4.append(y11)
y4=[i for item in y4 for i in item]
y5=[]
for i in range(8):
y11=data[data["分类"]==i+1].mean()[5:6].tolist()
y5.append(y11)
y5=[i for item in y5 for i in item]
显示结果如下:
data = pd.read_csv(r'山东省数据分析后.csv',encoding='UTF-8')
x=[]
for i in range(8):
x.append(i+1)
y1=[]
for i in range(8):
y11=data[data["分类"]==i+1].mean()[1:2].tolist()
y1.append(y11)
y2=[]
for i in range(8):
y11=data[data["分类"]==i+1].mean()[2:3].tolist()
y2.append(y11)
y3=[]
for i in range(8):
y11=data[data["分类"]==i+1].mean()[3:4].tolist()
y3.append(y11)
y4=[]
for i in range(8):
y11=data[data["分类"]==i+1].mean()[4:5].tolist()
y4.append(y11)
y5=[]
for i in range(8):
y11=data[data["分类"]==i+1].mean()[5:6].tolist()
y5.append(y11)
显示结果如下:
山东省重点城市(泰安市)与土壤基础养分条形图展示了泰安市市岱岳区、东平县、肥城市、泰山区、新泰市的土壤基础养分数据,依照此图,我们可以很清晰的依照作物的生长习性去确定作物应该种植在哪个县区之中,可以为枣庄市的种植规划做出建议与依据,提升种植的效率,因地制宜。
# x:重点城市泰安 y:某一类的值
data = pd.read_csv(r'山东省数据分析后.csv',encoding='UTF-8',index_col=['地市名'])
x=data.loc["泰安市"]
y1=x["有机质"]
y2=x["有效磷"]
y3=x["全氮"]
y4=x["速效钾"]
y5=x["PH"]
x11=x["县名"].tolist()
#设置图形大小
plt.figure(figsize=(20,8),dpi=80)
bar_width = 0.15
x1 = list(range(len(x)))
x2 =[i+bar_width for i in x1]
x3 =[i+bar_width*2 for i in x1]
x4 =[i+bar_width*3 for i in x1]
x5 =[i+bar_width*4 for i in x1]
# 绘制条形图,宽度,且有标签(没有标签图例则显示不出来)
plt.bar(x1,y1,width=bar_width,label='有机质')
plt.bar(x2,y2,width=bar_width,label='有效磷')
plt.bar(x3,y3,width=bar_width,label='全氮')
plt.bar(x4,y4,width=bar_width,label='速效钾')
plt.bar(x5,y5,width=bar_width,label='PH')
显示结果如下:
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False) # 分割圆周长
data1 = np.concatenate((data1, [data1[0]])) # 闭合
angles = np.concatenate((angles, [angles[0]])) # 闭合
plt.figure(figsize=(10,10),dpi=80)
plt.polar(angles, data1,'bo-', linewidth=2,label="有机质",color="r") #做极坐标系
plt.thetagrids(angles * 180/np.pi, labels) # 做标签
plt.fill(angles, data1, alpha=0.25)# 填充
data2 = np.concatenate((data2, [data2[0]])) # 闭合
plt.polar(angles, data2, 'bo-', linewidth=2,label="全氮",color="g") #做极坐标系
plt.fill(angles, data2, alpha=0.25)# 填充
data3 = np.concatenate((data3, [data3[0]])) # 闭合
plt.polar(angles, data3, 'bo-', linewidth=2,label="有效磷",color="b") #做极坐标系
plt.fill(angles, data3, alpha=0.25)# 填充
data4 = np.concatenate((data4, [data4[0]])) # 闭合
plt.polar(angles, data4, 'bo-', linewidth=2,label="速效钾",color="y") #做极坐标系
plt.fill(angles, data4, alpha=0.25)# 填充
data5 = np.concatenate((data5, [data5[0]])) # 闭合
plt.polar(angles, data5, 'bo-', linewidth=2,label="PH",color="c") #做极坐标系
plt.fill(angles, data5, alpha=0.25)# 填充
显示结果如下:
山东省分类1与土壤基础养分雷达图,在这个图中展示了分类一所包含的所有的县区的有机质,有效磷,全氮,速效钾,PH的对比状况,在同一分类中进行对比,依照作物的生长习性,可以更加细致的判断分类一适合种植哪些作物,哪些县区适合种植哪些作物。
5、总结
在山东省分类与土壤基础养分条形图绘制离散的不同分类的土壤基础养分数据,能够一眼看出各个数据的大小,比较数据之间的差别。从山东省分类与土壤基础养分折线图中,我们可以看到不同分类之间有机质,有效磷,全氮,速效钾,PH的变化与变化趋势。除了可以看出不同分类基础养分之间的变化趋势,根据此图我们还可以比较快速的依照作物的生长习性去确定作物应该种植在哪个分类之中。
山东省重点城市(泰安市)与土壤基础养分条形图展示了泰安市市岱岳区、东平县、肥城市、泰山区、新泰市的土壤基础养分数据,依照此图,我们可以很清晰的依照作物的生长习性去确定作物应该种植在哪个县区之中,可以为枣庄市的种植规划做出建议与依据,提升种植的效率,因地制宜。
山东省分类1与土壤基础养分雷达图,在这个图中展示了分类一所包含的所有的县区的有机质,有效磷,全氮,速效钾,PH的对比状况,在同一分类中进行对比,依照作物的生长习性,可以更加细致的判断分类一适合种植哪些作物,哪些县区适合种植哪些作物。
所以经过数据获取、数据存储、数据处理、数据分析、数据可视化。可以给农业种植者或者创业者提供可靠的细节,进行精准施肥,提高种植效率
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下