云计算百科
云计算领域专业知识百科平台

Python数据分析:分析鸢尾花种类数据项目实战

Python数据分析:分析鸢尾花种类数据项目实战

大家好!今天分享一个经典的数据分析项目——鸢尾花种类数据分析。我们将通过Python对两种鸢尾花的萼片、花瓣的长度和宽度进行统计检验,探究它们是否存在显著性差异。整个过程包括数据读取、清洗、探索性分析和假设检验,代码完整,适合初学者学习。让我们一起开始吧!🚀

📌 分析目标

本次分析的目标是:基于鸢尾花的属性数据,分析两种鸢尾花(Setosa和Versicolor)萼片、花瓣的长度和宽度平均值是否存在显著性差异,从而对不同种类鸢尾花的属性特征进行推断。

📁 数据简介

原始数据文件为 Iris.csv,包含两种鸢尾花,每种50个样本。每列含义如下:

  • Id:样本ID

  • SepalLengthCm:萼片长度(厘米)

  • SepalWidthCm:萼片宽度(厘米)

  • PetalLengthCm:花瓣长度(厘米)

  • PetalWidthCm:花瓣宽度(厘米)

  • Species:鸢尾花种类(Iris-setosa 或 Iris-versicolor)

📥 1. 读取数据

首先导入必要的库,并用Pandas读取数据。

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

original_data = pd.read_csv("Iris.csv")
original_data.head()

图片

输出结果展示了前5行数据,每个样本都有对应的ID、长度宽度和种类。

🧹 2. 评估和清理数据

创建数据副本,以便在清理时保留原始数据。

cleaned_data = original_data.copy()

2.1 数据整齐度检查

检查数据是否符合“每个变量为一列,每个观察值为一行”的规范。查看前10行数据,确认结构良好。

cleaned_data.head(10)

图片

2.2 数据干净度处理

基本信息查看

使用 info() 查看数据类型和缺失值情况。

cleaned_data.info()

图片

结果显示共有100条记录,无缺失值。但Id列应为字符串类型,需要转换。

cleaned_data["Id"] = cleaned_data["Id"].astype("str")
cleaned_data["Id"]

缺失数据处理

info()已显示无缺失值,无需处理。

重复数据处理

检查Id是否有重复值:

cleaned_data["Id"].duplicated().sum()

输出0,无重复数据。

不一致数据处理

查看Species列的唯一值:

cleaned_data["Species"].value_counts()

图片

结果只有两种类别:Iris-setosa和Iris-versicolor,无不一致数据。我们将该列转换为category类型以节省内存。

cleaned_data["Species"] = cleaned_data["Species"].astype("category")
cleaned_data["Species"]

图片

无效或错误数据处理

使用 describe() 查看数值列的统计信息,确认无异常值。

cleaned_data.describe()

图片

所有数值均在合理范围内,无需处理。

📊 3. 整理数据

根据分析目标,我们需要将两种鸢尾花的数据分开。

iris_setosa = cleaned_data.query('Species == "Iris-setosa"')
iris_setosa.head()

len(iris_setosa)  # 50

iris_versicolor = cleaned_data.query('Species == "Iris-versicolor"')
iris_versicolor.head()

len(iris_versicolor)  # 50

🔍 4. 探索数据

使用pairplot可视化两种鸢尾花各特征的分布关系,颜色区分种类。

sns.pairplot(cleaned_data, hue="Species")
plt.show()

图片

从图中可以看出,花瓣长度和宽度在两类之间差异明显,而萼片长度和宽度有一定重叠,需进一步统计检验。

📈 5. 分析数据

我们将对萼片长度、萼片宽度、花瓣长度、花瓣宽度分别进行独立样本t检验,判断均值是否存在显著差异。

引入t检验模块:

from scipy.stats import ttest_ind

5.1 萼片长度分析

分布可视化

sns.histplot(iris_setosa['SepalLengthCm'], binwidth=0.1)
sns.histplot(iris_versicolor['SepalLengthCm'], binwidth=0.1)
plt.show()

图片

假设检验
  • 原假设H₀:两种鸢尾花萼片长度平均值无显著差异。

  • 备择假设H₁:两种鸢尾花萼片长度平均值存在显著差异。

  • 检验类型:双尾检验(我们只关心是否有差异,不关心谁大谁小)。

  • 显著性水平α:0.05

t_stat, p_value = ttest_ind(iris_setosa["SepalLengthCm"], iris_versicolor["SepalLengthCm"])
print(f"t值:{t_stat}")
print(f"p值:{p_value}")

输出:

t值:-10.52098626754911
p值:8.985235037487079e-18

结论:p值远小于0.05,拒绝原假设,两种鸢尾花萼片长度均值存在显著差异。

5.2 萼片宽度分析

分布可视化

sns.histplot(iris_setosa['SepalWidthCm'], binwidth=0.1)
sns.histplot(iris_versicolor['SepalWidthCm'], binwidth=0.1)
plt.show()

图片

假设检验
  • 原假设H₀:两种鸢尾花萼片宽度平均值无显著差异。

  • 备择假设H₁:存在显著差异。

  • 双尾检验,α=0.05

t_stat, p_value = ttest_ind(iris_setosa["SepalWidthCm"], iris_versicolor["SepalWidthCm"])
print(f"t值:{t_stat}")
print(f"p值:{p_value}")

输出:

t值:9.282772555558111
p值:4.362239016010214e-15

结论:p值 < 0.05,拒绝原假设,萼片宽度均值存在显著差异。

5.3 花瓣长度分析

分布可视化

sns.histplot(iris_setosa['PetalLengthCm'], binwidth=0.1)
sns.histplot(iris_versicolor['PetalLengthCm'], binwidth=0.1)
plt.show()

图片

假设检验

t_stat, p_value = ttest_ind(iris_setosa["PetalLengthCm"], iris_versicolor["PetalLengthCm"])
print(f"t值:{t_stat}")
print(f"p值:{p_value}")

输出:

t值:-39.46866259397272
p值:5.717463758170621e-62

结论:p值 < 0.05,花瓣长度均值存在显著差异。

5.4 花瓣宽度分析

分布可视化

sns.histplot(iris_setosa['PetalWidthCm'], binwidth=0.1)
sns.histplot(iris_versicolor['PetalWidthCm'], binwidth=0.1)
plt.show()

图片

假设检验

t_stat, p_value = ttest_ind(iris_setosa["PetalWidthCm"], iris_versicolor["PetalWidthCm"])
print(f"t值:{t_stat}")
print(f"p值:{p_value}")

输出:

t值:-34.01237858829048
p值:4.589080615710866e-56

结论:p值 < 0.05,花瓣宽度均值存在显著差异。

📝 6. 结论

通过上述分析,我们得出以下结论:

  • Setosa鸢尾花和Versicolor鸢尾花在萼片长度、萼片宽度、花瓣长度、花瓣宽度的平均值上均存在统计显著性差异(所有p值均远小于0.05)。

本次项目完整地演示了数据清洗、探索性分析和假设检验的流程,希望对大家的数据分析学习有所帮助!如果你有任何问题或想法,欢迎在评论区留言交流~ 💬


💡 完整代码及数据可在公众号后台回复「鸢尾花」获取。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Python数据分析:分析鸢尾花种类数据项目实战
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!