【数据分析入门】泰坦尼克号生存率预测(一)
數(shù)據(jù)加載
首先在Kaggle上找到對(duì)應(yīng)的競(jìng)賽頁(yè)面,報(bào)名參賽下載數(shù)據(jù),可以得到了一個(gè)train.csv和test.csv文件。
當(dāng)然,如果你的電腦上已經(jīng)安裝了kaggle的包,當(dāng)然也可以使用命令行直接下載:
kaggle competitions download -c titanic
接著載入數(shù)據(jù),可以選擇使用相對(duì)路徑或絕對(duì)路徑,這里將使用絕對(duì)路徑,將表頭修改成中文,索引改為乘客的ID,便于觀察。
'''
----- kaggle_titanic
|----- train.csv
|----- test.csv
----- data_analysis.ipynb
'''
df = pd.read_csv('kaggle_titanic/train.csv', names = ['乘客ID', '是否幸存', '倉(cāng)位等級(jí)', '姓名', '性別', '年齡',
'兄弟姐妹個(gè)數(shù)', '父母子女個(gè)數(shù)', '船票信息', '票價(jià)', '客艙', '登船港口'], index_col='乘客ID', header = 0)
'''
常用params:
- chunksize: number,表示在逐塊提取過(guò)程中,每一塊的行數(shù)。
- names: list[],和列數(shù)相同,表頭修改后的別名
- index_col: 默認(rèn)為False/number,表示是否重新設(shè)置新的索引index
- header: 當(dāng)選擇默認(rèn)值或header=0時(shí),將首行設(shè)為列名。如果為1的話,展示的表格就從第二行開(kāi)始
'''
其中,chunksize是在對(duì)數(shù)據(jù)進(jìn)行逐塊提取時(shí)使用的參數(shù)。之所以進(jìn)行逐塊提取,是因?yàn)楫?dāng)你從一個(gè)有40億行數(shù)據(jù)的csv文件中抽取出滿足條件的某些行的數(shù)據(jù),如果直接使用pandas的read_csv()方法去讀取這個(gè)csv文件,那服務(wù)器的內(nèi)存是會(huì)吃不消的,所以就非常有必要使用chunksize去分塊處理。而經(jīng)過(guò)chunksize后將得到一個(gè)可迭代的返回結(jié)果:
chunker = pd.read_csv(path, chunksize=100)
type(chunker) # <class 'pandas.io.parsers.TextFileReader'>
for chunk in chunker
print(chunk) # 發(fā)現(xiàn)每一個(gè)chunk都有100行
當(dāng)然,你也可以使用其他方法去替換表頭,比如說(shuō)
# 方法一: 直接修改columns
df.columns = ['乘客ID', '是否幸存', '倉(cāng)位等級(jí)', '姓名', '性別', '年齡',
'兄弟姐妹個(gè)數(shù)', '父母子女個(gè)數(shù)', '船票信息', '票價(jià)', '客艙', '登船港口']
# 方法二: 重命名columns
df.rename(columns={'乘客ID': 'userID', ....}, inplace=True) # 注意inplace=True時(shí)將直接修改df
# 最后,還是要設(shè)置一個(gè)新的索引
df = df.set_index(keys=['乘客ID', '是否幸存' ])
'''
np.set_index():
函數(shù)原型:DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
參數(shù)解釋:
- keys:列標(biāo)簽或列標(biāo)簽/數(shù)組列表,需要設(shè)置為索引的列
- drop:默認(rèn)為True,刪除用作新索引的列
- append:默認(rèn)為False,是否將列附加到現(xiàn)有索引
- inplace:默認(rèn)為False,適當(dāng)修改DataFrame(不要?jiǎng)?chuàng)建新對(duì)象)
- verify_integrity:默認(rèn)為false,檢查新索引的副本。否則,請(qǐng)將檢查推遲到必要時(shí)進(jìn)行。將其設(shè)置為false將提高該方法的性能。
'''
接著你可以使用一些操作簡(jiǎn)單的看看數(shù)據(jù)。
df.info()
df.head(10) # df.tail(10)
df.isnull().head() # 判斷數(shù)據(jù)是否為空,為空的地方返回True,其余地方返回False
df.to_csv(filename)
對(duì)于一個(gè)數(shù)據(jù),你還可以從每列的數(shù)據(jù)類型來(lái)觀察。當(dāng)然,對(duì)于泰坦尼克號(hào)這一數(shù)據(jù)集而言,還可以進(jìn)一步觀察性別與生存率、倉(cāng)位等級(jí)(社會(huì)等級(jí))與生存率、家屬數(shù)與生存率、年齡與生存率等數(shù)據(jù)之間的關(guān)系。
Pandas的相關(guān)知識(shí)
Pandas中有兩個(gè)數(shù)據(jù)類型DataFrame和Series。
Series是一種類似于一維數(shù)組的對(duì)象。它由一組數(shù)據(jù)(各種Numpy數(shù)據(jù)類型)以及一組與之相關(guān)的數(shù)據(jù)標(biāo)簽(即索引)組成,它只有行索引。
DataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值類型(數(shù)值、字符串、布爾型值)。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共同用一個(gè)索引)。
我們比較常用的是DataFrame,通過(guò)簡(jiǎn)單的操作查看DataFrame的結(jié)構(gòu):
df.columns
df['xxx'] # 可以查看表頭為xxx這列的所有項(xiàng)
del df['xxx'] # 列刪除
當(dāng)然,你依舊可以考慮用其他方法刪除多余的列:
df.drop(['性別', '票價(jià)'],axis=1, inplace=True) # 刪除多列
# inplace 是起了一個(gè)保存作用,如果沒(méi)有它,就只是隱藏了列元而已
接著可以做一些條件篩選,比如找到年紀(jì)大于50歲的乘客,或者是找到年紀(jì)大于40和小于20的乘客,涉及到一些交并的操作:
midage = df[(df["年齡"] > 50) | (df["年齡"] < 20)] # 并集
midage = df[(df["年齡"] > 50) & (df["年齡"] < 20)] # 交集
當(dāng)你想取特定行特定列的元素時(shí),你或許需要將之前設(shè)定的“乘客id”索引給刪去,這樣才能完成特定行的獲取。
midage = midage.reset_index(drop=True)
'''
reset_index():
函數(shù)原型:DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
參數(shù)解釋:
- level:int、str、tuple或list,默認(rèn)無(wú),僅從索引中刪除給定級(jí)別。默認(rèn)情況下移除所有級(jí)別。
- drop:drop為False則索引列會(huì)被還原為普通列,否則會(huì)丟失
- inplace:默認(rèn)為false,適當(dāng)修改DataFrame(不要?jiǎng)?chuàng)建新對(duì)象)
- col_level:int或str,默認(rèn)值為0,如果列有多個(gè)級(jí)別,則確定將標(biāo)簽插入到哪個(gè)級(jí)別。默認(rèn)情況下,它將插入到第一級(jí)。
- col_fill:對(duì)象,默認(rèn)‘’,如果列有多個(gè)級(jí)別,則確定其他級(jí)別的命名方式。如果沒(méi)有,則重復(fù)索引名
'''
然后你就可以進(jìn)行“定位”取數(shù)的操作了:
midage.loc[[100, 105, 108], ['Pclass', 'Name', 'Sex']]
midage.iloc[[100, 105, 108], [2, 3, 4]] # iloc不能直接通過(guò)列名獲取數(shù)值,而是要寫出第幾列
另外,可進(jìn)行特定行列取數(shù)的函數(shù)還有iloc(),兩者之間的差異可參考博客:https://blog.csdn.net/Leon_Kbl/article/details/97492966,寫得非常清楚。
我們有的時(shí)候會(huì)對(duì)兩個(gè)DataFrame相加,這時(shí)候會(huì)返回一個(gè)新的DataFrame,對(duì)應(yīng)的行和列的值會(huì)想加,沒(méi)有對(duì)應(yīng)的就會(huì)變成空值。比如說(shuō)兩個(gè)DataFrame的(1, 1)位置上,都有值1,那么兩者想加的結(jié)果就是2。反之一個(gè)有一個(gè)無(wú),則得到的結(jié)果就是NaN。
數(shù)據(jù)分析探索
很多網(wǎng)站的表格都會(huì)做一個(gè)升序降序的功能,在數(shù)據(jù)分析的時(shí)候我們也會(huì)有這類的需求:
df.sort_value(by=['xx', 'xx'], ascending=True)
'''
params:
- by: 選擇待排序的列,可以是單個(gè)也可以多個(gè)
- ascending: True/False,True是升序
'''
你還可以選擇對(duì)行、列索引進(jìn)行升/降序排列。
df.sort_index() # 行索引升序
df.sort_index(axis = 1) # 列索引升序,其實(shí)就是表頭的排序是正確的
或者你對(duì)船上最大家族的人數(shù)感興趣,你也可以:
max(text['兄弟姐妹個(gè)數(shù)'] + text['父母子女個(gè)數(shù)'])
# 同樣的方法你可以看看其他感興趣的數(shù)據(jù)
Pandas的describe()函數(shù)查看數(shù)據(jù)基本統(tǒng)計(jì)信息:
train_data.describe()
'''
count 樣本大小
mean 平均值
std 標(biāo)準(zhǔn)差
min 最小值
25% 樣本數(shù)據(jù)25%時(shí)候的值
50% 50%
75% 75%
max 最大值
'''
通過(guò)describe()函數(shù)我們可以簡(jiǎn)單地看出哪些是數(shù)值型數(shù)據(jù)哪些是字符型數(shù)據(jù),對(duì)于字符型數(shù)據(jù)我們當(dāng)然要轉(zhuǎn)換成數(shù)值型數(shù)據(jù)來(lái)處理,比如可以轉(zhuǎn)換成0-1編碼的數(shù)值型。
但需要注意的是,對(duì)于一些數(shù)值型數(shù)據(jù)卻未必就不需要進(jìn)一步的處理了,比如Pclass特征,從名字我們就可以看出這是標(biāo)識(shí)倉(cāng)位等級(jí)的特征,取值范圍為[1, 2, 3],這個(gè)特征我們不應(yīng)該簡(jiǎn)單地當(dāng)作一個(gè)數(shù)值型數(shù)據(jù)放進(jìn)分類模型中直接跑,應(yīng)該把它轉(zhuǎn)變?yōu)閛ne-hot編碼,標(biāo)識(shí)乘客不同的倉(cāng)位,這一步我們將在數(shù)據(jù)預(yù)處理步驟完成。
另外,你也可以單獨(dú)看看特定列的信息統(tǒng)計(jì):
text['父母子女個(gè)數(shù)'].describe() # 或許可以看出訊息,絕大多數(shù)乘客都沒(méi)有帶父母子女
text['票價(jià)'].describe()
課后思考
1. read_table和read_csv的異同
read_csv是pandas中專門用于csv文件讀取的功能,不過(guò)這并不是唯一的處理方式。pandas中還有讀取表格的通用函數(shù)read_table。兩者都是加載帶分隔符的數(shù)據(jù),每一個(gè)分隔符作為一個(gè)數(shù)據(jù)的標(biāo)志,但二者讀出來(lái)的數(shù)據(jù)格式是不一樣的。
兩者在讀取數(shù)據(jù)時(shí)的主要差異性如下:
| 默認(rèn)分隔符 | 使用方式 | 輸出結(jié)果 | |
|---|---|---|---|
| read_csv | 逗號(hào) | pd.read_csv( ) |
每一個(gè)字符串作為一列 |
| read_table | 制表符' ' | pd.read_table |
每個(gè)字符串之間有逗號(hào)相隔 |
由于read_table以制表符 作為數(shù)據(jù)的標(biāo)志,也就是以行為單位進(jìn)行存儲(chǔ)。因此在讀取數(shù)據(jù)的過(guò)程中:
df_csv = pd.read_csv(path)
df_table = pd.read_table(path)
print(df_csv.shape) # (891, 12)
print(df_table.shape) # (891, 1)
輸出結(jié)果表明,使用read_table是對(duì)每一行作為一個(gè)維度進(jìn)行了存儲(chǔ),可以得到一個(gè)n行1列的數(shù)組,每一行字符串為一列而不是每一個(gè)字符串。而使用read_csv是一個(gè)n行k列的數(shù)組,因?yàn)樗鼘⒚恳粋€(gè)字符串作為了一列。
總結(jié)
以上是生活随笔為你收集整理的【数据分析入门】泰坦尼克号生存率预测(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: sqlite3的backup和resto
- 下一篇: java 输出三位数和n位数的每一位的数