第八章:Seaborn实践案例


文档摘要

第八章:Seaborn实践案例 第八章:Seaborn实践案例 - 深入数据可视化实战 引言 Seaborn,作为Python数据可视化库中的佼佼者,建立在Matplotlib之上,提供了更高级别的接口,旨在创建美观且信息丰富的统计图形。与Matplotlib相比,Seaborn更专注于统计数据可视化,能够更便捷地绘制复杂的数据关系图,例如分布图、关系图和分类图。 在前几章的学习中,我们已经了解了Seaborn的基础知识和各种绘图函数。现在,我们将进入“第八章:Seaborn实践案例”,通过一系列实际案例,深入探讨如何运用Seaborn解决真实世界的数据可视化问题。本章旨在将理论知识与实践相结合,帮助读者掌握Seaborn在不同场景下的应用技巧,提升数据洞察力和可视化表达能力。 8.

第八章:Seaborn实践案例

第八章:Seaborn实践案例 - 深入数据可视化实战

引言

Seaborn,作为Python数据可视化库中的佼佼者,建立在Matplotlib之上,提供了更高级别的接口,旨在创建美观且信息丰富的统计图形。与Matplotlib相比,Seaborn更专注于统计数据可视化,能够更便捷地绘制复杂的数据关系图,例如分布图、关系图和分类图。

在前几章的学习中,我们已经了解了Seaborn的基础知识和各种绘图函数。现在,我们将进入“第八章:Seaborn实践案例”,通过一系列实际案例,深入探讨如何运用Seaborn解决真实世界的数据可视化问题。本章旨在将理论知识与实践相结合,帮助读者掌握Seaborn在不同场景下的应用技巧,提升数据洞察力和可视化表达能力。

8.1 案例一:探索性数据分析 (EDA) - 泰坦尼克号乘客生存预测

8.1.1 案例背景

泰坦尼克号数据集是机器学习和数据分析领域经典的入门数据集。它包含了泰坦尼克号乘客的各种信息,例如年龄、性别、船舱等级、票价等,以及乘客是否生还的标签。我们的目标是利用Seaborn进行探索性数据分析(EDA),理解不同特征与乘客生存之间的关系,为后续的生存预测模型构建奠定基础。

8.1.2 数据准备

首先,我们需要加载泰坦尼克号数据集。我们通常使用Pandas库来读取和处理数据。

import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 加载泰坦尼克号数据集 titanic_data = pd.read_csv('titanic.csv') # 假设数据集文件名为 titanic.csv # 预览数据 print(titanic_data.head()) print(titanic_data.info()) print(titanic_data.describe())

8.1.3 数据可视化分析

1. 生存率分析

我们首先关注目标变量“Survived”(是否生还)。使用countplot可以直观地展示生还和未生还乘客的数量。

sns.set_style('whitegrid') # 设置Seaborn风格 sns.countplot(x='Survived', data=titanic_data) plt.title('乘客生存情况计数') plt.xlabel('是否生还 (0=否, 1=是)') plt.ylabel('乘客数量') plt.show()

代码详解:

  • sns.set_style('whitegrid'): 设置Seaborn绘图风格为白色网格,使图表更清晰易读。

  • sns.countplot(x='Survived', data=titanic_data): 使用countplot函数绘制计数条形图。x='Survived'指定x轴变量为'Survived'列,data=titanic_data指定使用的数据集。

  • plt.title(...), plt.xlabel(...), plt.ylabel(...): 使用Matplotlib函数设置图表标题和轴标签,提升图表的可读性。

  • plt.show(): 显示绘制的图表。

2. 性别与生存率关系

接下来,我们探究性别('Sex')与生存率的关系。可以使用堆叠条形图或分组条形图,这里我们使用分组条形图。

sns.countplot(x='Survived', hue='Sex', data=titanic_data, palette='RdBu_r') plt.title('不同性别乘客生存情况对比') plt.xlabel('是否生还 (0=否, 1=是)') plt.ylabel('乘客数量') plt.legend(title='性别') plt.show()

代码详解:

  • hue='Sex': 在countplot中添加hue参数,将'Sex'列作为分组变量,绘制分组条形图,对比不同性别在不同生存状态下的数量。

  • palette='RdBu_r': 使用Seaborn调色板 'RdBu_r',为不同性别设置颜色,增强图表视觉效果。

  • plt.legend(title='性别'): 添加图例,说明不同颜色代表的性别。

3. 船舱等级与生存率关系

船舱等级('Pclass')也可能影响生存率。我们同样使用分组条形图进行分析。

sns.countplot(x='Survived', hue='Pclass', data=titanic_data, palette='viridis') plt.title('不同船舱等级乘客生存情况对比') plt.xlabel('是否生还 (0=否, 1=是)') plt.ylabel('乘客数量') plt.legend(title='船舱等级') plt.show()

代码详解:

  • hue='Pclass': 将'Pclass'列作为分组变量,对比不同船舱等级在不同生存状态下的数量。

  • palette='viridis': 使用Seaborn调色板 'viridis',为不同船舱等级设置颜色。

4. 年龄分布与生存率关系

年龄('Age')是一个连续变量,我们可以使用直方图和箱线图来分析其分布和与生存率的关系。

# 年龄分布直方图 sns.histplot(titanic_data['Age'].dropna(), kde=True, bins=30) # 移除缺失值 plt.title('乘客年龄分布') plt.xlabel('年龄') plt.ylabel('乘客数量') plt.show() # 年龄与生存率的箱线图 sns.boxplot(x='Survived', y='Age', data=titanic_data, palette='Set2') plt.title('不同生存状态乘客年龄箱线图') plt.xlabel('是否生还 (0=否, 1=是)') plt.ylabel('年龄') plt.show() # 年龄与生存率的小提琴图 sns.violinplot(x='Survived', y='Age', data=titanic_data, palette='Set3') plt.title('不同生存状态乘客年龄小提琴图') plt.xlabel('是否生还 (0=否, 1=是)') plt.ylabel('年龄') plt.show()

代码详解:

  • sns.histplot(titanic_data['Age'].dropna(), kde=True, bins=30): 绘制年龄直方图。.dropna()移除年龄列中的缺失值,kde=True添加核密度估计曲线,bins=30设置直方图柱子的数量。

  • sns.boxplot(x='Survived', y='Age', data=titanic_data, palette='Set2'): 绘制箱线图,对比不同生存状态下年龄的分布。x='Survived'为分类变量,y='Age'为数值变量。

  • sns.violinplot(x='Survived', y='Age', data=titanic_data, palette='Set3'): 绘制小提琴图,结合了箱线图和核密度估计,更详细地展示不同生存状态下年龄的分布形状。

5. 船票价格与生存率关系

船票价格('Fare')也可能是影响生存率的因素。我们可以使用散点图或箱线图进行分析。

# 船票价格与生存率的散点图 (不常用,因为生存是分类变量,散点图在这里效果不佳) # sns.scatterplot(x='Fare', y='Survived', data=titanic_data) # 不推荐使用,效果不好 # 船票价格与生存率的箱线图 sns.boxplot(x='Survived', y='Fare', data=titanic_data, palette='pastel') plt.title('不同生存状态乘客船票价格箱线图') plt.xlabel('是否生还 (0=否, 1=是)') plt.ylabel('船票价格') plt.yscale('log') # 对y轴进行对数缩放,处理价格分布偏斜问题 plt.show() # 船票价格与生存率的小提琴图 sns.violinplot(x='Survived', y='Fare', data=titanic_data, palette='muted') plt.title('不同生存状态乘客船票价格小提琴图') plt.xlabel('是否生还 (0=否, 1=是)') plt.ylabel('船票价格') plt.yscale('log') # 对y轴进行对数缩放 plt.show()

代码详解:

  • sns.boxplot(x='Survived', y='Fare', data=titanic_data, palette='pastel'): 绘制箱线图,对比不同生存状态下船票价格的分布。

  • plt.yscale('log'): 对y轴(船票价格)进行对数缩放。由于船票价格分布通常偏斜,大部分价格集中在低端,少量价格很高,对数缩放可以更好地展示价格的分布范围和差异。

  • sns.violinplot(...): 绘制小提琴图,同样对y轴进行对数缩放。

8.1.4 EDA结论

通过以上Seaborn可视化分析,我们可以初步得出以下结论:

  • 性别: 女性的生存率显著高于男性。

  • 船舱等级: 船舱等级越高(Pclass=1),生存率越高。

  • 年龄: 年龄分布在不同生存状态下有所差异,但箱线图和小提琴图显示,生存者年龄分布的中位数略低于未生存者,可能暗示儿童和年轻人的生存率更高。

  • 船票价格: 生存者的船票价格分布普遍高于未生存者,高票价可能与更高的船舱等级和服务相关,从而间接影响生存率。

这些EDA结果为后续的特征工程和模型构建提供了重要的方向。

8.2 案例二:电子商务销售数据分析

8.2.1 案例背景

电子商务销售数据分析是Seaborn在商业分析中的常见应用。假设我们有一个电子商务平台的销售数据,包含订单ID、商品类别、销售额、购买日期等信息。我们的目标是利用Seaborn可视化分析销售数据,发现销售趋势、热销商品类别、用户消费行为等,为业务决策提供数据支持。

8.2.2 数据准备

首先,加载电子商务销售数据集。

# 假设数据集文件名为 ecommerce_sales.csv sales_data = pd.read_csv('ecommerce_sales.csv', parse_dates=['OrderDate']) # 将OrderDate列解析为日期类型 print(sales_data.head()) print(sales_data.info()) print(sales_data.describe())

8.2.3 数据可视化分析

1. 销售额时间趋势分析

时间序列数据分析是电商数据分析的重要组成部分。我们可以使用折线图 (lineplot) 展示销售额随时间变化的趋势。

# 按月汇总销售额 monthly_sales = sales_data.groupby(pd.Grouper(key='OrderDate', freq='M'))['Sales'].sum().reset_index() sns.lineplot(x='OrderDate', y='Sales', data=monthly_sales) plt.title('月度销售额趋势') plt.xlabel('月份') plt.ylabel('总销售额') plt.xticks(rotation=45) # 旋转x轴标签,避免重叠 plt.tight_layout() # 调整布局,防止标签被截断 plt.show()

代码详解:

  • sales_data.groupby(pd.Grouper(key='OrderDate', freq='M'))['Sales'].sum().reset_index(): 使用Pandas进行数据聚合。groupby(pd.Grouper(key='OrderDate', freq='M'))按月份对'OrderDate'列进行分组,['Sales'].sum()计算每个月的销售额总和,.reset_index()将分组结果转换为DataFrame。

  • sns.lineplot(x='OrderDate', y='Sales', data=monthly_sales): 绘制折线图,展示月度销售额的时间趋势。

  • plt.xticks(rotation=45): 旋转x轴日期标签45度,避免标签重叠。

  • plt.tight_layout(): 自动调整图表布局,防止标签被截断。

2. 商品类别销售额对比

了解不同商品类别的销售情况有助于优化商品结构和营销策略。我们可以使用条形图 (barplot) 或饼图 (pie plot,但Seaborn不直接提供饼图,可以使用Matplotlib)。这里我们使用条形图。

category_sales = sales_data.groupby('Category')['Sales'].sum().sort_values(ascending=False).reset_index() sns.barplot(x='Category', y='Sales', data=category_sales, palette='plasma') plt.title('各商品类别总销售额对比') plt.xlabel('商品类别') plt.ylabel('总销售额') plt.xticks(rotation=45) plt.tight_layout() plt.show()

代码详解:

  • sales_data.groupby('Category')['Sales'].sum().sort_values(ascending=False).reset_index(): 按商品类别 ('Category') 分组,计算每个类别的总销售额,并按销售额降序排序。

  • sns.barplot(x='Category', y='Sales', data=category_sales, palette='plasma'): 绘制条形图,对比各商品类别的总销售额。

  • palette='plasma': 使用Seaborn调色板 'plasma'。

3. 用户消费行为分析 - RFM模型

RFM模型 (Recency, Frequency, Monetary) 是分析用户价值和用户分群的常用模型。我们可以使用Seaborn可视化RFM指标的分布和关系。

  • Recency (最近一次购买时间间隔): 用户最近一次购买距离现在的时间。

  • Frequency (购买频率): 用户在一定时间内购买的次数。

  • Monetary (消费金额): 用户在一定时间内消费的总金额。

首先,计算RFM指标:

import datetime as dt current_date = sales_data['OrderDate'].max() + dt.timedelta(days=1) # 假设当前日期为数据集最后一天之后一天 rfm_data = sales_data.groupby('CustomerID').agg({ 'OrderDate': lambda x: (current_date - x.max()).days, # Recency 'OrderID': 'count', # Frequency 'Sales': 'sum' # Monetary }) rfm_data.rename(columns={'OrderDate': 'Recency', 'OrderID': 'Frequency', 'Sales': 'Monetary'}, inplace=True) print(rfm_data.head())

然后,使用Seaborn可视化RFM指标的分布:

# Recency 分布 sns.histplot(rfm_data['Recency'], kde=True, bins=30) plt.title('Recency 分布') plt.xlabel('最近一次购买时间间隔 (天)') plt.ylabel('用户数量') plt.show() # Frequency 分布 sns.histplot(rfm_data['Frequency'], kde=True, bins=30) plt.title('Frequency 分布') plt.xlabel('购买频率') plt.ylabel('用户数量') plt.show() # Monetary 分布 (对数缩放) sns.histplot(rfm_data['Monetary'], kde=True, bins=30) plt.title('Monetary 分布 (原始)') plt.xlabel('消费金额') plt.ylabel('用户数量') plt.show() sns.histplot(rfm_data['Monetary'], kde=True, bins=30) plt.yscale('log') plt.title('Monetary 分布 (对数缩放)') plt.xlabel('消费金额 (对数)') plt.ylabel('用户数量 (对数)') plt.show()

代码详解:

  • RFM指标计算部分:使用Pandas的 groupbyagg 函数计算每个用户的 Recency, Frequency, Monetary 值。

  • RFM指标分布可视化:使用 histplot 函数绘制直方图,展示各个RFM指标的分布情况。对于 Monetary 指标,使用对数缩放,更好地展示分布。

8.2.4 电商销售数据分析结论

通过Seaborn可视化分析,我们可以得出以下初步结论:

  • 销售额时间趋势: 观察销售额的季节性波动或长期增长趋势,例如可能存在节假日促销带来的销售高峰。

  • 商品类别销售额: 了解哪些商品类别销售额最高,哪些类别相对较低,为商品采购和营销重点提供依据。

  • 用户消费行为 (RFM): 通过RFM指标分布,了解用户的活跃程度、购买频率和消费能力,为用户分群和精准营销提供基础。例如,Recency值低的客户是最近活跃客户,Frequency和Monetary值高的客户是高价值客户。

8.3 案例三:社交媒体情感分析

8.3.1 案例背景

社交媒体情感分析是Seaborn在文本数据可视化中的应用。假设我们收集了一些社交媒体评论数据,并使用自然语言处理 (NLP) 技术对评论进行了情感分类(例如,积极、消极、中性)。我们的目标是使用Seaborn可视化情感分析结果,了解用户对某个话题或品牌的整体情感倾向。

8.3.2 数据准备

假设我们已经有了包含评论文本和情感标签的数据集。

# 假设数据集文件名为 social_media_sentiment.csv sentiment_data = pd.read_csv('social_media_sentiment.csv') print(sentiment_data.head()) print(sentiment_data.info()) print(sentiment_data.describe())

8.3.3 数据可视化分析

1. 情感分布

使用 countplot 展示不同情感标签的评论数量分布。

sns.countplot(x='Sentiment', data=sentiment_data, palette='coolwarm') plt.title('社交媒体评论情感分布') plt.xlabel('情感标签') plt.ylabel('评论数量') plt.show()

代码详解:

  • sns.countplot(x='Sentiment', data=sentiment_data, palette='coolwarm'): 绘制计数条形图,展示不同情感标签 ('Sentiment') 的评论数量。

  • palette='coolwarm': 使用Seaborn调色板 'coolwarm',通常用于表示两极分化的数据,例如情感分析中的积极和消极。

2. 情感与话题/关键词关系

如果数据集中包含话题或关键词信息,我们可以进一步分析不同话题或关键词的情感倾向。例如,使用分组条形图或堆叠条形图。

# 假设数据集有 'Topic' 列表示话题 sns.countplot(x='Sentiment', hue='Topic', data=sentiment_data, palette='Set1') plt.title('不同话题的社交媒体评论情感分布') plt.xlabel('情感标签') plt.ylabel('评论数量') plt.legend(title='话题') plt.show()

代码详解:

  • hue='Topic': 将 'Topic' 列作为分组变量,对比不同话题在不同情感标签下的评论数量。

  • palette='Set1': 使用Seaborn调色板 'Set1'。

3. 情感随时间变化趋势

如果数据包含时间信息,可以分析情感随时间变化的趋势。例如,使用折线图展示每日或每周的平均情感得分(如果情感标签是数值化的,例如,-1到1的情感得分)。

# 假设数据集有 'Date' 列表示评论日期,且 'SentimentScore' 列表示情感得分(数值化) # 按日期汇总平均情感得分 daily_sentiment = sentiment_data.groupby('Date')['SentimentScore'].mean().reset_index() sns.lineplot(x='Date', y='SentimentScore', data=daily_sentiment) plt.title('每日平均情感得分趋势') plt.xlabel('日期') plt.ylabel('平均情感得分') plt.xticks(rotation=45) plt.tight_layout() plt.show()

代码详解:

  • sentiment_data.groupby('Date')['SentimentScore'].mean().reset_index(): 按日期 ('Date') 分组,计算每日平均情感得分 ('SentimentScore')。

  • sns.lineplot(x='Date', y='SentimentScore', data=daily_sentiment): 绘制折线图,展示每日平均情感得分的时间趋势。

8.3.4 社交媒体情感分析结论

通过Seaborn可视化分析,我们可以初步得出以下结论:

  • 整体情感倾向: 通过情感分布图,了解用户对某个话题或品牌的整体情感是积极、消极还是中性为主。

  • 不同话题/关键词的情感: 对比不同话题或关键词的情感分布,发现用户对哪些话题或关键词更积极或消极。

  • 情感时间趋势: 观察情感随时间变化的趋势,例如,是否存在突发事件导致情感发生明显变化,或情感是否呈现长期改善或恶化趋势。

8.4 Mermaid 图 - 数据分析流程可视化

为了更好地理解数据分析流程,我们可以使用 Mermaid 图进行可视化。以下是案例一 (泰坦尼克号生存预测) 的数据分析流程 Mermaid 图示例:

图表详解:

  • graph TD: 声明这是一个流程图 (Top-Down)。

  • A[加载泰坦尼克号数据集]: 定义节点 A,内容为 "加载泰坦尼克号数据集",方括号表示矩形节点。

  • B(数据清洗与预处理): 定义节点 B,内容为 "数据清洗与预处理",圆括号表示圆角矩形节点。

  • C{探索性数据分析 (EDA)}: 定义节点 C,内容为 "探索性数据分析 (EDA)",花括号表示菱形节点,通常用于表示决策或分支。

  • D[生存率分析], E[...], F[...], G[...], H[...]: 定义 EDA 的子步骤节点。

  • I(结论与洞察): 定义节点 I,表示从 EDA 中得出结论和洞察。

  • J[特征工程], K[...], L[...], M[...]: 定义后续的机器学习流程步骤。

  • A --> B, B --> C, ... : 定义节点之间的连接方向,表示流程的顺序。

通过 Mermaid 图,我们可以清晰地看到数据分析的步骤和流程,有助于理解整个分析过程。

结论

本章“第八章:Seaborn实践案例”通过三个实际案例 (泰坦尼克号生存预测、电子商务销售数据分析、社交媒体情感分析),深入探讨了Seaborn在不同数据分析场景下的应用。我们学习了如何使用Seaborn进行探索性数据分析、时间序列数据可视化、用户行为分析和文本数据情感可视化。

Seaborn 强大的绘图功能和简洁的API,使得复杂的数据可视化任务变得更加高效和直观。通过本章的学习,相信读者已经掌握了Seaborn在实践中的应用技巧,能够运用Seaborn解决更多真实世界的数据可视化问题,并从中发现有价值的业务洞察。

在未来的学习和工作中,建议读者继续深入探索Seaborn的各种高级功能和定制选项,结合实际业务需求,灵活运用Seaborn,提升数据分析和可视化能力。同时,可以结合其他Python数据科学库 (如Pandas, Numpy, Scikit-learn) 和可视化工具 (如Matplotlib, Plotly, Bokeh),构建更全面、更强大的数据分析和可视化解决方案。


发布者: 作者: 转发
评论区 (0)
U