思維導圖
常用統計量
描述型統計學常用統計量與數學符號
python實現
1、基本統計量的python實現
#導入包
import pandas as pd
import numpy as np
from scipy import stats
import math
"""
Scipy是一個高級的科學計算庫,Scipy一般都是操控Numpy數組來進行科學計算,
Scipy包含的功能有最優化、線性代數、積分、插值、擬合、特殊函數、快速傅里葉變換、
信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算。
"""
a = [1,2,4,5,3,12,12,23,43,52,11,22,22,22]
a_mean = np.mean(a) #均值
a_med = np.median(a) #中位數
print("a的平均數:",a_mean)
print("a的中位數:",a_med)
#Scipy庫計算衆數
a_m1 =stats.mode(a)[0][0]
print("a的衆數:",a_m1)
#將一維數組轉成Pandas的Series,然後調用Pandas的mode()方法
ser = pd.Series(a)
a_m2 = ser.mode() #得到的是Series
print("a的衆數:",a_m2.iloc[0])
# 轉成pandas的數據框,返回df數據框
# 包含 計數、均值、標準差、最大最小值,中位數,1/4分位數 ,3/4分位數
a_des=pd.DataFrame(a).describe()
print(a_des)
"""
變異係數是刻畫數據相對分散性的一種度量。
變異係數只在平均值不爲零時有定義,而且一般適用於平均值大於零的情況。變異係數也被稱爲標準離差率或單位風險。
當需要比較兩組數據離散程度大小的時候,如果兩組數據的測量尺度相差太大,或者數據量綱的不同,變異係數可以消除測量尺度和量綱的影響。
"""
a_var = np.var(a) #方差
a_std1 = np.sqrt(a_var) #標準差
a_std2 = np.std(a) #標準差
a_mean = np.mean(a) #均值
a_cv = a_std2 /a_mean #變異係數
print("a的方差:",a_var)
print("a的標準差:",a_std1)
print("a的標準差:",a_std2)
print("a的均值:",a_mean)
print("a的變異係數:",a_cv)
2、頻率分佈表
案例題目:
data=pd.read_excel("Return.xlsx",sheet_name=1)
#data.groupby('Country').agg('mean')
data.head()
print(data.describe())
return_min=data['ArithmeticMean(%)'].min()
return_max=data['ArithmeticMean(%)'].max()
# 組距 = (最大值-最小值)/組數
# math.ceil向上取整 math.floor向下取整
int_val=(math.ceil(return_max)-math.floor(return_min))/5
print("最大回報:",return_min)
print("最小回報:",return_max)
print("組距:",int_val)
#構造頻率分佈表
l1=[i for i in range(math.floor(return_min),math.ceil(return_max)+1,int(int_val))]
fre_dis= pd.DataFrame(['%s to %s'%( l1[l1.index(j)-1],j) for j in l1[1:]],columns=['Interval'])
fre_dis.index=fre_dis.Interval
fre_dis['MIN']=fre_dis.Interval.str.split('to').str[0].str.strip().astype(int)
fre_dis['MAX']=fre_dis.Interval.str.split('to').str[1].str.strip().astype(int)
bins=fre_dis.MIN.tolist()
bins.append(max(bins)+1)
group_names=fre_dis.index.tolist()
#分組打標
group=pd.cut(data['ArithmeticMean(%)'].values,bins,labels=group_names,right=False)
#標籤——可以定義傳入labels,
#傳入series時labels有效,傳入list,labels默認0,1,2,3目前沒找到原因
print(group.codes)
#分組區間,長度1
print(group.categories)
#series,區間——個數
_freq=group.value_counts()
#
print(_freq.index)
# 頻率分佈直方圖
import matplotlib.pyplot as plt
_freq.plot(kind='bar',figsize=(10,6))
#頻率分佈表
data1=data.copy()
Inteval=pd.cut(data['ArithmeticMean(%)'],bins,right=False)
data1['區間']=Inteval.values
data1.groupby('區間').median()
data1.groupby('區間').mean()#每個區間平均數
_freq_df=pd.DataFrame(_freq,columns=['頻數'])
_freq_df['頻率%']=_freq_df / _freq_df['頻數'].sum()
_freq_df['頻率%']=_freq_df['頻率%'].map(lambda x:'%.2f%%'%(x*100))
_freq_df['累計頻數']=_freq_df['頻數'].cumsum()
_freq_df['累計頻率%']=_freq_df['累計頻數'].map(lambda x: x/ _freq_df['頻數'].sum())
_freq_df['累計頻率%']=_freq_df['累計頻率%'].map(lambda x:'%.2f%%'%(x*100))
_freq_df