箱形圖(Box-plot):
又稱為盒須圖、盒式圖或箱線圖,是一種用作顯示一組數據分散情況資料的統計圖。它能顯示出一組數據的最大值、最小值、中位數及上下四分位數
做模型時,經常使用箱型圖查看特征變量有沒有異常值
一、sns.boxplot()
#參數如下: seaborn.boxplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, notch=False, ax=None, **kwargs)
參數說明:
x,y:dataframe中的列名(str)或者矢量數據 data:dataframe或者數組 hue(str):dataframe的列名,按照列名中的值分類形成分類的條形圖 palette:調色板,控制圖像的色調 order, hue_order (lists of strings):用於控制條形圖的順序 orient:"v"|"h" 用於控制圖像使水平還是豎直顯示(這通常是從輸入變量的dtype推斷出來的,此參數一般當不傳入x、y,只傳入data的時候使用) fliersize:float,用於指示離群值觀察的標記大小 whis: 確定離群值的上下界(IQR超過低和高四分位數的比例),此范圍之外的點將被識別為異常值。IQR指的是上下四分位的差值。 width: float,控制箱型圖的寬度
使用iris數據集作為例子
x參數(箱型圖橫着放,默認也是橫着放)
%matplotlib inline import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from sklearn.datasets import load_iris plt.rc("font",family="SimHei",size="15") #解決中文亂碼問題 data=pd.DataFrame(load_iris().data,columns=load_iris().feature_names) data['sample']=load_iris().target data.columns #x參數,下面結果都一致 sns.boxplot(x=data['sepal length (cm)']) sns.boxplot(x=data['sepal length (cm)'],data=data) sns.boxplot(x='sepal length (cm)',data=data) sns.boxplot(data['sepal length (cm)'])
y參數(豎着放)
#y參數,下面結果都一致 sns.boxplot(y=data['sepal length (cm)']) sns.boxplot(y=data['sepal length (cm)'],data=data) sns.boxplot(y='sepal length (cm)',data=data) sns.boxplot(y='sample',data=data)
#直接是data sns.boxplot(data=data)
#x,y同時使用,x的類別最要不要太多,最好是類別型(或者類別少的)為x,數值型(或者類別多的)為y sns.boxplot(x='sepal length (cm)',y='petal length (cm)',data=data) sns.boxplot(x='sepal length (cm)',y='sample',data=data) sns.boxplot(y='sepal length (cm)',x='sample',data=data)
#x,y,hue sns.boxplot(x='sepal length (cm)',y='petal length (cm)',hue='sample',data=data)
#用於控制圖像使水平還是豎直顯示 fig,axes=plt.subplots(2,1) sns.boxplot(data=data,orient="v",palette="Set3",ax=axes[0]) #豎直顯示 sns.boxplot(data=data,orient="h",palette="Set3",ax=axes[1]) #水平顯示
#fliersize:float,用於指示離群值觀察的標記大小 fig,axes=plt.subplots(1,2) sns.boxplot(data=data,ax=axes[0]) #fliersize默認為5 sns.boxplot(data=data,fliersize=20,ax=axes[1])
#whis: 確定離群值的上下界(IQR超過低和高四分位數的比例),此范圍之外的點將被識別為異常值。IQR指的是上下四分位的差值 fig,axes=plt.subplots(1,2) sns.boxplot(data=data,whis=1,ax=axes[0]) #左圖 sns.boxplot(data=data,whis=2,ax=axes[1]) #右圖
#width: float,控制箱型圖的寬度 fig,axes=plt.subplots(1,2) sns.boxplot(data=data,width=0.3,ax=axes[0]) #左圖 sns.boxplot(data=data,width=0.8,ax=axes[1]) #右圖
二、df.plot.box()反正就是df畫圖
#df.boxplot data.boxplot() data.plot.box() data['sample'].boxplot() #這樣不行 data['sepal length (cm)'].plot.box() data.boxplot('sepal length (cm)') data.boxplot(['sepal length (cm)']) data.boxplot(['sepal length (cm)','petal length (cm)'])
還有一種
local.boxplot(column='loan_amt', by='have_localhouse_flag')
這種效果和seaborn 的x,y賦值是一樣的,但是要記住類別少的放在x軸,數值型一般放在y軸
三、plt.boxplot(),看來x只有接收一個特征時才比較適用
plt.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None) x:指定要繪制箱線圖的數據 notch:是否以凹口的形式展現箱線圖,默認非凹口 sym:指定異常點的形狀,默認為+號顯示 vert:是否需要將箱線圖垂直擺放,默認垂直擺放 whis:指定上下須與上下四分位的距離,默認為1.5倍的四分位差 positions:指定箱線圖的位置,默認為[0,1,2…] widths:指定箱線圖的寬度,默認為0.5 patch_artist:bool類型參數,是否填充箱體的顏色;默認為False meanline:bool類型參數,是否用線的形式表示均值,默認為False showmeans:bool類型參數,是否顯示均值,默認為False showcaps:bool類型參數,是否顯示箱線圖頂端和末端的兩條線(即上下須),默認為True showbox:bool類型參數,是否顯示箱線圖的箱體,默認為True showfliers:是否顯示異常值,默認為True boxprops:設置箱體的屬性,如邊框色,填充色等 labels:為箱線圖添加標簽,類似於圖例的作用 filerprops:設置異常值的屬性,如異常點的形狀、大小、填充色等 medianprops:設置中位數的屬性,如線的類型、粗細等 meanprops:設置均值的屬性,如點的大小、顏色等 capprops:設置箱線圖頂端和末端線條的屬性,如顏色、粗細等 whiskerprops:設置須的屬性,如顏色、粗細、線的類型等
#plt.boxplot(), plt.boxplot(x=data) #什么鬼,看不清楚 plt.boxplot(x=data[['sample','petal length (cm)']]) #還是看不清楚 plt.boxplot(x=data['sepal length (cm)'])
全部代碼如下:
# -*- coding: utf-8 -*- """ Created on Tue Jul 21 10:52:00 2020 @author: Admin """ %matplotlib inline import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from sklearn.datasets import load_iris plt.rc("font",family="SimHei",size="15") #解決中文亂碼問題 data=pd.DataFrame(load_iris().data,columns=load_iris().feature_names) data['sample']=load_iris().target data.columns data.info() #x參數,下面結果都一致 sns.boxplot(x=data['sepal length (cm)']) sns.boxplot(x=data['sepal length (cm)'],data=data) sns.boxplot(x='sepal length (cm)',data=data) sns.boxplot(data['sepal length (cm)']) #y參數,下面結果都一致 sns.boxplot(y=data['sepal length (cm)']) sns.boxplot(y=data['sepal length (cm)'],data=data) sns.boxplot(y='sepal length (cm)',data=data) sns.boxplot(y='sample',data=data) #直接是data sns.boxplot(data=data) #x,y同時使用,x的類別最要不要太多,最好是類別型(或者類別少的)為x,數值型(或者類別多的)為y sns.boxplot(x='sepal length (cm)',y='petal length (cm)',data=data) sns.boxplot(x='sepal length (cm)',y='sample',data=data) sns.boxplot(y='sepal length (cm)',x='sample',data=data) sns.boxplot(x='sample',y='sepal length (cm)',data=data) #x,y,hue sns.boxplot(x='sepal length (cm)',y='petal length (cm)',hue='sample',data=data) #用於控制圖像使水平還是豎直顯示 fig,axes=plt.subplots(2,1) sns.boxplot(data=data,orient="v",palette="Set3",ax=axes[0]) #豎直顯示 sns.boxplot(data=data,orient="h",palette="Set3",ax=axes[1]) #水平顯示 #fliersize:float,用於指示離群值觀察的標記大小 fig,axes=plt.subplots(1,2) sns.boxplot(data=data,ax=axes[0]) #fliersize默認為5 sns.boxplot(data=data,fliersize=20,ax=axes[1]) #whis: 確定離群值的上下界(IQR超過低和高四分位數的比例),此范圍之外的點將被識別為異常值。IQR指的是上下四分位的差值 fig,axes=plt.subplots(1,2) sns.boxplot(data=data,whis=1,ax=axes[0]) #左圖 sns.boxplot(data=data,whis=2,ax=axes[1]) #右圖 #width: float,控制箱型圖的寬度 fig,axes=plt.subplots(1,2) sns.boxplot(data=data,width=0.3,ax=axes[0]) #左圖 sns.boxplot(data=data,width=0.8,ax=axes[1]) #右圖 #df.boxplot data.boxplot() data.plot.box() data['sample'].boxplot() #這樣不行 data['sepal length (cm)'].plot.box() data.boxplot('sepal length (cm)') data.boxplot(['sepal length (cm)']) data.boxplot(['sepal length (cm)','petal length (cm)']) #plt.boxplot(), plt.boxplot(x=data) #什么鬼,看不清楚 plt.boxplot(x=data[['sample','petal length (cm)']]) #還是看不清楚 plt.boxplot(x=data['sepal length (cm)'])