如何使用Python程序完成描述性統(tǒng)計分析需求
一、前言
1.1 關(guān)于描述性統(tǒng)計分析
概括地來說,描述性統(tǒng)計分析就是在收集到的數(shù)據(jù)的基礎(chǔ)上,運用制表和分類,圖形以及計算概括性數(shù)據(jù)來描述數(shù)據(jù)特征的各項活動。重要的是,該方法主要內(nèi)容包括頻數(shù)分析、集中趨勢分析、離散程度分析、分布以及一些基本的統(tǒng)計圖形。
1.2 本篇目的
本篇內(nèi)容主要是編寫python代碼,以實現(xiàn)描述性統(tǒng)計的基本需求,即通過程序獲得在描述性統(tǒng)計分析時所需要的數(shù)據(jù)內(nèi)容。具體見下。
1.3 提示
本系列篇屬于實踐類型的代碼編寫,需要一定的代碼基礎(chǔ),因此有不理解的函數(shù)或方法可以查找他人的教程或是看本人所寫的基礎(chǔ)篇分享。本篇的中心內(nèi)容是2.1與2.2部分,該部分代碼可直接使用,根據(jù)需要可自行修改;而2.3可視化部分了解思路與代碼框架即可,代碼可根據(jù)個人需要重寫。
二、程序內(nèi)容的編寫
2.1 導(dǎo)入數(shù)據(jù)與前期處理
首先是導(dǎo)入excel表格里的數(shù)據(jù),并進(jìn)行一些基本的設(shè)置。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
pd.set_option('display.max_columns',1000)
pd.set_option("display.width",1000)
pd.set_option('display.max_colwidth',1000)
pd.set_option('display.max_rows',1000)#將行和列的最大展示值設(shè)置到1000,則可展示更多的行而不是以省略號形式展示。
df=pd.read_excel(r'D:\雜貨\編碼數(shù)據(jù).xlsx',sheet_name='編碼數(shù)據(jù)')第一、二、三行分別是導(dǎo)入pandas,numpy,matplotlib庫,后面會用到庫的內(nèi)容來編寫。
第四到第七行分別是將導(dǎo)入列表的輸出展示內(nèi)容擴(kuò)大到1000的數(shù)量(按照需要,1000這個數(shù)值還可以設(shè)置的更大),這樣在打印輸出表格的時候,就不會出現(xiàn)省略號省略掉中間內(nèi)容的情況。就像我在第一篇基礎(chǔ)篇中導(dǎo)入excel時出現(xiàn)的情況:

設(shè)置好后的輸出情況:

導(dǎo)入excel表格具體可看我第一篇內(nèi)容:如何在Python中導(dǎo)入EXCEL數(shù)據(jù)
2.2 描述性統(tǒng)計分析所要計算的數(shù)據(jù)
通常,描述性統(tǒng)計分析需要各變量的觀測值數(shù)量、均值、方差、標(biāo)準(zhǔn)差、最大最小值等,而在python中可運用庫的方法計算出各個數(shù)據(jù)。詳細(xì)代碼見以下:
obs=df.count()#觀測值
means=df.mean()#均值
var=df.var()#方差
std=df.std()#標(biāo)準(zhǔn)差
min=df.min()#最小值
max=df.max()#最大值
mode=df.mode()#眾數(shù)
siyi=df.quantile(0.25)#四分之一位數(shù)
sisan=df.quantile(0.75)#四分之三位數(shù)
median=df.median()#中位數(shù)
skew=df.skew()#偏度
kurt=df.kurt()#峰度
print("最大值:\n",max,'\n',"最小值:\n",min,'\n','觀測量:\n',obs,'\n','均值:\n',means,'\n',
"方差:\n",var,"\n",'標(biāo)準(zhǔn)差:\n',std,'\n',"眾數(shù): ",mode,"\n",'四分之一位數(shù):\n',siyi,'\n',
'四分之三位數(shù):\n',sisan,'\n','中位數(shù):\n',median,'\n','偏度:\n',skew,'\n','峰度:\n',kurt)代碼的含義在注釋中已經(jīng)標(biāo)注出來了,不再贅述。(print里的“\n”表示換行輸出)在運行以上代碼后,可以得到excel表格中每一列的對應(yīng)數(shù)據(jù),展示如下:

輸出的樣式如上圖,由于結(jié)果太多太長,就不一一展示。
2.3 數(shù)據(jù)可視化
2.3.1 概述
描述性統(tǒng)計分析中,除了列出以上的分析數(shù)據(jù)以外,在多數(shù)情況下仍然需要對重要的數(shù)據(jù)給出可視化的內(nèi)容,即作圖。數(shù)據(jù)可視化的圖的類型有很多種,比如說折線圖、柱狀圖、條形圖、散點圖、氣泡圖、雷達(dá)圖、箱線圖等。而在一般的數(shù)據(jù)分析類報告中,最常用的便是折線圖、柱狀圖,因此在本篇中只介紹這兩種可視化方法,其他的在后續(xù)教程分享中會按需要給出。
2.3.2 思路
可視化之前要有一個編寫代碼的思路,而作圖的基本思路如下:
建立畫布建立坐標(biāo)系輸入x軸數(shù)據(jù)與y軸數(shù)據(jù)設(shè)定x軸與y軸的刻度并給刻度命名作圖2.3.3 編寫代碼
fig=plt.figure()#建立畫布 ax1=fig.add_subplot(1,1,1)#建立坐標(biāo)系 x=np.arange(7)#x軸數(shù)據(jù) y=np.array([jishu1,jishu2,jishu3,jishu4,jishu5,jishu6,jishu7])#y軸數(shù)據(jù) plt.xticks(np.arange(7),['0-50元','50-100元','100-150元','150-200元','200-250元','250-300元','300元及以上'])#x軸長度與命名 plt.yticks(np.arange(0,350,50))#y軸長度與命名 plt.plot(x,y)#作圖
建立坐標(biāo)系:
建立坐標(biāo)系中,add_subplot()方法括號里的數(shù)字的含義是:一行一列的第一個坐標(biāo)系。這么說可能有點抽象,我給出以下例子:
#代碼1: fig=plt.figure()#建立畫布 ax1=fig.add_subplot(1,1,1)#建立坐標(biāo)系 #代碼2: fig=plt.figure()#建立畫布 ax1=fig.add_subplot(2,2,1)#建立坐標(biāo)系1 ax2=fig.add_subplot(2,2,2)#建立坐標(biāo)系2 ax3=fig.add_subplot(2,2,3)#建立坐標(biāo)系3 ax4=fig.add_subplot(2,2,4)#建立坐標(biāo)系4
代碼1中的(1,1,1)表示一行一列的第一個坐標(biāo)系;代碼二中的(2,2,1)表示二行二列的第一個坐標(biāo)系,(2,2,2)表示二行二列的第二個坐標(biāo)系,(2,2,3)表示二行二列的第三個坐標(biāo)系,(2,2,4)表示二行二列的第四個坐標(biāo)系。
而這兩段代碼展示出的坐標(biāo)圖是不一樣的,見下圖:
代碼1:

代碼2:

對比兩個輸出結(jié)果,可以很容易地知道,代碼1一張圖中只作了一個坐標(biāo)系,而代碼2的一張圖中作出了四個坐標(biāo)系。一行一列的第一個坐標(biāo)系指的就是代碼1唯一的這一個坐標(biāo)系,而二行二列的第一個坐標(biāo)系指的是左上角的坐標(biāo)系,二行二列的第四個坐標(biāo)系指的是右下角的坐標(biāo)系。這樣應(yīng)該就能比較好地理解這個函數(shù)的意義了。
附上數(shù)據(jù)(坐標(biāo)):
看到x與y軸數(shù)據(jù)的代碼,其中np.arange()函數(shù)是調(diào)用的np庫的函數(shù)方法。arange()中,方法與range()長的比較像:arange(start,end,step)。具體含義可以查看后續(xù)基礎(chǔ)篇分享。若了解range()函數(shù)的話,那么arange(7)中的數(shù)字7的含義我也不用多說。x=np.arange(7)則表示橫坐標(biāo)x分別等于0,1,2,3,4,5,6時對應(yīng)的情況。對于y中的array()函數(shù),其主要是用于矩陣或數(shù)組的輸入的,而本篇中的代碼:y=np.array([jishu1,jishu2,jishu3,jishu4,jishu5,jishu6,jishu7]),其中的jishu1這一系列的命名是我定義的變量名,其具體含義我在后文補充,總之在array()中需要輸入的也是數(shù)字。(按照各個問題的需要,本篇使用了array(),而x與y都適用np.arange()來輸入數(shù)據(jù)都是可以的)。
由此,x與y的數(shù)值組成了一個坐標(biāo)(x,y),從而能定義一個點的位置。
設(shè)定刻度(又可稱長度)與名稱:
最后三行代碼中的plt.xticks()與plt.yticks()方法分別是為了設(shè)定坐標(biāo)刻度(又可稱長度)與名稱準(zhǔn)備的。其中,括號內(nèi)的方法為:(刻度,命名),而np.arange(7)表示橫坐標(biāo)軸設(shè)定的長度為7,列表['0-50元','50-100元','100-150元','150-200元','200-250元','250-300元','300元及以上']即每一個刻度的命名。
最后一行代碼則是作出符合以上條件的坐標(biāo)圖。
其結(jié)果展示如下:

顯而易見,x軸的刻度編程了我所設(shè)定的名稱,y軸沒有設(shè)定名稱,則以數(shù)值的形式出現(xiàn)。
為了使坐標(biāo)圖更加直觀,我們也可以給x軸和y軸賦上標(biāo)簽,代碼如下:
plt.xlabel('消費金額')#x軸的標(biāo)簽
plt.ylabel('人數(shù)')#y軸的標(biāo)簽此時坐標(biāo)圖如下:

對比前面的坐標(biāo)圖,此時的坐標(biāo)圖中x軸和y軸都有了它們的“名字”,這樣圖的關(guān)系就更加明朗了。
2.4 補充內(nèi)容
前面提到,array()函數(shù)中的列表是什么意思。我是以我自己所收集的數(shù)據(jù)為例,寫的本篇內(nèi)容,因此有的地方是看個人研究需要而寫的代碼,在該部分我加以解釋。
Q7=df.iloc[:,15]
q7=[]
for i in Q7:
q7.append(i)
print(q7)#讀取所要分析的列的數(shù)據(jù)
jishu1=int(q7.count(1))
jishu2=int(q7.count(2))
jishu3=int(q7.count(3))
jishu4=int(q7.count(4))
jishu5=int(q7.count(5))
jishu6=int(q7.count(6))
jishu7=int(q7.count(7))#計數(shù)
print('0-50元的有:',jishu1,'\n','50-100元的有:',jishu2,'\n','100-150元的有:',jishu3,'\n',
'150-200元的有:',jishu4,'\n','200-250元的有:',jishu5,'\n','250-300元的有:',jishu6,'\n','300元及以上的有:',jishu7,'\n')第一行的df.iloc[:,15]表示的含義是我要讀取第十五列的變量的數(shù)據(jù),該內(nèi)容為“選取excel表格中的某一列”的方法的內(nèi)容,屬于基礎(chǔ)篇的操作,在后續(xù)我會在基礎(chǔ)篇中分享給部分的內(nèi)容,不在此地贅述。
下面的循環(huán)是我將讀取的函數(shù)放入列表中,并用count()函數(shù)計算個數(shù)(該數(shù)據(jù)為人數(shù)計數(shù),因此count()實際上是在數(shù)人數(shù)),由此得出以下各個消費段的人數(shù),輸出結(jié)果如下:

這七個數(shù)值就是y軸輸入的數(shù)據(jù)。由此應(yīng)該就能理解我在編寫y軸輸入數(shù)據(jù)的代碼時列表里的幾個變量名是啥意思了。
三、完整代碼與總結(jié)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
pd.set_option('display.max_columns',1000)
pd.set_option("display.width",1000)
pd.set_option('display.max_colwidth',1000)
pd.set_option('display.max_rows',1000)#將行和列的最大展示值設(shè)置到1000,則可展示更多的行而不是以省略號形式展示。
df=pd.read_excel(r'D:\雜貨\編碼數(shù)據(jù).xlsx',sheet_name='編碼數(shù)據(jù)')
obs=df.count()#觀測值
means=df.mean()#均值
var=df.var()#方差
std=df.std()#標(biāo)準(zhǔn)差
min=df.min()#最小值
max=df.max()#最大值
mode=df.mode()#眾數(shù)
siyi=df.quantile(0.25)#四分之一位數(shù)
sisan=df.quantile(0.75)#四分之三位數(shù)
median=df.median()#中位數(shù)
skew=df.skew()#偏度
kurt=df.kurt()#峰度
print("最大值:\n",max,'\n',"最小值:\n",min,'\n','觀測量:\n',obs,'\n','均值:\n',means,'\n',
"方差:\n",var,"\n",'標(biāo)準(zhǔn)差:\n',std,'\n',"眾數(shù): ",mode,"\n",'四分之一位數(shù):\n',siyi,'\n',
'四分之三位數(shù):\n',sisan,'\n','中位數(shù):\n',median,'\n','偏度:\n',skew,'\n','峰度:\n',kurt)
#作圖
Q7=df.iloc[:,15]
q7=[]
for i in Q7:
q7.append(i)
print(q7)#讀取所要分析的列的數(shù)據(jù)
jishu1=int(q7.count(1))
jishu2=int(q7.count(2))
jishu3=int(q7.count(3))
jishu4=int(q7.count(4))
jishu5=int(q7.count(5))
jishu6=int(q7.count(6))
jishu7=int(q7.count(7))#計數(shù)
print('0-50元的有:',jishu1,'\n','50-100元的有:',jishu2,'\n','100-150元的有:',jishu3,'\n',
'150-200元的有:',jishu4,'\n','200-250元的有:',jishu5,'\n','250-300元的有:',jishu6,'\n','300元及以上的有:',jishu7,'\n')
fig=plt.figure()#建立畫布
ax1=fig.add_subplot(1,1,1)#建立坐標(biāo)系
x=np.arange(7)#x軸數(shù)據(jù)
y=np.array([jishu1,jishu2,jishu3,jishu4,jishu5,jishu6,jishu7])#y軸數(shù)據(jù)
plt.xticks(np.arange(7),['0-50元','50-100元','100-150元','150-200元','200-250元','250-300元','300元及以上'])#x軸長度與命名
plt.yticks(np.arange(0,350,50))#y軸長度與命名
plt.plot(x,y)#作圖
plt.xlabel('消費金額')#x軸代表的名字
plt.ylabel('人數(shù)')#y軸代表的名字到此這篇關(guān)于如何使用Python程序完成描述性統(tǒng)計分析需求的文章就介紹到這了,更多相關(guān)Python完成描述性統(tǒng)計分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pip matplotlib報錯equired packages can not be built解決
這篇文章主要介紹了pip matplotlib報錯equired packages can not be built解決,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
淺析Python自帶性能強悍的標(biāo)準(zhǔn)庫itertools
itertools是python內(nèi)置的模塊,使用簡單且功能強大。這篇文章就主要介紹了通過itertools實現(xiàn)可迭代對象的無限迭代、有限迭代和排列組合。感興趣的同學(xué)可以關(guān)注一下2021-12-12
python基于socket函數(shù)實現(xiàn)端口掃描
這篇文章主要為大家詳細(xì)介紹了python基于socket函數(shù)實現(xiàn)端口掃描,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05
Python爬蟲urllib和requests的區(qū)別詳解
這篇文章主要介紹了Python爬蟲urllib和requests的區(qū)別詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
使用django實現(xiàn)一個代碼發(fā)布系統(tǒng)
這篇文章主要介紹了使用django實現(xiàn)一個代碼發(fā)布系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07

