任务描述 本关任务:完成泰坦尼克号遇难数据的清洗。 相关知识 案例背景 泰坦尼克号遭遇的灾难震惊世界,如何避免灾难甚至预测灾难呢? 要实现首先要做好泰坦尼克号的损失数据统计,才能为数据分析打下基础。 观察数据特点 如图所示的数据集中有一些的缺失值和不合理的数字即离群点。 目标:预测泰坦尼克号上的乘客是幸存还是遇难,每个乘客对应一个乘客Id,用0表示遇难,用1表示幸存。 理论基础 数据清洗 有上图案例的数据可知,在现实生活中的数据是“脏”的: 不完整的:缺少属性值。 例如,年龄=" "(地市的值) 含嘈杂的噪音,错误或离群。 例如,票价="-10"(错误) 如何处理丢失的数据 1.忽略元组:当每个属性缺少值比例比较大时,它的效果非常差 2.手动填写遗漏值:工作量大 3.自动填写 使用属性的平均值填充空缺值 最有可能的值:基于诸如贝叶斯公式或决策树推理 缺失值处理方法 import pandas as pd import numpy as np from sklearn.impute import SimpleImputer import matplotlib.pyplot as plt data_url = "train.csv" df = pd.read_csv(data_url) #使用属性的平均值填充空缺值 imp = SimpleImputer(missing_values = np.nan, strategy = 'mean') imp.fit(df.iloc[:,5:6]) plt.hist(imp.transform(df.iloc[:,5:6])) plt.show() 如何处理噪音数据 正态分布检测离群数据:删除离群点 基于正态分布的一元离群点检测 假定数据集由一个正态分布产生,然后,可以由输入数据学习正态分布的参数,并把低概率的点识别为离群点。 在正态分布的假定下,区域包含99.7%的数据,包含95.4%的数据,包含68.3%的数据。视具体情况而定,将其区域外的数据视为离群点。 数值分布在(μ-σ,μ+σ)中的概率为0.6827 数值分布在(μ-2σ,μ+2σ)中的概率为0.9545 数值分布在(μ-3σ,μ+3σ)中的概率为0.9973 箱线图检测离群数据:删除离群点 四分位数 四分位数:Q1(第25百分位),Q3(第75百分位) 四分位数极差:IQR= Q3 - Q1 IQR=Q3−Q1 max=Q3+1.5∗IQR min=Q1−1.5∗IQR 离群点:通常情况下,一个值高于/低于1.5×IQR 处理噪声数据代码实现 import pandas as pd import numpy as np import matplotlib.pyplot as pl from sklearn.impute import SimpleImputer data_url = "train.csv" df = pd.read_csv(data_url) imp = SimpleImputer(missing_values = np.nan, strategy = 'mean') imp.fit(df.iloc[:,5:6]) pl.boxplot(imp.transform(df.iloc[:,5:6])) pl.xlabel('data') pl.show() 编程要求 根据提示,你需要完成: 缺失值填充 离群点检测 测试说明 平台会对你编写的代码进行测试: 开始你的任务吧,祝你成功! 需要补充的代码:import numpy as np import pandas as pd #读取数据 df=pd.read_csv('/data/workspace/myshixun/step1/train.csv') ##### begin ##### #查看列中是否存在空值 #使用SimpleImputer取出缺失值所在列的数值,sklearn当中特征矩阵必须是二维才能传入 使用reshape(-1,1)升维 age=df['Age'].values.reshape(-1,1) #导入模块 from sklearn.impute import SimpleImputer #实例化,均值填充,可改变strategy参数,实现其他填充方式 #fit_transform一步完成调取结果 #填充好的数据传回到 data['Age']列df_fillna=df #检验是否还有空值,为0即说明空值均已被填充 ##### end ##### imp_mean=SimpleImputer(missing_values=np.nan,
时间: 2025-03-19 18:06:05 浏览: 54
### 泰坦尼克号数据集的数据清洗方法
#### 缺失值处理
对于泰坦尼克号数据集中存在的缺失值,可以通过统计学方法或者业务逻辑来填补这些空白。以下是常见的几种方式及其对应的代码实现:
1. **数值型特征的缺失值填充**
如果某一列是连续变量(如 `Age`),可以采用均值、中位数或众数来进行填充。通常情况下,使用中位数更为稳健,因为它不受极端值的影响。
```python
import pandas as pd
# 使用中位数填充 Age 列中的缺失值
train_df['Age'].fillna(train_df['Age'].median(), inplace=True)
test_df['Age'].fillna(test_df['Age'].median(), inplace=True) # 同样适用于测试集
```
2. **类别型特征的缺失值填充**
类别型变量(如 `Embarked`)可以选择用最常见的类目即众数进行替换。
```python
# 使用众数填充 Embarked 列中的缺失值
most_frequent_port = train_df['Embarked'].mode()[0]
train_df['Embarked'].fillna(most_frequent_port, inplace=True)
test_df['Embarked'].fillna(most_frequent_port, inplace=True)
```
3. **特殊情况下的自定义填充策略**
部分字段可能需要基于其他信息推断其合理取值范围再做决定。比如 Cabin 的缺失情况较为严重,可考虑直接删除该属性或将它转换成是否有记录的形式简化分析过程。
```python
# 将 Cabin 转化为二元分类 (存在与否),并丢弃原始 Cabin 列
train_df['Cabin'] = train_df['Cabin'].apply(lambda x: 'Yes' if isinstance(x, str) else 'No')
test_df['Cabin'] = test_df['Cabin'].apply(lambda x: 'Yes' if isinstance(x, str) else 'No')
```
#### 离群点检测与处理
离群点可能会扭曲模型的结果,在实际操作前需先识别它们的位置然后采取相应措施消除影响。
1. **箱线图法(IQR)**
基于四分位距(Interquartile Range)计算上下界之外的数据视为异常点。
```python
Q1 = train_df['Fare'].quantile(0.25)
Q3 = train_df['Fare'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = ((train_df['Fare'] < lower_bound) | (train_df['Fare'] > upper_bound))
# 移除离群点 或者 替换为边界值
train_df.loc[outliers, 'Fare'] = np.clip(train_df['Fare'], a_min=lower_bound, a_max=upper_bound)
```
通过上述手段完成初步清理工作之后即可进入后续建模阶段[^1][^2]。
阅读全文
相关推荐


















