自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Pandas 探索性數(shù)據(jù)分析綜合實戰(zhàn)

大數(shù)據(jù) 數(shù)據(jù)分析
本文的內(nèi)容是關于對數(shù)據(jù)集進行特別分析,并試圖找到關于數(shù)據(jù)的洞察力。我們做了處理缺失值、異常值的工作,并將單變量、雙變量和多變量的分析可視化。

?本文主要分析數(shù)據(jù)、組織數(shù)據(jù)、清洗、過濾、排序、聚合、可視化變量之間的關系、分類圖和數(shù)據(jù)的分散性。在一個數(shù)據(jù)科學項目的生命周期中,我們有70%以上的時間用于數(shù)據(jù)分析,比如進行特征工程和特征選擇。特征工程講的是根據(jù)我們的直覺用有效的數(shù)據(jù)來填補缺失值,糾正錯誤的數(shù)據(jù)類型,組織不平衡的數(shù)據(jù)集,而特征選擇講的是只選擇那些有助于預測變量或你感興趣的輸出的特征。要做好探索性數(shù)據(jù)分析,需要對pandas、numpy、scipy、matplotlib和seaborn庫有很好的了解。

本文的目的是了解數(shù)據(jù)集的要點,即對數(shù)據(jù)的初步了解。當你收到一個數(shù)據(jù)集時,你需要對數(shù)據(jù)集的變量、數(shù)據(jù)類型和變量之間的關系有一個概念。在大多數(shù)情況下,我們會在數(shù)據(jù)集中發(fā)現(xiàn)不完整的數(shù)據(jù),原因可能是用戶可能不想填寫數(shù)據(jù),在互聯(lián)網(wǎng)上傳輸時數(shù)據(jù)丟失,或者用戶可能沒有數(shù)據(jù)可以填寫。這是需要解決的第一步。不匹配的數(shù)據(jù)類型,如DateTime變量一般被讀成對象(String),或者有時整數(shù)被讀成浮點數(shù),反之亦然。在本文中,我們將使用一個實時的泰坦尼克號數(shù)據(jù)集,并對其進行探索性數(shù)據(jù)分析。

導入庫和數(shù)據(jù)集

開始導入所需的庫pandas、numpy、seaborn、matplotlib、魔法命令%matplotlib inline,并使用 read_csv 方法加載titanic數(shù)據(jù)集(titanic.csv),如圖所示。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline

現(xiàn)在我們可以開始對數(shù)據(jù)框架做一些初步的檢查,比如讀取幾行幾列以確保數(shù)據(jù)被加載到數(shù)據(jù)框架中,找到它的形狀(行數(shù)和列數(shù)),數(shù)據(jù)類型的信息。

我們可以使用head方法查看前幾行,如圖所示。這個方法需要一個整數(shù)作為參數(shù),并返回總的行數(shù)。

圖片

我們可以通過shape?屬性知道數(shù)據(jù)集的大小,如行和列的總數(shù),如下所示,該屬性顯示一個有891行和12列的元組。為了找到變量的數(shù)據(jù)類型,我們有info方法,它可以返回變量、數(shù)據(jù)類型、內(nèi)存使用量和關于每個變量的缺失值,Age?只有714,Cabin只有 204,不是891,因此他們需要被填充,在接下來我們對其進行可視化并處理缺失值。

df.shape
(891, 12)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB

處理缺失值

我們可以使用missingno?庫對數(shù)據(jù)集進行可視化處理,也可以使用isnull?方法檢查 "Age"? 和 "Cabin" 兩列中缺失的數(shù)值。

df.isnull().sum()
PassengerId      0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64

我們可以看到 'Age'? 列有177個空值,'Cabin' 有687個空值,下面的圖是整個數(shù)據(jù)集的可視化圖。

圖片

現(xiàn)在來處理缺失的 "Age"? 值,"Age"? 的數(shù)據(jù)類型是數(shù)字(Float),一般來說,缺失的數(shù)字列會用它們的平均值或中位數(shù)或任何基于我們直覺的值來填補,無論哪種都是最好的。在更新空值之前,檢查一下基于 "Pclass"? 和 "Sex"? 列的均值和中值。下圖顯示了基于 "Pclass"? 和 "Sex" 分組的平均數(shù)和中位數(shù)。這里我們可以看到平均數(shù)和中位數(shù)都非常接近,所以更好的選擇是繼續(xù)使用中位數(shù)。

df.groupby(["Pclass", "Sex"])["Age"].mean()
Pclass  Sex   
1 female 34.611765
male 41.281386
2 female 28.722973
male 30.740707
3 female 21.750000
male 26.507589
Name: Age, dtype: float64
df.groupby(["Pclass", "Sex"])["Age"].median()
Pclass  Sex   
1 female 35.0
male 40.0
2 female 28.0
male 30.0
3 female 21.5
male 25.0
Name: Age, dtype: float64

所以根據(jù)'Pclass'和'Sex'?,我們可以更新'Age'?變量的空值。這里我們可以使用loc?方法來尋找和替換'Age'變量的空值。

# Fillin the age values for  Pclass =1 for male  and  Female
df.loc[df.Age.isnull() & (df.Sex == "male") & (df.Pclass == 1), "Age"] = 37
df.loc[df.Age.isnull() & (df.Sex == "female") & (df.Pclass == 1), "Age"] = 35.5

# Fillin the age values for Pclass =2 for male and Female
df.loc[df.Age.isnull() & (df.Sex == "male") & (df.Pclass == 2), "Age"] = 29.0
df.loc[df.Age.isnull() & (df.Sex == "female") & (df.Pclass == 2), "Age"] = 28.5

# Fillin the age values for Pclass =2 for male and Female
df.loc[df.Age.isnull() & (df.Sex == "male") & (df.Pclass == 3), "Age"] = 25
df.loc[df.Age.isnull() & (df.Sex == "female") & (df.Pclass == 3), "Age"] = 22

現(xiàn)在我們已經(jīng)填補了'Age'?變量的缺失值,那么'Cabin'?變量呢,它只是船上的一個座位分配,這個變量對乘客的生存沒有任何影響,所以我們可以使用drop?方法放棄這個變量。再次繪圖并檢查是否有遺漏值?,F(xiàn)在可以看到'Age'列沒有任何空值,如下圖所示,甚至'Cabin'列也被刪除了:

df.drop(columns="Cabin", inplace=True)
ms.bar(df, color="orange", inline=True)

圖片

數(shù)據(jù)處理部分已經(jīng)完成?,F(xiàn)在可以利用這些干凈的數(shù)據(jù),對其進行分析。在進一步進行之前,了解每一列所代表的內(nèi)容。下面描述了每一列含義,這些字段很簡單,不言自明。

PassengerId:只是一個序列號

Survived: 0 = No, 1 = Yes

pclass: Ticket class 1 = 1st, 2 = 2nd, 3 = 3rd

sibsp: # 在泰坦尼克號上的兄弟姐妹/配偶的數(shù)量

parch: # 泰坦尼克號上的父母/子女的數(shù)量

ticket: Ticket number

cabin: Cabin number

embarked: Port of Embarkation C = Cherbourg, Q = Queenstown, S = Southampton

現(xiàn)在我們對數(shù)據(jù)集有了一個概念,但我們想從數(shù)據(jù)集中定義的問題陳述是什么?它可以是像幸存的總人數(shù)或他們旅行的班級,或有多少人有兄弟姐妹或配偶,父母-子女,等等。接下來用seaborn來繪圖。

變量識別

僅僅重申我們在統(tǒng)計學章節(jié)中討論過的內(nèi)容,我們有兩種變量分類和數(shù)字,這些變量又進一步細分為序數(shù)和名義,以及數(shù)字變量的連續(xù)和離散,如圖所示。

圖片

分類名義變量

順序變量的定義與分類變量類似;這里需要提到的是,它沒有任何特定的順序。一個例子是我們不能在這里假設男性大于女性。我們不能假設一個類別大于或小于其他類別,而且它們沒有任何特定的順序。

分類順序變量

分類的、序數(shù)的變量可以按特定的順序排列。一個例子是,如果你被要求填寫餐廳的食物和服務的反饋,這可能是諸如美味、好、更好、更差和最差。這有一個從正到負的特定順序,或者另一個例子是指一個班級的成績。

數(shù)值連續(xù)變量

數(shù)字連續(xù)變量有無限的值。這方面的例子可以是股票價格、身高、體重、年齡,等等。這些值沒有任何有限的區(qū)間。

數(shù)值離散變量

數(shù)值離散型變量有有限的值。一個例子是你有多少輛汽車或你有多少個孩子。它有一個確定的值,要么是0,1,2,等等。我們不可能有1.24輛汽車或1.05個孩子。

在泰坦尼克號數(shù)據(jù)集中有哪些不同的變量,并直觀地看到它們的數(shù)據(jù)類型表示。我們可以看到這些變量的單獨表示。

Name:分類名義變量。

Surviver:分類名義變量。

Pclass:分類順序變量。

Sex:分類名義變量。

Embark:分類名義變量。

Age:數(shù)值連續(xù)變量。

SibSp:數(shù)值離散變量。

Parch:數(shù)值離散變量。

Fare:數(shù)值連續(xù)變量。

單變量分析

單變量分析是關于一個單一的變量。使用seaborn,我們可以將一些最重要的圖示可視化。我們把船上幸存的乘客總數(shù)可視化??梢允褂糜嫈?shù)圖的方法,如圖所示。我們可以看到891人中只有350多人幸存下來。

sns.countplot(x="Survived", data=df)

圖片

"Embarked"變量是分類類型的,它表示在不同港口上船的人數(shù)。我們可以用countplot方法繪制,如下圖所示。

sns.set_style("whitegrid")
sns.countplot(x="Embarked", data=df)

圖片

另一個分類變量是Sex(性別);我們也可以繪制它,如下圖所示。

sns.countplot(x="Sex", data=df)

圖片

我們也可以對數(shù)字變量使用countplot?方法。我們可以繪制'SibSp'(配偶和兄弟姐妹)變量,如圖所示,它顯示600人是單獨旅行,200人以上有1個兄弟姐妹或配偶,以此類推。

sns.countplot(x="SibSp", data=df)

圖片

雙變量分析

到現(xiàn)在為止,我們已經(jīng)學習了單變量的分析,稱為單變量分析,而雙變量分析是用來尋找兩個變量之間的關系。為此尋找'Fare'和'Age'?變量之間的關系,我們可以使用relplot方法,如圖所示。

sns.set_style("darkgrid")
g = sns.relplot("Age", "Fare", data=df)
g.fig.set_figwidth(12)
g.fig.set_figheight(6)

圖片

我們可以看到年齡范圍從0到80,大部分票價都落在0到100的范圍內(nèi),同時,38歲的人有一個500以上的票價的離群值。很少有變量落在200到300的范圍內(nèi)。不同的雙變量圖是散點圖、熱圖、線圖和柱狀圖。

散點圖

散點圖是統(tǒng)計可視化的骨干。它用一團數(shù)據(jù)點描述了兩個變量之間的聯(lián)合分布。這一點我們已經(jīng)在上圖中比較了 "Fare"?和 "Age"的例子。

線形圖

在seaborn中,線狀圖可以通過relplot?方法完成,通過設置參數(shù)kind='line',如下圖所示。

sns.relplot("Age", "Fare", kind="line", data=df)

圖片

熱圖

使用熱圖法,我們可以用二維的形式來表示數(shù)據(jù)。數(shù)據(jù)值在圖中被表示為顏色,同時還有變量之間的數(shù)字相關性。在這里使用泰坦尼克號數(shù)據(jù)集,我們試圖表示變量之間是否有任何相關性。下圖顯示,這些變量之間沒有太大的相關性,而且它們是相互獨立的。

corr = df.corr()
sns.heatmap(corr, annot=True)

圖片

柱狀圖

柱狀圖是最常見的一種圖表類型。它顯示了數(shù)字變量和分類變量之間的關系,如圖所示。從圖中我們可以看出,第1類乘客的生存率更高。

sns.barplot(x="Pclass", y="Survived", data=df, ci=None)

圖片

多變量分析

多變量分析同時使用兩個以上的變量。通常我們可以看到,更多的變量可以是多維的,如下圖所示。這里我們將性別及他們的存活率與他們所乘坐的客運等級一起繪制出來。我們可以看到,與男性相比,女性乘客的存活率更高,而且Pclass ?1和Pclass 2的存活率也更高。

sns.barplot(x="Sex", y="Survived", hue="Pclass", data=df, ci=None)

圖片

我們還可以畫一個散點圖來表示多變量分析,如下圖所示,它顯示了"Age"和 "Fare"?以及他們的 "Survived"?。這里我們可以描述出,與低票價相比,高票價的人存活率更高,也就是說,Pclass 1和Pclass 2比Pclass 3存活率更高。有時單變量和雙變量分析并不能提供太多的信息,所以這里我們可以使用多變量分析。

sns.relplot(x="Age", y="Fare", hue="Survived", data=df)

圖片

處理離群點

離群點大多可能是數(shù)據(jù)中的一個錯誤,如打字錯誤、季節(jié)性趨勢等。在這種情況下,在計算匯總統(tǒng)計或從數(shù)據(jù)中得出見解之前,應該將其從數(shù)據(jù)集中糾正或刪除,否則會導致不正確的分析。假設你有一個美國不同州的披薩價格數(shù)據(jù)集,如下圖所示。

圖片

我們可以計算變量的長度,也可以用箱形圖直觀地看到異常值,如下圖所示。

sns.boxplot("price", data=df)

圖片

我們可以看到我們有3個離群點?,F(xiàn)在如果我們計算價格的平均值,我們得到的數(shù)值是35.12。

由于存在離群點,我們可以把它們丟掉,如下所示,再次計算平均值,這里我們可以看到平均值是16.67,幾乎是有離群點的數(shù)值的一半。所以在數(shù)據(jù)分析過程中,去除離群值是很重要的。

df.drop(df[df.price == 160.32].index, inplace=True)
df.drop(df[df.price == 63.43].index, inplace=True)
df.drop(df[df.price == 158.38].index, inplace=True)

特征選擇

在特征選擇中,我們在那些對使用機器學習進行預測很重要的變量上下功夫。一些特征,如'Passengerid'、'Name'、'Cabin' 和 'Ticket'在進行分析時不會產(chǎn)生任何影響,因此在使用機器學習算法進行任何預測之前,最好放棄這些變量。

還是使用泰坦尼克號數(shù)據(jù)集并對其進行特征選擇,如下圖所示。

圖片

我們可以使用刪除法,刪除 "Passengerid"、"Name"、"Cabin "和 "Ticket "這幾列,如下圖所示。

圖片

在上圖中,我們可以看到這些列被刪除了,很好,但是這里有一個問題。ML算法只理解數(shù)字,但是我們這里有兩個類別列'Sex'和'Embarked'?,它們是對象(字符串)類型。性別列有男性和女性兩個類別,而對于Embarked,我們有S、C和Q值。

df_main["Sex"].value_counts()
male      577
female 314
Name: Sex, dtype: int64
df_main["Embarked"].value_counts()
S    644
C 168
Q 77
Name: Embarked, dtype: int64

我們更新 S、Q 和 C 的性別欄0、1(男性和女性)和 0、1、2(登船)的值。

df_main.loc[df_main["Sex"] == "male", "Sex"] = 1
df_main.loc[df_main["Sex"] == "female", "Sex"] = 0
df_main.loc[df_main["Embarked"] == "S", "Embarked"] = 0
df_main.loc[df_main["Embarked"] == "Q", "Embarked"] = 1
df_main.loc[df_main["Embarked"] == "C", "Embarked"] = 2
df_main.head()

圖片

現(xiàn)在我們可以將數(shù)據(jù)集的信息特征和目標進行劃分。X?變量就像一個帶有行和列的矩陣,稱為特征,而y變量是目標。

X = df_main.drop(columns="Survived")
X.head()

因此,我們可以結束特征選擇部分,進一步將特征分為train_test_split,并應用適當?shù)臋C器學習算法,進行預測。

圖片

總結

本文的內(nèi)容是關于對數(shù)據(jù)集進行特別分析,并試圖找到關于數(shù)據(jù)的洞察力。我們做了處理缺失值、異常值的工作,并將單變量、雙變量和多變量的分析可視化。探索性數(shù)據(jù)分析是數(shù)據(jù)分析中最核心和最重要的概念之一。

責任編輯:武曉燕 來源: 數(shù)據(jù)STUDIO
相關推薦

2020-05-13 11:32:28

數(shù)據(jù)分析數(shù)值分析

2020-10-28 18:28:12

Pandas數(shù)據(jù)分析GUI

2024-06-12 11:57:51

2024-07-30 12:10:22

2012-09-04 09:20:26

測試軟件測試探索測試

2023-12-22 09:14:48

EDA數(shù)據(jù)分析探索性數(shù)據(jù)分析

2016-10-11 15:32:26

探索性大數(shù)據(jù)

2024-05-21 13:33:49

2023-05-11 13:39:39

EDA數(shù)據(jù)分析

2023-11-30 07:23:53

數(shù)據(jù)分析EDA

2017-04-25 18:35:47

硅谷數(shù)據(jù)科學家數(shù)據(jù)分析

2020-08-18 13:30:01

Python命令數(shù)據(jù)分析

2020-05-19 17:09:33

Pandas大數(shù)據(jù)數(shù)據(jù)分析

2021-04-28 16:00:55

數(shù)據(jù)分析人工智能機器學習

2024-10-23 09:00:00

數(shù)據(jù)分析Pandas

2016-08-27 16:16:40

大數(shù)據(jù)

2019-01-28 17:42:33

Python數(shù)據(jù)預處理數(shù)據(jù)標準化

2022-07-08 06:01:37

D-Tale輔助工具

2022-07-12 09:02:36

探索性測試測試

2021-04-12 09:00:00

機器學習深度學習技術
點贊
收藏

51CTO技術棧公眾號