29、使用Matplotlib、Pandas和Seaborn进行数据可视化

使用Matplotlib、Pandas和Seaborn进行数据可视化

数据可视化在数据分析和探索中起着至关重要的作用。Matplotlib、Pandas和Seaborn是Python中常用的可视化库,它们可以帮助我们快速、轻松地创建各种类型的图表。下面将介绍如何使用这些库进行数据可视化,并通过实际示例进行说明。

1. 创建示例DataFrame

首先,我们创建一个小的DataFrame,用于演示不同类型的绘图。

import pandas as pd

df = pd.DataFrame(index=['Atiya', 'Abbas', 'Cornelia',
                         'Stephanie', 'Monte'],
                  data={'Apples':[20, 10, 40, 20, 50],
                        'Oranges':[35, 40, 25, 19, 33]})

这个DataFrame包含了五个人对苹果和橙子的消费数据。

2. 绘制柱状图

柱状图使用索引作为x轴标签,列值作为柱子的高度。我们可以使用 plot 方法,并将 kind 参数设置为 bar 来绘制柱状图。

import matplotlib.pyplot as plt

color = ['.2', '.7']
df.plot(kind='bar', color=color, figsize=(16,4))
plt.show()

在这个例子中,我们还设置了颜色和图形的大小。

3. 绘制KDE图

KDE(Kernel Density Estimation)图忽略索引,使用每列的值作为x轴,并计算y值的概率密度。

df.plot(kind='kde', color=color, figsize=(16,4))
plt.show()

KDE图可以帮助我们了解数据的分布情况。

4. 绘制双变量图

我们可以将所有双变量图(线图、散点图和柱状图)绘制在同一个图形中。

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(16,4))
fig.suptitle('Two Variable Plots', size=20, y=1.02)
df.plot(kind='line', color=color, ax=ax1, title='Line plot')
df.plot(x='Apples', y='Oranges', kind='scatter', color=color,
        ax=ax2, title='Scatterplot')
df.plot(kind='bar', color=color, ax=ax3, title='Bar plot')
plt.show()

需要注意的是,散点图需要明确指定x和y轴的列名。

5. 绘制单变量图

同样,我们可以将所有单变量图(KDE图、箱线图和直方图)绘制在同一个图形中。

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(16,4))
fig.suptitle('One Variable Plots', size=20, y=1.02)
df.plot(kind='kde', color=color, ax=ax1, title='KDE plot')
df.plot(kind='box', ax=ax2, title='Boxplot')
df.plot(kind='hist', color=color, ax=ax3, title='Histogram')
plt.show()
6. 指定绘图列

除了散点图,其他图默认使用所有数值列。我们也可以指定具体的列来进行绘图。

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(16,4))
df.sort_values('Apples').plot(x='Apples', y='Oranges',
                              kind='line', ax=ax1)
df.plot(x='Apples', y='Oranges', kind='bar', ax=ax2)
df.plot(x='Apples', kind='kde', ax=ax3)
plt.show()
7. 航班数据集可视化

接下来,我们将对航班数据集进行探索性数据分析,通过创建单变量和多变量图来了解数据。

7.1 读取数据集
flights = pd.read_csv('data/flights.csv')
flights.head()
7.2 计算航班状态

在绘图之前,我们需要计算转移、取消、延误和准点航班的数量。

flights['DELAYED'] = flights['ARR_DELAY'].ge(15).astype(int)
cols = ['DIVERTED', 'CANCELLED', 'DELAYED']
flights['ON_TIME'] = 1 - flights[cols].any(axis=1)
cols.append('ON_TIME')
status = flights[cols].sum()
status
7.3 绘制单变量图

我们将在同一个图形中绘制多个分类和连续列的图。

fig, ax_array = plt.subplots(2, 3, figsize=(18,8))
(ax1, ax2, ax3), (ax4, ax5, ax6) = ax_array
fig.suptitle('2015 US Flights - Univariate Summary', size=20)
ac = flights['AIRLINE'].value_counts()
ac.plot(kind='barh', ax=ax1, title='Airline')
oc = flights['ORG_AIR'].value_counts()
oc.plot(kind='bar', ax=ax2, rot=0, title='Origin City')
dc = flights['DEST_AIR'].value_counts().head(10)
dc.plot(kind='bar', ax=ax3, rot=0, title='Destination City')
status.plot(kind='bar', ax=ax4, rot=0,
            log=True, title='Flight Status')
flights['DIST'].plot(kind='kde', ax=ax5, xlim=(0, 3000),
                     title='Distance KDE')
flights['ARR_DELAY'].plot(kind='hist', ax=ax6,
                          title='Arrival Delay',
                          range=(0,200))
plt.show()
7.4 绘制每周航班数量图

为了绘制每周航班数量图,我们需要将日期转换为时间戳。

hour = flights['SCHED_DEP'] // 100
minute = flights['SCHED_DEP'] % 100
df_date = flights[['MONTH', 'DAY']].assign(YEAR=2015,
                                           HOUR=hour,
                                           MINUTE=minute)
flight_dep = pd.to_datetime(df_date)
flights.index = flight_dep
fc = flights.resample('W').size()
fc.plot(figsize=(12,3), title='Flights per Week', grid=True)
plt.show()
7.5 处理缺失数据

从图中可以看出,十月份的数据缺失。我们可以使用插值方法填充缺失数据。

fc_miss = fc.where(fc > 1000)
fc_intp = fc_miss.interpolate(limit_direction='both')
ax = fc_intp.plot(color='black', figsize=(16,4))
fc_intp[fc < 500].plot(linewidth=10, grid=True,
                       color='.8', ax=ax)
ax.annotate(xy=(.8, .55), xytext=(.8, .77),
            xycoords='axes fraction', s='missing data',
            ha='center', size=20, arrowprops=dict())
ax.set_title('Flights per Week (Interpolated Missing Data)')
plt.show()
7.6 多变量绘图

我们还可以进行多变量绘图,例如找出平均飞行距离最长且总航班数不少于100的10个机场。

flights.groupby('DEST_AIR')['DIST'] \
       .agg(['mean', 'count']) \
       .query('count > 100') \
       .sort_values('mean') \
       .tail(10) \
       .plot(kind='bar', y='mean', rot=0, legend=False,
             title='Average Distance per Destination')
plt.show()
7.7 分析距离和飞行时间的关系

我们可以绘制距离和飞行时间的散点图,并找出异常值。

fs = flights.reset_index(drop=True)[['DIST', 'AIR_TIME']] \
            .query('DIST <= 2000').dropna()
fs.plot(x='DIST', y='AIR_TIME', kind='scatter',
        s=1, figsize=(16,4))
plt.show()

fs['DIST_GROUP'] = pd.cut(fs['DIST'], bins=range(0, 2001, 250))
normalize = lambda x: (x - x.mean()) / x.std()
fs['TIME_SCORE'] = fs.groupby('DIST_GROUP')['AIR_TIME'] \
                     .transform(normalize)

ax = fs.boxplot(by='DIST_GROUP', column='TIME_SCORE',
                figsize=(16,4))
ax.set_title('Z-Scores for Distance Groups')
ax.figure.suptitle('')
plt.show()

outliers = flights.iloc[fs[fs['TIME_SCORE'] > 6].index]
outliers = outliers[['AIRLINE','ORG_AIR', 'DEST_AIR',
                     'AIR_TIME',
                     'DIST', 'ARR_DELAY', 'DIVERTED']]
outliers['PLOT_NUM'] = range(1, len(outliers) + 1)

ax = fs.plot(x='DIST', y='AIR_TIME',
             kind='scatter', s=1,
             figsize=(16,4), table=outliers)
outliers.plot(x='DIST', y='AIR_TIME',
              kind='scatter', s=25, ax=ax, grid=True)
outs = outliers[['AIR_TIME', 'DIST', 'PLOT_NUM']]
for t, d, n in outs.itertuples(index=False):
    ax.text(d + 5, t + 5, str(n))
plt.setp(ax.get_xticklabels(), y=.1)
plt.setp(ax.get_xticklines(), visible=False)
ax.set_xlabel('')
ax.set_title('Flight Time vs Distance with Outliers')
plt.show()

通过以上步骤,我们可以使用Matplotlib、Pandas和Seaborn进行各种类型的数据可视化,并对航班数据集进行深入的探索性数据分析。

下面是一个简单的流程图,展示了数据可视化的基本流程:

graph LR
    A[读取数据] --> B[数据预处理]
    B --> C[单变量绘图]
    B --> D[多变量绘图]
    C --> E[分析结果]
    D --> E

表格:航班状态统计
| 状态 | 数量 |
| ---- | ---- |
| DIVERTED | 137 |
| CANCELLED | 881 |
| DELAYED | 11685 |
| ON_TIME | 45789 |

列表总结:
1. 创建示例DataFrame用于演示绘图。
2. 绘制柱状图、KDE图、双变量图和单变量图。
3. 对航班数据集进行探索性数据分析,包括计算航班状态、绘制单变量图、处理缺失数据和进行多变量绘图。
4. 找出距离和飞行时间关系中的异常值。

使用Matplotlib、Pandas和Seaborn进行数据可视化

8. 可视化方法总结与分析

在前面的内容中,我们使用了多种可视化方法对示例数据和航班数据集进行了分析。下面我们对这些方法进行总结和分析。

8.1 绘图方法对比
绘图类型 特点 使用场景
柱状图(Bar Plot) 使用索引作为x轴标签,列值作为柱子高度,可直观展示不同类别之间的数量对比。 适用于展示分类数据的数量或频率,如航空公司、出发地和目的地城市的航班数量。
KDE图(Kernel Density Estimation Plot) 忽略索引,使用列值作为x轴,计算y值的概率密度,展示数据的分布情况。 用于了解连续数据的分布特征,如航班距离的分布。
线图(Line Plot) 通过连接数据点展示数据的变化趋势。 适用于展示随时间或其他连续变量变化的数据趋势,如每周航班数量的变化。
散点图(Scatter Plot) 展示两个变量之间的关系,通过点的分布来判断变量之间的相关性。 用于分析两个连续变量之间的关系,如航班距离和飞行时间的关系。
箱线图(Box Plot) 展示数据的四分位数、中位数和异常值,可用于检测数据的离散程度和异常情况。 用于检测数据中的异常值,如不同距离组的飞行时间的异常值。
直方图(Histogram) 将数据分成若干区间,统计每个区间内数据的频数,展示数据的分布情况。 适用于展示连续数据的分布,如航班到达延误时间的分布。
8.2 绘图参数的使用

Pandas的 plot 方法非常灵活,有很多参数可以用于定制绘图结果。例如:
- kind :指定绘图类型,如 bar kde line 等。
- color :设置绘图的颜色。
- figsize :设置图形的大小。
- ax :指定绘图的Axes对象,可将多个图绘制在同一个图形中。
- title :设置图形的标题。
- xlim ylim :设置x轴和y轴的范围。
- rot :旋转x轴或y轴的刻度标签。
- log :设置y轴是否使用对数刻度。

此外,还可以使用 **kwds 参数传递额外的参数给底层的Matplotlib函数,如 range 参数用于直方图的范围设置。

9. 异常值分析与处理

在分析航班距离和飞行时间的关系时,我们通过分组计算每个航班的飞行时间与该组均值的标准差倍数(Z-Score),并使用箱线图检测异常值。以下是异常值分析的步骤总结:
1. 数据筛选 :选择距离小于等于2000英里的航班数据,并去除缺失值。

fs = flights.reset_index(drop=True)[['DIST', 'AIR_TIME']] \
            .query('DIST <= 2000').dropna()
  1. 分组 :将航班距离分成8个组,每个组的范围为250英里。
fs['DIST_GROUP'] = pd.cut(fs['DIST'], bins=range(0, 2001, 250))
  1. 计算Z-Score :对每个组内的飞行时间进行标准化处理,计算每个航班的飞行时间与该组均值的标准差倍数。
normalize = lambda x: (x - x.mean()) / x.std()
fs['TIME_SCORE'] = fs.groupby('DIST_GROUP')['AIR_TIME'] \
                     .transform(normalize)
  1. 检测异常值 :使用箱线图展示每个距离组的Z-Score分布,并选择Z-Score大于6的航班作为异常值。
ax = fs.boxplot(by='DIST_GROUP', column='TIME_SCORE',
                figsize=(16,4))
ax.set_title('Z-Scores for Distance Groups')
ax.figure.suptitle('')
outliers = flights.iloc[fs[fs['TIME_SCORE'] > 6].index]
  1. 标记异常值 :在散点图中标记异常值,并为每个异常值分配一个编号,方便后续分析。
outliers = outliers[['AIRLINE','ORG_AIR', 'DEST_AIR',
                     'AIR_TIME',
                     'DIST', 'ARR_DELAY', 'DIVERTED']]
outliers['PLOT_NUM'] = range(1, len(outliers) + 1)
ax = fs.plot(x='DIST', y='AIR_TIME',
             kind='scatter', s=1,
             figsize=(16,4), table=outliers)
outliers.plot(x='DIST', y='AIR_TIME',
              kind='scatter', s=25, ax=ax, grid=True)
outs = outliers[['AIR_TIME', 'DIST', 'PLOT_NUM']]
for t, d, n in outs.itertuples(index=False):
    ax.text(d + 5, t + 5, str(n))
plt.setp(ax.get_xticklabels(), y=.1)
plt.setp(ax.get_xticklines(), visible=False)
ax.set_xlabel('')
ax.set_title('Flight Time vs Distance with Outliers')
10. 总结与展望

通过使用Matplotlib、Pandas和Seaborn进行数据可视化,我们可以更直观地了解数据的特征和关系。在航班数据集的分析中,我们发现了一些有趣的现象,如不同航空公司的航班数量差异、航班距离和飞行时间的线性关系以及部分异常航班的存在。

未来的分析可以进一步深入,例如:
1. 更多变量的分析 :考虑更多的变量,如航班出发时间、天气条件等,分析它们对航班延误和飞行时间的影响。
2. 预测模型的建立 :基于现有的数据,建立预测模型,预测航班延误的概率或飞行时间。
3. 地理信息可视化 :结合地理信息系统(GIS),将航班数据可视化在地图上,更直观地展示航班的分布和流向。

下面是一个简单的流程图,展示了异常值分析的流程:

graph LR
    A[数据筛选] --> B[分组]
    B --> C[计算Z-Score]
    C --> D[检测异常值]
    D --> E[标记异常值]

列表总结:
1. 总结了不同绘图方法的特点和使用场景。
2. 分析了Pandas plot 方法的参数使用。
3. 详细介绍了异常值分析的步骤,包括数据筛选、分组、计算Z-Score、检测异常值和标记异常值。
4. 对未来的分析方向进行了展望,包括更多变量分析、预测模型建立和地理信息可视化。

通过以上内容,我们对使用Matplotlib、Pandas和Seaborn进行数据可视化有了更深入的了解,并掌握了一些实用的数据分析和可视化技巧。希望这些内容对你有所帮助!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值