來(lái)源丨愛數(shù)據(jù)LoveData
可視化是一種方便的觀察數(shù)據(jù)的方式,可以一目了然地了解數(shù)據(jù)塊。我們經(jīng)常使用柱狀圖、直方圖、餅圖、箱圖、熱圖、散點(diǎn)圖、線狀圖等。這些典型的圖對(duì)于數(shù)據(jù)可視化是必不可少的。除了這些被廣泛使用的圖表外,還有許多很好的卻很少被使用的可視化方法,這些圖有助于完成我們的工作,下面我們看看有那些圖可以進(jìn)行。 我們最多可以可視化 3 維數(shù)據(jù)。但是我們有時(shí)需要可視化超過(guò) 3 維的數(shù)據(jù)才能獲得更多的信息。我們經(jīng)常使用 PCA 或 t-SNE 來(lái)降維并繪制它。在降維的情況下,可能會(huì)丟失大量信息。在某些情況下,我們需要考慮所有特征, 平行坐標(biāo)圖有助于做到這一點(diǎn)。 鳶尾花數(shù)據(jù)集的平行坐標(biāo)圖 上面的圖片。橫線(平行軸)表示鳶尾花的特征(花瓣長(zhǎng)、萼片長(zhǎng)、萼片寬、花瓣寬)。分類是Setosa, Versicolor和Virginica。上圖將該物種編碼為Setosa→1,Versicolor→2,Virginica→3。每個(gè)平行軸包含最小值到最大值(例如,花瓣長(zhǎng)度從1到6.9,萼片長(zhǎng)度從4.3到7.9,等等)。例如,考慮花瓣長(zhǎng)度軸。這表明與其他兩種植物相比,瀨蝶屬植物的花瓣長(zhǎng)度較小,其中維珍屬植物的花瓣長(zhǎng)度最高。 有了這個(gè)圖,我們可以很容易地獲得數(shù)據(jù)集的總體信息。數(shù)據(jù)集是什么樣子的?讓我們來(lái)看看。 讓我們用Plotly Express庫(kù)[1]可視化數(shù)據(jù)。Plotly庫(kù)提供了一個(gè)交互式繪圖工具。 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()
除了上圖以外我們還可以使用其他庫(kù),如pandas、scikit-learn和matplotlib來(lái)繪制并行坐標(biāo)。 六邊形分箱圖是一種用六邊形直觀表示二維數(shù)值數(shù)據(jù)點(diǎn)密度的方法。 ax = df.plot.hexbin(x='sepal_width', y='sepal_length', gridsize=20,color='#BDE320') Pandas 允許我們繪制六邊形 binning [2]。我已經(jīng)展示了用于查找 sepal_width 和 sepal_length 列的密度的圖。 如果仔細(xì)觀察圖表,我們會(huì)發(fā)現(xiàn)總面積被分成了無(wú)數(shù)個(gè)六邊形。每個(gè)六邊形覆蓋特定區(qū)域。我們注意到六邊形有顏色變化。六邊形有的沒(méi)有顏色,有的是淡綠色,有的顏色很深。根據(jù)圖右側(cè)顯示的色標(biāo),顏色密度隨密度變化。比例表示具有顏色變化的數(shù)據(jù)點(diǎn)的數(shù)量。六邊形沒(méi)有填充顏色,這意味著該區(qū)域沒(méi)有數(shù)據(jù)點(diǎn)。 其他庫(kù),如 matplotlib、seaborn、bokeh(交互式繪圖)也可用于繪制它。 二維等高線密度圖是可視化特定區(qū)域內(nèi)數(shù)據(jù)點(diǎn)密度的另一種方法。這是為了找到兩個(gè)數(shù)值變量的密度。例如,下面的圖顯示了在每個(gè)陰影區(qū)域有多少數(shù)據(jù)點(diǎn)。 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庫(kù),因?yàn)樗梢苑奖愕乩L制交互式的圖表。我們這里繪制了兩個(gè)變量 sepal_width 和 sepal_length 的密度。 當(dāng)然,也可以使用其他庫(kù),如seaborn、matplotlib等。 QQ plot是另一個(gè)有趣的圖。QQ是Quantile - Quantile plot的縮寫(Quantile/percentile是一個(gè)范圍,在這個(gè)范圍內(nèi)數(shù)據(jù)下降了指定百分比。例如,第10個(gè)quantile/percentile表示在該范圍下,找到了10%的數(shù)據(jù),90% 超出范圍)。這是一種直觀地檢查數(shù)值變量是否服從正態(tài)分布的方法。讓我解釋一下它是如何工作的。 (a)樣本分布(b)標(biāo)準(zhǔn)正態(tài)分布 圖(a)是樣本分布;(b) 是標(biāo)準(zhǔn)正態(tài)分布。對(duì)于樣本分布,數(shù)據(jù)范圍從 10 到 100(100% 數(shù)據(jù)在 10 到 100 之間)。但對(duì)于標(biāo)準(zhǔn)正態(tài)分布,100% 的數(shù)據(jù)在 -3 到 3(z 分?jǐn)?shù))的范圍內(nèi)。在 QQ 圖中,兩個(gè) x 軸值均分為 100 個(gè)相等的部分(稱為分位數(shù))。如果我們針對(duì) x 和 y 軸繪制這兩個(gè)值,我們將得到一個(gè)散點(diǎn)圖。 散點(diǎn)圖位于對(duì)角線上。這意味著樣本分布是正態(tài)分布。如果散點(diǎn)圖位于左邊或右邊而不是對(duì)角線,這意味著樣本不是正態(tài)分布的。 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)
該圖顯示數(shù)據(jù)是正態(tài)分布的。我們用數(shù)據(jù)點(diǎn)做qq-plot來(lái)檢驗(yàn)它是否正態(tài)分布。 import statsmodels.api as sm
# q-q plot
sm.qqplot(gauss_data, line='s')
plt.show()
該圖顯示散點(diǎn)位于對(duì)角線上。所以它是正態(tài)分布的。 小提琴圖與箱線圖相關(guān)。我們能從小提琴圖中獲得的另一個(gè)信息是密度分布。簡(jiǎn)單來(lái)說(shuō)就是一個(gè)結(jié)合了密度分布的箱線圖。我們將其與箱線圖進(jìn)行比較。 在小提琴圖中,小提琴中間的白點(diǎn)表示中點(diǎn)。實(shí)心框表示四分位數(shù)間距 (IQR)。上下相鄰值是異常值的圍欄。超出范圍,一切都是異常值。下圖顯示了比較。 盒狀圖和小提琴狀圖的常見組成。所有學(xué)術(shù)級(jí)別的薪酬總額 import seaborn as sns
sns.violinplot(data=df, y='sepal_width')
我們還可以通過(guò)傳遞名稱來(lái)繪制不同物種的小提琴圖。 import seaborn as sns
sns.violinplot(data=df,x='species', y='sepal_width')
還可以使用其他庫(kù),如plotly、matplotlib等來(lái)繪制小提琴圖。 Boxenplot 是 seaborn 庫(kù)引入的一種新型箱線圖。對(duì)于箱線圖,框是在四分位數(shù)上創(chuàng)建的。但在 Boxenplot 中,數(shù)據(jù)被分成更多的分位數(shù)。它提供了對(duì)數(shù)據(jù)的更多內(nèi)存。 鳶尾花數(shù)據(jù)集的 Boxenplot 顯示了 sepal_width 的數(shù)據(jù)分布。 sns.boxenplot(x=df['sepal_width'])
上圖顯示了比箱線圖更多的盒。這是因?yàn)槊總€(gè)框代表一個(gè)特定的分位數(shù)。 sns.boxenplot(data=df, x='species',y='sepal_width')
不同物種sepal_width的Boxenplot圖。 下 圖中有一些名為誤差線的垂直線和其他一些連接這些垂直線的線。 讓我們看看它的確切含義。 點(diǎn)圖是一種通過(guò)上圖中顯示的點(diǎn)的位置來(lái)表示數(shù)值變量集中趨勢(shì)的方法,誤差條表示變量的不確定性(置信區(qū)間)[4]。繪制線圖是為了比較不同分類值的數(shù)值變量的變異性 [4]。 讓我們舉一個(gè)實(shí)際的例子—-我們繼續(xù)使用 seaborn 庫(kù)和 iris 數(shù)據(jù)集(在平行坐標(biāo)部分中提到)。 import seaborn as sns
sns.pointplot(data=df,x='species', y='sepal_width')
該圖表顯示了不同花的萼片寬度的變異性。我們還可以繪制多個(gè)點(diǎn)圖。 Swarm plot 是另一個(gè)受“beeswarm”啟發(fā)的有趣圖表。通過(guò)此圖我們可以輕松了解不同的分類值如何沿?cái)?shù)值軸分布 [5]。它在不重疊數(shù)據(jù)點(diǎn)的情況下繪制數(shù)據(jù)。但它不適用于大型數(shù)據(jù)集。 import seaborn as sns
sns.swarmplot(data=df,x='species', y='sepal_width')
它是圓環(huán)圖或餅圖的定制版本,將一些額外的層次信息集成到圖中 [7]。 整個(gè)圖表被分成幾個(gè)環(huán)(從內(nèi)到外)。它保存層次結(jié)構(gòu)信息,其中內(nèi)環(huán)位于層次結(jié)構(gòu)的頂部,外環(huán)位于較低的[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屬性提供了層次結(jié)構(gòu),其中性別位于層次結(jié)構(gòu)的頂部,然后是日期和時(shí)間。 詞云圖的想法非常簡(jiǎn)單。假設(shè)我們有一組文本文檔。單詞有很多,有些是經(jīng)常出現(xiàn)的,有些是很少出現(xiàn)的。在詞云圖中,所有單詞都被繪制在特定的區(qū)域中,頻繁出現(xiàn)的單詞被高亮顯示(用較大的字體顯示)。有了這個(gè)詞云,我們可以很容易地找到重要的客戶反饋,熱門的政治議程話題等。 數(shù)據(jù)集:
https://opendatacommons.org/licenses/odbl/1-0/
import pandas as pd
data=pd.read_csv('/work/android-games.csv')
data.head()
我們統(tǒng)計(jì)每個(gè)類別的數(shù)據(jù)數(shù)量 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()
該圖表顯示了頻率最高的所有類別。我們也可以用這個(gè)圖從文本中找到經(jīng)常出現(xiàn)的單詞。 數(shù)據(jù)可視化是數(shù)據(jù)科學(xué)中不可缺少的一部分。在數(shù)據(jù)科學(xué)中,我們與數(shù)據(jù)打交道。手工分析少量數(shù)據(jù)是可以的,但當(dāng)我們處理數(shù)千個(gè)數(shù)據(jù)時(shí)它就變得非常麻煩。如果我們不能發(fā)現(xiàn)數(shù)據(jù)集的趨勢(shì)和洞察力,我們可能無(wú)法使用這些數(shù)據(jù)。希望上面介紹的的圖可以幫助你深入了解數(shù)據(jù)。 https://plotly.com/python/parallel-coordinates-plot/ https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.hexbin.html Hintze, V. P. A Box Plot-Density Trace Synergism. Am. Sat, (52), 181 (Open Access Journal). seaborn.pointplot — seaborn 0.12.1 documentation (pydata.org) seaborn.swarmplot — seaborn 0.12.1 documentation (pydata.org) Create a sunburst chart in Office — Microsoft Support