探索性数据分析(EDA)的数据可视化 | 附代码

数据可视化是探索性数据分析的重要组成部分,因为它有助于分析和可视化数据,以获得对数据分布、变量之间的关系和潜在异常值的启示性见解。Python具有丰富的库,可以快速高效地创建可视化。在Python中,通常使用以下几种类型的可视化进行探索性数据分析:

  • 柱状图:用于显示不同类别之间的比较。

  • 折线图:用于显示随时间或不同类别的趋势。

  • 饼图:用于显示不同类别的比例或百分比。

  • 直方图:用于显示单个变量的分布。

  • 热图:用于显示不同变量之间的相关性。

  • 散点图:用于显示两个连续变量之间的关系。

  • 箱线图:用于显示变量的分布并识别异常值。

使用Python创建数据可视化的步骤:

  1. 理解业务问题:这是第一步,非常重要,因为我们将能够专注于获取正确的可视化。

  2. 导入必要的库:导入必要的库,例如Pandas、Seaborn、Matplotlib、Plotly等。

  3. 加载数据集:加载要可视化的数据集。

  4. 数据清理和预处理:清理和预处理数据,删除缺失值、重复值和异常值。此外,将分类数据转换为数值数据。

  5. 统计摘要:计算描述性统计量,例如均值、中位数、众数、标准差和相关系数,以了解变量之间的关系。

  6. 数据可视化与解释:创建可视化图表以了解数据的分布、关系和模式。之后解释可视化结果,从中获得关于数据的启示性见解和结论。

1. 理解业务问题

心血管疾病是全球死亡的主要原因。根据世界卫生组织的数据,每年约有1,790万人死于心脏病。其中85%的死亡是由心脏病发作和中风引起的。在本文中,我们将探索来自Kaggle的心脏病数据集,并使用Python创建用于探索性数据分析的数据可视化。

该数据集包含有关患者的数据,包括年龄、性别、血压、胆固醇水平以及是否患有心脏病发作等各种变量。该数据集的目标是根据患者的医疗属性预测其是否有心脏病发作的风险。

2.导入必要的库

python 复制代码
# import libraries
import pandas as pd
import numpy as np


# data visualization
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots

3. 加载数据集

让我们将数据加载到一个Pandas DataFrame中,并开始探索它。

ini 复制代码
heart = pd.read_csv('heart.csv')

现在我们已经加载了数据,让我们看一下DataFrame的前几行,以了解数据的大致情况。

css 复制代码
heart.head()

我们可以看到数据集包含14列,包括目标列(输出),该列指示患者是否患有心脏病发作。现在让我们开始创建可视化图表。

4. 数据清理和预处理

数据清理的目的是准备好我们的数据进行分析和可视化。

cs 复制代码
# 检查是否存在任何空值
heart.isnull().sum().sort_values(ascending=False).head(11)

正如我们在这里看到的,这种情况下没有缺失值。

css 复制代码
# 检查重复值
heart.duplicated().sum()
php 复制代码
# 删除重复值
heart.drop_duplicates(keep='first', inplace=True)

现在我们的数据已经清理好了。

5. 统计摘要

css 复制代码
# 获取数据集的统计摘要
heart.describe().T

我们可以得出的主要结论是,对于大多数列,平均值与中位数(50th percentile: 50%)相似。

6. 数据可视化与解释

基于性别的数据可视化

bash 复制代码
# Compare Heart Attack vs Sex 
df = pd.crosstab(heart['output'],heart['sex'])


sns.set_style("white")


df.plot(kind="bar",
        figsize=(6,6),
        color=['#c64343', '#e1d3c1']);


plt.title("Heart Attack Risk vs Sex ", fontsize=16)
plt.xlabel("0 = Lower Risk                  1 = Higher Risk", fontsize=16)
plt.ylabel("Amount", fontsize=16)
plt.legend(["Female","Male"], fontsize=14)
plt.xticks(rotation=0)
php 复制代码
fig = px.pie(heart2,
            names= "sex",
            template= "presentation",
            hole= 0.6,
            color_discrete_sequence=['#e1d3c1', '#c64343']
            #color_discrete_sequence=px.colors.sequential.RdBu
            )


# layout
fig.update_layout(title_text='Gender Distribution',
                  title_x=0.5,
                  font=dict( size=18),
                  autosize=False,
                  width=500,
                  height=500,
                  showlegend=False)


fig.add_annotation(dict(x=0.5, y=0.5,  align='center',
                        xref = "paper", yref = "paper",
                        showarrow = False, font_size=22,
                        text="<span style='font-size: 26px; color=#555; font-family:Arial'>Gender<br></span>"))


fig.update_traces(textposition='outside',  textinfo='percent+label', rotation=20)
fig.show()

解释:男性患心脏病的风险更高。

基于年龄的数据可视化

cs 复制代码
plt.figure(figsize=(14,8))
sns.set(font_scale=1.2)
sns.set_style("white")


sns.countplot(x=heart["age"],
              palette='Reds')




plt.title("Count of Patients Age",fontsize=20)
plt.xlabel("Age",fontsize=16)
plt.ylabel("Count",fontsize=16)
plt.show()
cs 复制代码
# age based analysis
sns.set(font_scale=1.3)


plt.figure(figsize=(8,6))
sns.set_style("white")
sns.distplot(heart['age'],
             color='red',
             kde=True)




plt.title("Distribution of Patients Age",fontsize=20)
plt.xlabel("Age",fontsize=16)
plt.ylabel("Density",fontsize=16)
plt.show()

解释:大多数患者的年龄在50-60岁之间。其中,患者中年龄为58岁的人数最多。

基于胆固醇水平的数据可视化

markdown 复制代码
# Attack vs Cholesterol analysis
sns.set(font_scale=1.3)
plt.figure(figsize=(8,6))
sns.set_style("white")


sns.distplot(heart[heart["output"]==0]["chol"],
             color="blue")
sns.distplot(heart[heart["output"]==1]["chol"],
             color="red")


plt.title("Heart Attack Risk vs Cholesterol", size=20)
plt.xlabel("Cholesterol Level", fontsize=16)
plt.ylabel("Density", fontsize=16)
plt.legend(["Lower Risk","Higher Risk"], fontsize=14)
plt.show()
powershell 复制代码
plt.figure(figsize=(8,6))


sns.lineplot(y="chol",
             x="age",
             data=heart,
             color="red")
plt.title("Cholesterol with Age",fontsize=20)
plt.xlabel("Age",fontsize=16)
plt.ylabel("Cholesterol Level",fontsize=16)
plt.show()

解释:

  • 大多数患者的胆固醇水平在200-300之间。

  • 随着年龄的增长,体内胆固醇水平增加的可能性很高。

基于胸痛类型的数据可视化

cs 复制代码
# 心脏病发作与胸痛类型的关系
df = pd.crosstab(heart3['cp'], heart['output'])
# 使交叉表更加直观
sns.set(font_scale=1.3)
sns.set_style("white")
df.plot(kind='bar',
figsize=(11,7),
color=['#e1d3c1', '#c64343']);
plt.title("心脏病发作风险与胸痛类型的关系", fontsize=20)
plt.xlabel("胸痛类型", fontsize=16)
plt.ylabel("数量", fontsize=16)
plt.legend(['低风险','高风险'], fontsize=14)
plt.xticks(rotation=0);

解释:

  • 大多数患者属于典型心绞痛类型。

  • 非心绞痛患者患心脏病的风险更高。

基于相关性的数据可视化

makefile 复制代码
plt.figure(figsize=(12,10))
sns.set(font_scale=0.9)
sns.heatmap(heart.corr(),
annot=True,
cmap='Reds')
plt.title("变量间的相关性", size=15)
plt.show()

解释:

热图显示了以下变量之间的相关性:

  • 胸痛类型(cp)和输出

  • 达到的最大心率(thalachh)和输出

  • 斜率(sp)和输出

我们还可以看到以下变量之间存在较弱的相关性:

  • oldpeak:之前的峰值和输出

  • caa:主要血管数量和输出

  • exng:运动诱发性心绞痛

结论

在本文中,我们使用数据可视化来检查我们的数据集,创建了多个图表,如条形图、饼图、线图、直方图、热图。探索性数据分析(EDA)和数据可视化的主要目的是在做出任何假设之前帮助理解数据。它们帮助我们查看分布、摘要统计信息、变量之间的关系和异常值。

· END ·

HAPPY LIFE

本文仅供学习交流使用,如有侵权请联系作者删除

相关推荐
Blossom.1181 小时前
使用Python实现简单的人工智能聊天机器人
开发语言·人工智能·python·低代码·数据挖掘·机器人·云计算
莫叫石榴姐2 小时前
大模型在数据分析领域的研究综述
大数据·数据挖掘·数据分析
胡耀超4 小时前
霍夫圆变换全面解析(OpenCV)
人工智能·python·opencv·算法·计算机视觉·数据挖掘·数据安全
人大博士的交易之路6 小时前
今日行情明日机会——20250516
大数据·数学建模·数据挖掘·程序员创富·缠中说禅·涨停回马枪·道琼斯结构
小白学大数据7 小时前
Scrapy框架下地图爬虫的进度监控与优化策略
开发语言·爬虫·python·scrapy·数据分析
招风的黑耳8 小时前
Axure设计的“广东省网络信息化大数据平台”数据可视化大屏
大数据·信息可视化·原型·数据可视化
拓端研究室TRL9 小时前
Python与MySQL网站排名数据分析及多层感知机MLP、机器学习优化策略和地理可视化应用|附AI智能体数据代码
人工智能·python·mysql·机器学习·数据分析
papapa键盘侠10 小时前
Coze 实战教程 | 10 分钟打造你的AI 助手
人工智能·微信·信息可视化
白宇横流学长10 小时前
基于大数据的租房信息可视化系统的设计与实现【源码+文档+部署】
大数据·信息可视化
Leo.yuan12 小时前
基于地图的数据可视化:解锁地理数据的真正价值
大数据·数据库·信息可视化·数据挖掘·数据分析