用python進行統計分析
阿新 • • 發佈:2019-01-09
模組為我們提供了非常多的描述性統計分析的指標函式,如總和、均值、最小值、最大值等,我們來具體看看這些函式:
1、隨機生成三組資料
import numpy as np
import pandas as pd
np.random.seed(1234)
d1 = pd.Series(2*np.random.normal(size = 100)+3)
d2 = np.random.f(2,4,size = 100)
d3 = np.random.randint(1,100,size = 100)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2、統計分析用到的函式
d1.count() #非空元素計算
d1.min() #最小值
d1.max() #最大值
d1.idxmin() #最小值的位置,類似於R中的which.min函式
d1.idxmax() #最大值的位置,類似於R中的which.max函式
d1.quantile(0.1) #10%分位數
d1.sum() #求和
d1.mean() #均值
d1.median() #中位數
d1.mode() #眾數
d1.var() #方差
d1.std() #標準差
d1.mad() #平均絕對偏差
d1.skew() #偏度
d1.kurt() #峰度
d1.describe() #一次性輸出多個描述性統計指標
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 必須注意的是,descirbe方法只能針對序列或資料框,一維陣列是沒有這個方法的
自定義一個函式,將這些統計指標彙總在一起:
defstatus(x) :
return pd.Series([x.count(),x.min(),x.idxmin(),x.quantile(.25),x.median(),
x.quantile(.75 ),x.mean(),x.max(),x.idxmax(),x.mad(),x.var(),
x.std(),x.skew(),x.kurt()],index=['總數','最小值','最小值位置','25%分位數',
'中位數','75%分位數','均值','最大值','最大值位數','平均絕對偏差','方差','標準差','偏度','峰度'])
- 1
- 2
- 3
- 4
- 5
執行該函式,檢視一下d1資料集的這些統計函式值:
df = pd.DataFrame(status(d1))
df
- 1
- 2
結果:
在實際的工作中,我們可能需要處理的是一系列的數值型資料框,如何將這個函式應用到資料框中的每一列呢?可以使用apply函式,這個非常類似於R中的apply的應用方法。
將之前建立的d1,d2,d3資料構建資料框:
df = pd.DataFrame(np.array([d1,d2,d3]).T, columns=['x1','x2','x3'])
df.head()
df.apply(status)
- 1
- 2
- 3
- 4
結果:
3、載入CSV資料
import numpy as np
import pandas as pd
bank = pd.read_csv("D://bank/bank-additional-train.csv")
bank.head() #檢視前5行
- 1
- 2
- 3
- 4
- 5
描述性統計1:describe()
result = bank['age'].describe()
pd.DataFrame(result ) #格式化成DataFrame
- 1
- 2
描述性統計2:describe(include=[‘number’])
include中填寫的是資料型別,若想檢視所有資料的統計資料,則可填寫object,即include=['object'];若想檢視float型別的資料,則為include=['float']。
- 1
- 2
result = bank.describe(include=['object'])
- 1
含義:
- count:指定欄位的非空總數。
- unique:該欄位中儲存的值型別數量,比如性別列儲存了男、女兩種值,則unique值則為2。
- top:數量最多的值。
- freq:數量最多的值的總數。
bank.describe(include=['number'])
- 1
連續變數的相關係數(corr)
bank.corr()
- 1
協方差矩陣(cov)
bank.cov()
- 1
刪除列
bank.drop('job', axis=1) #刪除年齡列,axis=1必不可少
- 1
排序
bank.sort_values(by=['job','age']) #根據工作、年齡升序排序
bank.sort_values(by=['job','age'], ascending=False) #根據工作、年齡降序排序
- 1
- 2
多表連線
準備資料:
import numpy as np
import pandas as pd
student = {'Name':['Bob','Alice','Carol','Henry','Judy','Robert','William'],
'Age':[12,16,13,11,14,15,24],
'Sex':['M','F','M','M','F','M','F']}
score = {'Name':['Bob','Alice','Carol','Henry','William'],
'Score':[75,35,87,86,57]}
df_student = pd.DataFrame(student)
df_student
df_score = pd.DataFrame(score)
df_score
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
student:
score:
內連線
stu_score1 = pd.merge(df_student, df_score, on='Name')
stu_score1
- 1
- 2
- 注意,預設情況下,merge函式實現的是兩個表之間的內連線,即返回兩張表中共同部分的資料。可以通過how引數設定連線的方式,left為左連線;right為右連線;outer為外連線。
左連線
stu_score2 = pd.merge(df_student, df_score, on='Name',how='left')
stu_score2
- 1
- 2
- 左連線中,沒有Score的學生Score為NaN
缺失值處理
現實生活中的資料是非常雜亂的,其中缺失值也是非常常見的,對於缺失值的存在可能會影響到後期的資料分析或挖掘工作,那麼我們該如何處理這些缺失值呢?常用的有三大類方法,即刪除法
、填補法
和插值法
。
刪除法
當資料中的某個變數大部分值都是缺失值,可以考慮刪除改變數;當缺失值是隨機分佈的,且缺失的數量並不是很多是,也可以刪除這些缺失的觀測。
替補法
對於連續型變數,如果變數的分佈近似或就是正態分佈的話,可以用均值替代那些缺失值;如果變數是有偏的,可以使用中位數來代替那些缺失值;對於離散型變數,我們一般用眾數去替換那些存在缺失的觀測。
插補法
插補法是基於蒙特卡洛模擬法,結合線性模型、廣義線性模型、決策樹等方法計算出來的預測值替換缺失值。
- 此處測試使用上面學生成績資料進行處理
查詢某一欄位資料為空的數量
sum(pd.isnull(stu_score2['Score']))
結果:2
- 1
- 2
直接刪除缺失值
stu_score2.dropna()
- 1
刪除前:
刪除後:
- 預設情況下,dropna會刪除任何含有缺失值的行
刪除所有行為缺失值的資料
import numpy as np
import pandas as pd
df = pd.DataFrame([[1,2,3],[3,4,np.nan],
[12,23,43],[55,np.nan,10],
[np.nan,np.nan,np.nan],[np.nan,1,2]],
columns=['a1','a2','a3'])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
df.dropna() #該操作會刪除所有有缺失值的行資料
- 1
df.dropna(how='all') #該操作僅會刪除所有列均為缺失值的行資料
- 1
填充資料
使用一個常量來填補缺失值,可以使用fillna函式實現簡單的填補工作:
1、用0填補所有缺失值
df.fillna(0)
- 1
2、採用前項填充或後向填充
df.fillna(method='ffill') #用前一個值填充
- 1
df.fillna(method='bfill') #用後一個值填充
- 1
3、使用常量填充不同的列
df.fillna({'a1':100,'a2':200,'a3':300})
- 1
4、用均值或中位數填充各自的列
a1_median = df['a1'].median() #計算a1列的中位數
a1_median=7.5
a2_mean = df['a2'].mean() #計算a2列的均值
a2_mean = 7.5
a3_mean = df['a3'].mean() #計算a3列的均值
a3_mean = 14.5
df.fillna({'a1':a1_median,'a2':a2_mean,'a3':a3_mean}) #填充值
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 很顯然,在使用填充法時,相對於常數填充或前項、後項填充,使用各列的眾數、均值或中位數填充要更加合理一點,這也是工作中常用的一個快捷手段。
資料打亂(shuffle)
實際工作中,經常會碰到多個DataFrame合併後希望將資料進行打亂。在pandas中有sample
函式可以實現這個操作。
df = df.sample(frac=1)
- 1
- 這樣對可以對df進行shuffle。其中引數frac是要返回的比例,比如df中有10行資料,我只想返回其中的30%,那麼frac=0.3。
有時候,我們可能需要打混後資料集的index(索引)還是按照正常的排序。我們只需要這樣操作
df = df.sample(frac=1).reset_index(drop=True)