可视化是一种方便的观察数据的方式,可以一目了然地了解数据块。我们经常使用柱状图、直方图、饼图、箱图、热图、散点图、线状图等。这些典型的图对于数据可视化是必不可少的。除了这些被广泛使用的图表外,还有许多很好的却很少被使用的可视化方法,这些图有助于完成我们的工作,下面我们看看有那些图可以进行。
1、平行坐标图
Parallel Coordinate
我们最多可以可视化 3 维数据。但是我们有时需要可视化超过 3 维的数据才能获得更多的信息。我们经常使用 PCA 或 t-SNE 来降维并绘制它。在降维的情况下,可能会丢失大量信息。在某些情况下,我们需要考虑所有特征, 平行坐标图有助于做到这一点。
鸢尾花数据集的平行坐标图
上面的图片。横线(平行轴)表示鸢尾花的特征(花瓣长、萼片长、萼片宽、花瓣宽)。分类是Setosa, Versicolor和Virginica。上图将该物种编码为Setosa→1,Versicolor→2,Virginica→3。每个平行轴包含最小值到最大值(例如,花瓣长度从1到6.9,萼片长度从4.3到7.9,等等)。例如,考虑花瓣长度轴。这表明与其他两种植物相比,濑蝶属植物的花瓣长度较小,其中维珍属植物的花瓣长度最高。
有了这个图,我们可以很容易地获得数据集的总体信息。数据集是什么样子的?让我们来看看。
让我们用Plotly Express库[1]可视化数据。Plotly库提供了一个交互式绘图工具。
import plotly.express as px
df = px.data.iris()
fig = px.parallel_coordinates(df, color="species_id", labels={"species_id": "Species",
"sepal_width": "Sepal Width", "sepal_length": "Sepal Length",
"petal_width": "Petal Width", "petal_length": "Petal Length", },
color_continuous_scale=px.colors.diverging.Tealrose,
color_continuous_midpoint=2)
fig.show()
除了上图以外我们还可以使用其他库,如pandas、scikit-learn和matplotlib来绘制并行坐标。
六边形分箱图
Hexagonal Binning
六边形分箱图是一种用六边形直观表示二维数值数据点密度的方法。
ax = df.plot.hexbin(x='sepal_width', y='sepal_length',
gridsize=20,color='#BDE320')
Pandas 允许我们绘制六边形 binning [2]。我已经展示了用于查找 sepal_width 和 sepal_length 列的密度的图。
如果仔细观察图表,我们会发现总面积被分成了无数个六边形。每个六边形覆盖特定区域。我们注意到六边形有颜色变化。六边形有的没有颜色,有的是淡绿色,有的颜色很深。根据图右侧显示的色标,颜色密度随密度变化。比例表示具有颜色变化的数据点的数量。六边形没有填充颜色,这意味着该区域没有数据点。
其他库,如 matplotlib、seaborn、bokeh(交互式绘图)也可用于绘制它。
等高线密度图
Contour
二维等高线密度图是可视化特定区域内数据点密度的另一种方法。这是为了找到两个数值变量的密度。例如,下面的图显示了在每个阴影区域有多少数据点。
import plotly.express as px
fig = px.density_contour(df, x="sepal_width", y="sepal_length")
fig.update_traces(contours_coloring="fill", contours_showlabels = True)
fig.show()
为了生成上面的图表,我这里使用了plotly库,因为它可以方便地绘制交互式的图表。我们这里绘制了两个变量 sepal_width 和 sepal_length 的密度。
当然,也可以使用其他库,如seaborn、matplotlib等。
4、QQ-plot
QQ plot是另一个有趣的图。QQ是Quantile - Quantile plot的缩写(Quantile/percentile是一个范围,在这个范围内数据下降了指定百分比。例如,第10个quantile/percentile表示在该范围下,找到了10%的数据,90% 超出范围)。这是一种直观地检查数值变量是否服从正态分布的方法。让我解释一下它是如何工作的。
(a)样本分布(b)标准正态分布
图(a)是样本分布;(b) 是标准正态分布。对于样本分布,数据范围从 10 到 100(100% 数据在 10 到 100 之间)。但对于标准正态分布,100% 的数据在 -3 到 3(z 分数)的范围内。在 QQ 图中,两个 x 轴值均分为 100 个相等的部分(称为分位数)。如果我们针对 x 和 y 轴绘制这两个值,我们将得到一个散点图。
QQ-plot
散点图位于对角线上。这意味着样本分布是正态分布。如果散点图位于左边或右边而不是对角线,这意味着样本不是正态分布的。
导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
生成正态分布数据。
np.random.seed(10)
# Generate Univariate Observations
gauss_data = 5 * np.random.randn(100) + 50
绘制数据点的分布。
sns.histplot(data=gauss_data, kde=True)
该图显示数据是正态分布的。我们用数据点做qq-plot来检验它是否正态分布。
import statsmodels.api as sm
# q-q plot
sm.qqplot(gauss_data, line='s')
plt.show()
该图显示散点位于对角线上。所以它是正态分布的。
小提琴图
Violin Plot
小提琴图与箱线图相关。我们能从小提琴图中获得的另一个信息是密度分布。简单来说就是一个结合了密度分布的箱线图。我们将其与箱线图进行比较。
在小提琴图中,小提琴中间的白点表示中点。实心框表示四分位数间距 (IQR)。上下相邻值是异常值的围栏。超出范围,一切都是异常值。下图显示了比较。
盒状图和小提琴状图的常见组成。所有学术级别的薪酬总额
让我们看看小提琴图的可视化。
import seaborn as sns
sns.violinplot(data=df, y="sepal_width")
我们还可以通过传递名称来绘制不同物种的小提琴图。
import seaborn as sns
sns.violinplot(data=df,x='species', y="sepal_width")
还可以使用其他库,如plotly、matplotlib等来绘制小提琴图。
箱线图的改进版
Boxen plot
Boxenplot 是 seaborn 库引入的一种新型箱线图。对于箱线图,框是在四分位数上创建的。但在 Boxenplot 中,数据被分成更多的分位数。它提供了对数据的更多内存。
鸢尾花数据集的 Boxenplot 显示了 sepal_width 的数据分布。
sns.boxenplot(x=df["sepal_width"])
上图显示了比箱线图更多的盒。这是因为每个框代表一个特定的分位数。
sns.boxenplot(data=df, x="species",y='sepal_width')
不同物种sepal_width的Boxenplot图。
点图
下图中有一些名为误差线的垂直线和其他一些连接这些垂直线的线。让我们看看它的确切含义。
点图是一种通过上图中显示的点的位置来表示数值变量集中趋势的方法,误差条表示变量的不确定性(置信区间)[4]。绘制线图是为了比较不同分类值的数值变量的变异性 [4]。
让我们举一个实际的例子—-我们继续使用 seaborn 库和 iris 数据集(在平行坐标部分中提到)。
import seaborn as sns
sns.pointplot(data=df,x="species", y="sepal_width")
该图表显示了不同花的萼片宽度的变异性。我们还可以绘制多个点图。
分簇散点图
Swarm plot
Swarm plot 是另一个受“beeswarm”启发的有趣图表。通过此图我们可以轻松了解不同的分类值如何沿数值轴分布 [5]。它在不重叠数据点的情况下绘制数据。但它不适用于大型数据集。
import seaborn as sns
sns.swarmplot(data=df,x="species", y="sepal_width")
旭日图
Sunburst Chart
它是圆环图或饼图的定制版本,将一些额外的层次信息集成到图中 [7]。
Sunburst Chart
整个图表被分成几个环(从内到外)。它保存层次结构信息,其中内环位于层次结构的顶部,外环位于较低的[7]阶。
以上日暴图的数据
import plotly.express as px
df = px.data.tips()
绘制旭日图
fig = px.sunburst(df, path=['sex', 'day', 'time'],
values='total_bill', color='time')
fig.show()
sunburst类的path属性提供了层次结构,其中性别位于层次结构的顶部,然后是日期和时间。
词云
Word Cloud
词云图的想法非常简单。假设我们有一组文本文档。单词有很多,有些是经常出现的,有些是很少出现的。在词云图中,所有单词都被绘制在特定的区域中,频繁出现的单词被高亮显示(用较大的字体显示)。有了这个词云,我们可以很容易地找到重要的客户反馈,热门的政治议程话题等。
数据集:
https://opendatacommons.org/licenses/odbl/1-0/
import pandas as pd
data=pd.read_csv('/work/android-games.csv')
data.head()
我们统计每个类别的数据数
data.category.value_counts()
GAME CARD 126
GAME WORD 104
GAME ACTION 100
GAME ADVENTURE 100
GAME STRATEGY 100
GAME PUZZLE 100
GAME SIMULATION 100
GAME CASUAL 100
GAME ARCADE 100
GAME ROLE PLAYING 100
GAME TRIVIA 100
GAME BOARD 100
GAME CASINO 100
GAME RACING 100
GAME EDUCATIONAL 100
GAME SPORTS 100
GAME MUSIC 100
Name: category, dtype: int64
我们进行可视化。
#importing the module from wordcloud library from wordcloud import WordCloud import matplotlib.pyplot as plt #creating a text from the category column by taking only the 2nd part of the category. text = " ".join(cat.split()[1] for cat in data.category) #generating the cloud word_cloud = WordCloud(collocations = False, background_color = 'black').generate(text) plt.imshow(word_cloud, interpolation='bilinear') plt.axis("off") plt.show()
该图表显示了频率最高的所有类别。我们也可以用这个图从文本中找到经常出现的单词。
总结
数据可视化是数据科学中不可缺少的一部分。在数据科学中,我们与数据打交道。手工分析少量数据是可以的,但当我们处理数千个数据时它就变得非常麻烦。如果我们不能发现数据集的趋势和洞察力,我们可能无法使用这些数据。希望上面介绍的的图可以帮助你深入了解数据。