动手学习数据分析——第一部分
數(shù)據(jù)分析是一個要從一堆數(shù)字中看到真相的過程。
這門課程得主要目的是通過真實的數(shù)據(jù),以實戰(zhàn)的方式了解數(shù)據(jù)分析的流程和熟悉數(shù)據(jù)分析python的基本操作。知道了課程的目的之后,我們接下來我們要正式的開始數(shù)據(jù)分析的實戰(zhàn)教學,完成kaggle上泰坦尼克的任務,實戰(zhàn)數(shù)據(jù)分析全流程。
第一部分:我們獲得一個要分析的數(shù)據(jù),我要學會如何加載數(shù)據(jù),查看數(shù)據(jù),然后學習Pandas的一些基礎操作,最后開始嘗試探索性的數(shù)據(jù)分析。
第一章:數(shù)據(jù)載入及初步觀察
1.1 載入數(shù)據(jù)(數(shù)據(jù)加載)
數(shù)據(jù)集下載 數(shù)據(jù)集下載
1.1.1 任務一:導入numpy和pandas
import numpy as np import pandas as pd【提示】如果加載失敗,學會如何在你的python環(huán)境下安裝numpy和pandas這兩個庫
1.1.2 任務二:載入數(shù)據(jù)
(1) 使用相對路徑載入數(shù)據(jù)
(2) 使用絕對路徑載入數(shù)據(jù)
df = pd.read_csv('/Users/74893/數(shù)據(jù)分析/train.csv')#絕對路徑 df【提示】相對路徑載入報錯時,嘗試使用os.getcwd()查看當前工作目錄。
【思考】知道數(shù)據(jù)加載的方法后,試試pd.read_csv()和pd.read_table()的不同,如果想讓他們效果一樣,需要怎么做?
【答】read_table是以制表符 \t 作為數(shù)據(jù)的標志,也就是以行為單位進行存儲,而read_csv是以分隔符號逗號作為數(shù)據(jù)的標志。想讓他們效果一樣就令sep=‘,’即可
【思考】了解一下’.tsv’和’.csv’的不同,如何加載這兩個數(shù)據(jù)集?
(1)從名稱上即可知道,TSV是用制表符(Tab,’\t’)作為字段值的分隔符;CSV是用半角逗號(’,’)作為字段值的分隔符;
(2)IANA規(guī)定的標準TSV格式,字段值之中是不允許出現(xiàn)制表符的。
【總結(jié)】加載的數(shù)據(jù)是所有工作的第一步,我們的工作會接觸到不同的數(shù)據(jù)格式(eg:.csv;.tsv;.xlsx),但是加載的方法和思路都是一樣的,在以后工作和做項目的過程中,遇到之前沒有碰到的問題,要多多查資料嗎,使用googel,了解業(yè)務邏輯,明白輸入和輸出是什么。
1.1.3 任務三:每1000行為一個數(shù)據(jù)模塊,逐塊讀取
chunker = pd.read_csv('train.csv', chunksize=1000)#每1000行為1模塊【思考】什么是逐塊讀取?為什么要逐塊讀取呢?
【答】read_csv中有個參數(shù)chunksize,通過指定一個chunksize分塊大小來讀取文件,返回的是一個可迭代的對象TextFileReader。盡量避免直接對過大的dataframe直接操作,方便讀取其中的一部分數(shù)據(jù)或?qū)ξ募M行逐塊處理。
1.1.4 任務四:將表頭改成中文,索引改為乘客ID [對于某些英文資料,我們可以通過翻譯來更直觀的熟悉我們的數(shù)據(jù)]
PassengerId => 乘客ID、Survived => 是否幸存、Pclass => 乘客等級(1/2/3等艙位)、Name => 乘客姓名、Sex => 性別、Age => 年齡、SibSp => 堂兄弟/妹個數(shù)、Parch => 父母與小孩個數(shù)、Ticket => 船票信息、Fare => 票價、Cabin => 客艙
Embarked => 登船港口
【思考】所謂將表頭改為中文其中一個思路是:將英文額度表頭替換成中文。還有其他的方法嗎?
還可以用rename
1.2 初步觀察
導入數(shù)據(jù)后,你可能要對數(shù)據(jù)的整體結(jié)構(gòu)和樣例進行概覽,比如說,數(shù)據(jù)大小、有多少列,各列都是什么格式的,是否包含null等
1.2.1 任務一:查看數(shù)據(jù)的基本信息
df.info()#查看數(shù)據(jù)類型1.2.2 任務二:觀察表格前10行的數(shù)據(jù)和后15行的數(shù)據(jù)
df.head(10)#查看前十行數(shù)據(jù) df.tail(15)#查看后15行數(shù)據(jù)1.2.4 任務三:判斷數(shù)據(jù)是否為空,為空的地方返回True,其余地方返回False
df.isnull().head()#判斷數(shù)據(jù)是否為空,為空的地方返回True,其余地方返回False【總結(jié)】上面的操作都是數(shù)據(jù)分析中對于數(shù)據(jù)本身的觀察
1.3 保存數(shù)據(jù)
1.3.1 任務一:將你加載并做出改變的數(shù)據(jù),在工作目錄下保存為一個新文件train_chinese.csv
【總結(jié)】數(shù)據(jù)的加載以及入門,接下來就要接觸數(shù)據(jù)本身的運算,我們將主要掌握numpy和pandas在工作和項目場景的運用。
1.4 知道你的數(shù)據(jù)叫什么(pandas基礎)
我們學習pandas的基礎操作,那么上面通過pandas加載之后的數(shù)據(jù),其數(shù)據(jù)類型是什么呢?
1.4.1 任務一:pandas中有兩個數(shù)據(jù)類型DateFrame和Series,通過查找簡單了解他們。然后自己寫一個關于這兩個數(shù)據(jù)類型的小例子🌰[開放題]
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}#索引+數(shù)據(jù) example_1 = pd.Series(sdata) example_1 data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}#索引+多列數(shù)據(jù) example_2 = pd.DataFrame(data) example_2
1.4.2 任務二:根據(jù)上面加載的方法載入"train.csv"文件
1.4.3 任務三:查看DataFrame數(shù)據(jù)的每列的項
df.columns#查看DataFrame每一列的項
1.4.4任務四:查看"cabin"這列的所有項 [有多種方法]
1.4.5 任務五:加載文件"test_1.csv",然后對比"train.csv",看看有哪些多出的列,然后將多出的列刪除
經(jīng)過我們的觀察發(fā)現(xiàn)一個測試集test_1.csv有一列是多余的,我們需要將這個多余的列刪去
【思考】還有其他的刪除多余的列的方式嗎?
【答】用.drop(‘columns’)函數(shù)能夠刪除Series和DataFrame指定行或列
1.4.6 任務六: 將[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]這幾個列元素隱藏,只觀察其他幾個列元素
df.drop(['PassengerId','Name','Age','Ticket'],axis=1)
【思考】對比任務五和任務六,是不是使用了不一樣的方法(函數(shù)),如果使用一樣的函數(shù)如何完成上面的不同的要求呢?
【答】如果想要完全的刪除你的數(shù)據(jù)結(jié)構(gòu),使用inplace=True,因為使用inplace就將原數(shù)據(jù)覆蓋了,所以這里沒有用這種方法
1.5 篩選的邏輯
表格數(shù)據(jù)中,最重要的一個功能就是要具有可篩選的能力,選出我所需要的信息,丟棄無用的信息。
下面我們還是用實戰(zhàn)來學習pandas這個功能。
1.5.1 任務一: 我們以"Age"為篩選條件,顯示年齡在10歲以下的乘客信息。
df[df["Age"]<10]1.5.2 任務二: 以"Age"為條件,將年齡在10歲以上和50歲以下的乘客信息顯示出來,并將這個數(shù)據(jù)命名為midage
midage = df[(df["Age"]>10)& (df["Age"]<50)] midage1.5.3 任務三:將midage的數(shù)據(jù)中第100行的"Pclass"和"Sex"的數(shù)據(jù)顯示出來
midage = midage.reset_index(drop=True) midage
【思考】這個reset_index()函數(shù)的作用是什么?如果不用這個函數(shù),下面的任務會出現(xiàn)什么情況?
【答】數(shù)據(jù)清洗時,會將帶空值的行刪除,此時DataFrame或Series類型的數(shù)據(jù)不再是連續(xù)的索引,可以使用reset_index()重置索引。reset_index()重置索引,在獲得新的index,原來的index變成數(shù)據(jù)列,保留下來。drop = True就是把原來的索引索引列去掉,重置索引。drop = False就是保留原來的索引,添加重置的索引。另外的區(qū)別就是有沒有把原來的索引去掉。
1.5.4 任務四:使用loc方法將midage的數(shù)據(jù)中第100,105,108行的"Pclass","Name"和"Sex"的數(shù)據(jù)顯示出來
midage.loc[[100,105,108],['Pclass','Name','Sex']] #因為你主動的延長了行的距離,所以會產(chǎn)生表格形式
【提示】使用pandas提出的簡單方式,可以看看loc方法
1.5.5 任務五:使用iloc方法將midage的數(shù)據(jù)中第100,105,108行的"Pclass","Name"和"Sex"的數(shù)據(jù)顯示出來
midage.iloc[[100,105,108],[2,3,4]]#
復習:在前面我們已經(jīng)學習了Pandas基礎,知道利用Pandas讀取csv數(shù)據(jù)的增刪查改,接下來要學習的就是探索性數(shù)據(jù)分析,主要介紹如何利用Pandas進行排序、算術計算以及計算描述函數(shù)describe()的使用。
1.6 了解你的數(shù)據(jù)嗎?
教材《Python for Data Analysis》第五章
1.6.1 任務一:利用Pandas對示例數(shù)據(jù)進行排序,要求升序
可以看到sort_values這個函數(shù)中by參數(shù)指向要排列的列,ascending參數(shù)指向排序的方式(升序還是降序)
【總結(jié)】下面將不同的排序方式做一個小總結(jié)
1.6.2 任務二:對泰坦尼克號數(shù)據(jù)(trian.csv)按票價和年齡兩列進行綜合排序(降序排列),從數(shù)據(jù)中你能發(fā)現(xiàn)什么?
【思考】排序后,如果我們僅僅關注年齡和票價兩列。根據(jù)常識我知道發(fā)現(xiàn)票價越高的應該客艙越好,所以我們會明顯看出,票價前20的乘客中存活的有14人,這是相當高的一個比例,那么我們后面是不是可以進一步分析一下票價和存活之間的關系,年齡和存活之間的關系呢?當你開始發(fā)現(xiàn)數(shù)據(jù)之間的關系了,數(shù)據(jù)分析就開始了。
1.6.3 任務三:利用Pandas進行算術計算,計算兩個DataFrame數(shù)據(jù)相加結(jié)果
#建立一個例子 frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3),columns=['a', 'b', 'c'],index=['one', 'two', 'three']) frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3),columns=['a', 'e', 'c'],index=['first', 'one', 'two', 'second']) frame1_a frame1_b #將frame_a和frame_b進行相加 frame1_a + frame1_b
兩個DataFrame相加后,會返回一個新的DataFrame,對應的行和列的值會相加,沒有對應的會變成空值NaN。
DataFrame還有很多算術運算,如減法,除法等,有興趣可以看《利用Python進行數(shù)據(jù)分析》第五章 算術運算與數(shù)據(jù)對齊 部分,多在網(wǎng)絡上查找相關學習資料。
1.6.4 任務四:通過泰坦尼克號數(shù)據(jù)如何計算出在船上最大的家族有多少人?
max(text['兄弟姐妹個數(shù)'] + text['父母子女個數(shù)'])如上,很簡單,我們只需找出兄弟姐妹個數(shù)和父母子女個數(shù)之和最大的數(shù)就行,先讓這兩列相加返回一個DataFrame,然后用max函數(shù)求出最大值。
1.6.5 任務五:學會使用Pandas describe()函數(shù)查看數(shù)據(jù)基本統(tǒng)計信息
#建立一個例子 frame2 = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],[np.nan, np.nan], [0.75, -1.3]], index=['a', 'b', 'c', 'd'], columns=['one', 'two']) frame2 frame2.describe()#調(diào)用 describe 函數(shù),觀察frame2的數(shù)據(jù)基本信息 ''' count : 樣本數(shù)據(jù)大小 mean : 樣本數(shù)據(jù)的平均值 std : 樣本數(shù)據(jù)的標準差 min : 樣本數(shù)據(jù)的最小值 25% : 樣本數(shù)據(jù)25%的時候的值 50% : 樣本數(shù)據(jù)50%的時候的值 75% : 樣本數(shù)據(jù)75%的時候的值 max : 樣本數(shù)據(jù)的最大值 '''
1.6.6 任務六:分別看看泰坦尼克號數(shù)據(jù)集中 票價、父母子女 這列數(shù)據(jù)的基本統(tǒng)計數(shù)據(jù),你能發(fā)現(xiàn)什么?
【思考】從上面數(shù)據(jù)我們可以看出, 一共有891個票價數(shù)據(jù), 平均值約為:32.20, 標準差約為49.69,說明票價波動特別大, 25%的人的票價是低于7.91的,50%的人的票價低于14.45,75%的人的票價低于31.00, 票價最大值約為512.33,最小值為0。
【總結(jié)】在第一部分我們通過Pandas的一些內(nèi)置函數(shù)對數(shù)據(jù)進行了初步統(tǒng)計查看,在這個過程中初步接觸了如何對數(shù)據(jù)進行簡單的分析,復習了pandas的一些基本操作,動手完成了對數(shù)據(jù)進行篩選,排序,運算,查看和統(tǒng)計等等的一些基本操作,希望接下來的學習中能夠有更多的收獲哈
總結(jié)
以上是生活随笔為你收集整理的动手学习数据分析——第一部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle授权普通用户查看执行计划
- 下一篇: 双系统 移动硬盘安装Ubuntu详细流程