赞
踩
1.数据的集中趋势
(1)平均值
import pandas as pd # 1.算数平均值 cars_score=pd.read_csv(r'D:\Projects\Python\Doing\pythonProject\data\cars_score.csv') print(cars_score.mean(axis=0)) ''' 油耗 3.752 动力 4.429 外观 4.763 空间 4.701 dtype: float64 ''' # 2.加权平均值 RFM=pd.read_excel(r'D:\Projects\Python\Doing\pythonProject\data\RFM.xlsx') RFM['Weight_Mean']=0.2*RFM['R_score']+0.5*RFM['F_score']+0.3*RFM['M_score'] print(RFM.head()) ''' lst_order_date freq tot_amt R_score F_score M_score Weight_Mean 0 2017-06-01 5 1469.99998 6 4 6 5.0 1 2016-07-11 2 168.00000 3 2 2 2.2 2 2017-07-02 1 79.00000 6 1 1 2.0 3 2016-06-01 1 109.00000 1 1 2 1.3 4 2017-02-19 3 316.00000 5 3 4 3.7 ''' # 3.几何平均值 GDP=pd.read_excel(r'D:\Projects\Python\Doing\pythonProject\data\G_D_P.xlsx') # 利用cumprod方法实现所有元素的累计乘积 cum_prod=GDP.Grouth.cumprod() # 基于cum_prod结果,利用索引将最后一个累积元素取出来 res=cum_prod[GDP.shape[0]-1] # 计算几何平均值 print(pow(res,1/len(cum_prod))) # 0.08776443979162651
(2)中位数和四分位数
import pandas as pd import matplotlib.pyplot as plt tips=pd.read_csv(r'D:\Projects\Python\Doing\pythonProject\data\tips.csv') # 基于pandas模块中的hist方法绘制直方图 tips.tip.hist(grid=False, # 去除图框内的网格线 facecolor='steelblue', # 直方图的探充塞 edgecolor='black' # 直方图的边框色 ) # plt.show() # 1.中位数、均值 print(tips.tip.median()) # 2.9 print(tips.tip.mean()) #2.9982786885245902 # 2.四分位点 print(tips.tip.quantile(q=0.25)) print(tips.tip.quantile(q=0.75))
(3)众数
import pandas as pd titanic=pd.read_excel(r'D:\Projects\Python\Doing\pythonProject\data\Titanic.xlsx') print(titanic.Embarked.mode()) ''' 0 S dtype: object ''' income=pd.read_excel(r'D:\Projects\Python\Doing\pythonProject\data\Income.xlsx') # 返回众数所在组的行索引 index=income.Counts.argmax() # 返回众数所在组的下限、上限 L=int(income.Income[index].split(',')[0][1:]) U=int(income.Income[index].split(',')[1][:-1]) # 返回左邻与右邻组所对应的频次 LF=income.Counts[index-1] RF=income.Counts[index+1] # 计算众数 print(L+LF/(LF+RF)*(U-L)) # 6871.508379888268
2.数据的分散趋势
(1)方差与标准差
Var=tips.tip.var() # 1.9144546380624725
Std=tips.tip.std() # 1.3836381890011826
(2)极差与四分位差
极差是指数值型变量中最大值和最小值之间的差,体现的是数据范围的跨度,如果该值越大,说明数据越分散,反之越集中。
四分位差则是上四分位数与下四分位数之间的差,反映的是中间50%数据的离散程度,如果该值越大,则说明中间部分的数据越分散,反之越集中。
import pandas as pd
import matplotlib.pyplot as plt
tips=pd.read_csv(r'D:\Projects\Python\Doing\pythonProject\data\tips.csv')
# 筛选出男性顾客与女性顾客的小费数据
tip_man=tips.tip[tips.sex=='Male']
tip_woman=tips.tip[tips.sex=='Female']
# 统计男性顾客与女性顾客的样本量
print(len(tip_man),len(tip_woman)) # 157 87
# 计算男性顾客与女性顾客所支付小费的变异系数
cv_man=tip_man.mean()/tip_man.std()
cv_woman=tip_woman.mean()/tip_woman.std()
print(cv_man,cv_woman) # 2.0748197374250794 2.4436927167952036
(3)变异系数
当需要比较两组数据的分散程度时,如果两组数据的样本量悬殊或者数据量纲不同,就不能使用方差或标准差。而变异系数能够消除样本量或量纲的影响,其计算原理是将数据的标准差与算术平均值作商。
import pandas as pd
tips=pd.read_csv(r'D:\Projects\Python\Doing\pythonProject\data\tips.csv')
# 筛选出男性顾客与女性顾客的小费数据
tip_man=tips.tip[tips.sex=='Male']
tip_woman=tips.tip[tips.sex=='Female']
# 统计男性顾客与女性顾客的样本量
print(len(tip_man),len(tip_woman)) # 157 87
# 计算男性顾客与女性顾客所支付小费的变异系数
cv_man=tip_man.mean()/tip_man.std()
cv_woman=tip_woman.mean()/tip_woman.std()
print(cv_man,cv_woman) # 2.0748197374250794 2.4436927167952036
(4)describe方法,提供数据的描述性函数,默认对所有数值型变量做统计汇总
print(tips.describe()) ''' total_bill tip size count 244.000000 244.000000 244.000000 mean 19.785943 2.998279 2.569672 std 8.902412 1.383638 0.951100 min 3.070000 1.000000 1.000000 25% 13.347500 2.000000 2.000000 50% 17.795000 2.900000 2.000000 75% 24.127500 3.562500 3.000000 max 50.810000 10.000000 6.000000 ''' # 通过指定include参数可以实现离散型变量的统计汇总 print(tips.describe(include=['object'])) ''' sex smoker day time count 244 244 244 244 unique 2 2 4 2 top Male No Sat Dinner freq 157 151 87 176 '''
3.数据的分布形态,反应的是数据的形体特征,如密度曲线表现为高矮胖瘦,非对称等特点。最典型的是正态分布。对于数据的分布形态可以通过计算其偏度和峰度指标,进而得到数据是否近似正态分布或者是否存在尖峰厚尾的特征。
Skew计算偏度,Skew>0,表示数据呈右偏特征;Skew<0表示数据为左偏。
Kurt计算峰度,Kurt>0表示数据为尖峰;Kurt<0表示数据为厚尾,都是相对于倒钟形的正态分布而言。
forestfires=pd.read_csv(r'D:\Projects\Python\Doing\pythonProject\data\forest fires.csv')
# 计算受灾面积的偏度
print(forestfires.area.skew()) # 12.846933533934866
# 计算受灾面积的峰度
print(forestfires.area.kurt()) # 194.1407210942299
结果显示,受灾面积的偏度为12.847>0, 数据表现为右偏的特征,说明少部分森林面积受灾面积非常大:受灾面积的峰度为194.141>0, 则说明数据具有尖峰的特征,主要的受灾面积集中在某个小范围数值内。偏度和峰度的计算,是从定量的角度判断数据的分布特征,同时,还可以通过绘制直方图直观地反映出数据的体态特征。
关于直方图的绘制,可以调用matplotib模块中的hist函数:
hist(x, bins=10, range=None, normed=False,weights=None, cumulative=False,
bottom=None,histtype=’bar’, align=‘mid’, orientation=‘vertical’,rwidth=None,
log=False, color=None, edgecolor,label=None, stacked=False)
forestfires=pd.read_csv(r'D:\Projects\Python\Doing\pythonProject\data\forest fires.csv')
plt.hist(x=forestfires.area, # 指定绘图数据
bins=50, # 指定直方图中条形数量为50个
color='steelblue',
edgecolor='black'
)
plt.show()
4.数据的相关关系,变量之间是否存在某种相关或依存关系,最直观的是散点图
除了绘图,还可以通过计算两个变量之间的相关系数来判断变量之间的相关性,通过这种定量的方法,可以得知变量之间相关性的高低,如Pearson相关系数。
ccpp=pd.read_excel(r'D:\Projects\Python\Doing\pythonProject\data\C_C_P_P.xlsx')
# 使用corrwith方法计算PE变量与其余变量之间的相关系数
print(ccpp.corrwith(ccpp.PE))
'''
AT -0.948128
V -0.869780
AP 0.518429
RH 0.389794
PE 1.000000
dtype: float64
'''
对于散点图的绘制可以调用scatter函数
scatter(x,y,s=20,c=None,marker=’o’,cmap=None,vmin=None,vman=None.alpha=None,
linewidths=None,degecolor=None)
plt.scatter(x=ccpp.AT,y=ccpp.PE,
c='steelblue',
alpha=0.7,
edgecolors='black'
)
# 添加x轴和y轴标签
plt.xlabel('AT')
plt.ylabel('PE')
plt.show()
如果需要绘制多个数值型变量之间的两两散点图,推荐使用seaborn模块中的pairplot函数,不仅可以绘制两两的散点图,还可以绘制单变量的直方图分布。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
ccpp=pd.read_excel(r'D:\Projects\Python\Doing\pythonProject\data\C_C_P_P.xlsx')
sns.pairplot(ccpp)
plt.show()
下三角反映数值型变量之间的两两三点关系(如RH与V变量之间几乎不存在相关性,AT和V变量之间成一定的正相关关系),对角线上是单变量的直方图。
5.数据的波动趋势,主要反映的是某个数值型变量随时间的推移,它所表现出来的波动特征。对于波动特征的解释往往可以拆分为趋势线波动(即数据呈现波浪式上升或下降的特征),季节性波动(即数据随着季节性因素呈现有规律的波动特征)和周期性波动(即数据随着人为的周期性因素呈现有规律地波动特征(如各大电商定期搞的促销活动,导致数据的周期波动))。可以借助于折线图直观的呈现。
import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl sales=pd.read_excel(r'D:\Projects\Python\Doing\pythonProject\data\trans_amt.xlsx') # 将date变量转换为日期型变量 sales.month=pd.to_datetime(sales.month,format='%Y年%m月') # 绘制每月的销售额 plt.plot(sales.month,sales.trans_amt,linestyle='-',linewidth=2,color='steelblue', marker='o',markersize=4,markeredgecolor='black',markerfacecolor='black') # 获取图的坐标信息 ax=plt.gca() # 设置日期的显示格式 date_format=mpl.dates.DateFormatter("%y/%m") ax.xaxis.set_major_formatter(date_format) # 设置x轴显示多少个日期刻度 xlocator=mpl.ticker.LinearLocator(18) ax.xaxis.set_major_locator(xlocator) # 将刻度标签旋转45° plt.xticks(rotation=45) plt.show()
数据描述重点是对数据的汇总或探索,反映数据的特征或规律。数据推断,则是对数据深层次的探索或挖掘,用于验证数据是否服从某种假设,这部分内容将以数据的正态性检验、卡方检验和 t检验为例,结合Python讲解具体的使用方法。
1.正态性检验——以二手房数据分析为例
(1)直方图法
基于直方图既可以得到数据的集中趋势,也可以直观地发现数据的分布特征。本节将在直方图的基础上添加核密度曲线(即数据的实际分布曲线)和理论的正态密度曲线,进一步对比实际分布与理论分布之间的差异。对于图形的绘制,可以利用seaborn模块中的distplot函数。
distplot(a, bins=None, hist=True, kde=True, rug=False, fit= None,hist_kws=None,
kde_kws= None, rug_kws=None, fit_kws=None,color=None,vertical=False,
norm_hist=False,axlabel=None,label=None, ax=None)
#读入外部数据 sec_buildings=pd.read_excel(r'D:\Projects\Python\Doing\pythonProject\data\sec_buildings.xlsx') # 数据的预览 # print(sec_buildings.head()) ''' block type size ... price built_date price_unit 0 梅园六街坊 2室0厅 47.72 ... 500 1992年建 104777 1 碧云新天地(一期) 3室2厅 108.93 ... 735 2002年建 67474 2 博山小区 1室1厅 43.79 ... 260 1988年建 59374 3 金桥新村四街坊(博兴路986弄) 1室1厅 41.66 ... 280 1997年建 67210 4 博山小区 1室0厅 39.77 ... 235 1987年建 59089 [5 rows x 9 columns] ''' # 中文和负号的正常显示 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] plt.rcParams['axes.unicode_minus']=False # 基于直方图判断数据是否服从正态分布 sns.distplot(a=sec_buildings.price,fit=stats.norm, # 指定绘制理论的正态分布曲线 norm_hist=True, # 绘制频率直方图 #设置直方图的属性(填充色和边框色) hist_kws={'color':'steelblue','edgecolor':'black'}, # 设置核密度曲线的属性(线条颜色、类型和标签) kde_kws={'color':'black','linestyle':'--','label':'核密度曲线'}, # 设置理论正态分布曲线的属性(线条颜色、类型和标签) fit_kws={'color':'red','linestyle':':','label':'正态密度曲线'}) # 显示图例 plt.legend() # 显示图形 plt.show()
直方图存在明显的右偏特征(即长尾巴拖在右侧),而且实际的核密度曲线与理论的正态密度曲线之间的吻合度也不是很高,故基本可以认定二手房的总价并不服从正态分布。
(2)PP图与QQ图
PP图的思想是比对正态分布的累计概率值和实际分布的累计概率值,而QQ图则比对正态分布的分位数和实际分布的分位数。利用它们判断变量是否近似服从正态分布的标准是:如果散点比较均匀地散落在倾斜线上,则说明变量近似服从正态分布,否则就认为数据不服从正态分布。
# 中文和负号的正常显示 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] plt.rcParams['axes.unicode_minus']=False #读入外部数据 sec_buildings=pd.read_excel(r'D:\Projects\Python\Doing\pythonProject\data\sec_buildings.xlsx') #基于PP图和QQ图判断数据是否服从正态分布 PP_qq_plot = sm.ProbPlot(sec_buildings.price) #绘制PP图 PP_qq_plot.ppplot(line='45') plt.title('P-P图') #绘制QQ图 PP_qq_plot.qqplot(line='q') plt.title('Q-Q图') #显示图形 plt.show()
(3) Shapiro检验法和K-S检验法
Shapiro检验法和K-S检验法均属于非参数的统计方法,它们的原假设被设定为变量服从正态分布,两者的最大区别在于适用的样本量不一致,如果样本量低于5000时,Shapiro 检验法比较合理,否则应使用K-S检验法。不管是Shapiro检验法还是K-S检验法,它们的原假设都是认为数据服从正态分布。
#读入外部数据
sec_buildings=pd.read_excel(r'D:\Projects\Python\Doing\pythonProject\data\sec_buildings.xlsx')
#基于定量的K-S检验法判断数据是否服从正态分布
KstestResult=stats.kstest(rvs =sec_buildings.price, #指定待检验的数据
#利用实际数据的均值和标准差设定理论的正态分布
args = (sec_buildings.price.mean(), sec_buildings.price.std()),
cdf= 'norm' #指定累计分布函数为正态函数
)
print(KstestResult)
# KstestResult(statistic=0.1683380890487141, pvalue=0.0)
样本量低于5000时,就需要使用Shapiro检验法
import scipy.stats as stats
import numpy as np
#生成正态分布和均匀分布随机数
x1 = np.random.normal(loc = 5, scale=2, size = 3500)
x2 = np.random.uniform(low= 1, high = 100, size = 4000)
#正态性检验
Shapiro_Testl = stats.shapiro(x= x1)
Shapiro_Test2 = stats.shapiro(x =x2)
#打印检验结果
print(Shapiro_Testl)
# ShapiroResult(statistic=0.9994206428527832, pvalue=0.36653921008110046)
print(Shapiro_Test2)
# ShapiroResult(statistic=0.9544370174407959, pvalue=1.2759395165805866e-33)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。