数据可视化是数据科学中非常重要的一部分。在探索和理解数据时非常有用。在某些情况下,可视化在传达信息方面比普通数字要好得多。
使用数据可视化技术可以轻松发现变量之间的关系,变量的分布以及数据中的基础结构。
在本文中,我们将学习如何创建6种基本但常用的数据可视化类型。我还写了一篇文章,解释了如何使用Seaborn创建这些可视化。
我们将在这篇文章中使用Matplotlib。因此,您不仅将了解可视化,而且还将了解Matplotlib和Seaborn语法之间的区别。
我们将使用Kaggle上可用的食品杂货和直销数据集来创建可视化。
首先,将数据集读取为Pandas数据框。
- import numpy as np
- import pandas as pd
- grocery = pd.read_csv("/content/Groceries_dataset.csv", parse_dates=['Date'])
- marketing = pd.read_csv("/content/DirectMarketing.csv")
> The first 5 rows of the grocery dataframe (image by author)
> The first 5 rows of the marketing dataframe (image by author)
我们现在可以开始创建可视化并探索数据集。
1. 线图
线图可视化两个变量之间的关系。其中之一通常是时间,以便我们可以看到变量如何随时间变化。
对于杂货数据集,我们可以使用线图来可视化所购买商品的数量随时间的变化。
首先,我们使用Pandas的groupby函数计算每天购买的商品数量。
- items = grocery[['Date','itemDescription']]\
- .groupby('Date').count().reset_index()
- items.rename(columns={'itemDescription':'itemCount'}, inplace=True)
- items.head()
- Date item Count
- 2014-01-01 48 1
- 2014-01-02 62 2
- 2014-01-03 54 3
- 2014-01-04 64 4
- 2014-01-05 44
这是用于创建折线图的matplotlib语法。
- plt.figure(figsize=(10,6))
- plt.title("Number of Items Purchased - Daily", fontsize=16)
- plt.plot('Date', 'itemCount',
- data=items[items.Date > '2015-08-01'])
- plt.xlabel('Date', fontsize=14)
- plt.ylabel('Item Count', fontsize=14)
> (image by author)
第一行创建一个Figure对象,第二行添加标题,第三行在Figure对象上绘制数据。最后两行添加了x轴和y轴的标签。
该图包含2015-08-01年之后的数据,以供演示。
注意:默认图形大小为(6,4)。我们可以为每个图形分别更改它或更新默认图形大小。
- #to get the default figure size
- plt.rcParams.get('figure.figsize')[6.0, 4.0]
- #to update the default figure size
- plt.rcParams['figure.figsize'] = (10,6)
2. 散点图
散点图通常用于可视化两个数字变量的值。我们可以观察它们之间是否存在相关性。因此,它也是一个关系图。
散点图可用于检查营销数据集中的薪水和支出金额之间是否存在相关性。我们还可以基于分类变量来区分值。
让我们分别创建已婚和单身人士的工资和花费金额的散点图。
- fig, ax = plt.subplots()
- plt.title("Salary vs Spent Amount", fontsize=16)
- ax.scatter('Salary', 'AmountSpent',
- data=marketing[marketing.Married == 'Married'])
- ax.scatter('Salary', 'AmountSpent',
- data=marketing[marketing.Married == 'Single'])
- ax.legend(labels=['Married','Single'], loc='upper left', fontsize=12)
> (image by author)
我们创建了带有多个轴对象的Figure对象。每个类别(已婚和单身)的散点图都绘制在轴对象上。
使用Seaborn分隔类别要容易得多。我们只是将列名传递给hue参数。
工资和支出金额之间存在正相关关系,这不足为奇。另一个见解是,已婚人士的收入通常比单身人士高。
注意:您可能已经注意到,第一图和第二图的" xticks"和" yticks"大小不同。我已经使用rc方法更新了这些设置,如下所示。
- plt.rc('xtick', labelsize=12)
- plt.rc('ytick', labelsize=12)
3. 直方图
直方图是一种检查连续变量分布的方法。它将变量的值范围划分为bin,并显示每个bin中的值数。因此,我们对值的分布方式进行了概述。
我们可以使用直方图检查支出金额的分布。
- plt.title("Distribution of Spent Amount", fontsize=16)
- plt.hist('AmountSpent', data=marketing, bins=16)
> (image by author)
bins参数用于更改箱数。越多的垃圾桶将导致更详细的分发概述。
4. 箱形图
箱形图概述了变量的分布。它显示了值如何通过四分位数和离群值分布。
箱形图可用于检查营销数据集中消费量的分布。我们还可以根据" OwnHome"列进行区分。
- X1 = marketing[marketing.OwnHome == 'Own']['AmountSpent']
- X2 = marketing[marketing.OwnHome == 'Rent']['AmountSpent']
- plt.title("Distribution of Spent Amount", fontsize=16)
- plt.boxplot((X1,X2), labels=['Own Home', 'Rent'])
> (image by author)
我们可以将值数组传递给盒图函数或元组中的多个数组。拥有房屋的人通常会花更多钱。这些值也更加分散。
中间的线代表变量的中位数。
5. 条形图
条形图主要用于分类变量。这是一个简单的图,但是对于报表或交付结果很有用。
我们可以使用subplots函数创建带有两个条形图的图形。
- fig, (ax1, ax2) = plt.subplots(nrows=1,
- ncols=2,
- sharey=True,
- figsize=(8,5))
- ax1.bar(x=location.index, height=location.values, width=0.5)
- ax1.set_title("Location", fontsize=14)
- ax2.bar(x=age.index, height=age.values, width=0.5)
- ax2.set_title("Age Groups", fontsize=14)
> (image by author)
我们可以看到每个类别中存在多少个值。这些信息可以简单地通过pandas的value_counts函数获得。但是,最好使用可视化。
6. 2D直方图
2D直方图在网格上组合了2个不同的直方图(x轴和y轴)。因此,我们能够可视化重叠或并发的密度。换句话说,我们可视化一对变量的分布。
我们可以使用hist2d函数轻松创建2D直方图。
- plt.figure(figsize=(8, 8))
- plt.title("Histogram of Spent Amount and Salary", fontsize=16)
- plt.hist2d("AmountSpent", "Salary",
- range=[[0, 2000], [0, 80000]],
- data=marketing,
- cmap='Blues')
> (image by author)
为了获得更多信息,我使用了range参数来限制x轴和y轴上的范围。否则,由于异常值,大多数值将被压缩到左下角。
较暗的区域包含更多的数据点。可以说,大多数人都在"支出额"和"工资"列的下部。
结论
我们在这篇文章中介绍的只是Matplotlib功能的一小部分。但是,这些基本图通常用于探索性数据分析或创建数据报告。
此外,它们对学习Matplotlib的语法有很大帮助。像其他任何学科一样,掌握Matplotlib的最佳方法是练习。熟悉基本功能后,即可继续使用更高级的功能。
Matplotlib语法比Seaborn更复杂,但是它在绘图上提供了更多的控制和灵活性。