机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾(上)

简介: 本篇博客通过分析泰坦尼克号事故中乘客的信息,从而得出一些相关关系的判断,并且使用Python可视化的手段更加具体的展现。

一、数据的初步探索



import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline  # 有时候图片展示不出来可能是这个原因
plt.rcParams['font.sans-serif']=['Microsoft YaHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
from datetime import datetime
plt.figure(figsize=(16,10))
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker
from pyecharts.charts import Bar
import os
from pyecharts.options.global_options import ThemeType
from scipy import stats
import pandas_profiling
from autoviz.AutoViz_Class import AutoViz_Class
from IPython.display import display
from statsmodels.stats.weightstats import ztest
import nltk
import plotly.graph_objs as go
import plotly.express as px
# 安装第三方工具包
!pip install pandas_profiling
!pip install autoviz
!pip install ppscore
# 读入数据
df=pd.read_csv("titanic.csv")
display(df.head(10))

e839909ae8cf4a02b7f663d51071c9d4.png

•PassengerID(ID)
•Survived(存活与否)
•Pclass(客舱等级,较为重要)
•Name(姓名,可提取出更多信息)
•Sex(性别,较为重要)
•Age(年龄,较为重要)
•Parch(直系亲友)
•SibSp(旁系)
•Ticket(票编号)
•Fare(票价)
•Cabin(客舱编号)
•Embarked(上船的港口编号)

使用Pandas profiling 库:

Pandas profiling可以弥补pandas describe没有详细数据报告生成的不足。它为数据集提供报告生成,并为生成的报告提供许多功能和自定义。

report=pandas_profiling.ProfileReport(df)
display(report)
# 通过不同的角度查看缺失值

0dae398134d14038b7813eb92b04d10c.png

使用Python Autoviz,一行代码即可完成对数据集所有关系的探索:

AV=AutoViz_Class()
report2=AV.AutoViz("titanic.csv")

初步的分析数据:

021a141a781e4d218a40ad2f15dc9640.gif

df_survivors=df[df['Survived']==1]  # 幸存者
df_nonsurvivors=df[df['Survived']==0] # 遇难者
df_survivors.head()

abd96e46f76643d5b77dddd765dfb705.png


绘制小提琴图:

violin_survivors=go.Violin(
    y=df_survivors['Age'],
    x=df_survivors['Survived'],
    name='Survivors',
    marker_color='forestgreen',
    box_visible=True)
violin_nonsurvivors=go.Violin(
    y=df_nonsurvivors['Age'],
    x=df_nonsurvivors['Survived'],
    name='Non-Survivors',
    marker_color='darkred',
    box_visible=True)
data=[violin_nonsurvivors,violin_survivors]
layout=go.Layout(
        paper_bgcolor='rgba(0,0,0,0)',
        plot_bgcolor='rgba(0,0,0,0)',
        title='"Age" of survivors vs Ages of non-survivors',
    xaxis=dict(
        title='Survived or not'
    ),
    yaxis=dict(
        title='Age'
    )
)
fig=go.Figure(data=data,layout=layout)
fig.show()

74c0b04071f64da0bb06a6111f7384f4.gif


二、数据的缺失值处理



train_data=pd.read_csv("titanic.csv") # 学习数据
test_data=pd.read_csv("titanic.csv") # 测试数据 
# 幸存者和遇难者的人数比率(0代表遇难者)
train_data['Survived'].value_counts().plot.pie(autopct='%1.2f%%',figsize=(10,7),fontsize=20)

218b09a6afb543e3b05f5450ed3e5f30.png


train_data.Embarked[train_data.Embarked.isnull()]=train_data.Embarked.dropna().mode().values # 缺失值使用众数来填充
# 对缺失的舱位号进行填充
train_data['Cabin']=train_data.Cabin.fillna('U0')
# Cabin代表在泰坦尼克号当中的仓位,就类似于学校的宿舍号,C代表最底层的,A代表上层贵族
# 这里把缺失值使用U0填充,没有实际含义


三、使用随机森林处理年龄




# 随机森林算法
from sklearn.ensemble import RandomForestRegressor
# 对缺失年龄进行填充
# 关于年龄的缺失值填充:假设知道你的兄弟姐妹的年龄,但是你的年龄未知,就可以根据你兄弟姐妹的年龄来推算出你的年龄
# 对应Age数据是空值的:其后面有5个数据可以进行参考:'Survived','Fare','Parch','SibSp','Pclass'。
# 对于Age不是空值的数据:根据Age与后面的五个参数'Survived','Fare','Parch','SibSp','Pclass'来构建模型,找到之间的关联,从而预测Age为空值的数据应该是多少
age_df=train_data[['Age','Survived','Fare','Parch','SibSp','Pclass']]
age_df_notnull=age_df.loc[(train_data['Age'].notnull())]
age_df_isnull=age_df.loc[(train_data['Age'].isnull())]
train_data.loc[train_data['Age'].isnull()]
# 有177条数据当中的Age为空,需要我们根据模型填写

c3a58097eaa34d93b4fad78ca73b6eba.png

# 使用随机森林的方式对年龄数据进行处理
X=age_df_notnull.values[:,1:] # 不要第一行
Y=age_df_notnull.values[:,0]
RFR=RandomForestRegressor(n_estimators=1000,n_jobs=-1)
RFR.fit(X,Y)
predictAges=RFR.predict(age_df_isnull.values[:,1:])
train_data.loc[train_data['Age'].isnull(),['Age']]=predictAges#将年龄是空值的数据填充上对应的我们预测出来的predictAges数据
predictAges
# 177个年龄的预估值,但不是整数,是小数
#array([23.91012463, 33.5790667 , 18.45447222, 34.77706252, 22.82583206,
#        27.92451495, 35.95309143, 22.23480409, 16.72228333, 27.92451495,
#        31.85729512, 34.04484405, 22.23480409, 23.3894125 , 41.26658333,
#        39.41428929, 14.56655619, 27.92451495, 31.85729512, 24.00832619,
#        31.85729512, 31.85729512, 27.92451495, 22.90537022, 30.49815577,
#        31.85729512, 40.55413361, 15.40209733, 31.47466905, 30.98913824,
#        25.62094582, 11.03429057, 24.91276667, 58.21367204,  7.26481346,
#        11.03429057, 31.78719475, 58.8055    , 26.40346667, 40.55413361,
#        22.23480409, 11.03429057, 34.63207227, 27.92451495,  7.26481346,
#        35.81648333, 23.10360556, 26.40346667, 30.98913824, 33.65973333,
#        40.55413361, 40.55413361, 52.66521429, 22.23480409, 35.54409821,
#        58.79858871, 39.41428929, 37.03649841, 22.23480409, 25.87029836,
#        32.00298358, 31.85729512, 29.08850714, 11.03429057, 25.87029836,
#        32.05307143, 27.92451495, 26.5948    , 62.716     , 34.77706252,
#        22.82583206, 22.82583206, 34.04484405, 16.72228333, 22.23480409,
#        35.11293571, 27.92451495, 24.41736964,  7.26481346, 27.92451495,
#        21.30626245, 35.54409821, 31.85729512, 27.92451495, 30.98913824,
#        40.55413361, 26.5948    , 25.17773002, 22.60258333, 31.85729512,
#        42.61237738, 40.55413361, 31.85729512, 35.54409821, 24.41736964,
#        30.98913824, 45.41313571, 35.54409821,  7.26481346, 22.60258333,
#        18.9056746 , 23.70674167, 28.90627937, 42.82544497, 31.85729512,
#        33.46546111, 34.77706252, 26.165255  , 29.62294286, 26.165255  ,
#         7.78515   , 23.7626625 , 31.23990052, 25.67115572, 29.62294286,
#        40.55413361, 31.85729512, 31.85729512, 26.165255  , 22.23480409,
#        21.82594306, 25.97161052, 31.85729512, 29.88929564, 20.06259281,
#        34.77706252, 27.92451495, 38.348     , 27.88305165, 26.40346667,
#        40.55413361, 24.41736964, 39.10006349, 26.78347096, 29.82119675,
#        35.81648333, 27.92451495, 28.05354048, 27.92451495, 28.11530132,
#        41.56493214, 35.54409821, 24.06617853, 29.82119675, 18.21759491,
#        14.56655619, 58.16147475, 27.83794286, 18.21759491, 35.54409821,
#        27.92451495, 27.92451495, 41.32000913, 23.7626625 , 40.377     ,
#        33.01589387, 34.77706252, 40.55413361, 24.41736964, 24.9595    ,
#        40.55413361, 11.03429057, 53.75925   , 39.10006349, 38.86513205,
#        29.75600476, 22.23480409, 26.165255  , 31.85729512, 41.80075152,
#        11.03429057, 43.7314369 , 26.165255  , 11.03429057, 25.0000228 ,
#        27.92451495, 24.9595    ])
train_data.describe()

0febeb866d5c48ffb4d85eb764fb9a0f.png


四、分析数据之间的关系



1. 性别与生存率的关系

# 04.01 性别与生存率的关系
train_data.groupby(['Sex','Survived'])['Survived'].count()

1caf7513839c463489df3b37bc6dd371.png

plt.style.use('ggplot')
plt.title('性别与存活率的关系')
plt.ylabel('存活率')
plt.xlabel('性别')
plt.xticks(rotation=0)
train_data[['Sex','Survived']].groupby(['Sex']).mean().plot.bar(figsize=(10,8),fontsize=20)

74ceddf1ce7449f1a3ead42afb9d4771.png

2.舱位等级与生存率的关系


# 04.02 舱位等级与生存率的关系
train_data.groupby(['Pclass','Survived'])['Pclass'].count()
train_data[['Pclass','Survived']].groupby(['Pclass']).mean().plot.bar(figsize=(10,8),fontsize=20)
plt.title('舱位等级与存活率的关系')
plt.ylabel('存活率')
plt.xlabel('1-头等舱       2-二等舱         3-三等舱')
plt.xticks(rotation=0)

6959b63a5a6448f394c187bae50bf054.png


3. 舱位等级,性别和年龄的关系


# 04.03 结合舱位等级,性别和年龄分布的两张小提琴图
fig,ax=plt.subplots(1,2,figsize=(16,10))
sns.violinplot("Pclass","Age",hue="Survived",data=train_data,split=True,ax=ax[0])
ax[0].set_yticks(range(0,100,10))
sns.violinplot("Sex","Age",hug="Survived",data=train_data,split=True,ax=ax[1])
plt.show()

41fd7604e3b047b9b788f8d25cc55248.png


4. 不同年龄阶段的总体分析


# 04.04 年龄的总体分布
plt.figure(figsize=(10,8))
plt.subplot(121)
train_data['Age'].hist(bins=80)
plt.xlabel('年龄')
plt.ylabel('人数')
plt.subplot(122)
train_data.boxplot(column='Age',showfliers=True) # showfliers:显示是否有脱离的异常值

showfliers:显示是否有脱离的异常值

d38f2ed09b9e49c4af27dd200af4947a.png

549188129561412aa5bdc6fec09ac8b9.png

# 04.05 不同年龄下存活分布情况
facet=sns.FacetGrid(train_data,hue="Survived",aspect=4)
facet.map(sns.kdeplot,'Age',shade=True)
facet.set(xlim=(0,train_data['Age'].max()))
facet.add_legend()

7bc646eb606945e4bda950fcdf8a6358.png

# 04.06 不同年龄下存活分布情况
fig,axis1=plt.subplots(1,1,figsize=(18,4))
train_data['Age_int']=train_data['Age'].astype(int) # 这里年龄出现小数,但是使用.astype(float).astype(int)也不行,会报错。直接使用.astype(int)也不行
average_age=train_data[['Age_int','Survived']].groupby(['Age_int'],as_index=False).mean()
sns.barplot(x='Age_int',y='Survived',data=average_age)

7d71ef4593554d5ea26d1e9628f398bf.png

# 不同年龄段下存活情况(对数据的分类统计)
bins=[0,12,18,65,100]
train_data['Age_group']=pd.cut(train_data['Age'],bins)
by_age=train_data.groupby('Age_group')['Survived'].mean()
by_age

1d59b2fcc4e040fd9374f2d09d9cd971.png

by_age.plot(kind='pie')

f80667162fa549b8ac70774b6d1c7e21.png

5.称谓与存活的关系

# 04.07 称呼与存活的关系
train_data['Title']=train_data['Name'].str.extract('([A-Za-z]+)\.',expand=False) # 正则表达式,表示把.前面的字母拿到
# str.extract(),可用正则从字符数据中抽取匹配的数据,只返回第一个匹配的数据。
# expand表示是否把series类型转化为DataFrame类型
train_data.Title

75049772d88745efa9398976ab5c8508.png

pd.crosstab(train_data['Title'],train_data['Sex'])

5ef2699dd48a47e3a5cdd0dcb6efe83f.png895cde55ab524f7988c6bc0a96755a5c.png

train_data[['Title','Survived']].groupby(['Title']).mean().plot.bar()
plt.xticks(rotation=40)

63d13909012145dc9a3f7ae433a92544.png


相关文章
|
1月前
|
机器学习/深度学习 数据采集 数据挖掘
实战派教学:掌握Scikit-learn,轻松实现数据分析与机器学习模型优化!
【10月更文挑战第4天】Scikit-learn凭借高效、易用及全面性成为数据科学领域的首选工具,简化了数据预处理、模型训练与评估流程,并提供丰富算法库。本文通过实战教学,详细介绍Scikit-learn的基础入门、数据预处理、模型选择与训练、评估及调优等关键步骤,助你快速掌握并优化数据分析与机器学习模型。从环境搭建到参数调优,每一步都配有示例代码,便于理解和实践。
83 2
|
19天前
|
机器学习/深度学习 并行计算 数据挖掘
R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域
【10月更文挑战第21天】R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域。本文将介绍R语言中的一些高级编程技巧,包括函数式编程、向量化运算、字符串处理、循环和条件语句、异常处理和性能优化等方面,以帮助读者更好地掌握R语言的编程技巧,提高数据分析的效率。
38 2
|
1月前
|
机器学习/深度学习 算法 数据挖掘
从零到精通:Scikit-learn在手,数据分析与机器学习模型评估不再难!
【10月更文挑战第4天】在数据科学领域,模型评估是连接理论与实践的桥梁,帮助我们理解模型在未知数据上的表现。对于初学者而言,众多评估指标和工具常令人困惑。幸运的是,Scikit-learn 这一强大的 Python 库使模型评估变得简单。本文通过问答形式,带你逐步掌握 Scikit-learn 的评估技巧。Scikit-learn 提供了丰富的工具,如交叉验证、评分函数(准确率、精确率、召回率、F1 分数)、混淆矩阵和 ROC 曲线等。
36 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
在数据驱动时代,Python 以强大的生态系统成为数据科学的首选语言,而 Scikit-learn 则因简洁的 API 和广泛的支持脱颖而出。本文将指导你使用 Scikit-learn 进行机器学习模型的训练与评估。首先通过 `pip install scikit-learn` 安装库,然后利用内置数据集进行数据准备,选择合适的模型(如逻辑回归),并通过交叉验证评估其性能。最终,使用模型对新数据进行预测,简化整个流程。无论你是新手还是专家,Scikit-learn 都能助你一臂之力。
129 8
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
数据可视化大不同!Python数据分析与机器学习中的Matplotlib、Seaborn应用新视角!
在数据科学与机器学习领域,数据可视化是理解数据和优化模型的关键。Python凭借其强大的可视化库Matplotlib和Seaborn成为首选语言。本文通过分析一份包含房屋面积、卧室数量等特征及售价的数据集,展示了如何使用Matplotlib绘制散点图,揭示房屋面积与售价的正相关关系;并利用Seaborn的pairplot探索多变量间的关系。在机器学习建模阶段,通过随机森林模型展示特征重要性的可视化,帮助优化模型。这两个库在数据分析与建模中展现出广泛的应用价值。
48 2
|
3月前
|
数据采集 机器学习/深度学习 算法
"揭秘数据质量自动化的秘密武器:机器学习模型如何精准捕捉数据中的‘隐形陷阱’,让你的数据分析无懈可击?"
【8月更文挑战第20天】随着大数据成为核心资源,数据质量直接影响机器学习模型的准确性和效果。传统的人工审查方法效率低且易错。本文介绍如何运用机器学习自动化评估数据质量,解决缺失值、异常值等问题,提升模型训练效率和预测准确性。通过Python和scikit-learn示例展示了异常值检测的过程,最后强调在自动化评估的同时结合人工审查的重要性。
90 2
|
3月前
|
机器学习/深度学习 搜索推荐 数据挖掘
【深度解析】超越RMSE和MSE:揭秘更多机器学习模型性能指标,助你成为数据分析高手!
【8月更文挑战第17天】本文探讨机器学习模型评估中的关键性能指标。从均方误差(MSE)和均方根误差(RMSE)入手,这两种指标对较大预测偏差敏感,适用于回归任务。通过示例代码展示如何计算这些指标及其它如平均绝对误差(MAE)和决定系数(R²)。此外,文章还介绍了分类任务中的准确率、精确率、召回率和F1分数,并通过实例说明这些指标的计算方法。最后,强调根据应用场景选择合适的性能指标的重要性。
422 0
|
3月前
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
77 2
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
169 4
|
3月前
|
机器学习/深度学习 算法 数据挖掘
2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析
本文介绍了2023年第二届钉钉杯大学生大数据挑战赛初赛A题的Python代码分析,涉及智能手机用户监测数据分析中的聚类分析和APP使用情况的分类与回归问题。
84 0
2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析