UCI数据库中有一个著名的数据集叫做Iris(鸢尾花)数据集,它用于分类问题的机器学习任务。这个数据集描述了三种不同种类的鸢尾花:Setosa、Versicolor和Virginica。每个样本有四个特征:萼片长度(sepal length)、萼片宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width)。
要对Iris数据集进行分析,首先需要获取数据集并加载到分析环境中。可以通过访问UCI数据库的网站(https://archive.ics.uci.edu/ml/datasets/iris鸢尾花数据集)来获取Iris数据集的下载链接。
数据清洗:
在Python中对Iris数据集进行数据清洗的过程通常包括以下步骤:
1. 导入必要的库:在开始清洗之前,首先导入需要使用的库,如`pandas`和`numpy`。
import pandas as pd
import numpy as np
2. 加载数据集:使用`pandas`库的`read_csv()`函数加载数据集。
data = pd.read_csv('path_to_iris_dataset.data') #path_to_iris_dataset.data为下载的数据集
3. 检查数据集:查看数据集的前几行以及基本信息,确保数据加载正确并了解数据的结构。
print(data.head())
print(data.info())
4. 处理缺失值:检查数据集中是否有缺失值,如果有,可以根据情况进行处理。以下是两种常见的处理方式:
- 删除含有缺失值的行:
data.dropna(inplace=True)
- 填充缺失值,例如使用特征的平均值或中位数:
data.fillna(data.mean(), inplace=True)
5. 处理重复值:检查并删除数据集中的重复值。
data.drop_duplicates(inplace=True)
6. 处理异常值:对于可能存在异常值的特征,可以根据领域知识或统计方法进行处理。一种常见的方法是使用正态分布的3σ原则来识别和删除异常值。
mean = data['feature'].mean()
std = data['feature'].std()
threshold = 3 * std
data = data[(data['feature'] > mean - threshold) & (data['feature'] < mean + threshold)]
将 `'feature'` 替换为实际的特征名称。
7. 数据转换:如果需要对数据进行转换(例如将类别特征转换为数值编码),可以使用`pandas`的相关函数,如`map()`或`replace()`。
8. 保存清洗后的数据集:将清洗后的数据保存到新的文件中,以便后续分析。
data.to_csv('cleaned_iris_dataset.csv', index=False)
请将 `'cleaned_iris_dataset.csv'` 替换为你想要保存数据集的实际路径和文件名。
任务一:
计算鸢尾花数据集的基本统计数据并画出趋势图,可以使用`pandas`和`matplotlib`库来完成这些任务。以下是一些示例代码:
import pandas as pd
import matplotlib.pyplot as plt
# 加载数据集
data = pd.read_csv('path_to_lris.data', header=None, names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class'])
# 基本统计数据
statistics = data.describe()
print(statistics)
# 不同类别的统计数据
class_statistics = data.groupby('class').describe()
print(class_statistics)
# 趋势图
data.plot(x='sepal_length', y='sepal_width', kind='scatter')
plt.title('Sepal Width vs. Sepal Length')
plt.show()
data.plot(x='petal_length', y='petal_width', kind='scatter')
plt.title('Petal Width vs. Petal Length')
plt.show()
# 不同类别的趋势图
class_names = data['class'].unique()
for class_name in class_names:
class_data = data[data['class'] == class_name]
class_data.plot(x='sepal_length', y='sepal_width', kind='scatter', label=class_name)
plt.title('Sepal Width vs. Sepal Length - {}'.format(class_name))
plt.legend()
plt.show()
class_data.plot(x='petal_length', y='petal_width', kind='scatter', label=class_name)
plt.title('Petal Width vs. Petal Length - {}'.format(class_name))
plt.legend()
plt.show()
将`path_to_lris.data`替换为实际的数据集路径。
以上代码首先加载数据集,并计算了整体数据集的基本统计数据(均值、标准差、最小值、最大值等),使用`describe()`函数实现。接着,根据不同的类别进行分组,并计算每个类别的统计数据。
然后,代码绘制了两个趋势图,分别是萼片宽度与萼片长度的关系,以及花瓣宽度与花瓣长度的关系。通过调用`plot()`函数,指定x轴和y轴的特征列,以及图表类型为散点图(kind='scatter')。使用`plt.title()`函数为图表添加标题,并通过`plt.show()`显示图表。
最后,代码绘制了不同类别的趋势图,分别展示了不同类别的萼片宽度与萼片长度的关系,以及花瓣宽度与花瓣长度的关系。通过在循环中筛选每个类别的数据,并使用`label`参数为每个类别的图表添加图例,实现了不同类别的趋势图的绘制。