描述型统计学常用统计量与数学符号
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