如果你想要用 Python 進(jìn)行數(shù)據(jù)分析,就需要在項(xiàng)目初期開(kāi)始進(jìn)行探索性的數(shù)據(jù)分析,這樣方便你對(duì)數(shù)據(jù)有一定的了解。其中最直觀(guān)的就是采用數(shù)據(jù)可視化技術(shù),這樣,數(shù)據(jù)不僅一目了然,而且更容易被解讀。
同樣,按照變量的個(gè)數(shù)可以把可視化視圖劃分為單變量分析和多變量分析。單變量分析指的是一次只關(guān)注一個(gè)變量。多變量分析可以讓你在一張圖上可以查看兩個(gè)以上變量的關(guān)系,從而分析出來(lái)這兩個(gè)變量之間是否存在某種聯(lián)系??梢暬囊晥D可以說(shuō)是分門(mén)別類(lèi),多種多樣,
常用的 10 種視圖,這些視圖包括:
散點(diǎn)圖、折線(xiàn)圖、直方圖、條形圖、箱線(xiàn)圖、餅圖、熱力圖、蜘蛛圖、二元變量分布和成對(duì)關(guān)系。
散點(diǎn)圖的英文叫做 scatter plot,它將兩個(gè)變量的值顯示在二維坐標(biāo)中,非常適合展示兩個(gè)變量之間的關(guān)系。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 數(shù)據(jù)準(zhǔn)備
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
# 用Matplotlib畫(huà)散點(diǎn)圖
plt.scatter(x, y,marker='x')
plt.show()
# 用Seaborn畫(huà)散點(diǎn)圖
df = pd.DataFrame({'x': x, 'y': y})
sns.jointplot(x="x", y="y", data=df, kind='scatter');
plt.show()
折線(xiàn)圖折線(xiàn)圖可以用來(lái)表示數(shù)據(jù)隨著時(shí)間變化的趨勢(shì)。
在 Matplotlib 中,我們可以直接使用 plt.plot() 函數(shù),當(dāng)然需要提前把數(shù)據(jù)按照 x 軸的大小進(jìn)行排序,要不畫(huà)出來(lái)的折線(xiàn)圖就無(wú)法按照 x 軸遞增的順序展示。在 Seaborn 中,我們使用 sns.lineplot (x, y, data=None) 函數(shù)。其中 x、y 是 data 中的下標(biāo)。data 就是我們要傳入的數(shù)據(jù),一般是 DataFrame 類(lèi)型。這里我們?cè)O(shè)置了 x、y 的數(shù)組。x 數(shù)組代表時(shí)間(年),y 數(shù)組我們隨便設(shè)置幾個(gè)取值。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 數(shù)據(jù)準(zhǔn)備
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
# 使用Matplotlib畫(huà)折線(xiàn)圖
plt.plot(x, y)
plt.show()
# 使用Seaborn畫(huà)折線(xiàn)圖
df = pd.DataFrame({'x': x, 'y': y})
sns.lineplot(x="x", y="y", data=df)
plt.show()
直方圖是比較常見(jiàn)的視圖,它是把橫坐標(biāo)等分成了一定數(shù)量的小區(qū)間,這個(gè)小區(qū)間也叫作“箱子”,然后在每個(gè)“箱子”內(nèi)用矩形條(bars)展示該箱子的箱子數(shù)(也就是 y 值),這樣就完成了對(duì)數(shù)據(jù)集的直方圖分布的可視化。在 Matplotlib 中,我們使用 plt.hist(x, bins=10) 函數(shù),其中參數(shù) x 是一維數(shù)組,bins 代表直方圖中的箱子數(shù)量,默認(rèn)是 10。在 Seaborn 中,我們使用 sns.distplot(x, bins=10, kde=True) 函數(shù)。其中參數(shù) x 是一維數(shù)組,bins 代表直方圖中的箱子數(shù)量,kde 代表顯示核密度估計(jì),默認(rèn)是 True,我們也可以把 kde 設(shè)置為 False,不進(jìn)行顯示。核密度估計(jì)是通過(guò)核函數(shù)幫我們來(lái)估計(jì)概率密度的方法。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 數(shù)據(jù)準(zhǔn)備
a = np.random.randn(100)
s = pd.Series(a)
# 用Matplotlib畫(huà)直方圖
plt.hist(s)
plt.show()
# 用Seaborn畫(huà)直方圖
sns.distplot(s, kde=False)
plt.show()
# kde=True 會(huì)顯示一條取值的曲線(xiàn)
sns.distplot(s, kde=True)
plt.show()
如果說(shuō)通過(guò)直方圖可以看到變量的數(shù)值分布,那么條形圖可以幫我們查看類(lèi)別的特征。
在條形圖中,長(zhǎng)條形的長(zhǎng)度表示類(lèi)別的頻數(shù),寬度表示類(lèi)別。在 Matplotlib 中,我們使用 plt.bar(x, height) 函數(shù),其中參數(shù) x 代表 x 軸的位置序列,height 是 y 軸的數(shù)值序列,也就是柱子的高度。在 Seaborn 中,我們使用 sns.barplot(x=None, y=None, data=None) 函數(shù)。其中參數(shù) data 為 DataFrame 類(lèi)型,x、y 是 data 中的變量。
import matplotlib.pyplot as plt
import seaborn as sns
# 數(shù)據(jù)準(zhǔn)備
x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5']
y = [5, 4, 8, 12, 7]
# 用Matplotlib畫(huà)條形圖
plt.bar(x, y)
plt.show()
# 用Seaborn畫(huà)條形圖
sns.barplot(x, y)
plt.show()
箱線(xiàn)圖,又稱(chēng)盒式圖,由五個(gè)數(shù)值點(diǎn)組成:最大值 (max)、最小值 (min)、中位數(shù) (median) 和上下四分位數(shù) (Q3, Q1)。它可以幫我們分析出數(shù)據(jù)的差異性、離散程度和異常值等。在 Matplotlib 中,我們使用 plt.boxplot(x, labels=None) 函數(shù),其中參數(shù) x 代表要繪制箱線(xiàn)圖的數(shù)據(jù),labels 是缺省值,可以為箱線(xiàn)圖添加標(biāo)簽。在 Seaborn 中,我們使用 sns.boxplot(x=None, y=None, data=None) 函數(shù)。其中參數(shù) data 為 DataFrame 類(lèi)型,x、y 是 data 中的變量。
# 數(shù)據(jù)準(zhǔn)備
# 生成10*4維度數(shù)據(jù)
data=np.random.normal(size=(10,4))
lables = ['A','B','C','D']
# 用Matplotlib畫(huà)箱線(xiàn)圖
plt.boxplot(data,labels=lables)
plt.show()
# 用Seaborn畫(huà)箱線(xiàn)圖
df = pd.DataFrame(data, columns=lables)
sns.boxplot(data=df)
plt.show()
餅圖是常用的統(tǒng)計(jì)學(xué)模塊,可以顯示每個(gè)部分大小與總和之間的比例。
在 Python 數(shù)據(jù)可視化中,它用的不算多。我們主要采用 Matplotlib 的 pie 函數(shù)實(shí)現(xiàn)它。在 Matplotlib 中,我們使用 plt.pie(x, labels=None) 函數(shù),其中參數(shù) x 代表要繪制餅圖的數(shù)據(jù),labels 是缺省值,可以為餅圖添加標(biāo)簽。這里我設(shè)置了 lables 數(shù)組,分別代表高中、本科、碩士、博士和其他幾種學(xué)歷的分類(lèi)標(biāo)簽。nums 代表這些學(xué)歷對(duì)應(yīng)的人數(shù)。
import matplotlib.pyplot as plt
# 數(shù)據(jù)準(zhǔn)備
nums = [25, 37, 33, 37, 6]
labels = ['High-school','Bachelor','Master','Ph.d', 'Others']
# 用Matplotlib畫(huà)餅圖
plt.pie(x = nums, labels=labels)
plt.show()
熱力圖,英文叫 heat map,是一種矩陣表示方法,其中矩陣中的元素值用顏色來(lái)代表,不同的顏色代表不同大小的值。
熱力圖是一種非常直觀(guān)的多元變量分析方法,通過(guò)顏色就能直觀(guān)地知道某個(gè)位置上數(shù)值的大小。
另外你也可以將這個(gè)位置上的顏色,與數(shù)據(jù)集中的其他位置顏色進(jìn)行比較。我們一般使用 Seaborn 中的 sns.heatmap(data) 函數(shù),其中 data 代表需要繪制的熱力圖數(shù)據(jù)。這里我們使用 Seaborn 中自帶的數(shù)據(jù)集 flights,該數(shù)據(jù)集記錄了 1949 年到 1960 年期間,每個(gè)月的航班乘客的數(shù)量。
(如果報(bào)錯(cuò):URLError: <urlopen error [Errno 61] Connection refused>,請(qǐng)從下面這個(gè)鏈接下載樣例數(shù)據(jù))
https://github.com/mwaskom/seaborn-data
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
# Load the example flights dataset and convert to long-form
flights_long = sns.load_dataset("flights")
# flights_long = pd.read_csv("~/seaborn-data-master/flights.csv")
flights = flights_long.pivot("month", "year", "passengers")
# Draw a heatmap with the numeric values in each cell
f, ax = plt.subplots(figsize=(9, 6))
sns.heatmap(flights, annot=True, fmt="d", linewidths=.5, ax=ax)
蜘蛛圖是一種顯示一對(duì)多關(guān)系的方法。
在蜘蛛圖中,一個(gè)變量相對(duì)于另一個(gè)變量的顯著性是清晰可見(jiàn)的。這里需要使用 Matplotlib 來(lái)進(jìn)行畫(huà)圖,首先設(shè)置兩個(gè)數(shù)組:labels 和 stats。他們分別保存了這些屬性的名稱(chēng)和屬性值。因?yàn)橹┲雸D是一個(gè)圓形,你需要計(jì)算每個(gè)坐標(biāo)的角度,然后對(duì)這些數(shù)值進(jìn)行設(shè)置。當(dāng)畫(huà)完最后一個(gè)點(diǎn)后,需要與第一個(gè)點(diǎn)進(jìn)行連線(xiàn)。因?yàn)樾枰?jì)算角度,所以我們要準(zhǔn)備 angles 數(shù)組;又因?yàn)樾枰O(shè)定統(tǒng)計(jì)結(jié)果的數(shù)值,所以我們要設(shè)定 stats 數(shù)組。并且需要在原有 angles 和 stats 數(shù)組上增加一位,也就是添加數(shù)組的第一個(gè)元素。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.font_manager import FontProperties
# 數(shù)據(jù)準(zhǔn)備
labels=np.array([u"A","B",u"C",u"D",u"E",u"F"])
stats=[83, 61, 95, 67, 76, 88]
# 畫(huà)圖數(shù)據(jù)準(zhǔn)備,角度、狀態(tài)值
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False)
stats=np.concatenate((stats,[stats[0]]))
angles=np.concatenate((angles,[angles[0]]))
# 用Matplotlib畫(huà)蜘蛛圖
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, stats, 'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)
# 設(shè)置中文字體
# font = FontProperties(fname=r"C:\Windows\Fonts\simhei.ttf", size=14)
# ax.set_thetagrids(angles * 180/np.pi, labels, FontProperties=font)
ax.set_thetagrids(angles * 180/np.pi, labels)
plt.show()
代碼中 flt.figure 是創(chuàng)建一個(gè)空白的 figure 對(duì)象,這樣做的目的相當(dāng)于畫(huà)畫(huà)前先準(zhǔn)備一個(gè)空白的畫(huà)板。然后 add_subplot(111) 可以把畫(huà)板劃分成 1 行 1 列。再用 ax.plot 和 ax.fill 進(jìn)行連線(xiàn)以及給圖形上色。最后我們?cè)谙鄳?yīng)的位置上顯示出屬性名。這里需要用到中文,Matplotlib 對(duì)中文的顯示不是很友好,因此我設(shè)置了中文的字體 font,這個(gè)需要在調(diào)用前進(jìn)行定義。最后我們可以得到下面的蜘蛛圖,看起來(lái)是不是很酷?
如果我們想要看兩個(gè)變量之間的關(guān)系,就需要用到二元變量分布。當(dāng)然二元變量分布有多種呈現(xiàn)方式,開(kāi)頭給你介紹的散點(diǎn)圖就是一種二元變量分布。
在 Seaborn 里,使用二元變量分布是非常方便的,直接使用 sns.jointplot(x, y, data=None, kind) 函數(shù)即可。其中用 kind 表示不同的視圖類(lèi)型:“kind='scatter’”代表散點(diǎn)圖,“kind='kde’”代表核密度圖,“kind='hex’ ”代表 Hexbin 圖,它代表的是直方圖的二維模擬。這里我們使用 Seaborn 中自帶的數(shù)據(jù)集 tips,這個(gè)數(shù)據(jù)集記錄了不同顧客在餐廳的消費(fèi)賬單及小費(fèi)情況。代碼中 total_bill 保存了客戶(hù)的賬單金額,tip 是該客戶(hù)給出的小費(fèi)金額。我們可以用 Seaborn 中的 jointplot 來(lái)探索這兩個(gè)變量之間的關(guān)系。
import matplotlib.pyplot as plt
import seaborn as sns
# 數(shù)據(jù)準(zhǔn)備
# tips = sns.load_dataset("tips")
tips = pd.read_csv("~/seaborn-data-master/tips.csv")
print(tips.head(10))
# 用Seaborn畫(huà)二元變量分布圖(散點(diǎn)圖,核密度圖,Hexbin圖)
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex')
plt.show()
如果想要探索數(shù)據(jù)集中的多個(gè)成對(duì)雙變量的分布,可以直接采用 sns.pairplot() 函數(shù)。它會(huì)同時(shí)展示出 DataFrame 中每對(duì)變量的關(guān)系,另外在對(duì)角線(xiàn)上,你能看到每個(gè)變量自身作為單變量的分布情況。
它可以說(shuō)是探索性分析中的常用函數(shù),可以很快幫我們理解變量對(duì)之間的關(guān)系。
pairplot 函數(shù)的使用,就像在 DataFrame 中使用 describe() 函數(shù)一樣方便,是數(shù)據(jù)探索中的常用函數(shù)。這里我們使用 Seaborn 中自帶的 iris 數(shù)據(jù)集,這個(gè)數(shù)據(jù)集也叫鳶尾花數(shù)據(jù)集。鳶尾花可以分成 Setosa、Versicolour 和 Virginica 三個(gè)品種,在這個(gè)數(shù)據(jù)集中,針對(duì)每一個(gè)品種,都有 50 個(gè)數(shù)據(jù),每個(gè)數(shù)據(jù)中包括了 4 個(gè)屬性,分別是花萼長(zhǎng)度、花萼寬度、花瓣長(zhǎng)度和花瓣寬度。通過(guò)這些數(shù)據(jù),需要你來(lái)預(yù)測(cè)鳶尾花卉屬于三個(gè)品種中的哪一種。
import matplotlib.pyplot as plt
import seaborn as sns
# 數(shù)據(jù)準(zhǔn)備
# iris = sns.load_dataset('iris')
iris = pd.read_csv("~/seaborn-data-master/iris.csv")
# 用Seaborn畫(huà)成對(duì)關(guān)系
sns.pairplot(iris)
plt.show()
Seaborn 是基于 Matplotlib 更加高級(jí)的可視化庫(kù)。 常用的這10 種可視化視圖,可以按照變量之間的關(guān)系對(duì)它們進(jìn)行分類(lèi),這些關(guān)系分別是比較、聯(lián)系、構(gòu)成和分布。當(dāng)然我們也可以按照隨機(jī)變量的個(gè)數(shù)來(lái)進(jìn)行劃分,比如單變量分析和多變量分析。在數(shù)據(jù)探索中,成對(duì)關(guān)系 pairplot() 的使用,相好比 Pandas 中的 describe() 使用一樣方便,常用于項(xiàng)目初期的數(shù)據(jù)可視化探索。在 Matplotlib 和 Seaborn 的函數(shù)中,我只列了最基礎(chǔ)的使用,也方便你快速上手。當(dāng)然如果你也可以設(shè)置修改顏色、寬度等視圖屬性。你可以自己查看相關(guān)的函數(shù)幫助文檔。這些留給你來(lái)進(jìn)行探索。
聯(lián)系客服