統計學有時候會被誤解,好像必須有大量的樣本資料,才能使統計結果有意義。
這會讓我們覺得統計學離我們的日常生活很遙遠。
其實,如果資料的準確度高的話,少量的樣本資料同樣能反映出真實的情況。
比如,很多國家選舉時不斷做的民意調查,一般做到有效樣本1600多份就夠了,不管你是幾千萬人的小國家,還是數億人的大國,調查的樣本數都差不多。
所以,正確地進行統計,即使樣本資料量不大,我們也可以從中提取知識,避免被誤導。
不過,在此之前,我們要能夠清楚地理解統計資料和各種統計指標的含義,以及它們在區分真相和誤導時的作用。
1. 統計是什麼
統計是個很籠統的概念,它涉及到很多事情,簡單來定義它的話,必然會掩蓋很多細節。
統計學可以被認為是處理資料的科學框架,其中包括與資料收集、分析和解釋相關的所有任務。
那麼,什麼是資料?
資料是對世界觀察的一般集合,其性質多種多樣,從定性到定量。
比如,研究人員從實驗中收集資料,企業家從使用者那裡收集資料,醫生從病人那裡收集資料等等。
本篇準備介紹一些在分析資料時常用的兩種描述性指標,透過它們來實際的度量資料情況,而不是模凌兩可的描述資料性質。
本文使用的示例資料來自scikit-learn
中自帶的糖尿病資料集。
from sklearn.datasets import load_diabetes
# 糖尿病人資料集
ds = load_diabetes(as_frame=True, return_X_y=True, scaled=False)
data = ds[0]
data.head()
其中一共有400多條資料。
這裡不做糖尿病的分析,只是用這個資料集來演示一些統計學描述指標的計算方式。
2. 集中度指標
首先是集中度指標,它表示資料的“中間”是什麼樣的。
“中間”這個詞是模糊的,我們可以用多種方式來定義中間。
2.1. 平均值
平均值是一種描述性統計量,描述的是資料集中最典型的值。
比如,我們看看示例資料中,糖尿病病人的年齡平均值:
# 獲取年齡列表
ages = data["age"].tolist()
# 年齡之和
sum_ages = sum(ages)
# 人數
num_ages = len(ages)
# 平均年齡
avg_ages = sum_ages / num_ages
avg_ages
# 執行結果
48.51809954751131
這個平均年齡告訴我們,易患糖尿病的“典型”年齡可能是48歲左右。
2.2. 中位數
中位數是資料“中間”的另一種定義,它不像平均值那樣需要算術計算。
它只要將資料排序之後,取中間的那個值就行,如果資料集中資料的個數是偶數,則取排序後中間兩個值的平均值。
# 獲取年齡列表
ages = data["age"].tolist()
sorted_ages = sorted(ages)
# 人數
num_ages = len(ages)
mid = int(num_ages / 2)
# 因為人數是偶數,所以中位數是中間兩個數的平均值
med_ages = (sorted_ages[mid - 1] + sorted_ages[mid])/2
med_ages
# 執行結果
50.0
中位數年齡50
與上面計算的平均值差別不大。
有時候,資料集中有一些異常值(極大或極小的值),就會造成中位數和平均值差別很大。
異常值一般會對平均值產生不利的影響,而對於中位數來說,一般影響不大。
2.3. 眾數
眾數是資料中出現最頻繁的值,它不像平均值和中位數那樣更像資料的“中間”。
不過,一個值在資料集中重複出現的次數越多,對平均值的影響就越大,因此,眾數代表了對平均值的最高加權貢獻因素。
# 獲取年齡列表
ages = data["age"].tolist()
ages_count = {}
# 統計每個年齡的個數
for i in ages:
if i in ages_count:
ages_count[i] += 1
else:
ages_count[i] = 1
# 出現次數最多的年齡
max_age, max_count = 0, 0
for k, v in ages_count.items():
if v > max_count:
max_age = k
max_count = v
print(max_age, max_count)
# 執行結果
53.0 19
眾數也就是出現最多的年齡,是53歲,有19
人。
該眾數相當接近中位數,這讓我們對於資料的集中趨勢更有信心。
3. 離散度指標
集中度指標讓我們瞭解到資料的“中間”是什麼樣的,而離散度指標則是告訴我們資料“變化”有多大。
離散度指標讓我們可以度量資料的變化程度,哪怕是輕微的變化程度。
3.1. 極差
極差就是資料的最大值與最小值之差,它讓我們瞭解到資料的變化範圍有多大。
# 獲取年齡列表
ages = data["age"].tolist()
# 極差
max(ages) - min(ages)
# 執行結果
60.0
極差60歲,說明糖尿病患者的年齡差距很大,這是一種需要及早預防的疾病。
3.2. 標準差
標準差是對觀察結果分佈的衡量,是對資料與“典型”資料點的偏差程度的度量。
標準差越大,資料在平均值附近的分佈就越分散,反之越集中。
# 標準差計算函式
def stdev(nums):
diffs = 0
avg = sum(nums)/len(nums)
for n in nums:
diffs += (n - avg)**(2)
return (diffs/(len(nums)-1))**(0.5)
# 獲取年齡列表
ages = data["age"].tolist()
stdev(ages)
# 執行結果
13.109027822041087
從極差看出年齡的差距有60歲,但是標準差只有13歲左右,說明資料還算集中,不是太分散。
3.3. 方差
方差就是標準差的平方,它們幾乎是完全相同的東西。
需要注意的是,方差的單位是原始資料不一樣,而標準差的單位和原始資料一樣。
與平均值一樣,方差和標準差也會受到異常值的影響。
4. 總結
本篇主要內容包括:
- 描述性統計指標分兩種:集中度指標和離散度指標
- 描述性統計指標表示資料的簡單摘要
- 平均值計算我們資料集的典型值,易受異常值影響
- 中位數是資料集排序後的中間值,不易受異常值影響
- 眾數是出現次數最多的值
- 極差是資料集中最大值和最小值之間的差
- 方差和標準差表示在平均值附近的波動情況