文章原創(chuàng),最近更新:2018-05-12
1.繪制線(xiàn)性回歸模型的函數(shù)
2.不同類(lèi)型的模型擬合(參考學(xué)習(xí))
3.調(diào)節(jié)其他變量(參考學(xué)習(xí))
4.控制繪制的大小和形狀(參考學(xué)習(xí))
課程來(lái)源: python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)實(shí)戰(zhàn)-唐宇迪
學(xué)習(xí)參考鏈接:
1芍殖、Seaborn(sns)官方文檔學(xué)習(xí)筆記(第四章 線(xiàn)性關(guān)系的可視化))
2擂红、Seaborn官方0.8.1版本
1.繪制線(xiàn)性回歸模型的函數(shù)
使用Seaborn中的兩個(gè)主要功能可視化通過(guò)回歸確定的線(xiàn)性關(guān)系。這些函數(shù)regplot()和lmplot()是密切相關(guān)的围小,并且共享了大部分的核心功能。然而树碱,了解他們不同的方式很重要肯适,以便您可以快速為特定工作選擇正確的工具。
在最簡(jiǎn)單的調(diào)用中成榜,兩個(gè)函數(shù)繪制了兩個(gè)變量x和y的散點(diǎn)圖框舔,然后擬合回歸模型y?x并繪制了該回歸線(xiàn)的結(jié)果回歸線(xiàn)和95%置信區(qū)間:
sns.load_dataset("tips")中的tips是seaborn庫(kù)自帶的一個(gè)數(shù)據(jù)集.
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
print(tips.head())
輸出的結(jié)果如下:
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
通過(guò)輸出的結(jié)果可以看出,以上數(shù)據(jù)包含幾個(gè)關(guān)鍵信息,主要講的是一個(gè)顧客去飯店消費(fèi)的表,第一列講的是總的消費(fèi)費(fèi)用,第二列講的是小費(fèi),第三列當(dāng)前顧客的性別,第四列顧客是否抽煙,第五列講的是周幾,第五列講的是吃中午飯還是晚飯?size指的是用餐人數(shù).
regplot()和lmplot()都可以繪制回歸關(guān)系,推薦regplot(),因?yàn)閞egplot()比lmplot()的參數(shù)支持的類(lèi)型更多一些.
怎么利用上面的數(shù)據(jù)畫(huà)回歸關(guān)系呢?
首先將regplot()函數(shù)調(diào)出來(lái),必須指定的參數(shù)有x軸是哪個(gè)指標(biāo),y軸是個(gè)指標(biāo).比如x軸的指標(biāo)是total_bill 的總的消費(fèi)費(fèi)用,y軸的指標(biāo)是tip消費(fèi),這里的回歸指的是total_bill 與tip之間的關(guān)系.這里的data指的是當(dāng)前的dataframe傳進(jìn)去.這里指的是tips這個(gè)dataframe.
如下代碼:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.regplot(x="total_bill",y="tip",data=tips)
輸出的結(jié)果如下:
從輸出的結(jié)果可以很清晰的看到一條擬合直線(xiàn)擬合當(dāng)前的數(shù)據(jù).我們就可以把這樣的直線(xiàn)畫(huà)出來(lái)了.通過(guò)結(jié)果可以分析total_bill與tip之間的關(guān)系,以及數(shù)據(jù)的大致分步情況.
這里同樣也可以用lmplot()函數(shù)畫(huà)回歸關(guān)系.
代碼如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill",y="tip",data=tips)
輸出結(jié)果如下:
regplot()函數(shù)與lmplot()函數(shù),很顯然,所得到的的圖的結(jié)果是相同的,除了圖形形狀略有些不同刘绣,這里會(huì)簡(jiǎn)短的解釋樱溉。
regplot()函數(shù)與regplot()函數(shù)之間有什么區(qū)別呢?
- 主要區(qū)別是regplot()以各種格式接受x和y變量,包括numpy數(shù)組纬凤、Pandas的Series列或DataFrame對(duì)象的變量引用.
- 不一樣的是福贞,lmplot()將數(shù)據(jù)集作為一個(gè)必需的參數(shù),而x和y變量必須指定為字符串停士。這種數(shù)據(jù)格式稱(chēng)為“長(zhǎng)格式”或“整潔”數(shù)據(jù)挖帘。
- 除了這種輸入靈活性,regplot()可以看做是擁有l(wèi)mplot()特征的子集恋技,所以后面將使用后者進(jìn)行演示拇舀。
當(dāng)其中一個(gè)變量取值為離散型的時(shí)候,可以擬合一個(gè)線(xiàn)性回歸蜻底。然而骄崩,這種數(shù)據(jù)集生成的簡(jiǎn)單散點(diǎn)圖通常不是最優(yōu)的:
相看一下"size"與"tip"之間的關(guān)系,可以通過(guò)regplot()函數(shù)畫(huà)出這樣的圖.
案例代碼如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.regplot(x="size",y="tip",data=tips)
輸出的結(jié)果如下:
當(dāng)前的size是1,2,3,4,5不是一些連續(xù)的值,所以說(shuō)不太時(shí)候去做這樣的回歸分析,如果數(shù)據(jù)不太滿(mǎn)足的情況下,一個(gè)常用的方法是為離散值添加一些隨機(jī)噪聲的“抖動(dòng)”(jitter),使得這些值的分布更加明晰薄辅。
值得注意的是要拂,抖動(dòng)僅適用于散點(diǎn)圖數(shù)據(jù),且不會(huì)影響擬合的回歸線(xiàn)本身.
size是類(lèi)別數(shù)據(jù),要么是1,2,3,4,不可能發(fā)生小數(shù)值,但是不適合建立一個(gè)回歸模型.
這里的抖動(dòng)在sns.regplot()函數(shù)中加x_jitte這個(gè)參數(shù).x_jitte這個(gè)參數(shù)的意思是在原有的數(shù)據(jù)的點(diǎn)上加上一個(gè)小范圍的浮動(dòng),這個(gè)浮動(dòng)的范圍可以自己定義.
案例代碼如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.regplot(x="size",y="tip",data=tips,x_jitter=.05)
輸出的結(jié)果如下:
從數(shù)據(jù)的結(jié)果來(lái)看,數(shù)據(jù)都有發(fā)生一點(diǎn)偏移,要么往左點(diǎn)要么往右點(diǎn),對(duì)原始的點(diǎn)進(jìn)行了一些隨機(jī)改變.可以使離散點(diǎn)變得稍微有那么一丁丁點(diǎn)連續(xù).,使回歸模型建立起來(lái)更加準(zhǔn)確一些.
對(duì)于類(lèi)別的問(wèn)題,比如這里的size問(wèn)題,建模的時(shí)候,可以考慮增加regplot()參數(shù)中增加x_jitter這個(gè)參數(shù),相當(dāng)于增加了一個(gè)小范圍的浮動(dòng)操作.
2.不同類(lèi)型的模型擬合(參考學(xué)習(xí))
上面使用的簡(jiǎn)單線(xiàn)性回歸模型非常簡(jiǎn)單长搀,但是宇弛,它不適用于某些種類(lèi)的數(shù)據(jù)集。 Anscombe's quartet數(shù)據(jù)集顯示了一些簡(jiǎn)單線(xiàn)性回歸提供了簡(jiǎn)單目視檢查清楚顯示差異的關(guān)系估計(jì)的例子源请。 例如枪芒,在第一種情況下,線(xiàn)性回歸是一個(gè)很好的模型:
對(duì)于類(lèi)別值比如
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
ci=None, scatter_kws={"s": 80});
輸出結(jié)果如下:
第二個(gè)數(shù)據(jù)集中的線(xiàn)性關(guān)系是一樣的谁尸,但是基本清楚地表明這不是一個(gè)好的模型:
代碼如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
ci=None, scatter_kws={"s": 80})
輸出的結(jié)果如下:
在存在這些高階關(guān)系的情況下舅踪,lmplot()和regplot()可以擬合多項(xiàng)式回歸模型來(lái)擬合數(shù)據(jù)集中的簡(jiǎn)單類(lèi)型的非線(xiàn)性趨勢(shì):
代碼如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
order=2, ci=None, scatter_kws={"s": 80});
輸出的結(jié)果如下:
3.調(diào)節(jié)其他變量(參考學(xué)習(xí))
上面的圖表顯示了許多方法來(lái)探索一對(duì)變量之間的關(guān)系。然而良蛮,通常抽碌,一個(gè)更有趣的問(wèn)題是“這兩個(gè)變量之間的關(guān)系如何作為第三個(gè)變量的函數(shù)而變化?”這是regplot()和lmplot()之間的區(qū)別决瞳。 雖然regplot()總是顯示單個(gè)關(guān)系货徙,lmplot()將regplot()與FacetGrid結(jié)合在一起,提供了一個(gè)簡(jiǎn)單的界面皮胡,可以在“faceted”圖上顯示線(xiàn)性回歸痴颊,從而允許您探索與多達(dá)三個(gè)其他類(lèi)別變量的交互。
分類(lèi)關(guān)系的最佳方式是繪制相同軸上的兩個(gè)級(jí)別屡贺,并使用顏色來(lái)區(qū)分它們:
代碼如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)
輸出的結(jié)果如下:
除了顏色之外蠢棱,還可以使用不同的散點(diǎn)圖標(biāo)記來(lái)使黑色和白色的圖像更好地繪制锌杀。 您還可以完全控制所用的顏色.
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,
markers=["o", "x"], palette="Set1")
輸出的結(jié)果如下:
要添加另一個(gè)變量,您可以繪制多個(gè)“facet”泻仙,每個(gè)級(jí)別的變量出現(xiàn)在網(wǎng)格的行或列中:
代碼如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips)
輸出的結(jié)果如下:
代碼如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill", y="tip", hue="smoker",
col="time", row="sex", data=tips)
輸出的結(jié)果如下:
4.控制繪制的大小和形狀(參考學(xué)習(xí))
在我們注意到由regplot()和lmplot()創(chuàng)建的默認(rèn)繪圖看起來(lái)是一樣的糕再,但在軸上卻具有不同大小和形狀。 這是因?yàn)閒unc:regplot是一個(gè)“軸級(jí)”功能繪制到特定的軸上玉转。 這意味著您可以自己制作多面板圖形突想,并精確控制回歸圖的位置。 如果沒(méi)有提供軸冤吨,它只需使用“當(dāng)前活動(dòng)的”軸蒿柳,這就是為什么默認(rèn)繪圖與大多數(shù)其他matplotlib函數(shù)具有相同的大小和形狀的原因。要控制大小漩蟆,您需要自己創(chuàng)建一個(gè)圖形對(duì)象垒探。
代碼如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
f, ax = plt.subplots(figsize=(5, 6))
sns.regplot(x="total_bill", y="tip", data=tips, ax=ax)
輸出的結(jié)果如下:
相反,lmplot()圖的大小和形狀通過(guò)FacetGrid界面使用size和aspect參數(shù)進(jìn)行控制怠李,這些參數(shù)適用于每個(gè)圖中的設(shè)置圾叼,而不是整體圖形:
代碼如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
f, ax = plt.subplots(figsize=(5, 6))
sns.lmplot(x="total_bill", y="tip", col="day", data=tips,
col_wrap=2, size=3)
輸出的結(jié)果如下:
代碼如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
f, ax = plt.subplots(figsize=(5, 6))
sns.lmplot(x="total_bill", y="tip", col="day", data=tips,
aspect=.5)
輸出的結(jié)果如下: