利用 Matplotlib、Pandas 和 Seaborn 进行数据可视化
1. 堆叠面积图发现新兴趋势
堆叠面积图是发现新兴趋势的绝佳可视化方式,特别适用于市场分析,常用于展示如互联网浏览器、手机或车辆等的市场份额百分比。
操作步骤
-
读取数据
:读取 meetup 数据集,将
join_date列转换为时间戳,将其设置为索引,并输出前五行。
import pandas as pd
meetup = pd.read_csv('data/meetup_groups.csv',
parse_dates=['join_date'],
index_col='join_date')
meetup.head()
- 统计每周加入各小组的人数 :按周和小组进行分组,并统计每组的注册人数。
group_count = meetup.groupby([pd.Grouper(freq='W'), 'group']).size()
group_count.head()
- 重塑数据 :将小组级别进行重塑,使每个小组有自己的数据列。
gc2 = group_count.unstack('group', fill_value=0)
gc2.tail()
- 计算累计会员总数 :对每列进行累计求和,得到每周的总会员数。
group_total = gc2.cumsum()
group_total.tail()
- 计算百分比 :为了使每行总和为 100%,将每行除以该行的总和。
row_total = group_total.sum(axis='columns')
group_cum_pct = group_total.div(row_total, axis='index')
group_cum_pct.tail()
- 创建堆叠面积图 :使用处理后的数据创建堆叠面积图。
import matplotlib.pyplot as plt
ax = group_cum_pct.plot(kind='area', figsize=(18,4),
cmap='Greys', xlim=('2013-6', None),
ylim=(0, 1), legend=False)
ax.figure.suptitle('Houston Meetup Groups', size=25)
ax.set_xlabel('')
ax.yaxis.tick_right()
plot_kwargs = dict(xycoords='axes fraction', size=15)
ax.annotate(xy=(.1, .7), s='R Users',
color='w', **plot_kwargs)
ax.annotate(xy=(.25, .16), s='Data Visualization',
color='k', **plot_kwargs)
ax.annotate(xy=(.5, .55), s='Energy Data Science',
color='k', **plot_kwargs)
ax.annotate(xy=(.83, .07), s='Data Science',
color='k', **plot_kwargs)
ax.annotate(xy=(.86, .78), s='Machine Learning',
color='w', **plot_kwargs)
plt.show()
原理
我们的目标是确定休斯顿五个最大的数据科学聚会小组随时间的会员分布情况。通过按周和小组分组,统计每周的注册人数,然后进行累计求和和百分比计算,最终得到适合绘制堆叠面积图的数据。
更多操作
Pandas 还可以创建饼图,用于查看不同时间点的小组分布快照。
from matplotlib.cm import Greys
import numpy as np
pie_data = group_cum_pct.asfreq('3MS', method='bfill').tail(6).to_period('M').T
greys = Greys(np.arange(50,250,40))
ax_array = pie_data.plot(kind='pie', subplots=True,
layout=(2,3), labels=None,
autopct='%1.0f%%', pctdistance=1.22,
colors=greys)
ax1 = ax_array[0, 0]
ax1.figure.legend(ax1.patches, pie_data.index, ncol=3)
for ax in ax_array.flatten():
ax.xaxis.label.set_visible(True)
ax.set_xlabel(ax.get_ylabel())
ax.set_ylabel('')
ax1.figure.subplots_adjust(hspace=.3)
plt.show()
2. 理解 Seaborn 和 Pandas 的差异
除了 Pandas,Seaborn 也是 Python 数据科学社区中用于创建可视化的流行库。两者都依赖于 Matplotlib 进行绘图,但处理数据的方式不同。Seaborn 大多数绘图函数需要整洁(长格式)的数据,而 Pandas 使用聚合(宽格式)的数据进行绘图。
| 工具 | 数据格式 | 绘图特点 |
|---|---|---|
| Seaborn | 整洁(长格式) |
自动聚合,可通过
hue
参数区分组
|
| Pandas | 聚合(宽格式) | 需要手动聚合数据 |
操作步骤
- 读取员工数据集 :读取员工数据集,并输出前五行。
employee = pd.read_csv('data/employee.csv',
parse_dates=['HIRE_DATE', 'JOB_DATE'])
employee.head()
- 导入 Seaborn 库 :导入 Seaborn 库并设置别名。
import seaborn as sns
-
使用 Seaborn 绘制部门计数条形图
:使用 Seaborn 的
countplot函数绘制每个部门的计数条形图。
sns.countplot(y='DEPARTMENT', data=employee)
plt.show()
- 使用 Pandas 重现条形图 :使用 Pandas 重现相同的条形图,需要提前对数据进行聚合。
employee['DEPARTMENT'].value_counts().plot('barh')
plt.show()
-
使用 Seaborn 计算每个种族的平均工资
:使用 Seaborn 的
barplot函数计算每个种族的平均工资。
ax = sns.barplot(x='RACE', y='BASE_SALARY', data=employee)
ax.figure.set_size_inches(16, 4)
plt.show()
- 使用 Pandas 重现平均工资条形图 :使用 Pandas 重现相同的条形图,需要按种族进行分组并计算平均值。
avg_sal = employee.groupby('RACE', sort=False)['BASE_SALARY'].mean()
ax = avg_sal.plot(kind='bar', rot=0, figsize=(16,4), width=.8)
ax.set_xlim(-.5, 5.5)
ax.set_ylabel('Mean Salary')
plt.show()
-
使用 Seaborn 按种族和性别计算平均工资
:使用 Seaborn 的
barplot函数按种族和性别计算平均工资。
ax = sns.barplot(x='RACE', y='BASE_SALARY', hue='GENDER',
data=employee, palette='Greys')
ax.figure.set_size_inches(16,4)
plt.show()
- 使用 Pandas 重现按种族和性别计算平均工资的条形图 :使用 Pandas 重现相同的条形图,需要按种族和性别进行分组并进行重塑。
employee.groupby(['RACE', 'GENDER'], sort=False)['BASE_SALARY'].mean().unstack('GENDER').plot(kind='bar', figsize=(16,4), rot=0,
width=.8, cmap='Greys')
plt.show()
-
使用 Seaborn 绘制按种族和性别划分的工资箱线图
:使用 Seaborn 的
boxplot函数绘制按种族和性别划分的工资箱线图。
sns.boxplot(x='GENDER', y='BASE_SALARY', data=employee,
hue='RACE', palette='Greys')
plt.show()
- 使用 Pandas 重现箱线图 :Pandas 不太容易精确重现 Seaborn 的箱线图,需要分别为不同性别创建子图。
fig, ax_array = plt.subplots(1, 2, figsize=(14,4), sharey=True)
for g, ax in zip(['Female', 'Male'], ax_array):
employee.query('GENDER== @g').boxplot(by='RACE', column='BASE_SALARY',
ax=ax, rot=20)
ax.set_title(g + ' Salary')
ax.set_xlabel('')
fig.suptitle('')
plt.show()
原理
导入 Seaborn 会改变 Matplotlib 的许多默认属性。Seaborn 可以自动进行聚合操作,而 Pandas 需要手动进行数据处理。Seaborn 的
hue
参数可以方便地对数据进行分组,而 Pandas 在处理多变量分组时相对复杂。
3. Seaborn 网格进行多变量分析
为了更好地理解 Seaborn,了解返回多个 Axes 的网格函数和返回单个 Axes 的函数之间的层次关系很有帮助。
| 网格类型 | 网格函数 | Axes 函数 | 变量类型 |
|---|---|---|---|
| FacetGrid | factorplot | stripplot, swarmplot, boxplot, violinplot, lvplot, pointplot, barplot, countplot | 分类变量 |
| FacetGrid | lmplot | regplot | 连续变量 |
| PairGrid | pairplot | regplot, distplot, kdeplot | 连续变量 |
| JointGrid | jointplot | regplot, kdeplot, residplot | 连续变量 |
| ClusterGrid | clustermap | heatmap | 连续变量 |
操作步骤
- 读取员工数据集并创建工作经验列 :读取员工数据集,并创建一个工作经验列。
employee = pd.read_csv('data/employee.csv',
parse_dates=['HIRE_DATE', 'JOB_DATE'])
days_hired = pd.to_datetime('12-1-2016') - employee['HIRE_DATE']
one_year = pd.Timedelta(1, unit='Y')
employee['YEARS_EXPERIENCE'] = days_hired / one_year
employee[['HIRE_DATE', 'YEARS_EXPERIENCE']].head()
-
创建基本的散点图和回归直线
:使用 Seaborn 的
regplot函数创建基本的散点图和回归直线。
ax = sns.regplot(x='YEARS_EXPERIENCE', y='BASE_SALARY',
data=employee)
ax.figure.set_size_inches(14,4)
plt.show()
-
使用
lmplot按性别绘制回归直线 :使用 Seaborn 的lmplot函数按性别绘制回归直线。
g = sns.lmplot('YEARS_EXPERIENCE', 'BASE_SALARY',
hue='GENDER', palette='Greys',
scatter_kws={'s':10}, data=employee)
g.fig.set_size_inches(14, 4)
print(type(g))
plt.show()
-
使用
lmplot按种族和性别绘制回归直线 :使用 Seaborn 的lmplot函数按种族和性别绘制回归直线。
grid = sns.lmplot(x='YEARS_EXPERIENCE', y='BASE_SALARY',
hue='GENDER', col='RACE', col_wrap=3,
palette='Greys', sharex=False,
line_kws = {'linewidth':5},
data=employee)
grid.set(ylim=(20000, 120000))
plt.show()
原理
通过使用 Pandas 的日期功能创建连续变量,然后使用 Seaborn 的
regplot
和
lmplot
函数进行回归分析。
lmplot
可以通过
hue
、
col
和
row
参数对数据进行分组,创建多个回归图。
更多操作
当处理分类特征时,我们可以进行类似的分析。
deps = employee['DEPARTMENT'].value_counts().index[:2]
races = employee['RACE'].value_counts().index[:3]
is_dep = employee['DEPARTMENT'].isin(deps)
is_race = employee['RACE'].isin(races)
emp2 = employee[is_dep & is_race].copy()
emp2['DEPARTMENT'] = emp2['DEPARTMENT'].str.extract('(HPD|HFD)',
expand=True)
common_depts = employee.groupby('DEPARTMENT').filter(lambda x: len(x) > 50)
ax = sns.violinplot(x='YEARS_EXPERIENCE', y='GENDER',
data=common_depts)
ax.figure.set_size_inches(10,4)
plt.show()
sns.factorplot(x='YEARS_EXPERIENCE', y='GENDER',
col='RACE', row='DEPARTMENT',
size=3, aspect=2,
data=emp2, kind='violin')
plt.show()
通过以上步骤,我们可以利用 Matplotlib、Pandas 和 Seaborn 进行各种数据可视化操作,包括堆叠面积图、饼图、条形图、箱线图和回归图等,同时了解 Seaborn 和 Pandas 在数据处理和绘图方面的差异。
利用 Matplotlib、Pandas 和 Seaborn 进行数据可视化(续)
4. 操作流程总结与拓展分析
为了更清晰地展示前面所介绍的操作流程,下面用 mermaid 流程图呈现从数据读取到不同类型可视化图表创建的整体过程。
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B(读取数据):::process
B --> C{数据类型}:::decision
C -->|时间序列数据| D(处理时间序列数据):::process
D --> E(创建堆叠面积图):::process
D --> F(创建饼图):::process
C -->|员工信息数据| G(处理员工信息数据):::process
G --> H(使用 Seaborn 绘图):::process
H --> H1(条形图、箱线图等):::process
G --> I(使用 Pandas 绘图):::process
I --> I1(条形图、箱线图等):::process
G --> J(使用 Seaborn 网格绘图):::process
J --> J1(回归图、小提琴图等):::process
E --> K([结束]):::startend
F --> K
H1 --> K
I1 --> K
J1 --> K
从这个流程图可以看出,整个操作流程根据数据类型的不同分为不同的分支。对于时间序列数据,主要用于创建堆叠面积图和饼图;对于员工信息数据,则可以使用 Seaborn 和 Pandas 进行多种类型的绘图,还可以利用 Seaborn 网格进行多变量分析。
5. 不同可视化工具的优缺点对比
在实际应用中,了解 Seaborn 和 Pandas 各自的优缺点有助于我们根据具体需求选择合适的工具。以下是一个对比表格:
| 工具 | 优点 | 缺点 |
|---|---|---|
| Seaborn |
- 自动聚合数据,减少手动处理步骤
- 提供丰富的绘图样式和颜色主题 - 可以通过
hue
参数轻松区分不同组数据
- 网格函数可以方便地进行多变量分析 |
- 需要整洁(长格式)的数据,对于宽格式数据需要额外处理
- 部分复杂图形的自定义程度相对有限 |
| Pandas |
- 适合处理聚合(宽格式)的数据
- 与 Pandas 数据结构紧密结合,操作方便 - 可以进行基本的绘图操作,满足常见需求 |
- 需要手动进行数据聚合和处理
- 在处理多变量分组和复杂图形时相对繁琐 |
6. 实际应用场景分析
不同的可视化图表和工具适用于不同的实际应用场景,下面进行详细分析:
6.1 堆叠面积图和饼图
堆叠面积图适用于展示多个类别随时间的变化趋势以及它们之间的相对比例关系。例如,在分析不同数据科学聚会小组的会员分布随时间的变化时,堆叠面积图可以清晰地显示每个小组的发展趋势以及它们在总体中的占比变化。而饼图则更适合展示某个特定时间点上不同类别之间的比例关系,如不同时间点的小组分布快照。
6.2 条形图和箱线图
条形图常用于比较不同类别之间的数量或数值大小。在员工信息分析中,使用条形图可以直观地比较不同部门的员工数量或者不同种族的平均工资。箱线图则主要用于展示数据的分布情况,通过它可以了解数据的中位数、四分位数、异常值等信息。在分析员工工资按种族和性别划分的情况时,箱线图可以清晰地展示不同组工资的分布差异。
6.3 回归图和小提琴图
回归图用于展示两个连续变量之间的关系,并可以拟合回归直线。在分析员工工作经验和工资之间的关系时,回归图可以帮助我们了解两者之间的线性关系。小提琴图结合了箱线图和核密度图的特点,能够更详细地展示数据的分布情况。在分析不同部门和种族的员工工作经验分布时,小提琴图可以清晰地展示每个组的分布形状和集中趋势。
7. 总结与建议
通过前面的介绍和分析,我们可以总结出以下几点:
-
数据格式选择
:在进行数据可视化之前,需要根据所使用的工具和要创建的图表类型,选择合适的数据格式。如果使用 Seaborn,尽量将数据转换为整洁(长格式);如果使用 Pandas,则可以使用聚合(宽格式)的数据。
-
工具选择
:根据具体的需求和数据特点选择合适的可视化工具。如果需要自动聚合数据、进行多变量分析以及使用丰富的绘图样式,Seaborn 是一个不错的选择;如果数据已经是聚合状态,并且只需要进行基本的绘图操作,Pandas 更适合。
-
图表类型选择
:根据要展示的数据信息和分析目的,选择合适的图表类型。例如,展示时间序列数据的趋势和比例关系可以选择堆叠面积图和饼图;比较不同类别之间的数值大小可以使用条形图;展示数据的分布情况可以选择箱线图和小提琴图;分析两个连续变量之间的关系可以使用回归图。
在实际应用中,可以根据以上建议灵活运用 Matplotlib、Pandas 和 Seaborn 进行数据可视化,以更好地展示数据信息、发现数据中的规律和趋势。同时,不断尝试不同的工具和图表类型,结合实际需求进行创新和优化,提高数据可视化的效果和质量。
超级会员免费看
35

被折叠的 条评论
为什么被折叠?



