描述統計學、推斷統計學、假設檢驗、計算person相關係數
阿新 • • 發佈:2019-02-18
''' 描述統計學 –集中趨勢 –離散趨勢 –偏態 假設檢驗 –基本原理 –基本概率 統計學可以分為:描述統計學與推斷統計學 描述統計學:使用特定的數字或圖表來體現資料的集中程度和離散程度。例:每次考試算的平均分,最高分,各個分段的人數分佈等,也是屬於描述統計學的範圍。 推斷統計學:根據樣本資料推斷總體資料特徵。例:產品質量檢查,一般採用抽檢,根據所抽樣本的質量合格率作為總體的質量合格率的一個估計。 應用:統計學的應用十分廣泛,可以說,只要有資料,就有統計學的用武之地。目前比較熱門的應用:經濟學,醫學,心理學等。 ''' # -*- 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()