Python 數據可視化,常用看這一篇就夠了

前言

如果你想要用 Python 進行數據分析,就需要在項目初期開始進行探索性的數據分析,這樣方便你對數據有一定的瞭解。其中最直觀的就是採用數據可視化技術,這樣,數據不僅一目瞭然,而且更容易被解讀。

可視化視圖分爲 4 類,

  • 比較:比較數據間各類別的關係,或者是它們隨着時間的變化趨勢,比如折線圖;
  • 聯繫:查看兩個或兩個以上變量之間的關係,比如散點圖;
  • 構成:每個部分佔整體的百分比,或者是隨着時間的百分比變化,比如餅圖;
  • 分佈:關注單個變量,或者多個變量的分佈情況,比如直方圖。

同樣,按照變量的個數可以把可視化視圖劃分爲單變量分析和多變量分析。單變量分析指的是一次只關注一個變量。多變量分析可以讓你在一張圖上可以查看兩個以上變量的關係,從而分析出來這兩個變量之間是否存在某種聯繫。可視化的視圖可以說是分門別類,多種多樣,
常用的 10 種視圖,這些視圖包括:
散點圖、折線圖、直方圖、條形圖、箱線圖、餅圖、熱力圖、蜘蛛圖、二元變量分佈和成對關係
在這裏插入圖片描述

散點圖

散點圖的英文叫做 scatter plot,它將兩個變量的值顯示在二維座標中,非常適合展示兩個變量之間的關係。

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
# 數據準備
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
# 用Matplotlib畫散點圖
plt.scatter(x, y,marker='x')
plt.show()

在這裏插入圖片描述

# 用Seaborn畫散點圖
df = pd.DataFrame({'x': x, 'y': y})
sns.jointplot(x="x", y="y", data=df, kind='scatter');
plt.show()

在這裏插入圖片描述
在工具包引用後,畫散點圖,需要使用 plt.scatter(x, y, marker=None) 函數。x、y 是座標,marker 代表了標記的符號。比如“x”、“>”或者“o”。選擇不同的 marker,呈現出來的符號樣式也會不同,你可以自己試一下。
在這裏插入圖片描述

折線圖

折線圖折線圖可以用來表示數據隨着時間變化的趨勢
在 Matplotlib 中,我們可以直接使用 plt.plot() 函數,當然需要提前把數據按照 x 軸的大小進行排序,要不畫出來的折線圖就無法按照 x 軸遞增的順序展示。在 Seaborn 中,我們使用 sns.lineplot (x, y, data=None) 函數。其中 x、y 是 data 中的下標。data 就是我們要傳入的數據,一般是 DataFrame 類型。這裏我們設置了 x、y 的數組。x 數組代表時間(年),y 數組我們隨便設置幾個取值。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 數據準備
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
# 使用Matplotlib畫折線圖
plt.plot(x, y)
plt.show()
# 使用Seaborn畫折線圖
df = pd.DataFrame({'x': x, 'y': y})
sns.lineplot(x="x", y="y", data=df)
plt.show()

折線圖

直方圖

直方圖是比較常見的視圖,它是把橫座標等分成了一定數量的小區間,這個小區間也叫作“箱子”,然後在每個“箱子”內用矩形條(bars)展示該箱子的箱子數(也就是 y 值),這樣就完成了對數據集的直方圖分佈的可視化。在 Matplotlib 中,我們使用 plt.hist(x, bins=10) 函數,其中參數 x 是一維數組,bins 代表直方圖中的箱子數量,默認是 10。在 Seaborn 中,我們使用 sns.distplot(x, bins=10, kde=True) 函數。其中參數 x 是一維數組,bins 代表直方圖中的箱子數量,kde 代表顯示核密度估計,默認是 True,我們也可以把 kde 設置爲 False,不進行顯示。核密度估計是通過核函數幫我們來估計概率密度的方法

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 數據準備
a = np.random.randn(100)
s = pd.Series(a) 
# 用Matplotlib畫直方圖
plt.hist(s)
plt.show()
# 用Seaborn畫直方圖
sns.distplot(s, kde=False)
plt.show()
# kde=True 會顯示一條取值的曲線
sns.distplot(s, kde=True)
plt.show()

在這裏插入圖片描述

條形圖

如果說通過直方圖可以看到變量的數值分佈,那麼條形圖可以幫我們查看類別的特徵
在條形圖中,長條形的長度表示類別的頻數,寬度表示類別。在 Matplotlib 中,我們使用 plt.bar(x, height) 函數,其中參數 x 代表 x 軸的位置序列,height 是 y 軸的數值序列,也就是柱子的高度。在 Seaborn 中,我們使用 sns.barplot(x=None, y=None, data=None) 函數。其中參數 data 爲 DataFrame 類型,x、y 是 data 中的變量。

import matplotlib.pyplot as plt
import seaborn as sns
# 數據準備
x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5']
y = [5, 4, 8, 12, 7]
# 用Matplotlib畫條形圖
plt.bar(x, y)
plt.show()
# 用Seaborn畫條形圖
sns.barplot(x, y)
plt.show()

在這裏插入圖片描述

箱線圖

箱線圖,又稱盒式圖,由五個數值點組成:最大值 (max)、最小值 (min)、中位數 (median) 和上下四分位數 (Q3, Q1)。它可以幫我們分析出數據的差異性、離散程度和異常值等。在 Matplotlib 中,我們使用 plt.boxplot(x, labels=None) 函數,其中參數 x 代表要繪製箱線圖的數據,labels 是缺省值,可以爲箱線圖添加標籤。在 Seaborn 中,我們使用 sns.boxplot(x=None, y=None, data=None) 函數。其中參數 data 爲 DataFrame 類型,x、y 是 data 中的變量。


# 數據準備
# 生成10*4維度數據
data=np.random.normal(size=(10,4)) 
lables = ['A','B','C','D']
# 用Matplotlib畫箱線圖
plt.boxplot(data,labels=lables)
plt.show()
# 用Seaborn畫箱線圖
df = pd.DataFrame(data, columns=lables)
sns.boxplot(data=df)
plt.show()

在這裏插入圖片描述

餅圖

餅圖是常用的統計學模塊,可以顯示每個部分大小與總和之間的比例
在 Python 數據可視化中,它用的不算多。我們主要採用 Matplotlib 的 pie 函數實現它。在 Matplotlib 中,我們使用 plt.pie(x, labels=None) 函數,其中參數 x 代表要繪製餅圖的數據,labels 是缺省值,可以爲餅圖添加標籤。這裏我設置了 lables 數組,分別代表高中、本科、碩士、博士和其他幾種學歷的分類標籤。nums 代表這些學歷對應的人數。

import matplotlib.pyplot as plt
# 數據準備
nums = [25, 37, 33, 37, 6]
labels = ['High-school','Bachelor','Master','Ph.d', 'Others']
# 用Matplotlib畫餅圖
plt.pie(x = nums, labels=labels)
plt.show()

在這裏插入圖片描述

熱力圖

熱力圖,英文叫 heat map,是一種矩陣表示方法,其中矩陣中的元素值用顏色來代表,不同的顏色代表不同大小的值。
熱力圖是一種非常直觀的多元變量分析方法,通過顏色就能直觀地知道某個位置上數值的大小。
另外你也可以將這個位置上的顏色,與數據集中的其他位置顏色進行比較。我們一般使用 Seaborn 中的 sns.heatmap(data) 函數,其中 data 代表需要繪製的熱力圖數據。這裏我們使用 Seaborn 中自帶的數據集 flights,該數據集記錄了 1949 年到 1960 年期間,每個月的航班乘客的數量。
(如果報錯:URLError: <urlopen error [Errno 61] Connection refused>,請從下面這個鏈接下載樣例數據)
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)

在這裏插入圖片描述

蜘蛛圖

蜘蛛圖是一種顯示一對多關係的方法。
在蜘蛛圖中,一個變量相對於另一個變量的顯著性是清晰可見的。這裏需要使用 Matplotlib 來進行畫圖,首先設置兩個數組:labels 和 stats。他們分別保存了這些屬性的名稱和屬性值。因爲蜘蛛圖是一個圓形,你需要計算每個座標的角度,然後對這些數值進行設置。當畫完最後一個點後,需要與第一個點進行連線。因爲需要計算角度,所以我們要準備 angles 數組;又因爲需要設定統計結果的數值,所以我們要設定 stats 數組。並且需要在原有 angles 和 stats 數組上增加一位,也就是添加數組的第一個元素。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.font_manager import FontProperties  
# 數據準備
labels=np.array([u"A","B",u"C",u"D",u"E",u"F"])
stats=[83, 61, 95, 67, 76, 88]
# 畫圖數據準備,角度、狀態值
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False)
stats=np.concatenate((stats,[stats[0]]))
angles=np.concatenate((angles,[angles[0]]))
# 用Matplotlib畫蜘蛛圖
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)   
ax.plot(angles, stats, 'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)
# 設置中文字體
# 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 是創建一個空白的 figure 對象,這樣做的目的相當於畫畫前先準備一個空白的畫板。然後 add_subplot(111) 可以把畫板劃分成 1 行 1 列。再用 ax.plot 和 ax.fill 進行連線以及給圖形上色。最後我們在相應的位置上顯示出屬性名。這裏需要用到中文,Matplotlib 對中文的顯示不是很友好,因此我設置了中文的字體 font,這個需要在調用前進行定義。最後我們可以得到下面的蜘蛛圖,看起來是不是很酷?
在這裏插入圖片描述

二元變量分佈

如果我們想要看兩個變量之間的關係,就需要用到二元變量分佈。當然二元變量分佈有多種呈現方式,開頭給你介紹的散點圖就是一種二元變量分佈。
在 Seaborn 裏,使用二元變量分佈是非常方便的,直接使用 sns.jointplot(x, y, data=None, kind) 函數即可。其中用 kind 表示不同的視圖類型:“kind=‘scatter’”代表散點圖,“kind=‘kde’”代表核密度圖,“kind=‘hex’ ”代表 Hexbin 圖,它代表的是直方圖的二維模擬。這裏我們使用 Seaborn 中自帶的數據集 tips,這個數據集記錄了不同顧客在餐廳的消費賬單及小費情況。代碼中 total_bill 保存了客戶的賬單金額,tip 是該客戶給出的小費金額。我們可以用 Seaborn 中的 jointplot 來探索這兩個變量之間的關係。

import matplotlib.pyplot as plt
import seaborn as sns
# 數據準備
# tips = sns.load_dataset("tips")
tips = pd.read_csv("~/seaborn-data-master/tips.csv")
print(tips.head(10))
# 用Seaborn畫二元變量分佈圖(散點圖,核密度圖,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()

在這裏插入圖片描述
散點圖
在這裏插入圖片描述
核密度圖
在這裏插入圖片描述
Hexbin圖
在這裏插入圖片描述

成對關係

如果想要探索數據集中的多個成對雙變量的分佈,可以直接採用 sns.pairplot() 函數。它會同時展示出 DataFrame 中每對變量的關係,另外在對角線上,你能看到每個變量自身作爲單變量的分佈情況。
它可以說是探索性分析中的常用函數,可以很快幫我們理解變量對之間的關係。
pairplot 函數的使用,就像在 DataFrame 中使用 describe() 函數一樣方便,是數據探索中的常用函數。這裏我們使用 Seaborn 中自帶的 iris 數據集,這個數據集也叫鳶尾花數據集。鳶尾花可以分成 Setosa、Versicolour 和 Virginica 三個品種,在這個數據集中,針對每一個品種,都有 50 個數據,每個數據中包括了 4 個屬性,分別是花萼長度、花萼寬度、花瓣長度和花瓣寬度。通過這些數據,需要你來預測鳶尾花卉屬於三個品種中的哪一種。


import matplotlib.pyplot as plt
import seaborn as sns
# 數據準備
# iris = sns.load_dataset('iris')
iris = pd.read_csv("~/seaborn-data-master/iris.csv")
# 用Seaborn畫成對關係
sns.pairplot(iris)
plt.show()

在這裏插入圖片描述

總結

Seaborn 是基於 Matplotlib 更加高級的可視化庫。 常用的這10 種可視化視圖,可以按照變量之間的關係對它們進行分類,這些關係分別是比較、聯繫、構成和分佈。當然我們也可以按照隨機變量的個數來進行劃分,比如單變量分析和多變量分析。在數據探索中,成對關係 pairplot() 的使用,相好比 Pandas 中的 describe() 使用一樣方便,常用於項目初期的數據可視化探索。在 Matplotlib 和 Seaborn 的函數中,我只列了最基礎的使用,也方便你快速上手。當然如果你也可以設置修改顏色、寬度等視圖屬性。你可以自己查看相關的函數幫助文檔。這些留給你來進行探索。

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