Python中4種更快速,更輕鬆的數據可視化方法(含代碼)

編譯:yxy

出品:ATYUN訂閱號

數據可視化是任何數據科學或機器學習項目的重要組成部分。我們通常會從探索性數據分析(EDA)開始,以獲得對數據的一些見解,然後創建可視化,這確實有助於使事情更清晰,更容易理解,尤其是對於更大,更高維度的數據集。在項目即將結束時,能夠以清晰,簡潔和令人信服的方式呈現你的最終結果非常重要,只有這樣,你的受衆(通常是非技術客戶)才能夠理解。

我曾經寫過一篇文章使用Python快速進行簡單的數據可視化 ,其中我介紹了5個基本可視化:散點圖,線圖,直方圖,條形圖和箱線圖。這些都是簡單但功能強大的可視化,你可以使用它們洞察你的數據集。而在本文中,我將介紹另外4 個數據可視化!這些可視化將更精細的從你的數據中提取更深入的信息。

基礎可視化:https://towardsdatascience.com/5-quick-and-easy-data-visualizations-in-python-with-code-a2284bae952f

熱圖

熱圖是數據的矩陣表示,其中矩陣值用顏色來表示。不同的顏色代表不同的大小,矩陣索引將2個項目或特徵鏈接在一起進行比較。熱圖非常適合顯示多個特徵變量之間的關係,因爲你可以直接將值的大小視爲不同的顏色。你還可以通過查看熱圖中的其他點來查看數據集中每種關係如何與的其他關係進行比較。由於它非常直觀,因此顏色確實提供了簡單而且直觀的解釋。

現在我們來看看代碼。seaborn庫可以用於繪製比matplotlib更高級的圖,通常需要更多組件,如許多顏色,圖形或變量。matplotlib用於顯示圖,numpy生成數據,pandas處理數據!繪圖只是一個簡單的seaborn功能,如果你認爲某些東西特別好看,也可以設置顏色映射。

# Importing libs
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Create a random dataset
data= pd.DataFrame(np.random.random((10,6)), columns=["Iron Man","Captain America","Black Widow","Thor","Hulk","Hawkeye"])
print(data)
# Plot the heatmap
heatmap_plot= sns.heatmap(data, center=0, cmap='gist_ncar')
plt.show()

二維密度圖

二維密度圖是一維密度圖的簡單擴展,相當於後者它的好處是能夠看到關於2個變量的概率分佈。我們來看看下面的二維密度圖。右邊的圖例用顏色表示每個點的概率。概率最高,也就是我們數據的集中的地方,肉眼觀察的話size大約爲0.5,speed約爲1.4。正如你現在所知,二維密度圖非常適合快速識別我們的數據中兩個變量最集中的位置,而一維密度圖只能識別一個。當你有兩個變量對你的輸出非常重要並且你希望看到它們倆如何影響輸出分佈時,這個圖非常有用。

它的seaborn的代碼同樣超級簡單!這一次,我們將創建一個偏態分佈。如果你發現某些顏色或陰影在視覺上效果更好,那麼有非常多的可選參數都會使圖看起來更清晰。

# Importing libs
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.statsimport skewnorm
# Create the data
speed= skewnorm.rvs(4, size=50)
size= skewnorm.rvs(4, size=50)
# Create and shor the 2D Density plot
ax= sns.kdeplot(speed, size, cmap="Reds", shade=False, bw=.15, cbar=True)
ax.set(xlabel='speed', ylabel='size')
plt.show()

蜘蛛圖

蜘蛛圖(spider plot)是展示一對多關係的最佳方式之一。也就是說,你可以繪製並查看幾個變量相對於單個變量或類別的值。由於面積和長度在該特定方向上變大,在蜘蛛圖中,一個變量相對於其他變量的突出成圖十分明顯,因爲在那個特定的方向上,面積和長度變得更大。如果你想知道關於這些變量的幾個類別是如何疊加的,你可以把它們並排畫出來。在下圖中,很容易比較復仇者(漫威英雄)的不同屬性,看看他們的優勢在哪裏!(請注意,以下這些統計數據是隨機設置的)

這次我們將可以直接使用matplotlib創建我們的可視化。我們需要計算每個屬性所處的角度,因爲我們希望它們沿着圓周長度相等。我們將標籤放置在每個計算出的角度,然後將值繪製單個點,點距中心的距離取決於其值的大小。最後,爲了清晰起見,我們使用半透明的顏色填充連接屬性點的線所包圍的區域。

# Import libs
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
# Get the data
df=pd.read_csv("avengers_data.csv")
print(df)
"""
   #             Name  Attack  Defense  Speed  Range  Health
0  1         Iron Man      83       80     75     70      70
1  2  Captain America      60       62     63     80      80
2  3             Thor      80       82     83    100     100
3  3             Hulk      80      100     67     44      92
4  4      Black Widow      52       43     60     50      65
5  5          Hawkeye      58       64     58     80      65
"""
# Get the data for Iron Man
labels=np.array(["Attack","Defense","Speed","Range","Health"])
stats=df.loc[0,labels].values
# Make some calculations for the plot
angles=np.linspace(0,2*np.pi,len(labels), endpoint=False)
stats=np.concatenate((stats,[stats[0]]))
angles=np.concatenate((angles,[angles[0]]))
# Plot stuff
fig= plt.figure()
ax= fig.add_subplot(111, polar=True)
ax.plot(angles, stats,'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)
ax.set_thetagrids(angles* 180/np.pi, labels)
ax.set_title([df.loc[0,"Name"]])
ax.grid(True)
plt.show()

樹圖

從小學開始我們就一直在使用樹形圖!它們十分直觀,易於理解。具有直接連接的節點具有緊密關係,而分開連接的節點則正好相反。在下面的可視化中,我繪製了kaggle一個數據集中統計數據的一部分,根據:

HP, Attack, Defense, Special Attack, Special Defense, Speed

因此,統計將最勢均力敵的口袋妖怪緊密連接在一起。例如,我們看到在頂部,Arbok和Fearow(阿柏怪和大嘴雀)是直接連接的,如果我們檢查數據,就會發現Arbok總分有438,而Fearow有442,非常接近!但到了Raticate(拉達),總分爲413,與Arbok和Fearow完全不同,因此他們會被分開!當我們沿着樹向上移動時,口袋妖怪越來越多地基於相似度進行分組。即使沒有直接的綠線連接,綠線組中的神奇寶貝也會比紅線組中的任何口袋妖怪更相似。

對於樹形圖,我們可以直接用Scipy!在我們的數據集中讀取之後,我們將刪除字符串列。在這裏,這樣做是爲了直接實現可視化,但在實踐中,將這些字符串轉換爲分類變量會獲得更好的比較和結果。我們還設置了數據幀索引,以便我們可以正確地將其用作引用每個節點的列。最後,在Scipy中使用一行代碼計算和繪製樹!

view source

# Import libs
import pandas as pd
from matplotlibimport pyplot as plt
from scipy.clusterimport hierarchy
import numpy as np
# Read in the dataset
# Drop any fields that are strings
# Only get the first 40 because this dataset is big
df= pd.read_csv('Pokemon.csv')
df= df.set_index('Name')
del df.index.name
df= df.drop(["Type 1","Type 2","Legendary"], axis=1)
df= df.head(n=40)
# Calculate the distance between each sample
Z= hierarchy.linkage(df,'ward')
# Orientation our tree
hierarchy.dendrogram(Z, orientation="left", labels=df.index)
plt.show()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章