数据分析
seaborn 模塊
簡述
對matplotlib 模塊進行了二次封裝, 底層依舊使用還是matplotlib 的, 但是在此基礎上增加了很多的易用性模板, 更加方便使用
引用使用
import seaborn as sns
對比 matplotlib 默認風格
默認風格的方法 - set
主題風格
設置風格 -set_style
可選參數
darkgrid
whitegrid
dark
white
ticks
white 風格
完全的清亮背景色, 無刻線, 無刻度尺
drak 風格
背景色深灰, 無刻線, 無刻度尺
whitegrid 風格
帶有 y軸 數據刻線, 背景清亮
ticks 風格
帶有刻度尺
darkgrid 風格
帶有x, y 刻線, 且背景深灰, 無刻度尺
批量執行風格 - axes_style
在縮進內的都可以套用此風格, 在畫子圖的時候使用此方法設定不同的風格可以更直觀的看出差異,方便觀察
自定義風格修改
默認的主題風格是比較固定的, 可以在此基礎上進行一定的修改滿足自定制
修改邊界線 - despine
去掉上面和右邊的線,
可設置參數offset設置 數值與坐標軸線的距離
可設置參數left 去除左右的邊界線, 其他方位可選是, top ,bottom,right
修改布局 -set_context
可選風格
paper
talk
poster
notebook
大小從小到大, 里面的格子可以看得出來哦
可選參數 font_scale 設定字體大小
可選參數rc 設定線的粗細
調色板
調色板 - 離散型
顏色很重要 - 用于展示數據更直觀的體現, 顏色區分展示是很舒適的
color_palette()能傳入任何Matplotlib所支持的顏色
color_palette() 不寫參數則默認顏色
set_palette() 設置所有圖的顏色
默認色板 - color_palette
6個默認的顏色循環主題: deep, muted, pastel, bright, dark,colorblind
畫板 - hls 空間
當你有六個以上的分類要區分時,最簡單的方法就是在一個圓形的顏色空間中畫出均勻間隔的顏色(這樣的色調會保持亮度和飽和度不變)。
這是大多數的當他們需要使用比當前默認顏色循環中設置的顏色更多時的默認方案。
最常用的方法是使用hls 的顏色空間,這是RGB值的一個簡單轉換。
使用方法具體就是輸入一個數字, 則輸出多少顏色,hls 畫板適合快速的生成多色畫板
畫板 - Paired 空間
Paired 適用于成對出現的色板排列. 用于某些數據對更加直觀方便
飽和度, 亮度 - hls_palette
hls_palette 函數來控制顏色的亮度和飽和
l - 亮度 lightness
s - 飽和 saturation
指定顏色 - xkcd
指定特定顏色的時候使用xkcd_rgb 函數可實現 , 傳入參數為鍵值形式取值, 可對顏色類型和深淺進行特化
xkcd包含了一套眾包努力的針對隨機RGB色的命名。產生了954個可以隨時通過xdcd_rgb字典中調用的命名顏色。
調色板 - 連續型
連續型色板用于相同色系的深淺度進行漸變處理
默認是由淺到深的漸變, 翻轉則在選取顏色后加_r 進行翻轉
畫板 -cubehelix_palette
色調線性變換 ,可以使用color_palette 傳參"cubehelix" 或者直接使用cubehelix_palette 函數
推薦后者, 后者可以傳遞更多的參數以及自動提示更方便
顏色區間 - start,rot
cubehelix_palette 函數的可選參數start,rot 控制顏色區間
指定深淺 -light_palette,dark_palette
簡單示例
變量分析
單變量分析
數據范式,基礎準備
直方圖 - distplot
也可以指定bins 的大小, 更細化的展示數據
加入fit 展示統計指標
分布散點圖 -stripplot
stripplot 函數創建散點圖展示單變量數據量
但是數據過大出現的重疊會導致堆積造成連線成面等現象無法正確觀察
重疊處理 - 偏移 jitter
設置jitter 可以使數據偏移左右位置散開展示, 但是看起來還是不太直觀
分簇散點圖- swarmplot
swarmplot 創建的散點圖則徹底將數據散開呈現圣誕樹結構, 更加清晰的展示
盒型圖 -boxplot
盒型圖概念
IQR即統計學概念四分位距,第1/4分位 與 第3/4之間的距離
N = 1.5IQR 如果一個值>Q3+N或 < Q1-N,則為離群點
小提琴圖 -violinplot
多變量體現的時候小提琴圖默認是區分的, 如上圖的吃晚餐和吃午餐的在周一到周五之間的關系上就是分為兩色分別展示
如果想更直觀的展示一天中 午餐顧客數量和晚餐顧客數量的對比. 則可以加入split參數, 如下圖的 每天吃飯男女的關系
組合圖
圖之間是可以組合的. 比如如下的小提琴圖和分簇散點圖的組合, 小提琴設置inner=None 表示去除中間的顯示
alpha 則設置透明度
條形圖 -barplot
下圖展示的是泰坦尼克號中不同性別. 不同船艙等級情況下的獲救幾率
多變量分析
數據范式準備
根據均值和協方差生成數據
綜合散點圖 - jointplot
觀測兩個變量之間的分布關系最好用散點圖 ,利用jointplot 建立散點圖且自動創建配合直方圖
重疊處理 - 蜂巢圖
散點圖在大量數據的時候點會堆疊導致無法觀察, 因此可使用 hex 圖這樣對重復數據點會有深淺變化
在jointplot 中指定可選參數kind 為 hex 即可
讀取數據集 -load_dataset
讀取數據集load_dataset 函數,示例使用內置的鳶尾花數據集, (有4個特征的數據集)
矩陣散點圖 - pairplot
在使用pairplot 函數讀取即可所有特質之間的 兩兩對應關系
因此不再需要手動執行循環建立子圖較為繁瑣的方式去處理
由下圖可見, 4個特征的兩兩對應關系, 對角線表示是相同特征的對比, 因此單特征展現為直方圖, 其他為散點圖
回歸分析
數據范式準備
內置的 tips 數據樣本, 顧客的一系列特征與愿意出多少小費的關聯
回歸圖 - regplot
regplot() 和lmplot() 都可以繪制回歸關系,推薦regplot()
傳入參數必選x,y,data,分別表示 x 軸, y 軸, 以及樣本數據
繪制出的圖形可以大體戰術出 全部小費金額和小費之間的線性關系以及數據分布的散點展示
加入數據抖動 -x_jitter
一些不太適合做線性回歸的數據可以加入抖動進行更好的適配
擬合以及其他操作參考 這里
回歸圖 -mplot
mplot 繪制的圖和regplot 大體差不多, 但是可供支持的參數更多, 可以實現更多復雜的指標操作
FacetGrid 使用
基本工作流程是FacetGrid使用數據集和用于構造網格的變量初始化對象。然后,可以通過調用FacetGrid.map()或將一個或多個繪圖函數應用于每個子集 FacetGrid.map_dataframe() 最后,可以使用其他方法調整繪圖,以執行更改軸標簽,使用不同刻度或添加圖例等操作
內部屬性
classseaborn.FacetGrid(
data,row=None,col=None,hue=None,col_wrap=None,sharex=True,
sharey=True,height=3,aspect=1,palette=None,row_order=None,
col_order=None,hue_order=None,hue_kws=None,dropna=True,
legend_out=True,despine=True,margin_titles=False,
xlim=None,ylim=None,subplot_kws=None,gridspec_kws=None,size=None)
data: DataFrame
處理后的(“長格式”)dataframe數據,其中每一列都是一個變量(特征),每一行都是一個樣本
row, col, hue: strings
定義數據子集的變量,這些變量將在網格的不同方面繪制。請參閱下面 *_order 參數以控制該變量的級別順序
例如:col="sex", hue="smoker",即列表示性別,顏色語意表示是否吸煙,下面示例會給出詳細說明
col_wrap: int, optional
這個意思是圖網格列維度限制,比如 col_wrap =3,那么在這個畫布里最多只能畫3列。行不限制,這樣就限制了列的個數。
share{x,y}: bool, ‘col’, or ‘row’ optional
是否共享x軸或者y軸,就是說如果為真,就共享同一個軸,否則就不共享,默認是都共享,即都為 True
g = sns.FacetGrid(tips, col="sex", hue="smoker",sharex=True, sharey=True)# 都共享 g.map(plt.scatter, "total_bill", "tip", alpha=0.8) g.add_legend();g = sns.FacetGrid(tips, col="sex", hue="smoker",sharex=True, sharey=False)# 關閉共享y軸, 關閉后會每個表獨立畫一個 y 軸 g.map(plt.scatter, "total_bill", "tip", alpha=0.8) g.add_legend();
height: scalar, optional
每個圖片的高度設定,默認為3
aspect: scalar, optional
文檔說是縱橫比,是說每個小圖的橫軸長度和縱軸的比
g = sns.FacetGrid(tips, col="sex", hue="smoker",sharex=True, sharey=True, aspect=1) # 默認為1,即等高等寬 g.map(plt.scatter, "total_bill", "tip", alpha=0.8) g.add_legend();g = sns.FacetGrid(tips, col="sex", hue="smoker",sharex=True, sharey=True, aspect=0.5) # 改為0.5 g.map(plt.scatter, "total_bill", "tip", alpha=0.8) g.add_legend();
palette: palette name, list, or dict, optional
這個簡單,一般在使用hue時來改變顏色的,有這幾種系統給的可選deep, muted, bright, pastel, dark, colorblind
舉個例子還是上圖的啊,不給代碼了,直接上圖了,此時我給的是palette='colorblind'
{row,col,hue}_order: lists, optional
對所給命令的級別進行排序。默認情況下,這將是數據中顯示的級別,如果變量是 pandas 分類,則是類別順序。
g = sns.FacetGrid(tips, col="sex", hue="smoker",sharex=True, sharey=True,col_order=['老大', '老二', '老三', '老四']) g.map(plt.scatter, "total_bill", "tip", alpha=0.8) g.add_legend();調換一下位置看看:
就不全上傳代碼了,關鍵代碼給出:
col_order=['老大', '老二', '老三', '老四']到這里大家就可以看出來了,這個命令是可以讓我們設置畫圖的順序的
hue_kws: dictionary of param -> list of values mapping
其他關鍵字參數插入到繪圖調用中,讓其他繪圖屬性在色相變量的級別上有所不同(例如散點圖中的標記)
>>> pal = dict(Lunch="seagreen", Dinner="gray") # 先定義一個字典,把顏色確定 >>> g = sns.FacetGrid(tips, col="sex", hue="time", palette=pal,# 然后傳遞給palette ... hue_order=["Dinner", "Lunch"])#hue_order這個官方解釋的好,優先Dinner >>> g = (g.map(plt.scatter, "total_bill", "tip", **kws) ... .add_legend())>>> g = sns.FacetGrid(tips, col="sex", hue="time", palette=pal,hue_order=["Dinner", "Lunch"], hue_kws=dict(marker=["^", "v"])) # 給顏色語意使用不同的標簽,這樣可以進行一部分區別 >>> g = (g.map(plt.scatter, "total_bill", "tip", **kws).add_legend())總結來說,hue_kwss就是增加能快速辨識的方法,在變量很多時很有用,我把hue_order=["Dinner", "Lunch"]換一下位置看看,確實是有順序的
legend_out: bool, optional
默認為True,legend是圖例的意思,如果True,圖形尺寸將被擴展,并且圖例將被繪制在中心右側的圖形之外,上面的圖都是這樣的,為假時,圖例單獨放出來,下面是為假的情況,看下下面的圖例和上面的區別
despine: boolean, optional
從圖中移除頂部和右側脊柱,就是邊緣框架
margin_titles: bool, optional
如果是真的,那么行變量的標題就會被繪制到最后一列的右邊。這個選項是實驗性的,在所有情況下都可能不起作用。
直接看圖吧:
g = sns.FacetGrid(tips, row="smoker", col="time", margin_titles=False) # margin_titles為假的時候 g.map(sns.regplot, "size", "total_bill", color="red", fit_reg=False, x_jitter=.2);再給出margin_titles=True的圖,代碼和上面一樣,可以看出來了,行變量的標題就會被繪制到最后一列的右邊
{x, y}lim: tuples, optional
每個方面的每個軸的限制(只有當共享x時才相關,y是正確的
subplot_kws: dict, optional
傳遞給matplotlib的subplot(s) 方法的關鍵字參數字典Dictionary of keyword arguments passed to matplotlib subplot(s) methods.這個需要看看subplot函數的參數,后面有時間補上
gridspec_kws: dict, optional
傳遞給matplotlib的gridspec模塊的關鍵字參數的字典(Viaplt.subplots)。matplotlib >= 1.4,如果colwrap不是None,則會被忽略。也許查看相關函數,改天再補上
這個兩個參數是為了和matplotlib傳參是使用的
內部方法
__init__(data [,row,col,hue,col_wrap,...]) |
初始化matplotlib圖和FacetGrid對象。 |
add_legend([legend_data,title,label_order]) |
繪制一個圖例,可能將其放在軸外并調整圖形大小。 |
despine(** kwargs) |
從小平面上移除軸刺。 |
facet_axis(row_i,col_j) |
使這些索引識別的軸處于活動狀態并返回。 |
facet_data() |
生成器用于每個方面的名稱索引和數據子集。 |
map(func,* args,** kwargs) |
將繪圖功能應用于每個方面的數據子集。 |
map_dataframe(func,* args,** kwargs) |
喜歡.map但是將args作為字符串傳遞并在kwargs中插入數據。 |
savefig(* args,** kwargs) |
保存圖。 |
set(** kwargs) |
在每個子圖集Axes上設置屬性。 |
set_axis_labels([x_var,y_var]) |
在網格的左列和底行設置軸標簽。 |
set_titles([template,row_template,...]) |
在每個構面上方或網格邊距上繪制標題。 |
set_xlabels([label]) |
在網格的底行標記x軸。 |
set_xticklabels([labels,step]) |
在網格的底行設置x軸刻度標簽。 |
set_ylabels([label]) |
在網格的左列標記y軸。 |
set_yticklabels([labels]) |
在網格的左列上設置y軸刻度標簽。 |
示例
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="darkgrid")
tips = sns.load_dataset("tips")
tips.head()
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
tips['day'].unique()
# 從數據中可以看出sex、smoker、time均為兩個狀態值
[Sun, Sat, Thur, Fri]
Categories (4, object): [Sun, Sat, Thur, Fri]
g = sns.FacetGrid(tips, col="time")
# 像這樣初始化網格會設置matplotlib圖形和軸,但不會在它們上繪制任何內容。
# 在該網格上可視化數據的主要方法是使用該FacetGrid.map()方法。 # 為其提供繪圖功能以及要繪制的數據框中的變量名稱。讓我們使用直方圖來 # 查看每個子集中tip的分布。 g = sns.FacetGrid(tips, col="time") g.map(plt.hist, "tip");
g = sns.FacetGrid(tips, col="sex", hue="smoker",col_wrap=2) g.map(plt.scatter, "total_bill", "tip", alpha=0.8) g.add_legend(); # 此功能將繪制圖形并注釋軸,希望一步生成完成的繪圖。要創建關系圖, # 只需傳遞多個變量名稱。您還可以提供關鍵字參數,這些參數將傳遞給 # 繪圖函數,看看col_wrap的功能
g = sns.FacetGrid(tips, col="sex", hue="smoker",col_wrap=1) g.map(plt.scatter, "total_bill", "tip", alpha=0.8) g.add_legend(); # 此時col_wrap=1 ,說明col_wrap是限制網格中圖的列的個數的
# 可以單獨傳遞類構造函數改變網格外觀
g = sns.FacetGrid(tips, row="smoker", col="time",
margin_titles=True)
g.map(sns.regplot, "size", "total_bill", color="red",
fit_reg=False, x_jitter=.2);
# margin_titles=True的作用是把標題寫到側面,
# fit_reg=False關閉回歸,我們下面看看關閉效果
g = sns.FacetGrid(tips, row="smoker", col="time",
margin_titles=False)
g.map(sns.regplot, "size", "total_bill", color="red",
fit_reg=True, x_jitter=.2);
# 關閉margin_titles=False,打開fit_reg=True
# margin_titles打開的好處是可以讓人很輕松的看明白圖的差別
# margin_titlesmatplotlib API未正式支持,并且在所有情況下都可能 # 無法正常工作。特別是,它目前不能與位于繪圖之外的圖例一起使用。 # 通過 height、aspect提供每個面的高度以及縱橫比來設置圖形的大小 g = sns.FacetGrid(tips, col="day", height=4, aspect=.5) g.map(sns.barplot, "sex", "total_bill");
# facet的默認排序源自DataFrame中的信息。如果用于定義構面的變量具有
# 分類類型,則使用類別的順序。否則,facet將按照類別級別的出現順序排列。
# 但是,可以使用適當的*_order參數指定任何構面尺寸的順序
ordered_days = tips.day.value_counts().index
g = sns.FacetGrid(tips, row="day", row_order=ordered_days,
height=1.7, aspect=4,)
g.map(sns.distplot, "total_bill", hist=False, rug=True);
繪制成對數據關系
PairGrid還允許您使用相同的繪圖類型快速繪制小子圖的網格,以可視化每個
子圖中的數據。在一個PairGrid中,每個行和列都分配給不同的變量,因此結果
圖顯示數據集中的每個成對關系。這種情節有時被稱為“散點圖矩陣”,因為這是
顯示每種關系的最常用方式,但PairGrid不限于散點圖。
理解a FacetGrid和a 之間的差異很重要PairGrid。在前者中,
每個方面都表現出以不同級別的其他變量為條件的相同關系。在后者中,
每個圖顯示不同的關系(盡管上三角和下三角將具有鏡像圖)。使用
PairGrid可以為您提供數據集中有趣關系的非常快速,非常高級的摘要。
該類的基本用法非常相似FacetGrid。首先初始化網格,然后將繪圖函數
傳遞給map方法,并在每個子圖上調用它。還有一個伴侶功能,pairplot()
它可以為更快的繪圖提供一些靈活性
iris = sns.load_dataset("iris")
# 該數據大家應該很熟悉了,就不看數據了
g = sns.PairGrid(iris)
g.map(plt.scatter);
# 可以在對角線上繪制不同的函數,以顯示每列中變量的單變量分布。 # 但請注意,軸刻度不會與該圖的計數軸或密度軸對應。 g = sns.PairGrid(iris) g.map_diag(plt.hist) g.map_offdiag(plt.scatter);
# 使用此圖的一種非常常見的方法是通過單獨的分類變量對觀察結果進行著色。 # 例如,iris數據集對三種不同種類的鳶尾花中的每一種都有四種測量值, # 因此您可以看到它們之間的差異。 g = sns.PairGrid(iris, hue="species") g.map_diag(plt.hist) g.map_offdiag(plt.scatter) g.add_legend();
# 也可以在上三角和下三角中使用不同的函數來強調關系的不同方面。 g = sns.PairGrid(iris) g.map_upper(plt.scatter) g.map_lower(sns.kdeplot,color='red') g.map_diag(sns.kdeplot, lw=2, legend=False);
# PairGrid很靈活,但要快速查看數據集,使用pairplot()可以更容易。 # 此功能默認使用散點圖和直方圖,但會添加一些其他類型 # (目前,您還可以繪制對角線上的回歸圖和對角線上的KDE)。 sns.pairplot(iris, hue="species", height=2.5);
heatmap - 熱度圖
圖形變化用顏色趨勢表現出來的形式 - 熱度圖
指定取值區間 - vim/vmax
未指定的時候自動會根據數據集中的最大最小值作為兩極
指定中心數據 - center
指定一個中心數據, 其上或者其下顏色差異都很大,
航班示例
利用函數pivot 對數據集進行預處理, 然后轉換為熱量圖
顯示數字 - annot, fmt
設置annot=True 表示顯示數字,設置fmt="d" 指定格式, 這里指定 "d" 是比較好的選擇, 默認不指定則會顯示亂碼較為難以觀察 (默認科學計數法)
指定色格間距 -linewidths
默認的色格之間都是都沒有間距的, 指定此屬性后可設置間距, 加間距看著更舒服點
指定調色板 - cmap
調色板的選擇也可以指定
隱藏色盤指標 - cbar
設置cbar=False 則可以隱藏, 但是不方便觀察, 不知道指標區間了, 酌情使用
總結
- 上一篇: 海盗中间件:美团服务体验平台对接业务数据
- 下一篇: 信用卡转账到银行卡怎么转?有手续费怎么算