零基础:数据分析的完整Python教程
目錄
1.用于數據分析的Python基礎(略)
- 為什么要學習Python進行數據分析?
- Python 2.7 v /秒3.4
- 如何安裝Python?
- 在Python中運行一些簡單的程序
2.Python庫和數據結構
- Python數據結構
- Python迭代和條件構造
- Python庫
3.使用Pandas在Python中進行探索性分析
- 系列和數據框簡介
- Analytics Vidhya數據集-貸款預測問題
3.使用Pandas在Python中進行數據整理
- 系列和數據框簡介
- Analytics Vidhya數據集-貸款預測問題
4.使用Pandas在Python中進行數據整理
5.用Python構建預測模型
- 邏輯回歸
- 決策樹
- 隨機森林
2.Python庫和數據結構
Python數據結構
以下是一些在Python中使用的數據結構。您應該熟悉它們,以便適當地使用它們。
- 列表 –列表是Python中功能最豐富的數據結構之一。列表可以簡單地通過在方括號中寫一個用逗號分隔的值列表來定義。列表可能包含不同類型的項目,但是通常所有項目都具有相同的類型。Python列表是可變的,并且列表的各個元素都可以更改。
這是一個定義列表然后訪問它的快速示例:
- 字符串–可以簡單地通過使用單(‘),雙(“”)或三(“’))反向逗號來定義字符串。用三引號引起來的字符串可以跨越多行,并且經常在文檔字符串中使用(Python記錄函數的方式)。\用作轉義符。請注意,Python字符串是不可變的,因此您不能更改部分字符串。
- 元組 –元組由用逗號分隔的多個值表示。元組是不可變的,并且輸出用括號括起來,以便正確處理嵌套的元組。此外,即使元組是不可變的,但如果需要,它們也可以保存可變數據。
由于元組是不可變的并且不能更改,因此與列表相比,它們的處理速度更快。因此,如果您的列表不太可能更改,則應使用元組而不是列表。
Python迭代和條件構造
像大多數語言一樣,Python也有一個FOR循環,這是最廣泛使用的迭代方法。它具有簡單的語法:
for i in [Python Iterable]:expression(i)這里的“ Python Iterable”可以是列表,元組或其他高級數據結構,我們將在后面的部分中進行探討。讓我們看一個簡單的示例,確定數字的階乘。
fact=1 for i in range(1,N+1):fact *= i談到條件語句,這些語句用于根據條件執行代碼片段。最常用的構造是if-else,其語法如下:
if [condition]:__execution if true__ else:__execution if false__例如,如果我們要打印數字N是偶數還是奇數:
if N%2 == 0:print ('Even') else:print ('Odd')現在您已經熟悉了Python基礎知識,讓我們再進一步。如果必須執行以下任務怎么辦:
例如,考慮一下我們剛才看到的階乘示例。我們可以按照以下步驟一步一步完成:
math.factorial(N)
當然,我們需要為此導入數學庫。接下來讓我們探索各種庫。
Python庫
以下是庫列表,您將需要進行任何科學計算和數據分析:
- NumPy代表數值Python。NumPy最強大的功能是n維數組。該庫還包含基本的線性代數函數,傅立葉變換,高級隨機數功能以及與其他低級語言(如Fortran,C和C++)集成的工具
- SciPy代表科學Python。SciPy建立在NumPy之上。它是用于各種高級科學和工程模塊(例如離散傅立葉變換,線性代數,優化和稀疏矩陣)的最有用的庫之一。
- Matplotlib用于繪制各種圖形,從直方圖到折線圖再到熱圖。.您可以在ipythonNotebook中使用Pylab功能(ipython notebook –pylab =inline)以內聯方式使用這些繪圖功能。如果您忽略inline選項,則pylab會將ipython環境轉換為非常類似于Matlab的環境。您還可以使用Latex命令將數學添加到繪圖中。
- 用于結構化數據操作和操縱的熊貓。它被廣泛用于數據處理和準備。熊貓是最近才添加到Python中的,并在促進Python在數據科學家社區中的使用方面發揮了作用。
- Scikit學習用于機器學習。該庫基于NumPy,SciPy和matplotlib構建,包含許多用于機器學習和統計建模的有效工具,包括分類,回歸,聚類和降維。
- 用于統計建模的Statsmodels。Statsmodels是一個Python模塊,允許用戶瀏覽數據,估計統計模型和執行統計測試。描述性統計信息,統計檢驗,繪圖功能和結果統計信息的廣泛列表適用于不同類型的數據和每個估計量。
- Seaborn用于統計數據可視化。Seaborn是一個用于使用Python制作引人入勝且內容豐富的統計圖形的庫。它基于matplotlib。Seaborn旨在使可視化成為探索和理解數據的中心部分。
- 散景,用于在現代網絡瀏覽器上創建交互式繪圖,儀表板和數據應用程序。它使用戶能夠以D3.js的樣式生成優雅簡潔的圖形。此外,它具有對非常大的數據集或流數據集進行高性能交互的能力。
- Blaze將Numpy和Pandas的功能擴展到分布式和流數據集。它可用于訪問來自多個源的數據,包括Bcolz,MongoDB,SQLAlchemy,ApacheSpark,PyTables等。Blaze與Bokeh一起可以充當非常強大的工具,用于在大量數據上創建有效的可視化效果和儀表板。
- Scrapy關于網絡爬蟲。這是獲取特定數據模式的非常有用的框架。它具有從網站主頁URL開始,然后在網站內的網頁中進行挖掘以收集信息的功能。
- SymPy用于符號計算。它具有從基本符號算術到微積分,代數,離散數學和量子物理學的廣泛功能。另一個有用的功能是能夠將計算結果格式化為LaTeX代碼。
- 訪問網絡的請求。它的工作方式類似于標準的python庫urllib2,但是更容易編寫代碼。您會發現urllib2的細微差別,但是對于初學者來說,請求可能會更方便。
其他庫,您可能需要:
- 操作系統和文件操作的操作系統
- networkx和igraph用于基于圖的數據操作
- 用于在文本數據中查找模式的正則表達式
用于刮網的BeautifulSoup。它次于Scrapy,因為它將在運行中僅從單個網頁中提取信息。
現在我們已經熟悉了Python基礎知識和其他庫,下面讓我們深入研究通過Python解決問題的方法。是的,我的意思是建立一個預測模型!在此過程中,我們使用了一些功能強大的庫,并且還遇到了下一層數據結構。我們將引導您完成三個關鍵階段:
- 數據探索–進一步了解我們擁有的數據
- 數據整理–清理并處理數據,使其更適合統計建模
- 預測建模–運行實際算法并獲得樂趣
3.使用Pandas在Python中進行探索性分析
Pandas是Python中最有用的數據分析庫之一,有助于在數據科學界增加Python的使用
在加載數據之前,讓我們了解Pandas中的2個關鍵數據結構–Series 和DataFrames。
Series 和DataFrames簡介
Series 可以理解為一維標記/索引數組。您可以通過這些標簽訪問該系列的各個元素。
DataFrames框類似于Excel工作簿–您具有引用列的列名和行,可以使用行號進行訪問。本質上的區別是,在數據幀的情況下,列名和行號稱為列和行索引。
系列和數據框構成Python中Pandas的核心數據模型。首先將數據集讀取到這些數據幀中,然后可以非常輕松地將各種操作(例如,分組,聚合等)應用于其列。
練習數據集–貸款預測問題
您可以從此處下載數據集。這是變量的描述:
導入庫和數據集:
以下是我們在本教程中將使用的庫:
- Numpy
- matplotlib
- Pandas
請注意,由于Pylab環境,您不需要導入matplotlib和numpy。我仍然將它們保留在代碼中,以防您在其他環境中使用該代碼。
導入庫后,您可以使用read_csv()函數讀取數據集。在此階段之前,代碼是這樣的:
import pandas as pd import numpy as np import matplotlib as plt %matplotlib inline df = pd.read_csv("/home/kunal/Downloads/Loan_Prediction/train.csv") #Reading the dataset in a dataframe using Pandas快速數據探索
讀取數據集后,您可以使用head()函數查看頂部幾行
df.head(10)
這是查看前10行。或者,您也可以通過打印數據集查看更多的行
接下來,您可以使用describe()函數查看數字字段的摘要
df.describe(10)
describe()函數將在其輸出中提供計數,均值,標準差(std),最小值,四分位數和最大值
這里有一些推斷,您可以通過查看describe()函數的輸出進行繪制:
請注意,通過將平均值與中位數(即50%的數字)進行比較,我們可以了解數據中可能存在的偏斜。
對于非數字值(例如Property_Area,Credit_History等),我們可以查看頻率分布以了解它們是否有意義。可以通過以下命令打印頻率表:
df[‘Property_Area’].value_counts()
同樣,我們可以查看信用證港口歷史記錄的唯一值。請注意,dfname [‘column_name’]是訪問數據幀中特定列的基本索引技術。它也可以是列的列表。
https://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html
分布分析
既然我們已經熟悉了基本數據特征,那么讓我們研究各種變量的分布。讓我們從數字變量開始-即ApplicantIncome和LoanAmount
首先使用以下命令繪制ApplicantIncome的直方圖:
df[‘ApplicantIncome’].hist(bin = 50)
在這里,我們觀察到極值很少。這也是為什么需要50個容器才能清楚地描述分布的原因。
接下來,我們查看箱形圖以了解分布。可以通過以下方式繪制票價的箱形圖:
df.boxplot(column = ‘ApplicantIncome’ )
這確認了許多異常值/極端值的存在。這可以歸因于社會上的收入差距。部分原因可能是由于我們正在尋找具有不同教育水平的人。讓我們按教育來區分它們:
我們可以看到,畢業生和非畢業生的平均收入之間沒有實質性差異。但是,收入較高的畢業生人數較多,這似乎與眾不同。
現在,讓我們使用以下命令查看LoanAmount的直方圖和箱線圖:
df[‘LoanAmount’].hist(bin = 50) df.boxplot(column = ‘LoanAmount’ )
同樣,還有一些極限值。顯然,ApplicantIncome和LoanAmount都需要一定數量的數據處理。LoanAmount具有缺失值和極值,而ApplicantIncome具有一些極值,這需要更深入的了解。我們將在接下來的部分中進行介紹。
分類變量分析
現在,我們了解了ApplicantIncome和LoanIncome的分布,讓我們更詳細地了解分類變量。我們將使用Excel樣式數據透視表和交叉表。例如,讓我們根據信用歷史記錄來查看獲得貸款的機會。可以使用以下數據透視表在MS Excel中實現此目的:
注意:此處的貸款狀態已編碼為1(是)和0(否)。因此,平均值表示獲得貸款的概率。
現在,我們將研究使用Python生成相似見解所需的步驟。請參考本文以了解Pandas中不同的數據處理技術。
temp1 = df['Credit_History'].value_counts(ascending=True) temp2 = df.pivot_table(values='Loan_Status',index=['Credit_History'],aggfunc=lambda x: x.map({'Y':1,'N':0}).mean()) print ('Frequency Table for Credit History:') print (temp1) print ('\nProbility of getting loan for each Credit History class:') print (temp2)
現在我們可以觀察到,我們得到了類似于MS Excel的樞軸表。可以使用“ matplotlib”庫通過以下代碼將其繪制為條形圖:
這表明,如果申請人具有有效的信用記錄,則獲得貸款的機會是八倍。您可以按已婚,自雇,Property_Area等繪制類似的圖。
或者,也可以通過將它們組合成堆疊圖表來可視化這兩個圖:
temp3 = pd.crosstab(df['Credit_History'], df['Loan_Status']) temp3.plot(kind='bar', stacked=True, color=['red','blue'], grid=False)您還可以將性別添加到混合中(類似于Excel中的數據透視表):
如果您還沒有意識到,我們在這里剛剛創建了兩種基本的分類算法,一種基于信用記錄,另一種基于2個分類變量(包括性別)。您可以對此進行快速編碼,以在AV Datahacks上創建第一個提交。
我們剛剛看到了如何使用Pandas在Python中進行探索性分析
接下來,讓我們進一步研究ApplicantIncome和LoanStatus變量,進行數據處理并創建一個數據集以應用各種建模技術。我強烈建議您在內容之前,先處理另一個數據集和問題,并通過一個獨立的示例進行研究。
4.用Python處理數據:使用Pandas
數據處理-需求概述
在探索數據的過程中,我們發現了數據集中的一些問題,需要先解決這些問題,然后才能為好的模型準備好數據。此練習通常稱為“數據整理”。這是我們已經意識到的問題:
除了數字字段的這些問題外,我們還應該查看非數字字段,例如性別,財產領域,已婚,教育和受撫養人,以查看它們是否包含有用的信息。
如果您不熟悉Pandas,我建議您 在繼續之前閱讀 本文。它詳細介紹了一些有用的數據處理技術。
檢查數據集中的缺失值
讓我們看一看所有變量中的缺失值,因為大多數模型都無法處理缺失數據,即使它們確實存在,對它們進行估算也往往會有所幫助。因此,讓我們檢查數據集中的空值/ NaN數
df.apply(lambda x: sum(x,isnull()),axis=0)該命令告訴我們每列中缺少值的數量,因為isnull()返回1(如果該值為null)
盡管缺失值的數量不是很高,但是有很多變量,因此應該對每個變量進行估計并將其添加到數據中。通過本文詳細了解不同的插補技術。
注意:請記住,缺失值不一定總是NaN。例如,如果Loan_Amount_Term為0,這有意義嗎?還是您會認為缺失?我想您的答案不見了,您說得對。因此,我們應該檢查不可行的值。
如何填寫LoanAmount中的缺失值?
有很多方法可以填補貸款金額的缺失值-最簡單的方法是用均值替換,可以通過以下代碼完成:
df['LoanAmount'].fillna(df['LoanAmount'].mean(),inplace = Ture)另一個極端可能是建立一個監督學習模型,以基于其他變量來預測貸款額,然后將年齡和其他變量一起用于預測生存期。
因為,現在的目的是找出數據處理的步驟,所以我寧愿采用一種方法,該方法介于這兩個極端之間。一個關鍵的假設是,一個人是受過教育還是自謀職業,可以結合起來對貸款金額進行很好的估計。
首先,讓我們看一下箱線圖,看是否存在趨勢:
因此,我們看到每個組的貸款金額中位數都有一些變化,可以用來估算這些值。 但是首先,我們必須確保“個體經營”和“教育”變量中的每個值都不應缺少。
正如我們之前所說,Self_Employed具有一些缺失的值。讓我們看一下頻率表:
由于?86%的值為“否”,因此將丟失的值歸為“否”是安全的,因為成功的可能性很高。可以使用以下代碼完成此操作:
現在,我們將創建數據透視表,該表為我們提供了自雇和教育功能的所有唯一值組的中值。接下來,我們定義一個函數,該函數返回這些單元格的值并將其應用于填充貸款金額的缺失值:
table = df.pivot_table(values='LoanAmount', index='Self_Employed' ,columns='Education', aggfunc=np.median) # 定義函數以返回次數據透視表定義值 def fage(x):return table.loc[x['Self_Employed'],x['Education']] #替換丟失的值 df['LoanAmount'].fillna(df[df['LoanAmount'].isnull()].apply(fage, axis=1), inplace=True)這應該為您提供一種估算貸款金額缺失值的好方法。
注意:僅當您沒有使用以前的方法(即使用均值)填充Loan_Amount變量中的缺失值時,此方法才有效。
如何處理LoanAmount和ApplicantIncome分配中的極值?
讓我們首先分析LoanAmount。由于極高的價值實際上是可能的,即有些人可能會因特殊需要而申請高價值貸款。因此,讓我們嘗試對數轉換以消除其影響,而不是將它們視為離群值:
df['LoanAmount_log'] = np.log(df[‘LoanAmount_log’]) df[‘LoanAmount_log’].hist(bins = 20)再次查看直方圖:
現在,分布看起來更接近于正態分布,極值的影響已大大減弱。
即將來臨的申請人收入。一種直覺可能是某些申請人的收入較低,但支持共同申請人。因此,將兩個收入合并為總收入并對其進行對數轉換可能是一個好主意。
df['TotalIncome'] = df['ApplicantIncome'] + df['CoapplicantIncome'] df['TotalIncome_log'] = np.log(df['TotalIncome']) df['LoanAmount_log'].hist(bins=20)
現在我們看到分布比以前好得多。我將由您自己來填寫性別,已婚,受撫養人,貸款額度,信貸歷史記錄的缺失值。另外,我建議您考慮可以從數據中得出的其他信息。例如,為LoanAmount / TotalIncome創建一個列可能很有意義,因為它可以使申請人了解貸款的還款能力。
接下來,我們將研究制作預測模型。
5.用Python構建預測模型
之后,我們使數據對建模有用,現在讓我們看一下在我們的數據集上創建預測模型的python代碼。Skicit-Learn(sklearn)是為此目的在Python中最常用的庫,我們將繼續學習。我鼓勵您通過本文來復習sklearn 。
由于sklearn要求所有輸入均為數字,因此我們應通過編碼類別將所有分類變量轉換為數字。在此之前,我們將填充數據集中的所有缺失值。可以使用以下代碼完成此操作:
df['Gender'].fillna(df['Gender'].mode()[0], inplace=True) df['Married'].fillna(df['Married'].mode()[0], inplace=True) df['Dependents'].fillna(df['Dependents'].mode()[0], inplace=True) df['Loan_Amount_Term'].fillna(df['Loan_Amount_Term'].mode()[0], inplace=True) df['Credit_History'].fillna(df['Credit_History'].mode()[0], inplace=True)from sklearn.preprocessing import LabelEncoder var_mod = ['Gender','Married','Dependents','Education','Self_Employed','Property_Area','Loan_Status'] le = LabelEncoder() for i in var_mod: df[i] = le.fit_transform(df[i]) df.dtypes接下來,我們將導入所需的模塊。然后,我們將定義一個通用分類函數,該函數將模型作為輸入并確定準確性和交叉驗證分數。由于這是一篇介紹性文章,因此我不會詳細介紹編碼。請參閱本文以獲取有關R和Python代碼的算法的詳細信息。另外,通過本文復習交叉驗證也將是一件好事,因為它是衡量電源性能的非常重要的指標。
#從scikit 導入模型學習模塊: from sklearn.linear_model import LogisticRegression from sklearn.cross_validation import KFold #For K-fold cross validation from sklearn.ensemble import RandomForestClassifier from sklearn.tree import DecisionTreeClassifier, export_graphviz from sklearn import metrics#Generic function for making a classification model and accessing performance: def classification_model(model, data, predictors, outcome):#Fit the model:model.fit(data[predictors],data[outcome])#對訓練集進行預測:predictions = model.predict(data[predictors])#Print accuracyprint ("Accuracy : %s" % "{0:.3%}".format(accuracy))#Perform k-fold cross-validation with 5 folds #對k進行5倍 k 交叉驗證kf = KFold(data.shape[0], n_folds=5)error = []for train, test in kf:#過濾訓練數據train_predictors = (data[predictors].iloc[train,:])#用來訓練算法的目標.train_target = data[outcome].iloc[train]#使用預測變量和目標訓練算法.model.fit(train_predictors, train_target)#Record error from each cross-validation runerror.append(model.score(data[predictors].iloc[test,:], data[outcome].iloc[test]))print ("Cross-Validation Score : %s" % "{0:.3%}".format(np.mean(error)))#Fit the model again so that it can be refered outside the function:model.fit(data[predictors],data[outcome])邏輯回歸
讓我們建立第一個Logistic回歸模型。一種方法是將所有變量都放入模型中,但這可能會導致過擬合(如果您還不知道此術語,請不要擔心)。簡而言之,采用所有變量可能會使模型理解特定于數據的復雜關系,并且不能很好地概括。閱讀有關Logistic回歸的更多信息
我們可以很容易地做出一些直觀的假設來使球滾動。在以下情況下獲得貸款的機會會更高:
因此,讓我們使用“ Credit_History”創建第一個模型。
outcome_var = 'Loan_Status' model = LogisticRegression() predictor_var = ['Credit_History'] classification_model(model, df,predictor_var,outcome_var)準確性:80.945%交叉驗證得分:80.946%
# 我們可以嘗試不同的變量組合: predictor_var = ['Credit_History','Education','Married','Self_Employed','Property_Area'] classification_model(model, df,predictor_var,outcome_var)準確性:80.945%交叉驗證得分:80.946%
通常,我們希望添加變量會提高準確性。但這是一個更具挑戰性的案例。不那么重要的變量不會影響準確性和交叉驗證分數。Credit_History主導了該模式。現在我們有兩個選擇:
決策樹
決策樹是用于建立預測模型的另一種方法。已知提供比邏輯回歸模型更高的準確性。了解有關決策樹的更多信息。
model = DecisionTreeClassifier() predictor_var = ['Credit_History','Gender','Married','Education'] classification_model(model, df,predictor_var,outcome_var)準確性:81.930%交叉驗證得分:76.656%
在這里,基于分類變量的模型無法產生影響,因為信用歷史記錄控制著它們。讓我們嘗試一些數字變量:
#We can try different combination of variables: predictor_var = ['Credit_History','Loan_Amount_Term','LoanAmount_log'] classification_model(model, df,predictor_var,outcome_var)準確性:92.345%交叉驗證得分:71.009%
在這里,我們觀察到盡管添加變量的準確性有所提高,但交叉驗證誤差卻有所降低。這是模型過度擬合數據的結果。讓我們嘗試一個更復雜的算法,看看是否有幫助:
隨機森林
隨機森林是解決分類問題的另一種算法。閱讀有關隨機森林的更多信息
隨機森林的一個優點是我們可以使它與所有要素一起使用,并且它返回一個要素重要性矩陣,可用于選擇要素。
model = RandomForestClassifier(n_estimators=100) predictor_var = ['Gender', 'Married', 'Dependents', 'Education','Self_Employed', 'Loan_Amount_Term', 'Credit_History', 'Property_Area','LoanAmount_log','TotalIncome_log'] classification_model(model, df,predictor_var,outcome_var)準確性:100.000%交叉驗證得分:78.179%
在這里,我們看到訓練集的準確性是100%。這是過度擬合的最終案例,可以通過兩種方式解決:
讓我們嘗試這兩個。首先,我們看到特征重要性矩陣,從中可以提取最重要的特征。
#Create a series with feature importances: featimp = pd.Series(model.feature_importances_, index=predictor_var).sort_values(ascending=False) print (featimp)
讓我們使用前5個變量創建模型。另外,我們將稍微修改隨機森林模型的參數:
準確性:82.899%交叉驗證得分:81.461%
請注意,盡管準確性降低了,但是交叉驗證得分卻有所提高,表明該模型具有很好的泛化能力。請記住,隨機森林模型不是完全可重復的。由于隨機化,不同的運行會導致輕微的變化。但是輸出應該留在球場上。
您可能已經注意到,即使在隨機森林上進行了一些基本參數調整之后,我們所達到的交叉驗證準確性也僅比原始邏輯回歸模型略高。該練習為我們提供了一些非常有趣且獨特的學習方法:
最后
在學習python中有任何困難不懂的可以微信掃描下方CSDN官方認證二維碼加入python交流學習
多多交流問題,互幫互助,這里有不錯的學習教程和開發工具。
(python兼職資源+python全套學習資料)
一、Python所有方向的學習路線
Python所有方向的技術點做的整理,形成各個領域的知識點匯總,它的用處就在于,你可以按照上面的知識點去找對應的學習資源,保證自己學得較為全面。
二、Python必備開發工具
四、Python視頻合集
觀看零基礎學習視頻,看視頻學習是最快捷也是最有效果的方式,跟著視頻中老師的思路,從基礎到深入,還是很容易入門的。
五、實戰案例
光學理論是沒用的,要學會跟著一起敲,要動手實操,才能將自己的所學運用到實際當中去,這時候可以搞點實戰案例來學習。
最后,千萬別辜負自己當時開始的一腔熱血,一起變強大變優秀。
總結
以上是生活随笔為你收集整理的零基础:数据分析的完整Python教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一种RK3399+MIPI+FPGA的高
- 下一篇: 怎樣制作线段动画_线条动画视频制作 如何