【python数据分析课程设计】大数据分析——不同地区土壤养分组成的大数据分析和数据可视化

一、选题背景

  土壤是农业基础,了解土壤养分组成对于提高产量和质量至关重要。此选题旨在分析不同地区土壤养分差异,以指导农业生产和管理。从社会角度看,有助于改善农业效益,增加农民收入,推动农村经济发展,减少化肥使用及环境污染。从经济角度来看,分析土壤养分差异可帮助农民选择适宜的农作物种植,提高经济效益,同时降低施肥成本。从技术和数据来源方面来说,通过卫星遥感和实验室测试获取相关指标,结合农田土壤样本和产量数据进行分析

二、大数据分析设计方案

1.本数据集的数据内容与数据特征分析   

  此数据集对不同地区的土壤进行了数据分析,包括pH值、有机质(OM)、盐度(EC)等性质,主要元素(N、P、K、Mg)以及对植物营养有显著影响的微量元素(Fe、Zn、Mn、Cu、B)。对数据进行基本的统计分析,包括计算各个养分的平均值、标准差、最大值和最小值,以了解不同养分的分布情况和变异程度。可以绘制直方图、箱线图等图表,展示不同养分的分布情况和异常值情况。还可以计算各个养分之间的相关系数,探究它们之间的关联性。同时,还可以结合气象数据,分析气候等因素对土壤养分的影响。

2.数据分析的课程设计方案概述(包括实现思路与技术难点)

实现思路:

 1. 数据获取与处理:收集不同地区土壤养分数据,整理为结构化的数据集。进行数据清洗、去重、缺失值处理、统一数据格式等预处理步骤。   

  2. 数据探索与分析:利用Python中的数据分析库进行基本的统计分析,计算养分指标的平均值、标准差、最大值和最小值等统计量。绘制直方图、箱线图等图表展示数据分布情况。进行相关性分析,计算不同养分之间的相关系数,并绘制相关矩阵热力图展示养分之间的关联性。

 3. 建立预测模型:建立预测模型,预测未来的土壤养分变化趋势。   

  4. 结果解释与可视化:将分析结果以直观的方式呈现,如热力图、散点图等,帮助用户理解。

技术难点:

  1. 数据质量与准确性: 确保收集到的土壤养分数据质量良好,排除异常值和错误数据,提高分析结果的准确性和可靠性。

 2. 大数据处理:需要考虑数据存储和计算效率的问题。

 3. 模型建立与优化:建立准确有效的预测模型需要综合考虑特征选择、模型选择和参数优化等问题。

  4. 数据可视化:熟悉Python的数据可视化库,选择合适的图表类型和展示方式。

  5. 数据清洗与预处理:处理各种异常情况和不完整数据,需要有一定的数据处理经验和技巧。

三、数据分析

1.数据源

  此数据源采用Kaggle平台开放的数据集,链接:Soil Data Grevena (kaggle.com)Soil Data》,(soil.csv),(SOIL DATA GR.xlsx)

2.数据清洗

   数据清洗是数据分析的重要步骤,它对于数据质量的提升、分析结果的准确性和可用性的提高具有重要意义。通过数据清洗,可以确保数据集的可靠性和适用性,为后续的数据分析和决策提供更有价值的基础。

import pandas as pd
# 读取数据
data = pd.read_csv('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
# 处理缺失值
data.dropna(inplace=True) # 删除包含缺失值的行
# 处理异常值
# 所有矿物百分比都应该在0到100之间
min_percentage = 0
max_percentage = 100
minerals = ['Zn %', 'Fe%', 'Cu %', 'Mn %', 'B %', 'S %']
for mineral in minerals:
data = data[(data[mineral] >= min_percentage) & (data[mineral] <= max_percentage)]
# 数据类型转换
data[minerals] = data[minerals].astype(float)
# 打印清洗后的数据
print(data)

3.大数据分析过程及采用的算法

利用层次聚类算法进行聚类分析:

# 导入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering as Ac
from sklearn.preprocessing import StandardScaler, normalize
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score
import scipy.cluster.hierarchy as hie
# 读取土壤数据集
soil_dataset = pd.read_csv('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
print(soil_dataset.info())
# 删除包含缺失值的行
soil_dataset_1 = soil_dataset.dropna(axis =0)
print(soil_dataset_1.info())
# 从数据集中随机选择155个数据点
random_indexes = np.random.choice(600,155,replace = False)
unique_elements, counts_elements = np.unique(random_indexes, return_counts=True)
# 打印随机抽样数据集的索引和总元素数量
print('Indexes of elements of randomly sampled Dataset:\n {}\n \nTotal number of elements to be chosen from the Dataset : {}'.format(unique_elements,sum(counts_elements)))
# 根据随机索引从数据集中获取对应的数据点
new_soil_dataset = soil_dataset_1.iloc[random_indexes]
print(new_soil_dataset.info)
# 移除地区数据,因为它不是一个分类变量
new_soil_dataset_1 = new_soil_dataset.iloc[:,1:7]
print(new_soil_dataset_1.head())

 

# 调用标准化对象,对数据集进行缩放
scaler = StandardScaler()
scaled_soil_dataset = scaler.fit_transform(new_soil_dataset_1)
normalized_soil_dataset = pd.DataFrame(normalize(scaled_soil_dataset))
# 应用主成分分析(PCA)将数据降维为二维
pca = PCA(n_components = 2)
principal_soil_dataset = pd.DataFrame(pca.fit_transform(normalized_soil_dataset))
principal_soil_dataset.columns = ['Principal Component 1', 'Principal Component 2']
# 存储不同聚类数下的轮廓系数
silhouette_measure_ward = []
silhouette_measure_single = []
silhouette_measure_complete = []
silhouette_measure_average = []
# 使用循环来测试从2到10(包括2但不包括11)的聚类数量
for i in range(2, 11):
silhouette_measure_ward.append(
silhouette_score(principal_soil_dataset, Ac(n_clusters = i,linkage = 'ward').fit_predict(principal_soil_dataset))
)
for i in range(2, 11):
silhouette_measure_single.append(
silhouette_score(principal_soil_dataset, Ac(n_clusters = i,linkage = 'single').fit_predict(principal_soil_dataset))
)
for i in range(2, 11):
silhouette_measure_complete.append(
silhouette_score(principal_soil_dataset, Ac(n_clusters = i,linkage = 'complete').fit_predict(principal_soil_dataset))
)
for i in range(2, 11):
silhouette_measure_average.append(
silhouette_score(principal_soil_dataset, Ac(n_clusters = i,linkage = 'average').fit_predict(principal_soil_dataset))
)
# 定义一个名为clusters的列表,其中包含从2到10的整数。
clusters = [2, 3, 4, 5, 6,7,8,9,10]
fig, ((axa, axb), (axc, axd)) = plt.subplots(2, 2,figsize = (18,12))
fig.suptitle('层次聚类轮廓系数',fontsize =20)
# 在子图axb、axb、axc、axd上绘制条形图,表示使用链接方法的Silhouette分数。
axa.bar(clusters, silhouette_measure_single,edgecolor ='purple',linewidth = 1.5,color = 'gold')
axb.bar(clusters, silhouette_measure_complete,edgecolor ='green',linewidth = 1.5,color = 'gold')
axc.bar(clusters, silhouette_measure_average,edgecolor ='blue',linewidth = 1.5,color = 'gold')
axd.bar(clusters, silhouette_measure_ward,edgecolor ='black',linewidth = 1.5,color = 'gold')
# 为每个子图设置x轴的标签。
axa.set_xlabel('Number of clusters (Single Link HAC)' )
axb.set_xlabel('Number of clusters (Complete Complete HAC)' )
axc.set_xlabel('Number of clusters (Average Link HAC)' )
axd.set_xlabel('Number of clusters (Ward HAC)' )
plt.show()
# 输出具有最大轮廓系数的聚类数量和链接类型
print('Number of clusters for Single Link HAC with maximum silhouette score : {}'.format(silhouette_measure_single.index(max(silhouette_measure_single))+2))
print('Number of clusters for Complete Link HAC with maximum silhouette score : {}'.format(silhouette_measure_complete.index(max(silhouette_measure_complete))+2))
print('Number of clusters for Average Link HAC with maximum silhouette score : {}'.format(silhouette_measure_average.index(max(silhouette_measure_average))+2))
print('Number of clusters for Ward HAC with maximum silhouette score : {}'.format(silhouette_measure_ward.index(max(silhouette_measure_ward))+2))

#使用四种不同的链接方法对数据集进行层次聚类
cluster_1 =Ac(n_clusters=silhouette_measure_single.index(max(silhouette_measure_single))+2, linkage='single')
cluster_1.fit_predict(principal_soil_dataset)
cluster_2 =Ac(n_clusters=silhouette_measure_complete.index(max(silhouette_measure_complete))+2, linkage='complete')
cluster_2.fit_predict(principal_soil_dataset)
cluster_3 =Ac(n_clusters=silhouette_measure_average.index(max(silhouette_measure_average))+2, linkage='average')
cluster_3.fit_predict(principal_soil_dataset)
cluster_4 =Ac(n_clusters=silhouette_measure_ward.index(max(silhouette_measure_ward))+2, linkage='ward')
cluster_4.fit_predict(principal_soil_dataset)
#为不同的链接创建子图
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2,figsize = (18,12))
fig.suptitle('不同关联的聚类的图',fontsize =20)
#在ax1子图上绘制散点图
ax1.scatter(principal_soil_dataset['Principal Component 1'],principal_soil_dataset['Principal Component 2'],c =cluster_1.fit_predict(principal_soil_dataset))
#设置ax1子图的x轴标签
ax1.set_xlabel('FOR SINGLE LINK HAC')
ax2.scatter(principal_soil_dataset['Principal Component 1'],principal_soil_dataset['Principal Component 2'],c =cluster_2.fit_predict(principal_soil_dataset))
ax2.set_xlabel('FOR COMPLETE LINK HAC')
ax3.scatter(principal_soil_dataset['Principal Component 1'],principal_soil_dataset['Principal Component 2'],c =cluster_3.fit_predict(principal_soil_dataset))
ax3.set_xlabel('FOR AVERAGE LINK HAC')
ax4.scatter(principal_soil_dataset['Principal Component 1'],principal_soil_dataset['Principal Component 2'],c =cluster_4.fit_predict(principal_soil_dataset))
ax4.set_xlabel('FOR WARD HAC')
plt.show()

 

4.数据可视化

  1.下面显示的是PH值的直方图,用于展示PH值的分布情况。直方图的横轴表示PH值的取值范围,纵轴表示该范围内PH值的频数或频率。每个柱子的高度表示该区间内PH值的数据点数量(频数),柱子之间的间隔表示不同区间之间的距离。

  土壤的PH值是衡量土壤酸碱性的指标,它反映了土壤中氢离子(H+)的浓度。不同作物对土壤PH值的要求也不同,所以土壤的PH值对于植物生长和发育具有重要的影响。因此,PH值的分布情况和土壤有着密切的关系。

  一般来说,土壤的PH值在6.0到7.5之间的为中性或微酸性土壤,这种土壤适合大部分作物的生长。当土壤的PH值低于6.0时,土壤就会变得过酸,这会导致土壤中的铝、锰等元素释放出来,对植物的根系造成伤害,影响植物的生长和发育。当土壤的PH值高于7.5时,土壤就会变得碱性,这会使得土壤中的钾、铁等元素难以被植物吸收,同样会对植物的生长和发育产生不良影响。

  因此,了解土壤的PH值分布情况对于合理选择作物、合理施肥和调整土地利用方式等方面都具有重要的意义。通过分析土壤的PH值分布情况,可以确定土壤酸碱度的整体趋势和变化规律,有助于制定科学合理的耕作措施,以保证农业生产的高效稳定发展。

import pandas as pd
import matplotlib.pyplot as plt
# 读取数据集
data = pd.read_excel('C:/Users/小苁同学/Desktop/新建文件夹/SOIL DATA GR.xlsx')
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置简黑字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 绘制PH值分布图
plt.figure(figsize=(12, 6))
plt.hist(data['pH'], bins=20, color='skyblue', edgecolor='black')
# 添加标题和坐标轴标签
plt.title('PH值分布', fontsize=16)
plt.xlabel('PH值', fontsize=12)
plt.ylabel('频数', fontsize=12)
# 设置网格线
plt.grid(linestyle='--', alpha=0.5)
# 调整边框样式
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
# 添加背景颜色
plt.gca().set_facecolor('#f4f4f4')
# 显示图形
plt.show()

  2.绘制了六个直方图,分别表示了数据集中不同元素(Zn、Fe、Cu、Mn、B和S)的含量分布情况。每个直方图的横轴表示对应元素的含量范围,纵轴表示该含量范围内出现的样本数或频率。例如,第一个直方图表示了Zn元素的含量分布情况。其中,横轴表示Zn元素的含量范围,纵轴表示该含量范围内出现的样本数或频率。如果某个含量范围内的样本数较多,则该范围对应的柱子会比较高;反之,如果该范围内的样本数较少,则对应的柱子会比较矮。通过绘制直方图,可以直观地看出每个元素在数据集中的含量分布情况,有利于进一步分析和理解数据。

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('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
# 绘制Zn%列的直方图
fig, axs = plt.subplots(2, 3, figsize=(12, 8))
axs[0, 0].hist(data['Zn %'], color='gray', linewidth=1.2)
axs[0, 0].set_title('Zn%含量分布图', fontsize=14)
axs[0, 0].set_xlabel('含量范围(%)', fontsize=12)
axs[0, 0].set_ylabel('样本数', fontsize=12)
axs[0, 0].tick_params(axis='both', labelsize=12)
axs[0, 0].grid(axis='y', linestyle='--')
# 绘制Fe%列的直方图
axs[0, 1].hist(data['Fe%'], color='lightblue', alpha=0.7)
axs[0, 1].set_title('Fe%含量分布图', fontsize=14)
axs[0, 1].set_xlabel('含量范围(%)', fontsize=12)
axs[0, 1].set_ylabel('样本数', fontsize=12)
axs[0, 1].tick_params(axis='both', labelsize=12)
axs[0, 1].grid(axis='y', linestyle='--')
# 绘制Cu%列的直方图
axs[0, 2].hist(data['Cu %'], color='orange', alpha=0.7)
axs[0, 2].set_title('Cu%含量分布图', fontsize=14)
axs[0, 2].set_xlabel('含量范围(%)', fontsize=12)
axs[0, 2].set_ylabel('样本数', fontsize=12)
axs[0, 2].tick_params(axis='both', labelsize=12)
axs[0, 2].grid(axis='y', linestyle='--')
# 绘制Mn%列的直方图
axs[1, 0].hist(data['Mn %'], color='green', alpha=0.7)
axs[1, 0].set_title('Mn%含量分布图', fontsize=14)
axs[1, 0].set_xlabel('含量范围(%)', fontsize=12)
axs[1, 0].set_ylabel('样本数', fontsize=12)
axs[1, 0].tick_params(axis='both', labelsize=12)
axs[1, 0].grid(axis='y', linestyle='--')
# 绘制B%列的直方图
axs[1, 1].hist(data['B %'], color='purple', alpha=0.7)
axs[1, 1].set_title('B%含量分布图', fontsize=14)
axs[1, 1].set_xlabel('含量范围(%)', fontsize=12)
axs[1, 1].set_ylabel('样本数', fontsize=12)
axs[1, 1].tick_params(axis='both', labelsize=12)
axs[1, 1].grid(axis='y', linestyle='--')
# 绘制S%列的直方图
axs[1, 2].hist(data['S %'], color='pink', alpha=0.7)
axs[1, 2].set_title('S%含量分布图', fontsize=14)
axs[1, 2].set_xlabel('含量范围(%)', fontsize=12)
axs[1, 2].set_ylabel('样本数', fontsize=12)
axs[1, 2].tick_params(axis='both', labelsize=12)
axs[1, 2].grid(axis='y', linestyle='--')
plt.tight_layout()
plt.show()

  

  3.箱线图可以帮助理解每种营养元素在不同地区的分布情况:中位数:每个箱线的中间横线代表该营养元素在所有地区中的中位数百分比含量。上下四分位数:箱线的上边界和下边界代表了营养元素含量的四分位数范围,能够帮助你了解数据的离散程度。异常值:在箱线图中,超出上下四分位数1.5倍四分位距的数据点会被认为是异常值(outliers),它们可能代表着一些特殊地区的异常营养元素含量情况。通过观察箱线图,你可以轻松地比较不同地区的营养元素含量的中位数、分布范围和异常值情况。这有助于发现地区之间的差异,并对土壤养分分布情况有一个直观的了解。

import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
mineral_columns = data.columns[1:]
# 箱线图美化设置
boxprops = dict(linewidth=2, color='darkblue')
medianprops = dict(linewidth=2, color='red')
whiskerprops = dict(linewidth=2, color='green')
capprops = dict(linewidth=2, color='black')
# 绘制箱线图
data[mineral_columns].boxplot(boxprops=boxprops, medianprops=medianprops, whiskerprops=whiskerprops,
capprops=capprops, notch=True, patch_artist=True)
# 自定义颜色
colors = ['lightblue', 'lightgreen', 'lightyellow', 'lightpink']
for patch, color in zip(plt.gca().patches, colors):
patch.set_facecolor(color)
# X轴标签旋转
plt.xticks(rotation=45)
# 设置X轴和Y轴标签
plt.xlabel('土壤养分元素')
plt.ylabel('百分比')
# 设置图标题
plt.title('土壤养分箱线图')
# 显示图形
plt.show()

 

  4.绘制了每个土壤营养元素的线形图,每个子图分别展示了土壤数据中矿物元素的平均值、标准差、最大值和最小值。每个子图都是一个线形图(line plot),其中x轴表示矿物元素种类,y轴表示相应的统计量(平均值、标准差、最大值、最小值),这四个图一起构成了一个多子图(multi-subplot)的图形,用于展示土壤数据中矿物元素的不同统计特性,以了解不同养分的分布情况和变异程度。

import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
# 提取矿物元素列
mineral_columns = df.columns[1:]
# 计算平均值、标准差、最大值和最小值
means = df[mineral_columns].mean()
std_devs = df[mineral_columns].std()
max_values = df[mineral_columns].max()
min_values = df[mineral_columns].min()
# 绘制图形
plt.figure(figsize=(14, 10))
# 第一行第一个图形:平均值
plt.subplot(2, 2, 1)
plt.plot(mineral_columns, means, label='Average', marker='o', linestyle='-', color='b')
plt.xlabel('营养元素')
plt.ylabel('百分比')
plt.title('元素的平均值')
plt.legend()
plt.xticks(rotation=45)
plt.grid(True)
# 第一行第二个图形:标准差
plt.subplot(2, 2, 2)
plt.plot(mineral_columns, std_devs, label='Standard Deviation', marker='s', linestyle='--', color='r')
plt.xlabel('营养元素')
plt.ylabel('百分比')
plt.title('元素的标准差')
plt.legend()
plt.xticks(rotation=45)
plt.grid(True)
# 第二行第一个图形:最大值
plt.subplot(2, 2, 3)
plt.plot(mineral_columns, max_values, label='Max', marker='^', linestyle='-.', color='g')
plt.xlabel('营养元素')
plt.ylabel('百分比')
plt.title('元素的最大值')
plt.legend()
plt.xticks(rotation=45)
plt.grid(True)
# 第二行第二个图形:最小值
plt.subplot(2, 2, 4)
plt.plot(mineral_columns, min_values, label='Min', marker='d', linestyle=':', color='m')
plt.xlabel('营养元素')
plt.ylabel('百分比')
plt.title('元素的最小值')
plt.legend()
plt.xticks(rotation=45)
plt.grid(True)
# 添加整体标题
plt.suptitle('土壤营养元素统计', fontsize=16)
# 显示图形
plt.tight_layout()
plt.show()
# 打印结果
print("平均值:")
print(means.to_string(index=False))
print("\n标准差:")
print(std_devs.to_string(index=False))
print("\n最大值:")
print(max_values.to_string(index=False))
print("\n最小值:")
print(min_values.to_string(index=False))

控制台打印:

 

  5.饼形图是一种常用的数据可视化图表,它通过将整体分割成扇形,用于表示各部分组成整体的比例关系。对于矿物饼形图,它表示了不同矿物在所考察的地区中的相对含量。每个扇形代表一个矿物,其大小反映了该矿物在总矿物组成中的比例。

import pandas as pd
import matplotlib.pyplot as plt
# 读取CSV文件
data = pd.read_csv('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
# 提取矿物列的名称
mineral_columns = data.columns[1:]
# 计算每种矿物的总和
mineral_totals = data[mineral_columns].sum()
# 定义自定义颜色
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#c2c2f0', '#ffb3e6']
# 设置爆炸参数
explode = (0, 0, 0.1, 0, 0, 0)
# 绘制爆炸饼图
plt.pie(mineral_totals, labels=mineral_columns, autopct='%1.1f%%', colors=colors, startangle=90,
shadow=True, explode=explode, wedgeprops={'linewidth': 1, 'edgecolor': 'black'})
plt.axis('equal') # 使饼图为圆形
plt.title('土壤养分元素占比情况')
# 设置标签字体
plt.rcParams['font.size'] = 12
# 添加图例并调整位置
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
# 显示图形
plt.show()

 

5.附完整程序源代码

#111----数据清洗
import pandas as pd
# 读取数据
data = pd.read_csv('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
# 处理缺失值
data.dropna(inplace=True) # 删除包含缺失值的行
# 处理异常值
# 所有矿物百分比都应该在0到100之间
min_percentage = 0
max_percentage = 100
minerals = ['Zn %', 'Fe%', 'Cu %', 'Mn %', 'B %', 'S %']
for mineral in minerals:
data = data[(data[mineral] >= min_percentage) & (data[mineral] <= max_percentage)]
# 数据类型转换
data[minerals] = data[minerals].astype(float)
# 打印清洗后的数据
print(data)
#222----PH值的直方图
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据集
data = pd.read_excel('C:/Users/小苁同学/Desktop/新建文件夹/SOIL DATA GR.xlsx')
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置简黑字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 绘制PH值分布图
plt.figure(figsize=(12, 6))
plt.hist(data['pH'], bins=20, color='skyblue', edgecolor='black')
# 添加标题和坐标轴标签
plt.title('PH值分布', fontsize=16)
plt.xlabel('PH值', fontsize=12)
plt.ylabel('频数', fontsize=12)
# 设置网格线
plt.grid(linestyle='--', alpha=0.5)
# 调整边框样式
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
# 添加背景颜色
plt.gca().set_facecolor('#f4f4f4')
# 显示图形
plt.show()
#333----利用层次聚类算法进行聚类分析:
# 导入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering as Ac
from sklearn.preprocessing import StandardScaler, normalize
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score
import scipy.cluster.hierarchy as hie
# 读取土壤数据集
soil_dataset = pd.read_csv('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
print(soil_dataset.info())
# 删除包含缺失值的行
soil_dataset_1 = soil_dataset.dropna(axis =0)
print(soil_dataset_1.info())
# 从数据集中随机选择155个数据点
random_indexes = np.random.choice(600,155,replace = False)
unique_elements, counts_elements = np.unique(random_indexes, return_counts=True)
# 打印随机抽样数据集的索引和总元素数量
print('Indexes of elements of randomly sampled Dataset:\n {}\n \nTotal number of elements to be chosen from the Dataset : {}'.format(unique_elements,sum(counts_elements))
)
# 根据随机索引从数据集中获取对应的数据点
new_soil_dataset = soil_dataset_1.iloc[random_indexes]
print(new_soil_dataset.info)
# 移除地区数据,因为它不是一个分类变量
new_soil_dataset_1 = new_soil_dataset.iloc[:,1:7]
print(new_soil_dataset_1.head())
# 调用标准化对象,对数据集进行缩放
scaler = StandardScaler()
scaled_soil_dataset = scaler.fit_transform(new_soil_dataset_1)
normalized_soil_dataset = pd.DataFrame(normalize(scaled_soil_dataset))
# 应用主成分分析(PCA)将数据降维为二维
pca = PCA(n_components = 2)
principal_soil_dataset = pd.DataFrame(pca.fit_transform(normalized_soil_dataset))
principal_soil_dataset.columns = ['Principal Component 1', 'Principal Component 2']
# 存储不同聚类数下的轮廓系数
silhouette_measure_ward = []
silhouette_measure_single = []
silhouette_measure_complete = []
silhouette_measure_average = []
# 使用循环来测试从2到10(包括2但不包括11)的聚类数量
for i in range(2, 11):
silhouette_measure_ward.append(
silhouette_score(principal_soil_dataset, Ac(n_clusters = i,linkage = 'ward').fit_predict(principal_soil_dataset))
)
for i in range(2, 11):
silhouette_measure_single.append(
silhouette_score(principal_soil_dataset, Ac(n_clusters = i,linkage = 'single').fit_predict(principal_soil_dataset))
)
for i in range(2, 11):
silhouette_measure_complete.append(
silhouette_score(principal_soil_dataset, Ac(n_clusters = i,linkage = 'complete').fit_predict(principal_soil_dataset))
)
for i in range(2, 11):
silhouette_measure_average.append(
silhouette_score(principal_soil_dataset, Ac(n_clusters = i,linkage = 'average').fit_predict(principal_soil_dataset))
)
# 定义一个名为clusters的列表,其中包含从2到10的整数。
clusters = [2, 3, 4, 5, 6,7,8,9,10]
fig, ((axa, axb), (axc, axd)) = plt.subplots(2, 2,figsize = (18,12))
fig.suptitle('Silhouette Scores v/s Number of Clusters for Different types of Linkages',fontsize =20)
# 在子图axb、axb、axc、axd上绘制条形图,表示使用链接方法的Silhouette分数。
axa.bar(clusters, silhouette_measure_single,edgecolor ='purple',linewidth = 1.5,color = 'gold')
axb.bar(clusters, silhouette_measure_complete,edgecolor ='green',linewidth = 1.5,color = 'gold')
axc.bar(clusters, silhouette_measure_average,edgecolor ='blue',linewidth = 1.5,color = 'gold')
axd.bar(clusters, silhouette_measure_ward,edgecolor ='black',linewidth = 1.5,color = 'gold')
# 为每个子图设置x轴的标签。
axa.set_xlabel('Number of clusters (Single Link HAC)' )
axb.set_xlabel('Number of clusters (Complete Complete HAC)' )
axc.set_xlabel('Number of clusters (Average Link HAC)' )
axd.set_xlabel('Number of clusters (Ward HAC)' )
plt.show()
# 输出具有最大轮廓系数的聚类数量和链接类型
print('Number of clusters for Single Link HAC with maximum silhouette score : {}'.format(
silhouette_measure_single.index(max(silhouette_measure_single))+2)
)
print('Number of clusters for Complete Link HAC with maximum silhouette score : {}'.format(
silhouette_measure_complete.index(max(silhouette_measure_complete))+2)
)
print('Number of clusters for Average Link HAC with maximum silhouette score : {}'.format(
silhouette_measure_average.index(max(silhouette_measure_average))+2)
)
print('Number of clusters for Ward HAC with maximum silhouette score : {}'.format(
silhouette_measure_ward.index(max(silhouette_measure_ward))+2)
)
#使用四种不同的链接方法对数据集进行层次聚类
cluster_1 =Ac(n_clusters=silhouette_measure_single.index(max(silhouette_measure_single))+2, linkage='single')
cluster_1.fit_predict(principal_soil_dataset)
cluster_2 =Ac(n_clusters=silhouette_measure_complete.index(max(silhouette_measure_complete))+2, linkage='complete')
cluster_2.fit_predict(principal_soil_dataset)
cluster_3 =Ac(n_clusters=silhouette_measure_average.index(max(silhouette_measure_average))+2, linkage='average')
cluster_3.fit_predict(principal_soil_dataset)
cluster_4 =Ac(n_clusters=silhouette_measure_ward.index(max(silhouette_measure_ward))+2, linkage='ward')
cluster_4.fit_predict(principal_soil_dataset)
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2,figsize = (18,12)) #Creating the subplots for different linkages
fig.suptitle('Plots showing clusters for different linkages',fontsize =20)
ax1.scatter(principal_soil_dataset['Principal Component 1'],principal_soil_dataset['Principal Component 2'],
c =cluster_1.fit_predict(principal_soil_dataset)
)
ax1.set_xlabel('FOR SINGLE LINK HAC')
ax2.scatter(principal_soil_dataset['Principal Component 1'],principal_soil_dataset['Principal Component 2'],
c =cluster_2.fit_predict(principal_soil_dataset)
)
ax2.set_xlabel('FOR COMPLETE LINK HAC')
ax3.scatter(principal_soil_dataset['Principal Component 1'],principal_soil_dataset['Principal Component 2'],
c =cluster_3.fit_predict(principal_soil_dataset)
)
ax3.set_xlabel('FOR AVERAGE LINK HAC')
ax4.scatter(principal_soil_dataset['Principal Component 1'],principal_soil_dataset['Principal Component 2'],
c =cluster_4.fit_predict(principal_soil_dataset)
)
ax4.set_xlabel('FOR WARD HAC')
plt.show()
#444------绘制直方图
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('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
# 绘制Zn%列的直方图
fig, axs = plt.subplots(2, 3, figsize=(12, 8))
axs[0, 0].hist(data['Zn %'], color='gray', linewidth=1.2)
axs[0, 0].set_title('Zn%含量分布图', fontsize=14)
axs[0, 0].set_xlabel('含量范围(%)', fontsize=12)
axs[0, 0].set_ylabel('样本数', fontsize=12)
axs[0, 0].tick_params(axis='both', labelsize=12)
axs[0, 0].grid(axis='y', linestyle='--')
# 绘制Fe%列的直方图
axs[0, 1].hist(data['Fe%'], color='lightblue', alpha=0.7)
axs[0, 1].set_title('Fe%含量分布图', fontsize=14)
axs[0, 1].set_xlabel('含量范围(%)', fontsize=12)
axs[0, 1].set_ylabel('样本数', fontsize=12)
axs[0, 1].tick_params(axis='both', labelsize=12)
axs[0, 1].grid(axis='y', linestyle='--')
# 绘制Cu%列的直方图
axs[0, 2].hist(data['Cu %'], color='orange', alpha=0.7)
axs[0, 2].set_title('Cu%含量分布图', fontsize=14)
axs[0, 2].set_xlabel('含量范围(%)', fontsize=12)
axs[0, 2].set_ylabel('样本数', fontsize=12)
axs[0, 2].tick_params(axis='both', labelsize=12)
axs[0, 2].grid(axis='y', linestyle='--')
# 绘制Mn%列的直方图
axs[1, 0].hist(data['Mn %'], color='green', alpha=0.7)
axs[1, 0].set_title('Mn%含量分布图', fontsize=14)
axs[1, 0].set_xlabel('含量范围(%)', fontsize=12)
axs[1, 0].set_ylabel('样本数', fontsize=12)
axs[1, 0].tick_params(axis='both', labelsize=12)
axs[1, 0].grid(axis='y', linestyle='--')
# 绘制B%列的直方图
axs[1, 1].hist(data['B %'], color='purple', alpha=0.7)
axs[1, 1].set_title('B%含量分布图', fontsize=14)
axs[1, 1].set_xlabel('含量范围(%)', fontsize=12)
axs[1, 1].set_ylabel('样本数', fontsize=12)
axs[1, 1].tick_params(axis='both', labelsize=12)
axs[1, 1].grid(axis='y', linestyle='--')
# 绘制S%列的直方图
axs[1, 2].hist(data['S %'], color='pink', alpha=0.7)
axs[1, 2].set_title('S%含量分布图', fontsize=14)
axs[1, 2].set_xlabel('含量范围(%)', fontsize=12)
axs[1, 2].set_ylabel('样本数', fontsize=12)
axs[1, 2].tick_params(axis='both', labelsize=12)
axs[1, 2].grid(axis='y', linestyle='--')
plt.tight_layout()
plt.show()
#555-------- 绘制箱线图
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
mineral_columns = data.columns[1:]
# 箱线图美化设置
boxprops = dict(linewidth=2, color='darkblue')
medianprops = dict(linewidth=2, color='red')
whiskerprops = dict(linewidth=2, color='green')
capprops = dict(linewidth=2, color='black')
# 绘制箱线图
data[mineral_columns].boxplot(boxprops=boxprops, medianprops=medianprops, whiskerprops=whiskerprops,
capprops=capprops, notch=True, patch_artist=True
)
# 自定义颜色
colors = ['lightblue', 'lightgreen', 'lightyellow', 'lightpink']
for patch, color in zip(plt.gca().patches, colors):
patch.set_facecolor(color)
# X轴标签旋转
plt.xticks(rotation=45)
# 设置X轴和Y轴标签
plt.xlabel('土壤养分元素')
plt.ylabel('百分比')
# 设置图标题
plt.title('土壤养分箱线图')
# 显示图形
plt.show()
#666------绘制线形图
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
# 提取矿物元素列
mineral_columns = df.columns[1:]
# 计算平均值、标准差、最大值和最小值
means = df[mineral_columns].mean()
std_devs = df[mineral_columns].std()
max_values = df[mineral_columns].max()
min_values = df[mineral_columns].min()
# 绘制图形
plt.figure(figsize=(14, 10))
# 第一行第一个图形:平均值
plt.subplot(2, 2, 1)
plt.plot(mineral_columns, means, label='Average', marker='o', linestyle='-', color='b')
plt.xlabel('营养元素')
plt.ylabel('百分比')
plt.title('元素的平均值')
plt.legend()
plt.xticks(rotation=45)
plt.grid(True)
# 第一行第二个图形:标准差
plt.subplot(2, 2, 2)
plt.plot(mineral_columns, std_devs, label='Standard Deviation', marker='s', linestyle='--', color='r')
plt.xlabel('营养元素')
plt.ylabel('百分比')
plt.title('元素的标准差')
plt.legend()
plt.xticks(rotation=45)
plt.grid(True)
# 第二行第一个图形:最大值
plt.subplot(2, 2, 3)
plt.plot(mineral_columns, max_values, label='Max', marker='^', linestyle='-.', color='g')
plt.xlabel('营养元素')
plt.ylabel('百分比')
plt.title('元素的最大值')
plt.legend()
plt.xticks(rotation=45)
plt.grid(True)
# 第二行第二个图形:最小值
plt.subplot(2, 2, 4)
plt.plot(mineral_columns, min_values, label='Min', marker='d', linestyle=':', color='m')
plt.xlabel('营养元素')
plt.ylabel('百分比')
plt.title('元素的最小值')
plt.legend()
plt.xticks(rotation=45)
plt.grid(True)
# 添加整体标题
plt.suptitle('土壤营养元素统计', fontsize=16)
# 显示图形
plt.tight_layout()
plt.show()
# 打印结果
print("平均值:")
print(means.to_string(index=False))
print("\n标准差:")
print(std_devs.to_string(index=False))
print("\n最大值:")
print(max_values.to_string(index=False))
print("\n最小值:")
print(min_values.to_string(index=False))
##777------绘制饼形图
import pandas as pd
import matplotlib.pyplot as plt
# 读取CSV文件
data = pd.read_csv('C:/Users/小苁同学/Desktop/新建文件夹/archive/soil.csv')
# 提取矿物列的名称
mineral_columns = data.columns[1:]
# 计算每种矿物的总和
mineral_totals = data[mineral_columns].sum()
# 定义自定义颜色
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#c2c2f0', '#ffb3e6']
# 设置爆炸参数
explode = (0, 0, 0.1, 0, 0, 0)
# 绘制爆炸饼图
plt.pie(mineral_totals, labels=mineral_columns, autopct='%1.1f%%', colors=colors, startangle=90,
shadow=True, explode=explode, wedgeprops={'linewidth': 1, 'edgecolor': 'black'}
)
plt.axis('equal') # 使饼图为圆形
plt.title('土壤养分元素占比情况')
# 设置标签字体
plt.rcParams['font.size'] = 12
# 添加图例并调整位置
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
# 显示图形
plt.show()

四、总结 

1.通过对不同地区土壤养分组成的大数据进行分析和挖掘,可以得到以下结论和目标达成情况:

  分析不同地区土壤的养分含量差异:通过统计分析和可视化展示,我们可以比较不同地区土壤养分的平均值、标准差、最大值和最小值等指标,了解各地土壤养分的差异性。

  是否达到预期的目标需要根据具体情况进行评估。如果成功地从大数据中提取了有益的结论,并且这些结论对于实际应用具有指导意义,那么可以认为达到了预期的目标。

2.在完成这个课程设计过程中获得了以下收获:

  数据分析和挖掘技能:学会如何使用Python进行数据清洗、处理、统计分析等技术,提高了数据分析能力和编程能力。

  对大数据分析的认识:深刻理解了大数据分析在农业生产、环境保护等领域的重要性和实际应用,意识到数据分析可以为这些领域带来巨大的价值。

  数据可视化能力:学会如何将数据可视化,通过图表、图形等方式直观地展示数据分析的结果。

3.改进的建议

  可以考虑进一步扩大数据样本的规模,增加不同地区的数据量,以获得更全面和准确的结论。同时,可以尝试使用更多的机器学习算法和模型,以提高预测和分类的准确性。另外,可以考虑将数据分析和挖掘的结果与实际农田进行验证,以验证结论的可靠性和实用性。

posted @   2203840433  阅读(249)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示