用python進行統計分析

模塊爲我們提供了非常多的描述性統計分析的指標函數,如總和、均值、最小值、最大值等,我們來具體看看這些函數:

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方法只能針對序列或數據框,一維數組是沒有這個方法的

自定義一個函數,將這些統計指標彙總在一起:

def status(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)  

轉載於http://blog.csdn.net/A632189007/article/details/76176985

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章