1.探索性數據分析(EDA,Exploratory Data Analysis)


一、數據探索

1.數據讀取

  • 遍歷文件夾,讀取文件夾下各個文件的名字:os.listdir() 方法:用於返回指定的文件夾包含的文件或文件夾的名字的列表。這個列表以字母順序。 它不包括 '.' 和'..' 即使它在文件夾中。

1.1 CSV格式數據

詳細說明

(1)讀取

### python導入csv文件的4種方法

# 1.原始的方式
lines = [line.split(',') for line in open('iris.csv')]
df = [[float(x) for x in line[:4]] for line in lines[1:]]

# 2.使用loadtxt,以下讀取出來的不是dataframe,是列表形式 
import numpy as np 
lines = np.loadtxt('iris.csv',delimiter=',',dtype='str')# 逗號為分隔符 
df = lines[1:,:4].astype('float') 

# 3.使用read_csv 
import pandas as pd 
df = pd.read_csv('iris.csv') df=df.ix[:,:4]

# 4.使用read_table
# 分塊讀
reader1 = read_table(' 文件位置 ', names=' dataframe的列名 ',encoding='utf-8' ,sep='|' )
for chunk in reader1:
     print(chunk)

# 迭代讀
reader2 = pd.read_table('tmp.sv', sep='|', iterator=True)
reader2.get_chunk(5)

pandas.read_csv可以讀取CSV(逗號分割)文件、文本類型的文件text、log類型到DataFrame

pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)
View Code
  • filepath_or_buffer :可以是URL,可用URL類型包括:http, ftp, s3和文件。對於多文件正在准備中本地文件讀取。 
    sep:如果不指定參數,則會嘗試使用逗號分隔。分隔符長於一個字符並且不是‘\s+’,將使用python的語法分析器。並且忽略數據中的逗號。正則表達式例子:’\r\t’。
    delim_whitespace : 指定空格(例如’ ‘或者’ ‘)是否作為分隔符使用,等效於設定sep=’\s+’。如果這個參數設定為True那么delimiter 參數失效。
    header :指定行數用來作為列名,數據開始行數。如果文件中沒有列名,則默認為0【第一行數據】,否則設置為None。如果明確設定 header = 0 就會替換掉原來存在列名。header參數可以是一個list例如:[0,1,3],這個list表示將文件中的這些行作為列標題(意味着每一列有多個標題),介於中間的行將被忽略掉。注意:如果skip_blank_lines=True 那么header參數忽略注釋行和空行,所以header=0表示第一行數據而不是文件的第一行。
    names :用於結果的列名列表,如果數據文件中沒有列標題行,就需要執行 header=None。names屬性在header之前運行默認列表中不能出現重復,除非設定參數mangle_dupe_cols=True。
    index_col :用作行索引的列編號或者列名,如果給定一個序列則有多個行索引。
    usecols:返回一個數據子集,該列表中的值必須可以對應到文件中的位置(數字可以對應到指定的列)或者是字符傳為文件中的列名。例如:usecols有效參數可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。使用這個參數可以加快加載速度並降低內存消耗。
    prefix:在沒有列標題時,也就是header設定為None,給列添加前綴。例如:添加prefix= ‘X’ 使得列名稱成為 X0, X1, …
    dtype: 每列數據的數據類型。例如 {‘a’: np.float64, ‘b’: np.int32}
    skipinitialspace:忽略分隔符后的空白(默認為False,即不忽略).
    skiprows :需要忽略的行數(從文件開始處算起),或需要跳過的行號列表(從0開始)。
    nrows :需要讀取的行數(從文件頭開始算起)。
    na_values :一組用於替換NA/NaN的值。如果傳參,需要制定特定列的空值。默認為‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`.
    keep_default_na:如果指定na_values參數,並且keep_default_na=False,那么默認的NaN將被覆蓋,否則添加
    na_filter:是否檢查丟失值(空字符串或者是空值)。對於大文件來說數據集中沒有空值,設定na_filter=False可以提升讀取速度。
    skip_blank_lines :如果為True,則跳過空行;否則記為NaN。
    View Code
  • head 、names:表示第一行的數據不取為列名,自己另外取名為names=['a','b','c']。如果不加header=None則表示第一行作為列名。
  • encoding :遇到 ‘utf-8’ codec can’t decode byte 0xba in position 0: invalid start byte 但是又必須要中文解碼,解決辦法是設置read_csv中encoding = ‘GB2312’
  • chunksize:通過指定一個chunksize分塊大小來讀取文件,返回的是一個可迭代的對象TextFileReader。
  • iterator :指定iterator=True 也可以返回一個可迭代對象TextFileReader 

(2)保存

①一次性寫入

import pandas as pd
data=pd.DataFrame(數據源)
data.to_csv('文件名.csv',index = False,encoding = 'utf-8,mode='a'')  index= False的意思是不把index保存進文件中,mode='a'是表示以追加的方式加入文件中

②追加,按行寫入文件中

f=open(path,'a+',newline='')#newline設定可以讓寫出的csv中不包含空行
writer=csv.writer(f)
for row in range(b.shape[0]):
    writer.writerow(b.iloc[row])#按行將數據寫入文件中
f.close()

1.2 Excel文件的讀取和保存

(1)讀取

dataframe=pd.read_excel('文件名.xlsx')

(2)保存

dataframe=pd.DataFrame(數據源)
dataframe.to_excel('文件名.xlsx',sheet_name='表名')

1.3 sql文件讀取:read_sql

讀取sql文件之前需要安裝好mysql以及python連接mysql的模塊PyMySQL,直接命令pip install pymysql。

在數據庫中新建一個數據庫test,然后新建一個表students,插入數據。

在讀取mysql數據之前要將mysql的服務啟動:net start mysql。

import pymysql
import pandas as pd
#連接數據庫為test
conn=pymysql.connect(host="127.0.0.1",user="root",passwd="123456",db="test")
#查詢的表為students
sql="select * from students"
data=pd.read_sql(sql,conn)
print(data)

1.4 讀取html文件:read_html

這個函數主要讀取HTML中table的數據。

import pandas as pd
htl=pd.read_html('E:\test.html')
print(htl)

讀取網絡上的HTML的數據也一樣。只要將本地地址換成網絡地址就行  

1.5 讀取文本數據(txt文件、dat文件、out文件):read_table

dataframe寫入文本數據代碼:

def text_save(filename, data):#filename為寫入CSV文件的路徑,data為要寫入數據列表.
    file = open(filename,'a')
    for i in range(len(data)):
        s = str(data[i]).replace('[','').replace(']','')#去除[],這兩行按數據不同,可以選擇
        s = s.replace("'",'').replace(',','') +'\n'   #去除單引號,逗號,每行末尾追加換行符
        file.write(s)
    file.close()
    print("保存文件成功")

1.6 json文件讀取

(1)讀取

#調用read函數全部讀取json文件中的數據會報錯,因為不能同時讀取相同的json對象。需要用readlines()函數,一行一行的讀取。
import json
with open('data.json','r') as f:
    data=f.read()
    data=json.loads(data)
    print(data)

#調用readlines()函數讀取,並加載進一個列表當中
data_list=[]
with open(r'data.json','r') as f:
    for line in f.readlines():
        dic = json.loads(line)
        data_list.append(dic)

2.數據集成

(1)數據整合

  • 整合兩個數組: np.concatenate((數組1,數組2))
  • 整合兩個dataframe:pd.concat([dataframe1,dataframe2])

(2)數據打亂

  1. np.random.shuffle()
    • import numpy.random
      def shuffleData(data):
        np.random.shufflr(data)
        cols=data.shape[1]
        X=data[:,0:cols-1]
        Y=data[:,cols-1:]
        return X,Y
      View Code
  2. np.random.permutation()
    • permutation = list(np.random.permutation(m))  #m為樣本數
      shuffled_X = X[permutation]
      shuffled_Y = Y[permutation].reshape((1,m))
      View Code
  3. sample
    • # sample()參數frac是要返回的比例,比如df中有10行數據,我只想返回其中的30%,那么frac=0.3
      # 以下代碼實現了從“CRASHSEV”中選出1,2,3,4的屬性,亂序,然后取出前10000行,按行鏈接成新的數據,重建索引:
      def unbanlance(un_data):
          data1 = un_data.loc[(data["CRASHSEV"] == 1)].sample(frac=1).iloc[:10000, :]
          data2 = un_data.loc[(data["CRASHSEV"] == 2)].sample(frac=1).iloc[:10000, :]
          data3 = un_data.loc[(data["CRASHSEV"] == 3)].sample(frac=1).iloc[:10000, :]
          data4 = un_data.loc[(data["CRASHSEV"] == 4)].sample(frac=1).iloc[:10000, :]
          ba_data = pd.concat([data1,data2,data3,data4], axis=0).sample(frac=1).reset_index(drop=True)  #0是按行鏈接
          return ba_data
      View Code

(3)數據替換

  • 將df數據中的?替換為標准缺失值表示:df.replace(to_replace="?",value=np.nan)  

3.查看數據信息

  1. 查看數據前5行:dataframe.head()
  2. 查看數據的信息,包括每個字段的名稱、非空數量、字段的數據類型:data.info()
  3. 查看數據的統計概要(count/mean/std/min/25%/50%/75%max):data.describe()
  4. 查看dataframe的大小:dataframe.shape
  5. 按列/數組排序
    1. 按某列排序:正序(倒序)df.groupby(['列名']).cumcount()
    2. 對該列或該行進行值排序:sort_values(by="列名/行名")
    3. 對數組進行升序排序,返回索引值。降序的話可以給a加負號。 numpy.argsort(a) 或者 a.argsort()
  6. 數據相加
    1. a.sum(axis=1)  :a為數組,sum(axis=1)表示每行的數相加,平時不加axis則默認為0,為0表示每列的數相加。
  7. 字典操作
    • sorted對字典或者列表的后面一個值排序

      sorted(dic.items() , key=lambda x:x[1] , reverse=True )

      sorted (dic.items(),key=operator.itemgetter(1) ,reverse=True)

    • 字典的get函數:

      dic.get(key,0)相當於if ……else ,若key在字典dic中則返回dic[key]的值,若不在則返回0。

二、數據質量分析

1.缺失值分析

1.1 數據缺失的類型

  1. 完全隨機缺失(missing completely at random,MCAR):指的是數據的缺失是完全隨機的,不依賴於任何不完全變量或完全變量,不影響樣本的無偏性,如家庭地址缺失;
  2. 隨機缺失(missing at random,MAR):指的是數據的缺失不是完全隨機的,即該類數據的缺失依賴於其他完全變量,如財務數據缺失情況與企業的大小有關;
  3. 非隨機缺失(missing not at random,MNAR):指的是數據的缺失與不完全變量自身的取值有關,如高收入人群不原意提供家庭收入;

  對於隨機缺失和非隨機缺失,直接刪除記錄是不合適的,原因上面已經給出。隨機缺失可以通過已知變量對缺失值進行估計,而非隨機缺失的非隨機性還沒有很好的解決辦法。

1.2 查看缺失情況

  • dataframe.isnull() 

  元素級別的判斷,把對應的所有元素的位置都列出來,元素為空或者NA就顯示True,否則就是False

  • dataframe.isnull().any()

  列級別的判斷,只要該列有為空或者NA的元素,就為True,否則False

  • missing = dataframe.columns[ dataframe.isnull().any() ].tolist()  

  將為空或者NA的列找出來

  • dataframe [ missing ].isnull().sum()

  將列中為空或者NA的個數統計出來

  • len(data["feature"] [ pd.isnull(data["feature"]) ]) / len(data))

  缺失值比例

1.3 缺失值處理方式

1.3.1 連續型

(1)直接刪除

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
功能:根據各標簽的值中是否存在缺失數據對軸標簽進行過濾,可通過閾值調節對缺失值的容忍度
參數:axis : {0 or ‘index’, 1 or ‘columns’},或 tuple/list 
   how : {‘any’, ‘all’}
     any : 如果存在任何NA值,則放棄該標簽
     all :    如果所有的值都為NA值,則放棄該標簽
   thresh : int, 默認值 None
      int value :要求每排至少N個非NA值  
   subset : 類似數組
   inplace : boolean, 默認值 False
      如果為True,則進行操作並返回None。
返回:被刪除的DataFrame
  • 直接刪除含有缺失值的行/列
    • new_drop = dataframe.dropna ( axis=0,subset=["Age","Sex"] ) 【在子集中有缺失值,按行刪除】
    • new_drop = dataframe.dropna ( axis=1)  【將dataframe中含有缺失值的所有列刪除】
  • 計算缺失值的個數,如果超過一定數,再刪除
    • #去掉缺失值大的行
      def miss_row(data):
          miss_row = data.isnull().sum(axis=1).reset_index()
          miss_row.columns = ['row','miss_count']
          miss_row_value = miss_row[miss_row.miss_count>500].row.values
          data.drop(miss_row_value,axis=0,inplace=True)
          return data
      
      #去掉缺失值大的列
      def miss_col(data):
          miss_col= data.isnull().sum(axis=0).reset_index()
          miss_col.columns = ['col','miss_count']
          miss_col_value = miss_col[miss_col.miss_count>200].col.values
          data.drop(miss_col_value,axis=1,inplace=True)
          return data
      View Code 

(2)插補

  對缺失值的插補大體可分為兩種:替換缺失值,擬合缺失值,虛擬變量。替換是通過數據中非缺失數據的相似性來填補,其核心思想是發現相同群體的共同特征,擬合是通過其他特征建模來填補,虛擬變量是衍生的新變量代替缺失值。

【1】插補法(適用於缺失值少

  1. 固定值插補
    • dataframe.loc dataframe column .isnull(),column value   # 將某一列column中缺失元素的值,用value進行填充。
  2. 均值插補
    • data.Age.fillna(data.Age.mean(),inplace=True)  # 將age列缺失值填充均值。(偏正態分布,用均值填充,可以保持數據的均值)
  3. 中值插補
    • df['price'].fillna(df['price'].median()) # 偏長尾分布,使用中值填充,避免受異常值的影響。
  4. 最近數據插補
    • dataframe ['age'].fillna(method='pad')  # 使用前一個數值替代空值或者NA,就是NA前面最近的非空數值替換   
    • dataframe ['age'].fillna(method='bfill',limit=1) # 使用后一個數值替代空值或者NA,limit=1就是限制如果幾個連續的空值,只能最近的一個空值可以被填充。
  5. 回歸插補
  6. 拉格朗日插值
  7. 牛頓插值法
  8. 分段插值
  9. K-means
    1. 通過K均值的聚類方法將所有樣本進行聚類划分,然后再通過划分的種類的均值對各自類中的缺失值進行填補。歸其本質還是通過找相似來填補缺失值。缺失值填補的准確性就要看聚類結果的好壞了,而聚類結果的可變性很大,通常與初始選擇點有關,因此使用時要慎重。
  10. KNN填補空值
    • #用KNN填充空值
      def knn_fill_nan(data,K):
          #計算每一行的空值,如果有空值,就進行填充;沒有空值的行用於做訓練數據
          data_row = data.isnull().sum(axis=1).reset_index()
          data_row.columns = ['raw_row','nan_count']
          #空值行(需要填充的行)
          data_row_nan = data_row[data_row.nan_count>0].raw_row.values
          
          #非空行,原始數據
          data_no_nan = data.drop(data_row_nan,axis=0)
          
          #空行,原始數據
          data_nan = data.loc[data_row_nan]
          
          for row in data_row_nan:
              data_row_need_fill = data_nan.loc[row]
              #找出空列,並用非空列做KNN
              data_col_index = data_row_need_fill.isnull().reset_index()
              data_col_index.columns = ['col','is_null']
              is_null_col = data_col_index[data_col_index.is_null == 1].col.values
              data_col_no_nan_index = data_col_index[data_col_index.is_null == 0].col.values
              #保存需要填充的行的非空列
              data_row_fill = data_row_need_fill[data_col_no_nan_index]
              
              #廣播,矩陣-向量
              data_diff = data_no_nan[data_col_no_nan_index] - data_row_need_fill[data_col_no_nan_index]
              #求歐式距離
              data_diff = (data_diff ** 2).sum(axis=1)
              data_diff = data_diff.apply(lambda x:np.sqrt(x))
              data_diff = data_diff.reset_index()
              data_diff.columns = ['raw_row','diff_val']
              data_diff_sum = data_diff.sort_values(by='diff_val',ascending=True)
              data_diff_sum_sorted = data_diff_sum.reset_index()
              #取出k個距離最近的row
              top_k_diff_val = data_diff_sum_sorted.loc[0:K-1].raw_row.values
              #根據row和col值確定需要填充的數據的具體位置(可能是多個)
              #填充的數據為最近的K個值的平均值
              top_k_diff_val = data.loc[top_k_diff_val][is_null_col].sum(axis=0)/K
              #將計算出來的列添加至非空列
              data_row_fill = pd.concat([data_row_fill,pd.DataFrame(top_k_diff_val)]).T
              data_no_nan = data_no_nan.append(data_row_fill,ignore_index=True)
          print('填補完成')
          return data_no_nan
      View Code

【2】擬合(適用於缺失值多)

  1. 回歸預測:缺失值是連續的,即定量的類型,才可以使用回歸來預測。
  2. 極大似然估計(Maximum likelyhood):在缺失類型為隨機缺失的條件下,假設模型對於完整的樣本是正確的,那么通過觀測數據的邊際分布可以對未知參數進行極大似然估計(Little and Rubin)。這種方法也被稱為忽略缺失值的極大似然估計,對於極大似然的參數估計實際中常采用的計算方法是期望值最大化(Expectation Maximization,EM)。該方法比刪除個案和單值插補更有吸引力,它一個重要前提:適用於大樣本。有效樣本的數量足夠以保證ML估計值是漸近無偏的並服從正態分布。但是這種方法可能會陷入局部極值,收斂速度也不是很快,並且計算很復雜,且僅限於線性模型
  3. 多重插補(Mutiple imputation):多值插補的思想來源於貝葉斯估計,認為待插補的值是隨機的,它的值來自於已觀測到的值。具體實踐上通常是估計出待插補的值,然后再加上不同的噪聲,形成多組可選插補值。根據某種選擇依據,選取最合適的插補值。  
    • 三步驟:
      • 為每個缺失值產生一套可能的插補值,這些值反映了無響應模型的不確定性;
      • 每個插補數據集合都用針對完整數據集的統計方法進行統計分析;
      • 對來自各個插補數據集的結果,根據評分函數進行選擇,產生最終的插補值;
  4. 隨機森林:將缺失值作為目標變量
def set_missing_ages(df):

    # 把已有的數值型特征取出來丟進Random Forest Regressor中
    age_df = df[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]

    # 乘客分成已知年齡和未知年齡兩部分
    known_age = age_df[age_df.Age.notnull()].as_matrix()
    unknown_age = age_df[age_df.Age.isnull()].as_matrix()

    # y即目標年齡
    y = known_age[:, 0]

    # X即特征屬性值
    X = known_age[:, 1:]

    # fit到RandomForestRegressor之中
    rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
    rfr.fit(X, y)

    # 用得到的模型進行未知年齡結果預測
    predictedAges = rfr.predict(unknown_age[:, 1:])
#     print predictedAges
    # 用得到的預測結果填補原缺失數據
    df.loc[ (df.Age.isnull()), 'Age' ] = predictedAges 

    return df, rfr

【3】衍生(適用於缺失值多)

虛擬變量:通過判斷特征值是否有缺失值來定義一個新的二分類變量。比如,特征為A含有缺失值,我們衍生出一個新的特征B,如果A中特征值有缺失,那么相應的B中的值為1,如果A中特征值沒有缺失,那么相應的B中的值為0。

data_train['CabinCat'] = data_train['Cabin'].copy()
data_train.loc[ (data_train.CabinCat.notnull()), 'CabinCat' ] = "No"
data_train.loc[ (data_train.CabinCat.isnull()), 'CabinCat' ] = "Yes"

fig, ax = plt.subplots(figsize=(10,5))
sns.countplot(x='CabinCat', hue='Survived',data=data_train)
plt.show()

(3)不處理(適用於缺失值多)

  • 如果“缺失”包含了業務含義,保留該變量,並且直接將缺失值填充為區別於其他正常值的默認值,比如-1。
  • 補齊處理只是將未知值補以我們的主觀估計值,不一定完全符合客觀事實,在對不完備信息進行補齊處理的同時,我們或多或少地改變了原始的信息系統。而且,對空值不正確的填充往往將新的噪聲引入數據中,使挖掘任務產生錯誤的結果。因此,在許多情況下,我們還是希望在保持原始信息不發生變化的前提下對信息系統進行處理。
  • 在實際應用中,一些模型無法應對具有缺失值的數據,因此要對缺失值進行處理。然而還有一些模型本身就可以應對具有缺失值的數據,此時無需對數據進行處理,比如Xgboostlightgbm等高級模型。

1.3.2 類別型

缺失值少:

  • 如果“缺失”沒有業務含義,用眾數填充:dataframe [age] [ dataframe.age.isnull() ] = dataframe.age.dropna().mode().values    #眾數填補 , mode()函數就是取出現次數最多的元素。
  • 如果“缺失”包含了業務含義,保留該變量,並且直接將缺失值填充為默認值。 dataframe.loc dataframe column .isnull(),column value   # 將某一列column中缺失元素的值,用value值進行填充。

缺失值多:

  • 剔除掉缺失率>80%並且未來依然會高缺失的變量

缺失值適中:

  • 將缺失當做新的一類,如one-hot來處理

1.3.3 時間類型

  • 缺失值少:
    • df.interpolate():對於時間序列的缺失,可以使用這種方法。
  • 缺失值多:
  • 缺失值適中:

2.異常值分析

2.1查看異常情況

  1. 畫數據的散點圖。觀察偏差過大的數據,是否為異常值;
    • plt.scatter(x1,x2)
  2. 箱型圖,箱型圖識別異常值比較客觀,因為它是根據3σ原則,如果數據服從正態分布,若超過平均值的3倍標准差的值被視為異常值。
    • Percentile = np.percentile(df['length'],[0,25,50,75,100])
      IQR = Percentile[3] - Percentile[1]
      UpLimit = Percentile[3]+ageIQR*1.5
      DownLimit = Percentile[1]-ageIQR*1.5
    1. Ql為下四分位數:表示全部觀察值中有四分之一的數據取值比它小; 
    2. Qu為上四分位數:表示全部觀察值中有四分之一的數據取值比它大; 
    3. IQR稱為四分位數間距:是上四分位數Qu和下四分衛數Ql之差,之間包含了全部觀察值的一半。 
    4. seaborn畫boxplot
      • f,ax=plt.subplots(figsize=(10,8)) sns.boxplot(y='length',data=df,ax=ax) plt.show()
  3. 基於模型預測
    • 構建概率分布,離群點在該分布下概率低就視為異常點
  4. 基於近鄰度的離群點檢測
    1. KNN
  5. 基於密度的離群點檢測
    1. 對象到k個最近鄰的平均距離的倒數,如果該距離小,則密度高;
    2. DBSCAN:一個對象周圍的密度等於該對象指定距離d內對象的個數
  6. 基於聚類的方法來做異常點檢測
    1. K-means
  7. 專門的離群點檢測
    • One class SVM和Isolation Forest

2.2 異常值處理方式

  1. 視為缺失值:修補(平均數、中位數等)
  2. 直接刪除:是否要刪除異常值可根據實際情況考慮。因為一些模型對異常值不很敏感,即使有異常值也不影響模型效果,但是一些模型比如邏輯回歸LR對異常值很敏感,如果不進行處理,可能會出現過擬合等非常差的效果。
  3. 不處理:直接在具有異常值的數據集上進行數據挖掘
  4. 平均值修正:可用前后兩個觀測值的平均值修正該異常值

三、數據特征分析

1.分布

  1. 定量數據分布分析:繪制頻率直方分布圖
  2. 定性數據分布分析:根據變量的分類類型分組,繪制餅圖和條形圖來描述分布
  3. 樣本分布是否偏斜:計算偏度和峰度

左偏,偏度<0;右偏,偏度>0,偏度的絕對值數值越大表示其分布形態的偏斜程度越大。

計算偏度、峰度

# 方法1:在series上計算偏度、峰度
import pandas as pd
x = [53, 61, 49, 66, 78, 47]
s = pd.Series(x)
print(s.skew())#偏度
print(s.kurt())#峰度

# 結果如下:
0.7826325504212567
-0.2631655441038463

# 方法2:直接在dataframe上計算偏度
data_frame2= pd.DataFrame({'A':[1,2,3,4],'b':[1,0,3,1]})
data_frame2.skew(axis = 0)

# 結果如下:
A    0.000000
b    1.129338
dtype: float64
View Code   

2.對比

  1. 絕對數對比
  2. 相對數對比(如結構相對數、比例相對數)

3.常見統計量

  1. 集中趨勢度量:均值、中位數、眾數
  2. 離中趨勢度量:極差、標准差、變異系數(標准差/均值)、四分位數間距

4.周期性

  1. 帕累托法則(即為二八法則)

5.相關性(連續變量間線性相關的程度)

  1. 繪制散點圖、繪制散點圖矩陣
  2. 計算相關系數(皮爾森相關系數、斯皮爾曼秩相關系數、判定系數)
    • df.corr(method='pearson'),默認是pearson,還支持kendall/spearman

 

 

 

參考文獻:

【1】Python數據分析2------數據探索

【2】【Python數據分析基礎】: 異常值檢測和處理

【3】Python數據分析--------numpy數據打亂

【4】Python數據分析1------數據存取

【5】學分析[03]Pandas的read_csv的參數

【6】Python數據分析之Pandas讀寫外部數據文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM