天天看點

統計學中基礎概念說明

  如果覺得文章寫得好,如果你想要部落格文章中的資料,請關注公衆号:【資料分析與統計學之美】,添加作者【個人微信】,進群和作者交流!

目錄

  1、什麼是描述性統計?

  2、統計量

   1)常用統計量

   2)變量的類型

   3)本文章使用的相關python庫

  3、頻率與頻數

   1)頻率與頻數的概念

   2)代碼示範:計算鸢尾花資料集中每個類别的頻數和頻率

  4、集中趨勢

   1)均值、中位數、衆數概念

   2)均值、中位數、衆數三者的差別

   3)不同分布下,均值、中位數、衆數三者之間的關系

   4)代碼:計算鸢尾花資料集中花萼長度的均值、中位數、衆數

  5、集中趨勢:分位數

   1)分位數的概念

   2)怎麼求分位數?

   3)分位數是數組中的元素的情況

   4)分位數不是數組中的元素的情況:使用分攤法求分位數

   5)numpy中計算分位數的函數:quantile()

   6)pandas中計算分位數的函數:describe()

  6、離散程度

   1)極差、方差、标準差的概念

   2)極差、方差、标準差的作用

   3)代碼:計算鸢尾花資料集中花萼長度的極差、方差、标準差

  7、分布形狀:偏度和峰度

   1)偏度

   2)峰度

1、什麼是描述性統計?

  描述性統計,就是從總體資料中提取變量的主要資訊(總和、均值等),進而從總體層面上,對資料進行統計性描述。在統計的過程中,通常會配合繪制相關的統計圖來進行輔助。

2、統計量

  描述性統計所提取的含有總體性值的資訊,我們稱為統計量。

1)常用統計量
* 頻數與頻率
   + 預數
   + 頻率

* 集中趨勢分析
   + 均值
   + 中位數
   + 衆數
   + 分位數

* 離散程度分析
   + 極差
   + 方差
   + 标準差

* 分布形狀
   + 偏度
   + 峰度
           
2)變量的類型
* 類别變量
   + 無序類别變量
   + 有序類别變量

* 數值變量
   + 連續變量
   + 離散型變量
           
3)本文章使用的相關python庫
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
from sklearn.datasets import load_iris
from scipy import stats

sns.set(style="darkgrid")
mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
warnings.filterwarnings("ignore")
           

3、頻率與頻數

1)頻率與頻數的概念
  • 資料的頻數與頻率适用于類别變量。
  • 頻數:指一組資料中類别變量的每個不同取值出現的次數。
  • 頻率:指每個類别變量的頻數與總次數的比值,通常采用百分數表示。
2)代碼:計算鸢尾花資料集中每個類别的頻數和頻率
iris = load_iris()
# iris是一個類字典格式的資料,data、target、feature_names、target_names都是鍵
display(iris.data[:5],iris.target[:5])
# feature_names是每一列資料的特征名。target_names是鸢尾花的屬種名
display(iris.feature_names,iris.target_names)

# reshape(-1,1)表示将原始數組變為1列,但是行數這裡我寫一個-1,表示系統
# 會根據我指定的列數,自動去計算出行數。reshape(1,-1)含義同理
dt = np.concatenate([iris.data,iris.target.reshape(-1,1)],axis=1)
df = pd.DataFrame(dt,columns=iris.feature_names + ["types"])
display(df.sample(5))

# 計算鸢尾花資料集中每個類别出現的頻數
frequency = df["types"].value_counts()
display(frequency)
percentage = frequency / len(df)
display(percentage)

frequency.plot(kind="bar")
           

結果如下:

統計學中基礎概念說明

4、集中趨勢

1)均值、中位數、衆數概念
  • 均值:即平均值,其為一組資料的總和除以資料的個數。
  • 中位數:将一組資料升序排列,位于該組資料最中間位置的值,就是中位數。如果資料個數為偶數,則取中間兩個數值的均值。
  • 衆數:一組資料中出現次數對多的值。
2)均值、中位數、衆數三者的差別
  • ”數值變量”通常使用均值與中值表示集中趨勢。
  • “類别變量”通常使用衆數表示集中趨勢。
  • 計算均值的時候,是以容易受到極端值的影響。中位數與衆數的計算不受極端值的影響,是以會相對穩定。
  • 衆數在一組資料中可能不是唯一的。但是均值和中位數都是唯一的。
  • 在正态分布下,三者是相同的。在偏态分布下,三者會所有不同。
3)不同分布下,均值、中位數、衆數三者之間的關系
統計學中基礎概念說明

  記憶方法:哪邊的尾巴長,就叫做 “X偏”。左邊的尾巴長,就叫做“左偏”;右邊的尾巴長,就叫做“右偏”。并且均值離着尾巴最近,中位數總是在最中間,衆數離着尾巴最遠。

4)代碼:計算鸢尾花資料集中花萼長度的均值、中位數、衆數
mean = df["sepal length (cm)"].mean()
display(mean)

median = df["sepal length (cm)"].median()
display(median)
# 由于series中沒有專門計算衆數的函數,是以需要我們統計頻數最大的那些值
s = df["sepal length (cm)"].value_counts()
s = s[s.values == s.values[0]]
s.index.tolist()
t = s.index[0]
t
# scipy的stats子產品中,可以計算衆數
from scipy import stats
t = stats.mode(df["sepal length (cm)"])
# 注意:t展示的類字典格式的資料類型,mode展示衆數,count用于展示衆數出現的次數
display(t.mode,t.count)

sns.distplot(df["sepal length (cm)"])

plt.axvline(mean,ls="-",color="r",label="均值")
plt.axvline(median,ls="-",color="g",label="中值")
plt.axvline(t,ls="-",color="indigo",label="衆數")
plt.legend(loc="best")
           

結果如下:

統計學中基礎概念說明

5、集中趨勢:分位數

1)分位數的概念
  • 分位數:将資料從小到大排列,通過n-1個分位數将資料分為n個區間,使得每個區間的數值的個數相等(近似相等)。
  • 以四分位數為例,通過3個分位數,将資料劃分為4個區間。(十分位數含義相同)
  • 第一個分位數成為1/4分位數(下四分位數),資料中有1/4的資料小于該分位數。
  • 第二個分位數成為2/4分位數(中四分位數,也叫中位數),資料中有2/4的資料小于該分位數。
  • 第三個分位數成為3/4分位數(下四分位數),資料中有3/4的資料小于該分位數。
    統計學中基礎概念說明
2)怎麼求分位數

  給定一組資料(存放在數組中),我們要如何計算其四分位值呢?首先要明确一點,四分位值未必一定等同于數組中的某個元素。

  在Python中,四分位值的計算方式如下:

  ① 首先計算四分位的位置。

  q1_index=1+(n-1)*0.25

  q2_index=1+(n-1)*0.5

  q3_index=1+(n-l)*0.75

  其中,位置index從1開始,n為數組中元素的個數。

  ② 根據位置計算四分位值。

  如果index為整數(小數點後為0),四分位的值就是數組中索引為index的元素(注意位置索引從1開始)。

  如果index不是整數,則四分位位置介于ceil(index)與floor(index)之間,根據這兩個位置的元素确定四分位值。

3)分位數是數組中的元素的情況
x = np.arange(10,19)
n = len(x)
# 計算每個分位數的位置,這個位置是從1開始的。但是數組元素索引從0開始的
q1_index=1+(n-1)*0.25
q2_index=1+(n-1)*0.5
q3_index=1+(n-1)*0.75
# 這裡計算出來的數字是浮點類型,需要轉化為小數,才能當作索引
q1_index,q2_index,q3_index

# 計算分位數
index = np.array([q1_index,q2_index,q3_index]).astype(np.int32)
index -= 1
q = x[index]
q
           

結果如下:

統計學中基礎概念說明

繪制圖形:

plt.figure(figsize=(15,4))
plt.xticks(x)
plt.plot(x,np.zeros(len(x)),ls="",marker="D",ms=15,label="元素值")
plt.plot(x[index],np.zeros(len(index)),ls="",marker="X",ms=15,label="四分位值")
plt.legend()
           

結果如下:

統計學中基礎概念說明
4)分位數不是數組中的元素的情況
x = np.arange(10,20)
n = len(x)
# 計算每個分位數的位置,這個位置是從1開始的。但是數組元素索引從0開始的
q1_index=1+(n-1)*0.25
q2_index=1+(n-1)*0.5
q3_index=1+(n-1)*0.75
q1_index,q2_index,q3_index

# 計算分位數
index = np.array([q1_index,q2_index,q3_index])
index
left = np.floor(index).astype(np.int32)
left
right = np.ceil(index).astype(np.int32)
right
weight = np.modf(index)[0]
weight
q = x[left] + (x[right] - x[left]) *weight
q
           

結果如下:

統計學中基礎概念說明

繪制圖形:

plt.figure(figsize=(15,4))
plt.xticks(x)
plt.plot(x,np.zeros(len(x)),ls="",marker="D",ms=15,label="元素值")
plt.plot(q,np.zeros(len(q)),ls="",marker="X",ms=15,label="四分位值")
plt.legend()
for v in q:
    plt.text(v,0.01,v,fontsize=15)
plt.legend()
           

結果如下:

統計學中基礎概念說明
5)numpy中計算分位數的函數:quantile()
x = np.arange(10,19)
np.quantile(x,[0.25,0.5,0.75])

x = np.arange(10,20)
np.quantile(x,[0.25,0.5,0.75])
           

結果如下:

統計學中基礎概念說明

從結果中可以看到:上述我們自己計算的分位數結果,和使用該函數計算的分位數的結果,是一樣的。

6)pandas中計算分位數的函數:describe()
x = pd.Series(np.arange(10,19))
x.describe()

x = pd.Series(np.arange(10,20))
x.describe()
           

結果如下:

統計學中基礎概念說明

注意:describe()中可以傳入percentiles參數,擷取指定分位數的值。

x = pd.Series(np.arange(10,19))
x.describe(percentiles=[0.25,0.5,0.75,0.9])
           

結果如下:

統計學中基礎概念說明

6、離散程度

1)極差、方差、标準差的概念
統計學中基礎概念說明
2)極差、方差、标準差的作用
  • 極差的計算非常簡單,但是極差沒有充分的利用資料資訊。
  • 方差(标準差)可以展現資料的“分散性”,方差(标準差)越大,資料越分散,方差(标準差)越小,資料越集中。
  • 方差(标準差)也可以展現資料的“波動性”(穩定性)。方差(标準差)越大,資料波動性越大。
  • 方差(标準差)越小,資料波動性越小。
  • 當資料較大時,也可以使用n代替n-1。
3)代碼:計算鸢尾花資料集中花萼長度的極差、方差、标準差
iris = load_iris()
dt = np.concatenate([iris.data,iris.target.reshape(-1,1)],axis=1)
df = pd.DataFrame(dt,columns=iris.feature_names + ["types"])
display(df.sample(5))

sub = df["sepal length (cm)"].max()  - df["sepal length (cm)"].min()
sub
var = df["sepal length (cm)"].var()
var
std = df["sepal length (cm)"].std()
std
var == std ** 2
           

結果如下:

統計學中基礎概念說明

繪制圖形:

plt.figure(figsize=(15,4))
plt.ylim(-0.5,1.5)
plt.plot(df["sepal length (cm)"],np.zeros(len(df)),ls="",marker="o",ms=10,color="g",label="花瓣長度")
plt.plot(df["sepal width (cm)"],np.ones(len(df)),ls="",marker="o",ms=10,color="b",label="花瓣寬度")
         

plt.axvline(df["sepal length (cm)"].mean(),ls="--",color="g",label="花瓣長度均值")
plt.axvline(df["sepal width (cm)"].mean(),ls="-",color="b",label="花瓣寬度均值")

plt.legend()
           

結果如下:

統計學中基礎概念說明

7、分布形狀:偏度和峰度

1)偏度

① 概念

  • 偏度是統計資料分布偏斜方向和程度的度量,是統計資料分布非對稱程度的數字特征。
  • 如果資料對稱分布(例如正态分布),則偏度為0。
  • 如果資料左偏分布,則偏度小于0,如果資料右偏分布,則偏度大于0。
    統計學中基礎概念說明

② 代碼如下

t1 = np.random.randint(1,11,100)
t2 = np.random.randint(11,21,500)
t3 = np.concatenate([t1,t2])
left_skew = pd.Series(t3)

t1 = np.random.randint(1,11,500)
t2 = np.random.randint(11,21,100)
t3 = np.concatenate([t1,t2])
right_skew = pd.Series(t3)

display(left_skew.skew(),right_skew.skew())
sns.kdeplot(left_skew,shade=True,label="左偏")
sns.kdeplot(right_skew,shade=True,label="右偏")
plt.legend()
           

結果如下:

統計學中基礎概念說明
2)峰度

① 概念

  • 峰度是描述總體中所有取值分布形态陡緩程度的統計量,可以講峰度了解為資料分布的高矮程度,峰度的比較是相對于标準正态分布的。
  • 對于标準正态分布,峰度為0。
  • 如果峰度大于0,說明資料在分布上比标準正态分布密集,方差(标準差)較小。
  • 如果峰度小于0,說明資料在分布上比标準正态分布分散,方差(标準差)較大。

② 代碼如下

standard_normal = pd.Series(np.random.normal(0,1,10000))
display("标準正态分布峰度",standard_normal.kurt(),"标準差:",standard_normal.std())
display("花萼長度峰度",df["sepal length (cm)"].kurt(),"标準差:",df["sepal length (cm)"].std())
display("花萼寬度峰度",df["sepal width (cm)"].kurt(),"标準差:",df["sepal width (cm)"].std())

sns.kdeplot(standard_normal,label="标準正态分布")
sns.kdeplot(df["sepal length (cm)"],label="花萼長度")
sns.kdeplot(df["sepal width (cm)"],label="花萼寬度")
           

結果如下:

統計學中基礎概念說明

繼續閱讀