about Anscombe's quartet
1973年,統計學家F.J. Anscombe構造出了四組奇特的數據。它告訴人們,在分析數據之前,描繪數據所對應的圖像有多麼的重要。
這四組數據中,x值的平均數都是9.0,y值的平均數都是7.5;x值的方差都是10.0,y值的方差都是3.75;它們的相關度都是0.816,線性迴歸線都是y=3+0.5x。單從這些統計數字上看來,四組數據所反映出的實際情況非常相近,而事實上,這四組數據有着天壤之別。
把它們描繪在圖表中,你會發現這四組數據是四種完全不同的情況。第一組數據是大多人看到上述統計數字的第一反應,是最“正常”的一組數據;第二組數據所反映的事實上是一個精確的二次函數關係,只是在錯誤地應用了線性模型後,各項統計數字與第一組數據恰好都相同;第三組數據描述的是一個精確的線性關係,只是這裏面有一個異常值,它導致了上述各個統計數字,尤其是相關度值的偏差;第四組數據則是一個更極端的例子,其異常值導致了平均數、方差、相關度、線性迴歸線等所有統計數字全部發生偏差。
參考:http://www.matrix67.com/blog/archives/2308
question:
code:
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
sns.set_context("talk")
anscombe = sns.load_dataset("anscombe")
dataset = anscombe.groupby("dataset")
print("x, y 的均值")
means = dataset.mean()
print(means, '\n')
print("x, y 的方差")
var = dataset.var()
print(var, '\n')
strings = ['I', 'II', 'III', 'IV']
datas = []
datas.append(anscombe.query("dataset == 'I'"))
datas.append(anscombe.query("dataset == 'II'"))
datas.append(anscombe.query("dataset == 'III'"))
datas.append(anscombe.query("dataset == 'IV'"))
print("x, y 的相關係數")
for i in range(0,4):
corr = datas[i]['x'].corr(datas[i]['y']) #計算相關係數
print(strings[i], corr)
print("\nx, y 的線性迴歸方程")
for i in range(0,4):
x = datas[i]['x']
y = datas[i]['y']
x = sm.add_constant(x) #添加一個常數係數
res = sm.OLS(y,x).fit() #根據最小二乘法得出線性迴歸方程
params = res.params
print(strings[i], '\n', params)
result:
queation:
code:
graph = sns.FacetGrid(anscombe, col="dataset")
graph.map(plt.scatter, 'x', 'y') #繪製散點圖
plt.show()
result: