1. 程式人生 > >描述統計學、推斷統計學、假設檢驗、計算person相關係數

描述統計學、推斷統計學、假設檢驗、計算person相關係數

'''
描述統計學
–集中趨勢
–離散趨勢
–偏態
假設檢驗
–基本原理
–基本概率

統計學可以分為:描述統計學與推斷統計學
描述統計學:使用特定的數字或圖表來體現資料的集中程度和離散程度。例:每次考試算的平均分,最高分,各個分段的人數分佈等,也是屬於描述統計學的範圍。
推斷統計學:根據樣本資料推斷總體資料特徵。例:產品質量檢查,一般採用抽檢,根據所抽樣本的質量合格率作為總體的質量合格率的一個估計。
應用:統計學的應用十分廣泛,可以說,只要有資料,就有統計學的用武之地。目前比較熱門的應用:經濟學,醫學,心理學等。

'''

# -*- coding: utf-8 -*-
from pandas import Series, DataFrame
import numpy as np
import math
import matplotlib.pyplot as plt

a=[98,83,65,72,79,76,75,94,91,77,63,83,89,69,64,78,63,86,91,72,71,72,70,80,65,70,62,74,71,76]

print( np.mean(a) ) # 75.9666666667
print( np.sort(a) )  
# [62 63 63 64 65 65 69 70 70 71 71 72 72 72 74 75 76 76 77 78 79 80 83 83 86 89 91 91 94 98]
print( np.sort(a)[14:16] )  # 包含起始位置、不包括結束位置  [74 75]
print( np.mean(np.sort(a)[14:16]) )  # 74.5

#眾數——資料中出現次數最多的數(所佔比例最大的數)
def get_mode(arr):
    mode = [];  
    arr_appear = dict((a, arr.count(a)) for a in arr);  # 統計各個元素出現的次數  
    if max(arr_appear.values()) == 1:
        return; 
    else:
        for k, v in arr_appear.items():  # 出現次數最多的數,就是眾數  
            if v == max(arr_appear.values()):  
                mode.append(k);
    return mode;

print( get_mode(a) );  # [72]
print( np.var(a) );  # 方差 93.2988888889
print( np.std(a) );  # 計算矩陣標準差 9.65913499693

a=Series(a)

print( a.skew() )  # 計算偏斜度  0.574289187335

print( a.kurt() )   # -0.428723747954

'''
偏度和峰度都是統計量 
一階矩是隨機變數的期望,二階矩是隨機變數平方的期望
偏度Skewness(三階) ——三階中心距除以標準差的三次方
峰度Kurtosis (四階) —— 概率密度在均值處峰值高低的特徵,常定義四階中心矩除以方差的平方,減去三;
'''

print( a.describe() ) # 描述
'''
count    30.000000
mean     75.966667
std       9.824260
min      62.000000
25%      70.000000
50%      74.500000
75%      82.250000
max      98.000000
dtype: float64
'''

df = DataFrame({'data1' : np.random.randn(5),
                'data2' : np.random.randn(5)})
print( df.cov() ) # E[(X-E(X))(Y-E(Y))]稱為隨機變數X和Y的協方差,記作COV(X,Y),即COV(X,Y)=E[(X-E(X))(Y-E(Y))^T]
print( df.corr() )

###假設檢驗
'''
假設檢驗
基本思想
–小概率思想
–反證法思想
零假設與備擇假設——無罪推定原理
兩類錯誤
–第一類錯誤
–第二類錯誤

假設檢驗的基本步驟
1. 提出零假設
2. 建立檢驗統計量
3. 確定否定域/計算p-value
4. 得出結論

'''
from scipy import stats as ss
df=DataFrame({'data':[10.1,10,9.8,10.5,9.7,10.1,9.9,10.2,10.3,9.9]})
ss.ttest_1samp(a = df, popmean = 10)


print( ' ################################################# ' )

#計算person相關係數
a = np.array([[1, 1, 2, 2, 3],  
       [2, 2, 3, 3, 5],  
       [1, 4, 2, 2, 3]])   

# 可計算行與行之間的相關係數,np.corrcoef(a,rowvar=0)用於計算各列之間的相關係數,輸出為相關係數矩陣。
print( np.corrcoef(a) ) 
'''
[[ 1.      0.9759  0.1048]
 [ 0.9759  1.      0.179 ]
 [ 0.1048  0.179   1.    ]]
'''
print( np.corrcoef(a,rowvar=0) )  
'''
[[ 1.    -0.189  1.     1.     1.   ]
 [-0.189  1.    -0.189 -0.189 -0.189]
 [ 1.    -0.189  1.     1.     1.   ]
 [ 1.    -0.189  1.     1.     1.   ]
 [ 1.    -0.189  1.     1.     1.   ]]
'''

print( np.corrcoef(a)*0.5+0.5 ) #相關係數矩陣的值域由[-1,1]對映為[0,1]
'''
[[ 1.      0.988   0.5524]
 [ 0.988   1.      0.5895]
 [ 0.5524  0.5895  1.    ]]
'''

print( ' ################################################# ' )


def calc(data):
    n = len(data)
    niu = 0.0
    niu2 = 0.0
    niu3 = 0.0
    for a in data:
        niu += a
        niu2 += a**2
        niu3 += a**3
    niu/= n   #這是求E(X)
    niu2 /= n #這是E(X^2)
    niu3 /= n #這是E(X^3)
    sigma = math.sqrt(niu2 - niu*niu) #這是D(X)的開方,標準差
    return [niu,sigma,niu3] #返回[E(X),標準差,E(X^3)]

def calc_stat(data):
    [niu,sigma,niu3] = calc(data)
    n = len(data)
    niu4 = 0.0
    for a in data:
        a -= niu
        niu4 += a ** 4
    niu4 /= n   
    skew = (niu3 - 3*niu*sigma**2 - niu**3)/(sigma**3)
    kurt =  niu4/(sigma**2)
    return [niu,sigma,skew,kurt] #返回了均值,標準差,偏度,峰度

if __name__ == "__main__":
    data = list(np.random.randn(10000))#關於此處的陣列與列表
    data2 = list(2*np.random.randn(10000))
    data3 = [x for x in data if x> -0.5]
    data4 = list(np.random.uniform(0,4,10000))
    [niu,sigma,skew,kurt] = calc_stat(data)
    [niu2,sigma2,skew2,kurt2] = calc_stat(data2)
    [niu3,sigma3,skew3,kurt3] = calc_stat(data3)
    [niu4,sigma4,skew4,kurt4] = calc_stat(data4)
    
    print (niu,sigma,skew,kurt)
    print (niu2,sigma2,skew2,kurt2)
    print (niu3,sigma3,skew3,kurt3)
    print (niu4,sigma4,skew4,kurt4)

    info = r'$\mu=%.2f,\ \sigma=%.2f,\ skew=%.2f,\ kurt=%.2f$'%(niu,sigma,skew,kurt)
    info2 = r'$\mu=%.2f,\ \sigma=%.2f,\ skew=%.2f,\ kurt=%.2f$'%(niu2,sigma2,skew2,kurt2)
    plt.text(1,0.38,info,bbox=dict(facecolor='red',alpha=0.25))
    plt.text(1,0.35,info2,bbox=dict(facecolor='green',alpha=0.25))
    #plt.text(x的位置,y的位置,面板內寫的資訊,標籤框的屬性=dict(facecolor='面板顏色',alpha='深淺度'))
    plt.hist(data,50,normed=True,facecolor='r',alpha=0.9)
    #hist直方圖/箱式圖(
    #將data中的元素分到50個等間隔的範圍內,返回每個範圍內元素的個數作為一個行向量,
    #50代表要分的元素的個數
    #
    #facecolor,alpha都是代表顏色的)
    plt.hist(data2,80,normed=True,facecolor='g',alpha = 0.8)
    plt.grid(True)
    plt.show()