『壹』 技巧 | Pandas 數據填充
課程學習: Pandas 數據處理基礎入門
除了直接填充值,我們還可以通過參數,將缺失值前面或者後面的值填充給相應的缺失值。例如使用缺失值前面的值進行填充:
或者是後面的值:
可以看到,連續缺失值好腔芹也是按照前序數值進行填充的,並且完全填充。這里,我們可以通過 limit= 參數設置連續填充的限制數量:
除了上面的填充方式,還可以通過 Pandas 自帶的求平均值方法等來填充特定列或行。舉個例子:友畢
插值是數值分析中一種方法。簡而言之,就是藉助於一個函數(線性或非線性),再根據已知數據去求解未知數據的值。插值在數據領域非常常見,它的好處在於,可以盡量去還原數據本身的樣子。我們可以通過 interpolate() 方法完成線性插值。
對於 interpolate() 支持的插值演算法,也就是 method= 。下面給出幾條選擇的建議:
除了上面提到圓旦的一些方法和技巧,實際上 Pandas 常用的還有:
--- End ---
『貳』 Pandas-DataFrame基礎知識點總結
DataFrame是一種表格型數據結構,它含有一組有序的列,每列可以是不同的值。DataFrame既有行索引,也有列索引,它可以看作是由Series組成的字典,不過這些Series公用一個索引。
DataFrame的創隱飢空建有多種方式,不過最重要的還是根據dict進行創建,以及讀取csv或者txt文件來創建。這里主要介紹這兩種方式。
根據字典創建
DataFrame的行索引是index,列索引是columns,我們可以在創建DataFrame時指定索引的值:
使用嵌套字典也可以創建DataFrame,此時外層字典的鍵作為列,內層鍵則作為索引:
我們可以用index,columns,values來訪問DataFrame的行索引,列索引以及數據值,數據值返回的是一個二維的ndarray
讀取文件
讀取文件生成DataFrame最常用的是read_csv,read_table方法。該方法中幾個重要的參數如下所示:
其他創建DataFrame的方式有很多,比如我們可以通過讀取mysql或者mongoDB來生成,也可以讀取json文件等等,這里就不再介紹。
在DataFrame的處理中經常會遇到軸的概念,這里先給大家一個直觀的印象,我們所說的axis=0即表示沿著每一列或行標簽索引值向下執行方法,axis=1即表示沿著每一行或者列標簽模向執行對應的方法。
索引、切片
我們可以根據列名來選取一列,返回一個Series:
我們還可以選取多列或者多行:
當然,在選取數據的時候,我們還可以根據邏輯條件來選取:
pandas提供了專門的用於灶瞎索引DataFrame的方法,即使用ix方法進行索引,不過ix在最新的版本中已經被廢棄了,如果要是用標簽,最好使用loc方法,如果使用下標,最好使用iloc方法:
修改數據
可以使用一個標量修改DataFrame中的某一列,此時這個標量會廣播到DataFrame的每一行肢迅上:
也可以使用一個列表來修改,不過要保證列表的長度與DataFrame長度相同:
可以使用一個Series,此時會根據索引進行精確匹配:
重新索引
使用reindex方法對DataFrame進行重新索引。對DataFrame進行重新索引,可以重新索引行,列或者兩個都修改,如果只傳入一個參數,則會從新索引行:
填充數據只能按行填充,此時只能對行進行重新索引:
丟棄指定軸上的值
可以使用drop方法丟棄指定軸上的值,不會對原DataFrame產生影響
算術運算
DataFrame在進行算術運算時會進行補齊,在不重疊的部分補足NA:
可以使用fill_value方法填充NA數據,不過兩個df中都為NA的數據,該方法不會填充:
函數應用和映射
numpy的元素級數組方法,也可以用於操作Pandas對象:
另一個常見的操作是,將函數應用到由各列或行所形成的一維數組上。DataFrame的apply方法即可實現此功能。
元素級的Python函數也是可以用的,使用applymap方法:
排序和排名
對於DataFrame,sort_index可以根據任意軸的索引進行排序,並指定升序降序
DataFrame也可以按照值進行排序:
匯總和計算描述統計
DataFrame中的實現了sum、mean、max等方法,我們可以指定進行匯總統計的軸,同時,也可以使用describe函數查看基本所有的統計項:
DataFrame也實現了corr和cov方法來計算一個DataFrame的相關系數矩陣和協方差矩陣,同時DataFrame也可以與Series求解相關系數。
處理缺失數據
Pandas中缺失值相關的方法主要有以下三個:
isnull方法用於判斷數據是否為空數據;
fillna方法用於填補缺失數據;
dropna方法用於舍棄缺失數據。
上面兩個方法返回一個新的Series或者DataFrame,對原數據沒有影響,如果想在原數據上進行直接修改,使用inplace參數:
對DataFrame來說,dropna方法如果發現缺失值,就會進行整行刪除,不過可以指定刪除的方式,how=all,是當整行全是na的時候才進行刪除,同時還可以指定刪除的軸。
DataFrame填充缺失值可以統一填充,也可以按列填充,或者指定一種填充方式:
『叄』 Pandas基本操作
一、查看數據
1.查看DataFrame前xx行或後xx行
a=DataFrame(data);
a.head(6)表示顯示前6行數據,若head()中不帶參數則會顯示全部數據。
a.tail(6)表示顯示後6行數據,若tail()中不帶參數則也會顯示全部數據。
2.查看DataFrame的index,columns以,dtypes及values
a.index ; a.columns ; a.values;a.dtypes 即可
3.describe()函數對於數據的快速統計匯總
a.describe()對每一列數據進行統計,包括計數,均值,std,各個分位數等。
4.對數據的轉置
a.T
5.對軸進行排序
a.sort_index(axis=1,ascending=False);
其中axis=1表示對 所有的columns 進行排序,下面的數也跟著發生移動。後面的ascending=False表示按降序排列,參數缺失時默認升序。
6.對DataFrame中的值排序
a.sort(columns='x')
即對a中的x這一列,從小到大擾雀進行排序。注意僅僅是x這一列,而上面的按軸進行排序時會對所有的columns進行操作。
二、選擇對象
1.選擇特定列和行的數據
a['x'] 那麼將會返回columns為x的列, 注意這種方式一次只能返回一個列。 a.x與a['x']意思一樣。
取行數據,神李空通過切片[]來選擇
如:a[0:3] 則會返回前三行的數據。
2.通過標簽來選擇
a.loc['one']則會默認表示選取行為'one'的行;
a.loc[:,['a','b'] ] 表示選取所有的行以及columns為a,b的列;
a.loc[['one','two'],['a','b']] 表示選取'one'和'two'這兩行以及columns為a,b的列;
a.loc['one',''a]與a.loc[['one'],['a']]作用是一樣的,不過前者只顯示對應的值,而後者會顯示對應的行和列游瞎標簽。
3.通過位置來選擇
這與通過標簽選擇類似
a.iloc[1:2,1:2] 則會顯示第一行第一列的數據;(切片後面的值取不到)
a.iloc[1:2] 即後面表示列的值沒有時,默認選取 行位置為1的數據 ;
a.iloc[[0,2],[1,2]] 即可以自由選取行位置,和列位置對應的數據。
4.使用條件來選擇
使用 單獨的列 來選擇數據
a[a.c>0] 表示選擇c列中大於0的數據
使用where來選擇數據
a[a>0] 表直接選擇a中所有大於0的數據
使用isin()選出 特定列中包含特定值的行
a1=a.()
a1[a1['one'].isin(['2','3'])] 表顯示滿足條件:列one中的值包含'2','3'的所有行。
三、設置值(賦值)
賦值操作在上述選擇操作的基礎上直接賦值即可。
例a.loc[:,['a','c']]=9 即將a和c列的所有行中的值設置為9
a.iloc[:,[1,3]]=9 也表示將a和c列的所有行中的值設置為9
同時也依然可以用條件來直接賦值
a[a>0]=-a 表示將a中所有大於0的數轉化為負值
四、缺失值處理
在pandas中,使用np.nan來代替缺失值,這些值將默認不會包含在計算中。
1.reindex()方法
用來 對指定軸上的索引進行改變/增加/刪除操作 ,這將返回原始數據的一個拷貝。
a.reindex(index=list(a.index)+['five'],columns=list(b.columns)+['d'])
a.reindex(index=['one','five'],columns=list(b.columns)+['d'])
即用index=[]表示對index進行操作,columns表對列進行操作。
2.對缺失值進行填充
a.fillna(value=x)
表示用值為x的數來對缺失值進行填充
3.去掉包含缺失值的行
a.dropna(how='any')
表示去掉所有包含缺失值的行
五、合並
1.contact
contact(a1,axis=0/1,keys=['xx','xx','xx',...]),其中a1表示要進行進行連接的列表數據,axis=1時表橫著對數據進行連接。axis=0或不指定時,表將數據豎著進行連接。a1中要連接的數據有幾個則對應幾個keys, 設置keys是為了在數據連接以後區分每一個原始a1中的數據。
例:a1=[b['a'],b['c']]
result= pd.concat (a1,axis=1,keys=['1','2'])
2.Append 將一行或多行數據連接到一個DataFrame上
a.append(a[2:],ignore_index=True)
表示將a中的第三行以後的數據全部添加到a中,若不指定ignore_index參數,則會把添加的數據的index保留下來,若ignore_index=Ture則會 對所有的行重新自動建立索引。
3.merge類似於SQL中的join
設a1,a2為兩個dataframe,二者中存在相同的鍵值,兩個對象連接的方式有下面幾種:
(1)內連接,pd.merge(a1, a2, on='key')
(2)左連接,pd.merge(a1, a2, on='key', how='left')
(3)右連接,pd.merge(a1, a2, on='key', how='right')
(4)外連接, pd.merge(a1, a2, on='key', how='outer')
至於四者的具體差別,具體學習參考sql中相應的語法。
六、分組(groupby)
用pd.date_range函數生成連續指定天數的的日期
pd.date_range('20000101',periods=10)
『肆』 2020-08-05--Pandas-03--缺失值處理
這一章節我們來看下如何使用Pandas處理缺失值。
在了解缺失值(也叫控制)如何處理之前,首先要知道的就是什麼是缺失值?直觀上理解,缺知瞎失值表示的是「缺失的數據」。
可以思考一個問題:是什麼原因造成的缺失值呢?其實有很多原因,實際生活中可能由於有的數據不全所以導致數據缺失,也有可能由於誤操作導致數據缺失,又或者人為地造成數據缺失。
來看下我們的示例吧。
可以看到,用戶 Tom 的性別為 None,用戶 Mary 的年齡為 NAN,生日為 NaT。在 Pandas 的眼中,這些都屬於缺失值,可以使用 isnull() 或 notnull() 方法來操作。
isnull針對DataFrame對象,notnull()針對Series對象
isnull():判斷數據中的缺失值,若是確實值,則為True,否則為Flase,返回一個具體數據權威bool值的DataFrame對象
除了簡單的可以識別出哪些是缺失值或非缺失值外,最常用的就是過濾掉一些缺失的行。比如,我想過濾掉用戶年齡為空的用戶,如何操作呢?
notnull():查看每行的該值是否為確實值,若是,則為True,否則為False,返回Series對象。
對於Series對象,相對簡單,直接刪除對應搭旦空值為缺失值的行,返回刪除後的數據(Series對象)
對於DataFrame對象,相對復雜,因為刪除要謹慎操作,參數有:
除了可以丟棄缺失值外,也可以填充缺失值,最常見的是使用 fillna 完成填充。
fillna 這名字一看就是用來填充缺失值的。
填充缺失值時,常見的一種方式是使用一個標量來填充。例如,這里我樣有缺失的年齡都填充為 0。
除了可以使用標量來填充之外,還可以使用前一個或後一個有效值來填充。
設置參數 method='pad' 或 method='ffill' 可以使用前一個有效值來填充。
設置參數 method='bfill' 或 method='backfill' 可以使用後一個有效值來填充。
除了通過 fillna 方法來填充缺失值外,還可以通過 interpolate 方法來填充。默認情況下使用線性差值,可以是設置 method 參數來改變方式。
大家有沒有想過一個問題:到底什麼才是缺失值呢?你可能會奇怪說,前面不是已經說過了么,None、np.nan、NaT 這些都是缺失值。但是我也說過了,這些在 Pandas 的眼中是缺失值,有時候在我們人類的眼中,某些異常值我們也會當做缺失值來處理。
例如,在我們的存儲的用戶信息中,假定我們限定用戶都是青年,出現了年齡為 40 的,我們就可以認為這是一個異常值。再比如,我們都知道性別分為男遲枯性(male)和女性(female),在記錄用戶性別的時候,對於未知的用戶性別都記為了 「unknown」,很明顯,我們也可以認為「unknown」是缺失值。此外,有的時候會出現空白字元串,這些也可以認為是缺失值。
對於上面的這種情況,我們可以使用 replace 方法來替換缺失值。
對於Series對象
也可以指定一個映射字典。
對於DataFrame來說,可以在replace方法中加上參數inplace=True來做原地操作:可以對DataFrame,也可以針對某一列/行(Series):
可以指定每列要替換的值。設置為原地操作
類似地,我們可以將特定字元串進行替換.
除了可以替換特定的值之外,還可以使用正則表達式來替換,如:將空白字元串替換成空值。
除了我們自己手動丟棄、填充已經替換缺失值之外,我們還可以使用對象來填充。
例如有兩個關於用戶年齡的 Series,其中一個有缺失值,另一個沒有,我們可以將沒有的缺失值的 Series 中的元素傳給有缺失值的。
對於Series:
對於DataFrame,與Series一樣。
『伍』 缺失值處理
缺失數據
1 缺失值的統計和刪除
1.1 缺失信息的統計
缺失數據可以使用 isna 或 isnull (兩個函數沒有區別)來查看每個單元格是否缺失,通過和 sum 的組合可以計算出每列缺失值的比例。
如果想要查看某一列缺失或者非缺失的行,臘困信可以利用 Series 上的 isna 或者 notna 進行布爾索引。例如,查看身高缺失的行:
如果想要同時對幾個列,檢索出全部為缺失或者至少有一個缺失或者沒有缺失的行,可以使用 isna, notna 和any, all 的組合。例如,對身高、體重和轉系情況這 3 列分別進行這三種情況的檢索
1.2 缺失信息的刪除
數據處理中經常需要根據缺失值的大小、比例或其他特徵來進行行樣本或列特徵的刪除,pandas 中提供了dropna 函數來進行操作。
dropna 的主要參數為軸方向 axis (默認為 0,即刪除行)、刪除方式 how 、刪除的非缺失值個數閾值 thresh(非缺失值沒有達到這個數量的相應維度會被刪除)、備選的刪除子集 subset ,其中 how 主要有 any 和 all兩種參數可以選擇。
2 缺失值的填充和插值
2.1 利用 fillna 進行填充
在 fillna 中有三個參數是常用的:value, method, limit 。其中,value 為填充值,可以是標量,也可以是索引到元素的字輪輪典映射;method 為填充方法,有用前面的元素填充 ffill 和用後面的元素填充 bfill 兩種類型,limit 參數表示連續缺失值的最大填充次數。
2.2 插值函數
在關於 interpolate 函數的 文檔 描述中,列舉了許多插值法,包括了大量 Scipy 中的方法。由於很多插值方法涉及到比較復尺禪雜的數學知識,因此這里只討論比較常用且簡單的三類情況,即線性插值、最近鄰插值和索引插值。
對於 interpolate 而言,除了插值方法(默認為 linear 線性插值)之外,有與 fillna 類似的兩個常用參數,一個是控制方向的 limit_direction ,另一個是控制最大連續缺失值插值個數的 limit 。其中,限制插值的方向默認為 forward ,這與 fillna 的 method 中的 ffill 是類似的,若想要後向限制插值或者雙向限制插值可以指定為 backward 或 both
關於 polynomial 和 spline 插值的注意事項
在 interpolate 中 如 果 選 用 polynomial 的 插 值 方 法, 它 內 部 調 用 的 是scipy.interpolate.interp1d(*,*,kind=order) , 這 個 函 數 內 部 調 用 的 是 make_interp_spline方法,因此其實是樣條插值而不是類似於 numpy 中的 polyfit 多項式擬合插值;而當選用 spline方法時,pandas 調用的是 scipy.interpolate.UnivariateSpline 而不是普通的樣條插值。這一部分的文檔描述比較混亂,而且這種參數的設計也是不合理的,當使用這兩類插值方法時,用戶一定要小心謹慎地根據自己的實際需求選取恰當的插值方法。
3 Nullable 類型
3.1 缺失記號及其缺陷
在 python 中的缺失值用 None 表示,該元素除了等於自己本身之外,與其他任何元素不相等:
在 numpy 中利用 np.nan 來表示缺失值,該元素除了不和其他任何元素相等之外,和自身的比較結果也返回False
值得注意的是,雖然在對缺失序列或表格的元素進行比較操作的時候,np.nan 的對應位置會返回 False ,但是在使用 equals 函數進行兩張表或兩個序列的相同性檢驗時,會自動跳過兩側表都是缺失值的位置,直接返回 True :
在時間序列的對象中,pandas 利用 pd.NaT 來指代缺失值,它的作用和 np.nan 是一致的
那麼為什麼要引入 pd.NaT 來表示時間對象中的缺失呢?仍然以 np.nan 的形式存放會有什麼問題?在 pandas中可以看到 object 類型的對象,而 object 是一種混雜對象類型,如果出現了多個類型的元素同時存儲在 Series中,它的類型就會變成 object
NaT 問題的根源來自於 np.nan 的本身是一種浮點類型,而如果浮點和時間類型混合存儲,如果不設計新的內置缺失類型來處理,就會變成含糊不清的 object 類型,這顯然是不希望看到的。
同時,由於 np.nan 的浮點性質,如果在一個整數的 Series 中出現缺失,那麼其類型會轉變為 float64 ;而如果在一個布爾類型的序列中出現缺失,那麼其類型就會轉為 object 而不是 bool
因此,在進入 1.0.0 版本後,pandas 嘗試設計了一種新的缺失類型 pd.NA 以及三種 Nullable 序列類型來應對這些缺陷,它們分別是 Int, boolean 和 string 。
3.2 Nullable 類型的性質
從字面意義上看 Nullable 就是可空的,言下之意就是序列類型不受缺失值的影響。例如,在上述三個 Nullable類型中存儲缺失值,都會轉為 pandas 內置的 pd.NA
在 Int 的序列中,返回的結果會盡可能地成為 Nullable 的類型
對於 boolean 類型的序列而言,其和 bool 序列的行為主要有兩點區別:
第一點是帶有缺失的布爾列表無法進行索引器中的選擇,而 boolean 會把缺失值看作 False
第二點是在進行邏輯運算時,bool 類型在缺失處返回的永遠是 False ,而 boolean 會根據邏輯運算是否能確定唯一結果來返回相應的值。那什麼叫能否確定唯一結果呢?舉個簡單例子:True | pd.NA 中無論缺失值為什麼值,必然返回 True ;False | pd.NA 中的結果會根據缺失值取值的不同而變化,此時返回 pd.NA ;False& pd.NA 中無論缺失值為什麼值,必然返回 False 。
3.3 缺失數據的計算和分組
當調用函數 sum, prob 使用加法和乘法的時候,缺失數據等價於被分別視作 0 和 1,即不改變原來的計算結果
當使用累計函數時,會自動跳過缺失值所處的位置:
當進行單個標量運算的時候,除了 np.nan ** 0 和 1 ** np.nan 這兩種情況為確定的值之外,所有運算結果全為缺失(pd.NA 的行為與此一致),並且 np.nan 在比較操作時一定返回 False ,而 pd.NA 返回 pd.NA
另外需要注意的是,diff, pct_change 這兩個函數雖然功能相似,但是對於缺失的處理不同,前者凡是參與缺失計算的部分全部設為了缺失值,而後者缺失值位置會被設為 0% 的變化率
對於一些函數而言,缺失可以作為一個類別處理,例如在 groupby, get_mmies 中可以設置相應的參數來進行增加缺失類別:
4 練習
4.1 Ex1:缺失值與類別的相關性檢驗
.4.2 Ex2:用回歸模型解決分類問題
『陸』 Pandas基礎教程
DataFrameGroupBy對象常用的函數:
數據缺失通常有兩種情況:
一種就是空,None等,在pandas是NaN(和np.nan一樣)。
另一高歷如種是我們讓其為0,藍色框中。
在pandas中數據缺失處理方法 :
判斷數據是否為NaN:pd.isnull(df),pd.notnull(df)
處理方式1:刪除NaN所在的行列dropna (axis=0, how='any', inplace=False)
處理方式2:填充數據,t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)
處理為0的數據:t[t==0]=np.nan
注意 :當然並不是每次為0的數據都需要處理;計算平均值等情況,nan是不參與計算的,但是0會。
r取值范圍[‐1,1]
0.8‐1.0 極強相關;0.6‐0.8 強相關;戚啟 0.4‐0.6 中等程度相關; 0.2‐0.4 弱相關; 0.0‐0.2 極弱相關或無相關。
相關分析函數 適用於Series和DataFrame類型
參考資料:
網址:
https://blog.csdn.net/qq_35318838/article/details/80564938
書籍:
《python數據科學手冊》
《利用python進行數據分析》
《python科學計算》
視頻:
《黑馬程序員之數據分析》
《爛仔python數據分析與展示》
『柒』 pandas 處理缺失值[dropna、drop、fillna]
一本正經胡說八道的貓
面對缺失值三種處理方法源轎擾:
參考原文鏈接
option 1: 去掉含有缺失值的樣本(行)
option 2:將含有缺失值的列(特徵向量)去掉
option 3:將缺失值用某雹旦些帆悉值填充(0,平均值,中值等)
對於dropna和fillna,dataframe和series都有,在這主要講datafame的
dropna() 方法的其他參數。
參數說明:
方法二:替換並刪除,Python pandas 如果某列值為空,過濾刪除所在行數據
如上面的df數據,這個時候的思路是:
fillna()給空值填充一個數值(如999999)
index.tolist()找出值為填充值所在行的索引
drop根據索引幹掉對應的行
『捌』 【數據分析】:Pandas的函數與功能
【注意】:顯示索引選擇時,包括最後一輪棚困個索引。隱式索引則不包括。
索引器包括:loc、iloc、ix
[Out]:
[Out]:
【技能提升】:ix 索引器,可以將顯示索引和隱式索引混合使用。但是 ix不被新版本支持了,所以作為了解就好。
【】:
任何處於處理Numpy形式數據的方法 ,都可以用於這些索引器。比如:掩碼、花式索引;
【】:臘念任何一種取值方法,都可以用於調整數據。
【解釋】:
[Out]:
【解釋】:
【注釋】:
Pandas 採用標簽法來表示缺失值,有兩種方式:
【注意】:
pandas 將None與NaN看成是可等價交換的,在適當的時候,會將兩者進行替換,除此之外,Pandas 會將沒有標簽值的數據,自動轉換成NaN。實例如下:
andas:對不同類型的缺失值的轉換規則
【注意】:Pandas 中,字元串使用object類型存儲。
關於 【thresh】:通過thresh 設置非和改缺失值的最小數量(thresh=n:表沒有缺失值)
【方法優化】:
將Series | DataFrame 的index參數設置為至少二維的索引數組
『玖』 基於python的prosper借貸平台之數據分析
項目介紹:
p2p 借貸業兄租務具有門檻低,渠道成本低的特性,風險防控對於出借企業來說畝升非常重要。本項目需要
從大量借貸者的數據集中分析出容易違約和不容易違約的人群畫像特徵,以給業務做貸前決策使
用。同時使用機器學習演算法,實現自動識別風險人群(精準率為 89.86%),加快人工審查效率。
項目具體內容:
1、使用 python pandas 工具進行數據清洗、缺失值、異常值處理以及特徵指標篩選。
2、使用 python matplotlib 可視化工具進行探索式數據分析,展示用戶關鍵特徵如月收入、信用卡
透支情況對於違約率的影響情況。
3、使用機器學習隨機森林進行建模分析,使用學習曲線、網格搜索、交叉驗證,最終得到了一個評
分為 84.9%、精準率為 89.86%、召回率為 80.70%、auc 面積為 0.9337 數據預測模型。
本次數據訓練使用的模型是隨機森林分類演算法,通過對預處理過的數據集進行訓練,使用學習曲線、網格搜索、交叉驗證。最終得到了一個評分為84.9%、精準率為89.86%、召回率為80.70%、 auc面積為0.9337 數據預測模型。
數據預處理的基本流程與思路:
1、首先要明確有多少特徵,哪些是連續的,哪些是類別的。
2、檢查有沒有缺失值,對確實的特徵選擇恰當方式進行彌補,使數據完整。
3、對連續的數值型特徵進行標准化,使得均值為0,方差為1。
4、對類別型的特徵進行one-hot編碼。
5、將需要轉換成類別型數據的連續型數據進行二值化。
6、為防止過擬合或者其他原因,選擇是否要將數據進行正則化。
7、在對數據進行初探之後發現效果不佳,可以嘗試使用多項式方法,尋找非線性的關系。
8、根據實際問題分析是否需要對特徵進行相應的函數轉換。
導入數據集,並查看數據基本情況。可以看到prosper原始數據量比較龐大,一個有113937個樣本,80個特徵列,1個標簽列。
1.1、特徵較多,先共刪減一部分無用的特徵。
1.2 查看數據缺失情況,可以看到有40個特徵是存在數據缺失的,缺失率從0.000219-0.882909不等。下面處理缺失數據。
1.2.1 刪除缺失值比較多的特徵
下面兩個特徵缺失率太高,且與迅塵老我們要分析的相關性不大,直接刪除掉。
1.2.2 獲取數據類型是分類變數的所有特徵,並使用unknown進行填充
1.2.3 特殊變數使用計算公式進行填充
1.2.4 去掉意義重復列
1.2.5 刪除缺失率比較少的特徵的缺失數據行
處理完缺失數據後,樣本量為106290,特徵量為55
1.3 數據過濾
1.3.1 從2009年7月開始,Prosper調整了對客戶的評估方式,此次我們只對2009-07-01後的貸款進行分析。
過濾完數據後,樣本量變為82931,特徵量為54
2.1單變數分析
0為未違約人數,1位違約人數,可以看到2009.07以後,違約率為22.90%
2.1.1不同地區貸款數量分布
從圖中可以看到加利福尼亞州貸款數量遠比其他州的數量高。由於prosper總部就位於加利福尼亞州,這與實際情況一致。其他排名靠前的分別是得克薩斯、紐約、佛羅里達、伊利諾伊,貸款數據均超過了5000條。根據2015年美國各州的GDP排名,這5個州剛好排名前五,而且順序也是一致的。說明Prosper平台的用戶主要分布在美國經濟發達的地區。
2.1.2 貸款人收入情況分布
年薪在25000美金以上在美國屬於技術性白領或者有一定學歷的職員,50000美金已經是近金領階層,比如:大學教授,醫生等。從圖中可以看出Prosper平台用戶的收入水平都相對較高,有利於用戶還款,利於平台和投資者的風險控制。
2.1.3貸款人職業分布
從圖中可以看出,除了不願意透露具體職業的人,大部分用戶是教授、程序員、企業高管等具有一定社會地位的人,這部分人受過高等教育,信用有一定保障。另外,這與之前看到的收入情況相符。
2.1.4貸款人債務收入比分布
大部分用戶的債務收入比在0.2左右,超過0.5的占很少部分。說明Prosper平台用戶的還款能力還是比較樂觀的
2.1.5 貸款者信用卡使用情況
BankcardUtilization代表的是信用卡使用金額和信用卡額度的比值,可以體現用戶的資金需求。Prosper用戶多是0.5~1之間,說明用戶每個月還有信用卡要還,降低了其還款能力。
2.2 相關的關鍵因素對貸款違約率的影響
2.2.1借貸人收入IncomeRange對違約率的影響
從圖中可以看出:
1.一般來說收入越高違約率越低
2.貸款的人員主要集中在中等收入群體
2.2.2 債務收入比DebtToIncomeRatio對違約率的影響
從上圖可以看出:
1.債務收入比小於0.6時,違約數明顯小於未違約數,
2.當債務收入比大於0.6時,兩者的差距不是很明顯甚至違約數大於未違約數,說明了債務收入比越大的人越容易違約
2.2.3 借款人BankcardUtilization對違約率的影響
1.總的來說,隨著信用卡的透支比例越來越高,違約率也越來越高
2.SuperUse的違約率到了37.5%,這部分人群需要嚴格了監控,No Use人群也有31%的違約率,當初將信用卡透支比例為0和NA的數據都歸類為No Use,顯然沒有這么簡單,應該是大部分人群的NA值是為了隱藏自己的高透支比例而填寫的
2.2.4 消費信用分CreditScoreRange對違約率的影響
從上圖可以看出:
1.隨著信用分數CreditScore的上升,它的違約率在下降
2.大部分貸款者的信用分為650-800,違約率在0.06-0.02
2.2.5 過去7年借款人違約次數DelinquenciesLast7Years對違約率的影響
過去七年違約次數(DelinquenciesLast7Years)能夠衡量一個人在過去七年中徵信情況,違約一次或以上的人在借款時違約概率更大。
從上圖可以看出:
1.總體來說過去7年違約次數越多,違約率越高
2.過去7年未違約的人數相對來說比其他違約的人數高很多,具體看下面的分析
3.1 數據轉化
3.1.1類變數進行啞變數化
樣本量變為82931,特徵量為127
3.1.2 標簽變數進行二分類
已完成貸款的樣本量變為26365,特徵量為127
未違約率為:0.7709084012895885;違約率為0.22909159871041151
3.2 至此,數據預處理的工作就告一段落,保存預處理好的數據。
導入經過預處理的prosper借貸數據集
4.1 手工挑選特徵查看一下建模效果
准確率為0.7695
4.2 使用模型自己選取特徵
准確率為0.7780
4.3 使用學習曲線選取最優n_estimators
在0-200/20內學習,得到最優n_estimators=161,score = 0.8508
在151-171/20內學習,得到最優n_estimators=163,score = 0.8511
4.4 使用網格搜索調其他參數
在0-60/5內學習,得到最優max_depth=41
在0-60/5內學習,得到最優max_features=16
這里由於比較耗時,沒有進一步細化選擇更高的參數
4.4 最終模型效果
最終准確率 0.8490528905289052
混淆矩陣 :
[[5552 554]
[1175 4914]]
精準率 : [0.82533076 0.89868325]
召回率 : [0.90926957 0.80702907]
roc和auc面積為0.9337
4.5 查看各特徵的重要性
4.6 數據預測
預測的違約率0.0427