數據挖掘算法和實踐(六):seaborn數據可視化探索

seaborn是一個面向對象作圖工具,直譯是海洋生物,tips 是小費數據集(seaborn自帶),本次使用seaborn學習數據分佈的探索,在遇到新的數據集合時候,分析問題不至於無從下手;關於使用seaborn,參考官網 http://seaborn.pydata.org/index.html

import seaborn as sns
import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np

一、數據讀取

# 修改baseUrl的路徑即可完成數據讀取修改
baseUrl="C:\\Users\\71781\\Desktop\\2020\\ML-20200422\\seaborn_sklearn\\"
# tips=sns.load_dataset("tips")
tips=pd.read_csv("tips.csv")

# 如果想增加對特徵屬性的描述(單位或含義),可對數據進行重命名操作
tips.columns=("total_bill_dollar","tips_dollar","sex","smoker","day","time","size")

# 特徵屬性多的時候使用set_option方法可展示最多500個列;
pd.set_option("display.max_columns",500) #讓所有列都能加載出來

# tips['day'].values
# tips['day'].value_counts

# tips['day'].shape
tips.head()
# 針對離散值,查看值域
np.unique(tips['time'])

# 針對整型特徵屬性describe查看常規統計
tips.describe()

一、seaborn可視化

 Seaborn裝載了一些默認主題風格,通過sns.set()方法實現。sns.set()可以設置5種風格的圖表背景:darkgrid, whitegrid, dark, white, ticks,通過參數style設置,默認情況下爲darkgrid風格:

1、分佈圖(連續性變量):distplot()

# 1、分佈圖(連續性變量):distplot()
# 探究單個連續屬性的分佈圖,使用distplot()方法,橫座標是數據,縱座標是概率圖;參照seaborn官網api:
# seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
# 被定義爲靈活的繪製單變量分佈圖l
sns.distplot(tips["total_bill_dollar"])

2、數量統計圖(離散變量):countplot()

# 2、數量統計圖(離散變量):countplot()
# 分佈圖一般是針對連續性的特徵屬性,當特徵屬性是離散的時使用countplot()方法查看特徵屬性值的個數統計量;
# seaborn.countplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, dodge=True, ax=None, **kwargs)

# 由於seaborn默認是圖形豎着排列,不好觀察,所以這裏使用matplotlib和seaborn結合使得兩個圖橫向排列,預先定義畫布然後填充圖形,非常實用!
fig,(axis1,axis2,axis3) = plt.subplots(1,3,figsize=(15,5))
sns.countplot(x='sex', data=tips, ax=axis1)
# countplot() 可以繪製兩個離散值之間的統計關係圖,能夠直觀觀察問題 
sns.countplot(x='sex', hue="time", data=tips, order=['Female','Male'], ax=axis2)
sns.countplot(x='time', hue="sex", data=tips, order=['Dinner','Lunch'], ax=axis3)
# 圖2和圖3描述了一個問題,女性偏愛吃午餐,男性偏愛吃晚餐;

# countplot() 中x和y只能指定一個,指定x軸則y軸展示數量,指定y軸則x軸展示數量
fig,(axis1,axis2,axis3) = plt.subplots(1,3,figsize=(15,5))
sns.countplot(y='sex', data=tips, ax=axis1)
sns.countplot(y='sex', hue="time", data=tips, order=['Female','Male'], ax=axis2)
sns.countplot(y='time', hue="sex", data=tips, order=['Dinner','Lunch'], ax=axis3)

3、兩個變量的散點圖:scatterplot()

# 3、兩個變量的散點圖:scatterplot()
# scatterplot() 單純只做散點圖,但是能突出3個變量間的關係,一般把參數中的hue設置成分類結果,觀察每一種分類的分佈情況
# seaborn.scatterplot(x=None, y=None, hue=None, style=None, size=None, data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, markers=True, style_order=None, x_bins=None, y_bins=None, units=None, estimator=None, ci=95, n_boot=1000, alpha='auto', x_jitter=None, y_jitter=None, legend='brief', ax=None, **kwargs)
ax = sns.scatterplot(x="total_bill_dollar", y="tips_dollar", hue="day",size="smoker",data=tips)
# 下圖中用不用顏色區分day,然後用不同大小區分了smoker,一個圖裝了4個變量之間的關係。。。

4、根據屬性值域繪製散點圖:relplot()

# 4、根據屬性值域繪製散點圖:relplot()
#  relplot()根據不同特徵屬性值域繪製變量之間的散點圖
# seaborn.relplot(x=None, y=None, hue=None, size=None, style=None, data=None, row=None, col=None, col_wrap=None, row_order=None, col_order=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, markers=None, dashes=None, style_order=None, legend='brief', kind='scatter', height=5, aspect=1, facet_kws=None, **kwargs)
# 行按照time值域分類,列按照sex值域分類,總共是 2*2 =4個圖,很容易發現女性喜歡週四中午吃午餐,男性喜歡週末吃晚餐;
sns.relplot(x="total_bill_dollar", y="tips_dollar", hue="day",col="time", row="sex", data=tips)

5、兩個變量的聯合分佈圖jointplot()

# 5、兩個變量的聯合分佈圖jointplot()
# 單個變量的分佈探究完成後,可以做多個連續性變量之間的聯合分佈散點圖,使用jointplot()函數,在x和y軸繪製分佈圖,在中心繪製散點圖;
# seaborn.jointplot(x, y, data=None, kind='scatter', stat_func=None, color=None, height=6, ratio=5, space=0.2, dropna=True, xlim=None, ylim=None, joint_kws=None, marginal_kws=None, annot_kws=None, **kwargs)
sns.jointplot(x="total_bill_dollar", y="tips_dollar", data=tips, color="black")
# jointplot() 既可以看到單個變量的分佈,又可以查看兩者之間的關係,kind='kde'得到密度圖,kind='reg'得到迴歸線;
sns.jointplot(x="total_bill_dollar", y="tips_dollar", data=tips,kind='reg',color="red")

6、箱線圖:boxplot()

# 6、箱線圖:boxplot()
# boxplot可以直觀明瞭地識別數據批中的異常值,也可以判斷數據批的偏態和尾重,發現有一些異常點;
ax1=sns.boxplot(x="day", y="total_bill_dollar",hue="smoker", data=tips)

7、不重疊散點圖:swarmplot()

# 7、不重疊散點圖:swarmplot()
ax1=sns.swarmplot(x="day", y="total_bill_dollar",hue="smoker",  data=tips)

8、有個變量屬性的重疊散點圖:stripplot()

# 8、有個變量屬性的重疊散點圖:stripplot() 
ax = sns.stripplot(x="day", y="total_bill_dollar", hue="smoker",data=tips)

# 一般swarmplot(),stripplot() 同boxplot()和violinplot()一同使用,既可以觀察總體分佈,也能看個體分佈情況
ax1=sns.boxplot(x="day", y="total_bill_dollar", data=tips)
ax1 = sns.swarmplot(x="day", y="total_bill_dollar", data=tips)

 9、小提琴圖跟boxplot()用途一樣

# 9、小提琴圖跟boxplot()用途一樣
ax1 = sns.violinplot(x="day", y="total_bill_dollar", hue="smoker",data=tips)
ax1 = sns.stripplot(x="day", y="total_bill_dollar", hue="smoker",data=tips)

10、繪製條件關係的多圖網格:FacetGrid()

# 10、繪製條件關係的多圖網格:FacetGrid()
g = sns.FacetGrid(tips, col="time",  row="smoker")
g = g.map(plt.hist, "total_bill_dollar")

# 比較隨性的繪圖方法,很靈活
g = sns.FacetGrid(tips, col="time",  row="sex")
g = g.map(plt.scatter, "total_bill_dollar", "tips_dollar", edgecolor="w")

11、barplot()函數

若輸出的值域是離散值,我們可以將其轉換成1/0的連續性,然後看特徵屬性的貢獻度;

# 11、barplot()函數,直觀繪製曲線圖
# 若輸出值域是離散值,我們可以將其轉換成1/0
# 這裏值域是個連續性的,所以我們把sex轉換爲1和0,探究一下
tips['sex'].replace('Female',0,inplace=True)
tips['sex'].replace('Male',1,inplace=True)
tips.head()

# 求均值
perc=tips[['day','sex','time']].groupby(['day','time'],as_index=False).mean()
sns.barplot(x='time',y='sex',hue='day',data=perc)

 

一般掌握以上的繪圖方法就能夠確保夠用,主要是熟能生巧,能夠快速找到數據之間的關係,快速發現數據價值;

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