【回顧&引言】前面一章的內(nèi)容大家可以感覺到我們主要是對(duì)基礎(chǔ)知識(shí)做一個(gè)梳理榜田,讓大家了解數(shù)據(jù)分析的一些操作瞒爬,主要做了數(shù)據(jù)的各個(gè)角度的觀察。那么在這里堪簿,我們主要是做數(shù)據(jù)分析的流程性學(xué)習(xí)棒旗,主要是包括了數(shù)據(jù)清洗以及數(shù)據(jù)的特征處理喘批,數(shù)據(jù)重構(gòu)以及數(shù)據(jù)可視化。這些內(nèi)容是為數(shù)據(jù)分析最后的建模和模型評(píng)價(jià)做一個(gè)鋪墊铣揉。
開始之前饶深,導(dǎo)入numpy、pandas包和數(shù)據(jù)
import numpy as np
import pandas as pd
df = pd.read_csv('train.csv')
df.head(3)
第二章:第一節(jié)數(shù)據(jù)清洗及特征處理
我們拿到的數(shù)據(jù)通常是不干凈的逛拱,所謂的不干凈敌厘,就是數(shù)據(jù)中有缺失值,有一些異常點(diǎn)等朽合,需要經(jīng)過(guò)一定的處理才能繼續(xù)做后面的分析或建模俱两,所以拿到數(shù)據(jù)的第一步是進(jìn)行數(shù)據(jù)清洗,本章我們將學(xué)習(xí)缺失值曹步、重復(fù)值锋华、字符串和數(shù)據(jù)轉(zhuǎn)換等操作,將數(shù)據(jù)清洗成可以分析或建模的亞子箭窜。
2.1 缺失值觀察與處理
我們拿到的數(shù)據(jù)經(jīng)常會(huì)有很多缺失值,比如我們可以看到Cabin列存在NaN衍腥,那其他列還有沒(méi)有缺失值磺樱,這些缺失值要怎么處理呢
2.1.1 任務(wù)一:缺失值觀察
(1) 請(qǐng)查看每個(gè)特征缺失值個(gè)數(shù)
(2) 請(qǐng)查看Age, Cabin婆咸, Embarked列的數(shù)據(jù) 以上方式都有多種方式竹捉,所以大家多多益善
df.info()
df.isnull().sum()
df[['Age','Cabin','Embarked']].head(3)
2.1.2 任務(wù)二:對(duì)缺失值進(jìn)行處理
(1)處理缺失值一般有幾種思路
(2) 請(qǐng)嘗試對(duì)Age列的數(shù)據(jù)的缺失值進(jìn)行處理
(3) 請(qǐng)嘗試使用不同的方法直接對(duì)整張表的缺失值進(jìn)行處理
df[df['Age']==None] =0
df[df['Age'].isnull()]=0
df[df['Age']==np.nan].head(3)
df.dropna(axis=0,how='any')
df.fillna(0)
【思考1】dropna和fillna有哪些參數(shù),分別如何使用呢??
DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None, inplace=False)
1尚骄、axis =0:刪除所在行 axis =1或者columns:刪除所在列
2块差、how=any:刪除任一個(gè)行/列 how=all:當(dāng)所有行/列為NA時(shí)才刪除
3、提高刪除NA的閾值倔丈。參數(shù)thresh=2憨闰,表示行/列中的NA數(shù)量大于2才刪除
4、參數(shù)subset設(shè)置待判斷的列/行名需五,這些列/行中有NA值則所在行/列被刪除
5鹉动、將處理后的df替換原本的df。參數(shù)inplace=True
DataFrame.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
1宏邮、設(shè)定每列NA的填充值泽示。value為字典格式
2缸血、用前向值/后向值填充NA。method='fillna'表示NA被前一個(gè)值填充
3械筛、設(shè)定每列/行的填充數(shù)捎泻。limit=1表示每列/行僅僅填充1個(gè)NA
4、參數(shù)axis和inplace與dropna相同
【參考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html
【參考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
【思考】檢索空缺值用np.nan,None以及.isnull()哪個(gè)更好埋哟,這是為什么笆豁?如果其中某個(gè)方式無(wú)法找到缺失值,原因又是為什么定欧?
2.2 重復(fù)值觀察與處理
由于這樣那樣的原因渔呵,數(shù)據(jù)中會(huì)不會(huì)存在重復(fù)值呢,如果存在要怎樣處理呢
2.2.1 任務(wù)一:請(qǐng)查看數(shù)據(jù)中的重復(fù)值
df[df.duplicated()]
2.2.2 任務(wù)二:對(duì)重復(fù)值進(jìn)行處理
(1)重復(fù)值有哪些處理方式呢砍鸠?
(2)處理我們數(shù)據(jù)的重復(fù)值
df.drop_duplicates()
df.head()
2.2.3 任務(wù)三:將前面清洗的數(shù)據(jù)保存為csv格式
df.to_csv('test_train_csv')
2.3 特征觀察與處理
我們對(duì)特征進(jìn)行一下觀察扩氢,可以把特征大概分為兩大類:
數(shù)值型特征:Survived ,Pclass爷辱, Age 录豺,SibSp, Parch饭弓, Fare双饥,其中Survived, Pclass為離散型數(shù)值特征弟断,Age咏花,SibSp, Parch阀趴, Fare為連續(xù)型數(shù)值特征
文本型特征:Name昏翰, Sex, Cabin刘急,Embarked棚菊, Ticket,其中Sex叔汁, Cabin统求, Embarked, Ticket為類別型文本特征据块,數(shù)值型特征一般可以直接用于模型的訓(xùn)練码邻,但有時(shí)候?yàn)榱四P偷姆€(wěn)定性及魯棒性會(huì)對(duì)連續(xù)變量進(jìn)行離散化。文本型特征往往需要轉(zhuǎn)換成數(shù)值型特征才能用于建模分析另假。
2.3.1 任務(wù)一:對(duì)年齡進(jìn)行分箱(離散化)處理
(1) 分箱操作是什么冒滩?
簡(jiǎn)單點(diǎn)說(shuō)就是將不同的東西,按照特定的條件放到一個(gè)指定容器里浪谴,比如水果 把綠色的放一個(gè)籃子里开睡,紅色一個(gè)籃子等等因苹,這個(gè)籃子就是箱,而水果就是數(shù)據(jù) 顏色就是條件
(2) 將連續(xù)變量Age平均分箱成5個(gè)年齡段篇恒,并分別用類別變量12345表示?
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
參數(shù): x扶檐,類array對(duì)象,且必須為一維胁艰,待切割的原形式
bins, 整數(shù)款筑、序列尺度、或間隔索引腾么。如果bins是一個(gè)整數(shù)奈梳,它定義了x寬度范圍內(nèi)的等寬面元數(shù)量,但是在這種情況下解虱,x的范圍在每個(gè)邊上被延長(zhǎng)1%攘须,以保證包括x的最小值或最大值。如果bin是序列殴泰,它定義了允許非均勻in寬度的bin邊緣于宙。在這種情況下沒(méi)有x的范圍的擴(kuò)展。
right,布爾值悍汛。是否是左開右閉區(qū)間
labels,用作結(jié)果箱的標(biāo)簽捞魁。必須與結(jié)果箱相同長(zhǎng)度。如果FALSE离咐,只返回整數(shù)指標(biāo)面元谱俭。
retbins,布爾值。是否返回面元
precision宵蛀,整數(shù)旺上。返回面元的小數(shù)點(diǎn)幾位
include_lowest,布爾值糖埋。第一個(gè)區(qū)間的左端點(diǎn)是否包含?
df['AgeBand'] = pd.cut(df['Age'],5,labels=[1,2,3,4,5]) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? df.head()
(3) 將連續(xù)變量Age劃分為[0,5) [5,15) [15,30) [30,50) [50,80)五個(gè)年齡段,并分別用類別變量12345表示?
df['AgeBand1'] = pd.cut(df['Age'],5,right = False,labels =[1,2,3,4,5],include_lowest=True) df.head()
(4) 將連續(xù)變量Age按10% 30% 50% 70% 90%五個(gè)年齡段窃这,并用分類變量12345表示
df['AgeBand1'] = pd.cut(df['Age'],5,right = False,labels =[1,2,3,4,5],include_lowest=True) df.head()
(5) 將上面的獲得的數(shù)據(jù)分別進(jìn)行保存瞳别,保存為csv格式
【參考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.cut.html
【參考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.qcut.html
2.3.2 任務(wù)二:對(duì)文本變量進(jìn)行轉(zhuǎn)換
(1) 查看文本變量名及種類
#方法一: value_counts df['Sex'].value_counts()
#方法二: unique df['Sex'].unique()
df['Sex'].nunique()
(2) 將文本變量Sex, Cabin 杭攻,Embarked用數(shù)值變量12345表示
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2]) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? df.head()
#方法二: map df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2}) ? ? ? ? ? ? ? ? ?df.head()
#方法三: 使用sklearn.preprocessing的LabelEncoder ? ? ?不怎么理解祟敛,需進(jìn)一步了解 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?from sklearn.preprocessing import LabelEncoder ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? for feat in ['Cabin', 'Ticket']: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?lbl = LabelEncoder() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique()))) ? ? ? ? ? ? ? ? ? ? ? ? ? ?df[feat + "_labelEncode"] = df[feat].map(label_dict) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str)) ? ? ? ? ? ? ? ? ? ? ? ? ? df.head()
(3) 將文本變量Sex, Cabin兆解, Embarked用one-hot編碼表示
#將類別文本轉(zhuǎn)換為one-hot編碼 ?不怎么理解馆铁,需進(jìn)一步了解?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#方法一: OneHotEncoder?
for feat in ["Age", "Embarked"]:?
? ?# x = pd.get_dummies(df["Age"] // 6)?
? ?# x = pd.get_dummies(pd.cut(df['Age'],5))?
? ?x = pd.get_dummies(df[feat], prefix=feat)?
? ?df = pd.concat([df, x], axis=1)?
? ?#df[feat] = pd.get_dummies(df[feat], prefix=feat)?
df.head()
2.3.3 任務(wù)三:從純文本Name特征里提取出Titles的特征(所謂的Titles就是Mr,Miss,Mrs等)
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?df.head()
#保存最終你完成的已經(jīng)清理好的數(shù)據(jù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?df.to_csv('test_fin.csv')