數據分析之路—數據的描述性統計

  • 2019 年 10 月 8 日
  • 筆記

原創:a廉小寶

數據的描述性統計

將知識點關鍵概念也記錄下來加一些自己的理解,知識是第一生產力? 使用程式語言對所學知識加以實踐,實踐才能體現理論的價值⛽️

理論:

數據描述的維度及指標

數據的集中趨勢描述

數據的集中趨勢描 述是尋找反映事物特徵的數據集合的代表值或中心值,這個代表值或中 心值可以很好地反映事物目前所處的位置和發展水平,通過對事物集中 趨勢指標的多次測量和比較,還能夠說明事物的發展和變化趨勢。國家 的人均GDP就是一個集中趨勢指標,雖然每個人對國家的GDP貢獻度不 一樣,但是人均GDP能夠代表每個人對國家GDP的平均貢獻度,從而反 映一個國家的經濟發展水平。

算術平均值
1.簡單算術平均值

將數據集合的所有數據值相加的和除以數據值個數就得到簡單算術平均值

假設有一組包含n個數值的數據集合,它們的數值分別為x1 ,x2 , …,xn ,該數據集合的簡單算術平均值的計算公式為:

2.加權算術平均值

因為簡單算術平均值認為所有的數據值都具有同等的重要性,所以 每個數據值都具有相同的權重。但是有些時候,每個數據值的權重是不 一樣的,需要用加權算術平均值來表示數據集合的集中趨勢

假設有一個數據集合,總共包括k個不同類別的數據組,各組的簡單算術平均值 表示為x1-,x-2,…,x-k,每個數據組的數值個數分別為f1,f2,…, fk,每組的數值個數就是每個數據組的權重,那麼加權算術平均值的計算公式可以表示為:

3.使用算術平均值的注意事項

當數據集合中有 極大值或極小值存在時,會對算術平均值產生很大的影響,其計算結果 會掩蓋數據集合的真實特徵,這時算術平均值就失去了代表性

幾何平均值

有些數據之間的關係不是加減關係,而是乘除關係。此時,應該用 幾何平均值來表示由這樣的數值組成的數據集合的集中趨勢。例如,銀 行的平均存款年利率、汽車工廠每條生產線的平均產品合格率、國家十 年來的平均發展速度等。幾何平均值被用於各種定比數據的平均值計 算,假設有一個定比數據集合,集合中的數值分別為x1,x2,…,xn, 且所有的數值均大於 0,那麼該數據集合的幾何平均值的計算公式為

比如 生產線上工序1合格率為85%,工序2合格率為97%,工序3合格率為94% … 那麼生產單件的產品的合格率為

眾數

數據集合中出現次數最多的數值被稱為眾數。如果在一個數據集合 中,只有一個數值出現的次數最多,那麼這個數值就是該數據集合的眾 數

中位數

對於數據集合(x1,x2,…,xn),將所有的數值按照它們的大小,從高到低或從低到高進行排序,如果數據集合包含的數值個數是基 數,那麼排在最中間的數值就是該數據集合的中位數;如果數據集合的 數值個數是偶數,那麼取最中間兩個數值的算術平均值作為中位數。例 如,現有數據集合{2,3,5,7,8,9,10}和{3,5,7,8,9,10, 11,12},它們的中位數分別為7和8.5

中位數與算術平均值相比,中位數的優勢在於不受數據集合中個別 極端值的影響,表現出穩定的特點。這一特點使其在數據集合的數值分 布有較大偏斜時,能夠保持對數據集合特徵的代表性。因此,中位數常 被用來度量具有偏斜性質的數據集合的集中趨勢(啥時候國家統計局公布一下工資中位數讓我知道我沒有怎麼拖後腿)

數據的離散程度描述

極差

極差又被稱為全距,是指數據集合中最大值與最小值的差值,表示 整個數據集合能夠覆蓋的數值距離

)

平均偏差

離散程度是一個相對概念,需要通過與參考值的對比才能表示出離 散程度。因為算術平均值是最重要也是最常用的集中趨勢指標,所以均 值也就自然能夠成為參考值

方差和標準差
1.總體的方差和標準差

如果數據集合(x1,x2,…,xn)就是數據總體,並且數據集合有 N個數值(個案),假設數據總體的均值為μ,那麼總體方差σ2的計算公式為:

總體標準差是方差的正值平方根,其計算公式為:

2.樣本的方差和標準差

一般情況下,能夠作為數據總體的數據集合容量都是非常龐大的, 基於成本的考慮,不可能採集數據總體的全部數值(個案)。通常的做 法是從數據總體中隨機抽取一定數量的樣本數值,然後用樣本數值的方 差和標準差來估計總體的方差和標準差。為了區分,樣本的均值用x-表 示,樣本方差用s2表示,樣本標準差用s表示。假設樣本容量為n,那麼:

樣本方差是總體方差的無偏估計,並不代表任意抽取某個樣本,用 樣本方差公式計算得到的樣本方差等於總體方差。這句話的真實意思是 從總體中抽取全部可能情況的樣本容量為n的樣本,這些樣本計算得到 的樣本方差的均值等於總體方差,也就是無偏的。

變異係數

方差和標準差雖然能夠表示數據集合中每個數值(個案)距離算術 均值的平均偏差距離,但是這個距離的大小程度卻不能很好展現,特別 是對於算術平均值不同的兩個數據集合。如果兩者的方差和標準差相等 時,那麼到底哪個數據集合的離散程度更高、更低或相同?對於這個問 題,方差和標準差解決不了,變異係數卻可以(也就是不同的數量級等問題會影響到指標,一個人一小時完成10件標準差2和一個人一小時完成100件標準差2.1顯然後者更優秀)

四分位極差

將所有數據按照大小,從低到高進 行排序,如果數據集合的數值個數是奇數,那麼排在最中間的數據值即 為中位數;如果數值個數是偶數,那麼取最中間兩個數值的算術平均值 作為中位數。以此類推,排在四分之一位置的數值即為第一四分位數 Q1;排在四分之二位置的數值為第二四分位數Q2 ,也就是中位數;排在四分之三位置的數值為第三四分位數Q3。這三個四分位數將整個數據集合分成四等分。四分位極差等於第一四分位數與第三四分位數的差 值(Q3-Q1),這個差值區間包含了整個數據集合50%的數據值

數據的分布形態描述

集中趨勢和 離散程度是數據分布的兩個重要特徵,但要全面了解數據分布的特點還要知道數據分布的形狀是否對稱、傾斜程度以及分布的扁平程度。偏態和峰態就是對分布形狀的測度。

偏態係數

高度偏態係數 SK>1 或 SK<-1 中等偏態分布 0.5<SK<1 或 -0.5<SK<-1 正態分布 SK=0

峰態係數

峰態通常是指標準正態分布比較而言。如果一組數據服從標準正態分布,則峰態係數的值等於0;若峰態係數的值明顯不等於0,則表明分布比正態分布更平或者更尖,通常稱為平峰或尖峰分布。

程式碼實踐:

python

import numpy as npy  import pandas as pd  import scipy.stats as s    data_pre = npy.random.random_integers(1, 10, 5)  data = pd.Series(data_pre)  print(data)      # 所有的描述展示  print(data.describe(include='all'))    # 單獨統計  # 眾數  print('眾數:', data.mode()[0])  # 中位數  print('中位數:', data.median())  # 分位數  print('四分位:n 第一分位:{0} n 第二分位:{1} n 第三分位:{2}'.format(data.quantile(0.25)                                                          , data.quantile(0.5)                                                          , data.quantile(0.75)))  # 算術平均數  print('算術平均數:', data.mean())    # 加權平均數  qs = npy.random.rand(data.count())  tmp = data * qs/qs.sum()  print('加權平均數:%.3f' % tmp[0])    # 幾何平均數  print('幾何平均數: %.3f' % s.gmean(data))    # 方差  print('方差:%.3f' % data.var())    # 標準差  print('標準差:%.3f' % data.std())    # 極差  print('極差:',  data.max()-data.min())    # 平均差  print('平均差:%.3f' % npy.abs(data-data.mean()).mean())    # 四分位極差  print('四分位極差:', data.quantile(0.75)-data.quantile(0.25))    # 異眾比率  print('異眾比率:', 1-data.value_counts()[data.mode()].sum()/data.count())    # 離散係數  print('離散係數:', data.std()/data.mean())    # 峰態係數  print('峰態係數:', s.kurtosis(data))

Excle

可視化圖表

散點圖用來分析統計一些聚集點指標

折線圖

import matplotlib.pylab as pyl  import numpy as npy    x = [10, 20, 30, 40, 80]  y = [53, 74, 22, 18, 51]    pyl.title("show")  pyl.xlabel("age")  pyl.ylabel("salary")  pyl.xlim(0, 100)  pyl.ylim(0, 100)  pyl.plot(x, y)  pyl.show()

柱狀圖

data2 = npy.random.normal(50.0, 10.0, 100)#(均數、西格瑪、個數)  # print(data2)  pyl.hist(data2)  pyl.show()
# -*- coding: utf-8 -*-  import math      # 算數平均數  def avg(num_list):      return sum(num_list)/len(num_list)      # 幾何平均數  def avg_geometry(num_list):      sum = 1      if num_list and len(num_list) > 0:          length = len(num_list)          for num in num_list:              sum *= num          return math.pow(sum, 1.0/length)      # 中位數/分位數  def median(num_list, split_num=2):      num_list.sort()      length = len(num_list)      result = []      if not split_num or split_num == 2:          if length % 2 == 0:              return (num_list[int(length/2-1)] + num_list[int(length/2)])/2          else:              return num_list[length/2-1]      else:          if length % split_num == 0:              i = split_num              while i > 1:                  result.append((num_list[int(length / i - 1)] + num_list[int(length / i)]) / 2)                  i -= 1              return result          else:              i = split_num              while i > 1:                  result.append(num_list[int(length / i - 1)])                  i -= 1              return result      # 平均差  def average_deviation(num_list):      avg_num = avg(num_list)      return sum([abs(num-avg_num) for num in num_list])/len(num_list)      # 方差  def variance(num_list):      avg_num = avg(num_list)      return sum([math.pow(num - avg_num, 2) for num in num_list])/len(num_list)      # 標準差  def standard_deviation(num_list):      return math.pow(variance(num_list), 1.0/2)      # 離散係數 又叫變異係數 標準差/平均數  def coefficient_dispersion(num_list):      return standard_deviation(num_list)/avg(num_list)      # 眾數  def mode(num_list):      dict = {}      result = []      max = 0      if num_list and len(num_list) > 0:          for num in num_list:              if num in dict:                  dict[num] += 1              else:                  dict[num] = 1          d1 = sorted(dict.values(), reverse=True)          max = d1[0]          for num in dict:              count = dict.get(num, 0)              if count == max:                  result.append(num)      return result      # 異眾比率 不是眾數在總數佔比  def variation_ratio(num_list):      count = 0      mode_nums = mode(num_list)      for num in num_list:          if num not in mode_nums:              count += 1      return count/len(num_list)      if __name__ == '__main__':      list = [2, 10, 60, 6, 5, 6]      # 以下 在numpy都有實現      print(mode(list))      print(avg(list))      print(avg_geometry(list))      print(median(list))      print(average_deviation(list))      print(variance(list))      print(standard_deviation(list))      print(variation_ratio(list))      print(coefficient_dispersion(list))      print(median(list, split_num=3))

Tags: