Python数据分析基础教程/王斌会
第四章 数据的探索性分析
- 4.1数据的表述分析
4.1.1基本描述统计量
4.1.2计数数据的汇总分析
4.1.3计量数据的汇总分析
#(1)均数(算术平均数)
BSdata.身高.mean()
#(2)中位数
BSdata.身高.median()
#(3)极差
BSdata.身高.max()-BSdata.身高.min()
#(4)方差
BSdata.身高.var()
#(5)标准差
BSdata.身高.std()
#(6)四分位数间距
BSdata.身高.quantile(0.75)-BSdata.身高.quantile(0.25)
#(7)偏度
BSdata.身高.skew()
#(8)峰度
BSdata.身高.kurt()
#(9)自定义计算基本统计量函数
def stats(x):
stat=[x.count(),x.min(),x.quantile(.25),x.mean(),x.median(),
x.quantile(.75),x.max(),x.max()-x.min(),x.var(),x.std(),x.skew(),x.kurt()]
stat=pd.Series(stat,index=['Count','Min', 'Q1(25%)','Mean','Median',
'Q3(75%)','Max','Range','Var','Std','Skew','Kurt'])
x.plot(kind='kde') #拟合核密度 kde 曲线,见下节
return(stat)
stats(BSdata.身高)
stats(BSdata.支出)
- 4.2基本绘图命令
import matplotlib.pyplot as plt #基本绘图包
plt.rcParams['font.sans-serif']=['KaiTi']; #SimHei黑体
plt.rcParams['axes.unicode_minus']=False; #正常显示图中负号
4.2.1常用会图工具–基于matplotlib
#(1)常用的统计图函数
#(2)图形参数设置
X=['A','B','C','D','E','F','G']
Y=[1,4,7,3,2,5,6]
plt.bar(X,Y); # 条图
plt.pie(Y,labels=X); # 饼图
#plt.pie(Y,labels=X,autopct='%1.2f%%')
plt.plot(X,Y) #线图 plot
plt.hist(BSdata.身高) # 频数直方图
plt.hist(BSdata.身高,density=True) # 频率直方图
plt.scatter(BSdata.身高, BSdata.体重); # 散点图
plt.xlabel(u'身高');plt.ylabel(u'体重');
#(3)图形参数设置
plt.plot(X,Y,c='red');
plt.ylim(0,8);
plt.xlabel('names');plt.ylabel('values');
plt.xticks(range(len(X)), X);
plt.plot(X,Y,linestyle='--',marker='o');
plt.plot(X,Y,'o--'); plt.axvline(x=1);plt.axhline(y=4);
#plt.vlines(1,0,6,colors='r');plt.hlines(4,0,6);
plt.plot(X,Y);plt.text(2,7,'peakpoint')
plt.plot(X,Y,label=u'折线');
plt.legend();
#误差条图
s=[0.1,0.4,0.7,0.3,0.2,0.5,0.6]
plt.bar(X,Y,yerr=s,error_kw={'capsize':5})
#(4)多图
plt.figure(figsize=(12,6));
plt.subplot(121); plt.bar(X,Y);
plt.subplot(122); plt.plot(Y);
plt.figure(figsize=(7,10));
plt.subplot(211); plt.bar(X,Y);
plt.subplot(212); plt.plot(Y);
fig,ax = plt.subplots(1,2,figsize=(14,6))
ax[0].bar(X,Y)
ax[1].plot(X,Y)
fig,ax=plt.subplots(2,2,figsize=(15,10))
ax[0,0].bar(X,Y); ax[0,1].pie(Y,labels=X)
ax[1,0].plot(Y); ax[1,1].plot(Y,'.-',linewidth=3);
4.2.1常用会图工具–基于pandas
###4.2.2 基于pandas 的绘图
BSdata['体重'].plot(kind='line');
BSdata['体重'].plot(kind='hist')
BSdata['体重'].plot(kind='box');
BSdata['体重'].plot(kind='density',title='Density');
BSdata[['身高','体重','支出']].plot(subplots=True,layout=(1,3),kind='box')
BSdata[['身高','体重','支出']].plot(subplots=True,layout=(1,3),kind='density')
BSdata[['身高','体重','支出']].plot(subplots=True,layout=(3,1),kind='density')
T1=BSdata['开设'].value_counts();T1
pd.DataFrame({'频数':T1,'频率':T1/T1.sum()*100})
T1.plot(kind='bar'); #T1.sort_values().plot(kind='bar');
T1.plot(kind='pie');
效果图
- 4.3数据的分类分析
4.3.1一维数据分析
4.3.2二维数据分析
4.3.3计量数据分析
4.3.4多维数据分析
-附件:第四章代码汇总
#4 数据的探索性分析
##4.1 数据的描述分析
###4.1.1基本描述统计量
BSdata.describe()
BSdata[['性别','开设','课程','软件']].describe()
####4.1.2计数数据汇总分析
#(1)频数:绝对数
T1=BSdata.性别.value_counts();T1
#(2)频率:相对数
T1/sum(T1)*100
###4.1.3 计量数据汇总分析
#(1)均数(算术平均数)(2)中位数(3)极差(4)方差(5)标准差(6)四分位数间距(7)偏度(8)峰度 (同上 略)
####(9)自定义计算基本统计量函数!!
def stats(x):
stat=[x.count(),x.min(),x.quantile(.25),x.mean(),x.median(),
x.quantile(.75),x.max(),x.max()-x.min(),x.var(),x.std(),x.skew(),x.kurt()]
stat=pd.Series(stat,index=['Count','Min', 'Q1(25%)','Mean','Median',
'Q3(75%)','Max','Range','Var','Std','Skew','Kurt'])
x.plot(kind='kde') #拟合核密度 kde 曲线,见下节
return(stat)
stats(BSdata.身高)
stats(BSdata.支出)
#4.2 基本绘图命令
##4.2.1 常用的绘图函数
import DaPy1func as da
da.stats(BSdata.身高)
da.stats(BSdata.支出)
import matplotlib.pyplot as plt #基本绘图包
plt.rcParams['font.sans-serif']=['KaiTi']; #SimHei黑体
plt.rcParams['axes.unicode_minus']=False; #正常显示图中负号
plt.figure(figsize=(6,5)); #图形大小
'''本地直接显示图形'''
matplotlib inline
#(1)常用的统计图函数
#(2)图形参数设置
####二、计数数据的基本统计图
#############同上略
###4.2.2 基于pandas 的绘图
#############同上略
##4.3 数据的分类分析
###4.3.1 一维频数分析
####4.3.1.1 计数数据频数分布
#(1)pivot_table
BSdata['开设'].value_counts()
#pd.pivot_table(BSdata,values='学号',index='开设',aggfunc=len)
#BSdata.pivot_table(values='学号',index='开设',aggfunc=len)
# (2) 计数频数表
def tab(x,plot=False): #计数频数表
f=x.value_counts();f
s=sum(f);
p=round(f/s*100,3);p
T1=pd.concat([f,p],axis=1);
T1.columns=['例数','构成比'];
T2=pd.DataFrame({'例数':s,'构成比':100.00},index=['合计'])
Tab=T1.append(T2)
if plot:
fig,ax = plt.subplots(2,1,figsize=(8,15))
ax[0].bar(f.index,f); # 条图
ax[1].pie(p,labels=p.index,autopct='%1.2f%%'); # 饼图
return(round(Tab,3))
tab(BSdata.开设,True)
####4.3.1.2 计量数据频数分布
#(1)身高频数表
pd.cut(BSdata.身高,bins=10).value_counts()
pd.cut(BSdata.身高,bins=10).value_counts().plot(kind='bar');
#(2)支出频数表
pd.cut(BSdata.支出,bins=[0,10,30,100]).value_counts()
pd.cut(BSdata.支出,bins=[0,10,30,100]).value_counts().plot(kind='bar');
# (3) 计量频数表
def freq(X,bins=10): #计量频数表与直方图
H=plt.hist(X,bins);
a=H[1][:-1];a
b=H[1][1:];b
f=H[0];f
p=f/sum(f)*100;p
cp=np.cumsum(p);cp
Freq=pd.DataFrame([a,b,f,p,cp])
Freq.index=['[下限','上限)','频数','频率(%)','累计频数(%)']
return(round(Freq.T,2))
freq(BSdata.体重)
###4.3.2 二维集聚分析
####4.3.2.1 计数数据的列联表
#(1)二维列联表
pd.crosstab(BSdata.开设,BSdata.课程)
pd.crosstab(BSdata.开设,BSdata.课程,margins=True)
pd.crosstab(BSdata.开设,BSdata.课程,margins=True,normalize='index')
pd.crosstab(BSdata.开设,BSdata.课程,margins=True,normalize='columns')
pd.crosstab(BSdata.开设,BSdata.课程,margins=True,normalize='all').round(3)
BSdata.pivot_table('学号','开设','课程',aggfunc=len)
BSdata.pivot_table('学号',index='开设',columns='课程',aggfunc=len)
pd.pivot_table(BSdata,values='学号',index='开设',columns='课程',aggfunc=len)
BSdata
#(2)复式条图
T2=pd.crosstab(BSdata.开设,BSdata.课程);T2
T2.plot(kind='bar');
T2.plot(kind='barh');
T2.plot(kind='bar',stacked=True);
####4.3.2.2 计量数据的集聚表
#(1)groupby函数
BSdata.groupby(['性别'])
type(BSdata.groupby(['性别']))
BSdata.groupby(['性别'])['身高'].mean()
BSdata.groupby(['性别'])['身高'].size()
BSdata.groupby(['性别','开设'])['身高'].mean()
#(2)agg函数
BSdata.groupby(['性别'])['身高'].agg([np.mean, np.std])
#(3)应用apply()
BSdata.groupby(['性别'])['身高','体重'].apply(np.mean)
BSdata.groupby(['性别','开设'])['身高','体重'].apply(np.mean)
###4.3.3 多维透视分析
####4.2.3.1 计数数据的透视分析
#(1)pivot_table
BSdata.pivot_table(index=['性别'],values=['学号'],aggfunc=len)
BSdata.pivot_table(values=['学号'],index=['性别','开设'],aggfunc=len)
BSdata.pivot_table(values=['学号'],index=['开设'],columns=['性别'],aggfunc=len)
####4.2.3.2 计量数据的透视分析
#pd.pivot_table(BSdata,index=["性别"],aggfunc=len)
BSdata.pivot_table(index=['性别'],values=["身高"],aggfunc=np.mean)
BSdata.pivot_table(index=['性别'],values=["身高"],aggfunc=[np.mean,np.std])
BSdata.pivot_table(index=["性别"],values=["身高","体重"])
####4.2.3.3 复合数据的透视分析
pd.pivot_table(BSdata,index=["性别","开设"],aggfunc=len,margins=True)
BSdata.pivot_table('学号', ['性别','开设'], '课程', aggfunc=len, margins=True, margins_name='合计')
pd.pivot_table(BSdata,index=["性别"],aggfunc=np.mean)
BSdata.pivot_table(['身高','体重'],['性别',"开设"],aggfunc=[len,np.mean,np.std] )