数据挖掘实战1:泰坦尼克号数据

慈云数据 2024-06-01 技术支持 41 0

一、数据挖掘流程

1.数据读取

      -读取数据

      -统计指标

      -数据规模

2.数据探索(特征理解)

      -单特征的分析,诸个变量分析对结果y的影响(x,y的相关性)

      -多变量分析(x,y之间的相关性)

      -统计绘图

3.数据清洗和预处理

      -缺失值填充

      -标准化、归一化

      -特征工程(筛选有价值的特征)

      -分析特征之间的相关性

4.建模

      -特征数据的准备和标签

      -数据集的切分

      -多种模型对比:交叉验证、调参(学习曲线,网格搜索)

      -集成算法(提升算法)XGBoost、GBDT、light-GBM、神经网络(多种集成)

二、代码实现

1.数据读取

数据集可以去kaggle下载:Titanic - Machine Learning from Disaster | Kaggle。

data = pd.read_csv('./data/train.csv')
pd.set_option('display.max_columns', 20)
print(data.head(4))

print(data.info())

print(data['Survived'].value_counts())  # 当前列计数

 2、数据探索

# 标签比例 获救比例,饼图
f, ax = plt.subplots(1, 2, figsize=(10, 6))
data['Survived'].value_counts().plot.pie(explode=[0, 0.1],  # 偏移量
                                         autopct='%1.1f%%',  # 百分比保留小数位数 
                                         ax=ax[0], shadow=True)
ax[0].set_title('Survived')  # 图一标题
sns.countplot('Survived', saturation=0.75,  # 饱和度
              data=data, ax=ax[1])  # 柱状图
plt.show()

# 男女获救比例
print(data.groupby(['Sex', 'Survived'])['Survived'].count())

sns.countplot('Sex', hue='Survived', data=data)  # 柱状图
plt.show()

# 船舱等级和获救之间的关系
print(pd.crosstab(data['Pclass'], data['Survived'], margins=True))

 

sns.countplot('Pclass', hue='Survived', data=data)
plt.show()

# 不同性别及船舱等级和获救之间的关系
print(pd.crosstab([data['Sex'], data['Survived']], data['Pclass'], margins=True))

sns.factorplot('Pclass', 'Survived',
               hue='Sex',  # 颜色
               data=data)   # 降维画图
plt.grid()
plt.show()

 

 3.数据清洗和预处理

3.1 提取性别身份,并将少数类归为其他

data['initial'] = data['Name'].str.extract('([A-Za-z]+)\.') # 提取性别身份
print(data['initial'].head(5))

print(pd.crosstab(data['initial'], data['Sex']).T)

 将少数的列变为other列。(除Master、Mr、Miss、Mrs外的其他列变为other列)

def transformOther(str):
    if str != 'Master' and str != 'Miss' and str != 'Mr' and str != 'Mrs':
        str = 'other'
    return str
data['re'] = data['initial'].apply(transformOther)
print(data['re'].unique())

print(data.groupby('re')['Sex'].count())

 3.2 缺失值填充

3.2.1填补Age缺失值(用各性别下年龄均值去填补Age缺失值)

# 各性别下年龄均值
print(data.groupby('re')['Age'].mean())
print(int(data.groupby('re')['Age'].mean()[0]))

def FillNullAge(age):
    for str in data['re'].values:
        if np.isnan(age):
            age = int(data.groupby('re')['Age'].mean()[str])
    return age
data['Age'] = data['Age'].apply(FillNullAge)
print(data['Age'].isnull().sum())

3.2.2 填充港口数据

上船港口和船舱等级之间的关系。

# 上船港口和船舱等级之间的关系
print(pd.crosstab(data['Embarked'], data['Pclass'], margins=True))
sns.countplot('Embarked',  # 上船的港口
              hue='Pclass', data=data)
plt.show()

 上船港口和获救之间的关系。

# 上船港口和获救之间的关系
print(pd.crosstab(data['Embarked'], data['Survived'], margins=True))
sns.countplot('Embarked', hue='Survived', data=data)
plt.show()

 

 填补港口数据为s。

data['Embarked'].fillna('s', inplace=True)  # 填补港口数据
print(data['Embarked'].isnull().any())

 不同船舱的核密度估计图

# 不同船舱的核密度估计图
f, ax = plt.subplots(1, 3, figsize=(10, 8))
sns.distplot(data[data['Pclass'] == 1].Fare, ax=ax[0])
sns.distplot(data[data['Pclass'] == 2].Fare, ax=ax[1])
sns.distplot(data[data['Pclass'] == 3].Fare, ax=ax[2])
plt.show()

 相关性热图

# 相关性热图
sns.heatmap(data.corr(), annot=True, linewidths=0.2, cmap='summer_r')
fig = plt.gcf()
fig.set_size_inches(8, 6)
plt.savefig('heatmap.jpg')

 

 3.3 数据处理

3.3.1 年龄分段(

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon