Python的數據分析可視化十種技能總結

常見的可視化試圖列舉

可視化視圖可以分成4大類:比較、聯繫、構成和分佈。他們的特點如下:

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

同樣,按照變量的個數,可以把可視化視圖劃分成爲單變量分析和多變量分析:

  • 1、單變量分析指的是一次只關注一個變量。比如只關注“身高”這個變量,來看身高的取值分佈,而暫時忽略其他的變量。
  • 2、多變量分析可以讓我們在一張圖上查看兩個以上的變量的關係。比如身高和年齡。可以理解爲是同一個人的兩個參數,這樣在同一張圖中可以看到每個人的身高和年齡的取值,從而可以分析出這兩個變量之間是否存在某種聯繫。

可視化的試圖分門別類,主要有下面的10種比較常用:1、散點圖、2、折線圖、3、直方圖、4、條形圖、5、箱型圖、6、餅圖、7、熱力圖、8蜘蛛圖、9、二元變量分佈、10、二元變量分佈以及成對關係。
視圖種類

1、散點圖:

舉個最簡單例子,一個點的可視化就是:

import matplotlib.pyplot as plt

plt.scatter(1, 2, marker="o") # mark的值可以設置爲"x",">","o"
plt.show()

在這裏插入圖片描述
上面使用的是Matplotlib庫,下面也可以使用基於Matplotlib的seaborn這個更高級的庫,實現代碼:

import seaborn as sns
 # data就是我們需要傳入的數據,數據是DataFrame類型,scatter 代表散點的意思,kind可以取其他的值,代表不同的繪製方式
sns.jointplot(x,y,data=None,kind='scatter')

假設我們有很多數據,需要將這些數據畫成散點圖真麼做?可以使用隨機數來進行模擬:

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',marker='v');
plt.show()

效果圖如下所示,先顯示Matplotlib畫出的圖,然後顯示使用Seaborn畫出的圖:

在這裏插入圖片描述

在這裏插入圖片描述
可以看到seaborn工具還幫我們做了密度統計,比純粹的Matplotlib統計的數據更加豐富。

2、折線圖

在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()

在這裏插入圖片描述
在這裏插入圖片描述
從上面的兩個圖像的形狀可以知道,兩個圖是完全一樣的,沒有其他過多的內容,只是在seaborn中標記了x和y。

3、直方圖

直方圖是比較常見的試圖,它是把橫座標等分成一定數量的小區間,這個小區間也在加“箱子”,然後在每一個“箱子”內部使用矩形條(bars)展示該箱子的箱子數(也就是y值),這樣就完成了對數據集的直方圖分佈的可視化。

在Matplotlib中,我們使用plt.hist(x,bin=10)函數,其中參數x是一維數組,bins代表直方圖中箱子的數量,默認是10。

在Seaborn中,我們使用sns.distplot(x, bins=10,kde=True)函數。其中參數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,bins=15) # 默認的bins是10
plt.show()
# 使用Seaborn 畫直方圖
sns.distplot(s, kde=False)
plt.show()
# 進行核密度估計
sns.distplot(s,kde=True)
plt.show()

運行結果如下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
第三個圖中,當設置kde爲True之後,顯示出核密度曲線圖。

4、條形圖

如果說通過直方圖可以看到變量的數值分佈,那麼條形圖可以幫助我們查看類別的特徵。在條形圖中,長條形的長度表示類別的頻度,寬度表示類別

在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()

運行的效果圖如下所示:
在這裏插入圖片描述
在這裏插入圖片描述
區別其實不算大,就是有沒有顏色的區別。

5、箱線圖
箱線圖,又稱爲盒式圖,由五個數值組成:最大值(max)、最小值(min)、中位數(median)和上下四分位數(Q3,Q1)。它可以幫我們分析出數據的差異性、離散程度和異常值等。

在Matplotlib中。使用plt.boxplot(x,lablels=None)函數,其中參數x代表繪製箱線圖的數據,labels是缺失值,可以爲箱線圖添加標籤。

在Seaborn中。使用sns.boxplot(x=None,y=None,data=None)函數。其中參數data爲DataFrame類型,x,y是data中的變量。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt #不導入.pyplot也沒事
import seaborn as sns

# 數據準備
# 生成 0-1 之間的 10 * 4 維度的數據
data = np.random.normal(size=(10,4)) # 3列對應3個標籤
print(data)
labels = ['A','B','C','D']
# 使用Matplotlib畫出箱線圖
plt.boxplot(data, labels = labels) #數據按照列顯示
plt.show()
# 使用Seaborn 畫出箱線圖
df = pd.DataFrame(data, columns = labels)
sns.boxplot(data=df)
plt.show()

運行的結果如下:

[[ 0.3254286   1.07300549  0.01592661  0.11135052]
 [ 0.00691687  0.91592263 -0.9133012  -0.16704924]
 [-0.14681058 -1.33135914 -0.48755575 -0.99630723]
 [ 0.00643802 -0.64605021 -0.1261428  -0.27082019]
 [ 0.35080959  1.87987406  1.57485532  0.75964526]
 [-1.1094676   0.10937961  0.72612711 -0.23571834]
 [-1.25257039  0.29394106  0.19746625 -0.32605526]
 [ 1.56447536  0.10158119  0.57406157 -0.89720202]
 [ 1.60596428 -0.91531169  0.89972146 -0.97846049]
 [-2.09628817  1.44807861  0.33475465  1.13538435]]

在這裏插入圖片描述
在上面的代碼中,生成-2 到 2之間的10*4維度的數據,,然後分別使用Matplotlib和Seaborn進行箱線圖的繪製。

6、餅圖

餅圖是常用的統計學模塊,可以顯示每個部分大小與總和之間的比例。在Python的數據可視化中,其實用的並不算多,主要是使用Matplotlib的pie函數來實現它。

在Matplotlib中,使用plt.pie(x,labels-None)函數,其中參數x代表要繪製餅圖的數據,labels是缺省值,可以爲餅圖添加標籤。

這裏設置了數組labels,分別代表高中、本科、碩士、博士和其他的幾種學歷的分類標籤。nums代表這些學歷對應的人數。

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

運行的結果如下所示,呈現扁狀的原因是在Python2中的版本的問題在Python3中就不會有這樣的情況:
在這裏插入圖片描述

7、熱力圖

熱力圖,英文名稱爲heat map,是一種矩陣的表示方法,其中矩陣中的元素值用顏色來代表,不同的顏色代表不同大小的值。通過顏色就能直觀的知道某個位置上的值的大小。另外你也可以將這個位置上的顏色與數據集中的其他位置的顏色進行比較

熱力圖是一種非常直觀的多元變量分析方法。

一般使用Seaborn的sns.heatmap(data)函數,其中data代表需要繪製的熱力圖數據

這裏使用Seaborn中自帶的數據集flights,該數據記錄了1949年到1960年間,每個月的航班乘客的數量。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from pandas import Series, DataFrame

%matplotlib inline
# 數據準備
# flights = sns.load_dataset("flights") 
flights = DataFrame(pd.read_csv("./seaborn_dataset/flights.csv"))
data=flights.pivot('year','month','passengers')
# 用 Seaborn 畫熱力圖
sns.heatmap(data)
plt.show()

在這裏插入圖片描述
通過上面的圖seaborn的heatmap函數,可以看到不同的年份,不同的月份的乘客數量的變化情況,其中顏色淺越淺的代表乘客的數量越多。

8、蜘蛛圖

蜘蛛圖顯示的是一種一對多關係的方法。在蜘蛛圖中,一個變量相對於另一個變量的顯著性是清晰可見的。

假設我們需要給王者榮耀的玩家做一個戰力圖,指標一共包括推進、KDA、生存、團戰、發育和輸出的方法應該如何。

我們需要使用Matplotlib來進行畫圖,首先設置兩個數組:labels和stats。他們分別保存這些屬性的名稱和屬性值。

因爲蜘蛛圖是一個圓形,需要計算每個座標的角度,然後對這些數值進行設置,所以要設定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"推進","KDA",u"生存",u"團戰",u"發育",u"輸出"])
stats = [83,61,95,67,76,88]
# 畫圖數據準備,角度、狀態值
angles = np.linspace(0, 2*np.pi, len(labels), endpoint=False) # 2代表的是平面顯示
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=1)
ax.fill(angles, stats, alpha=0.25)
# 設置中文字體,因爲在Matplotlib對中文的支持不是很好,也可以修復這個bug
font = FontProperties(fname=r"/usr/share/fonts/truetype/arphic/uming.ttc",size=14)
ax.set_thetagrids(angles * 180/np.pi, labels, FontProperties=font)
plt.show()

在這裏插入圖片描述
代碼中flt.figure是創建一個空白的figure對象,這樣做的目的是相當於在畫畫前先準備一個空白的畫板。然後add_subplot(111)可以把畫板劃分成爲1行1列。再使用ax.plot和ax.fill進行連線以及給圖形上色。最後我們在相應的位置上顯示出屬性名。這裏需要用到中文,Mapplotlib對中文的顯示不是很友好,所以需要設置中文字體font,這個需要在調用前進行定義。使用fc-list :lang=zh命令可以將系統的中文字體列舉出來。

9、二元變量分佈

如果想要查看兩個變量之間的關係,就需要用到二元變量分佈。當然二元變量分佈有多種呈現的方式,例如開頭的散點圖就是二元分佈的一種。

在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
import pandas as pd
from pandas import DataFrame

# 數據準備
# tips = sns.load_dataset("tips")
tips = DataFrame(pd.read_csv("./seaborn_dataset/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()

運行的結果數據和圖像如下所示:

   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4
5       25.29  4.71    Male     No  Sun  Dinner     4
6        8.77  2.00    Male     No  Sun  Dinner     2
7       26.88  3.12    Male     No  Sun  Dinner     4
8       15.04  1.96    Male     No  Sun  Dinner     2
9       14.78  3.23    Male     No  Sun  Dinner     2

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

10、成對關係圖

如果要探索數據集中的多個成對雙變量的分佈,可以直接採用sns.pairplot()函數。它會同時展示出DataFrame中的每對變量的關係,另外在對角線上,你能看到每個變量自身作爲單變量的分佈情況。它可以說是探索性分析中的常用函數,可以很快幫助我們理解變量之間的關係。

pairplot函數的使用,就像是在DataFrame中使用的describe()函數一樣方便,是數據探索中的常用函數。

這裏使用Seaborn的自帶的鳶尾花iris數據集,這個數據集將鳶尾花分成Setosa、Versicolour和Virginica三個品種,在這個數據集中,針對每一個品種,都有50條數據,每個數據包括4個屬性,分別是花萼長度,花萼寬度、花瓣長度和花瓣寬度。這樣通過這些數據,就可以來預測鳶尾花卉屬於哪一個品種。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from pandas import DataFrame
# 數據準備
# iris = sns.load_dataset("iris")
iris = DataFrame(pd.read_csv("./seaborn_dataset/iris.csv"))
# 使用Seaborn來畫出成對關係
sns.pairplot(iris)
plt.show()

運行結果顯示如下:
在這裏插入圖片描述
這裏使用的Seaborn中的pairplot函數來對數據集中的多個雙變量的關係進行探索,從上圖可知,一共有sepal_length、sepal_width、petal_length和petal_width這4個變量,他們分別表示花萼長度、花萼寬度、花瓣長度和花瓣寬度。上圖相當於4個變量兩兩之間的關係。比如矩陣中的第一張圖代表的是花萼長度自身的分佈圖,它的右側的這一張圖代表的是花萼長度和花萼寬度的這兩個變量之間的關係。

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