數據分析入門系列教程-數據清洗

2021-02-14 數據思維

從今天開始,我們再一起來學習數據分析,共同進步!
首先先來進行一個數據清洗的實戰,使用比較經典的數據集,鐵達尼號生存預測數據。

數據集下載地址

https://github.com/zhouwei713/DataAnalyse/tree/master/Titanic_dataset

導入數據

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('titanic_data.csv')
df

數據集信息如下:

各欄位含義

pclass:船票等級

sibsp:一同登船的兄弟姐妹或配偶數量

parch:一同登船的父母或子女數量

ticket:船票號碼

fare:船票價格

cabin:船艙

embarked:登船地點

數據整體查看

拿到數據之後,我們先整體查看下數據信息

df.describe()

還有些列是非數值的,所以沒有展示。

這裡得到的各項指標,我們先保存不動,在後面處理缺失值時會有用到。

處理缺失值

首先查看缺失值

df.isnull().sum()
>>>
pclass         1
survived       1
name           1
sex            1
age          264
sibsp          1
parch          1
ticket         1
fare           2
cabin       1015
embarked       3
dtype: int64

可以看到,缺失值比較多的是 cabin 和 age

年齡處理

查看缺失佔比

print('缺失佔比 %.2f%%' %((df['age'].isnull().sum()/df.shape[0])*100))
>>>
缺失佔比 20.15%

下面查看下年齡的分布情況

age = df['age'].hist(bins=15, color='teal', alpha=0.6)
age.set(xlabel='age')
plt.xlim(-10,85)
plt.show()

從圖中我們可以看出,整體數據是向左偏的,即大多數數據是小於平均值的,故而我們可以採用中位數來填補空值,而不是平均數。

從上面的 describe 函數的輸出值也可以看出,平均值是 29.88,中位數是 28,顯然中位數更加接近於大部分數據所在的區域。

使用中位數填充空缺的年齡值

data = df.copy()
data['age'].fillna(df['age'].median(skipna=True), inplace=True)

倉位處理

查看缺失百分比

print('缺失百分比 %.2f%%' %((df['cabin'].isnull().sum()/df.shape[0])*100))
>>>
缺失百分比 77.48%

由於倉位信息已經缺失了大部分,所以這裡選擇直接刪除處理

data.drop(columns=['cabin'], inplace=True)

登船地點處理

我們先來查看下登船地點這列數據的形式

print(df['embarked'].value_counts())
sns.countplot(x='embarked', data=df, palette='Set2')
plt.show()
>>>
S    914
C    270
Q    123
Name: embarked, dtype: int64

可以看到,登船地點總共包含三類數據,S、C 和 Q,他們出現的次數分別為 914、270 和 123。

又因為該列數據總共缺失 3 個,缺失率很低,使用眾數來填充這三個缺失值應該是沒問題的。

使用眾數填充

data['embarked'].fillna(df['embarked'].value_counts().idxmax(), inplace=True)

其他缺失值處理

對於其他列,只是缺失了一到兩個,可以採用眾數的方式來填充缺失值,也可以選擇直接刪除掉缺失的部分,不影響整體數據分布

data.dropna(axis=0, how='any', inplace=True)

最後,再查看確認下是否不存在缺失值了

data.isnull().sum()
>>>
pclass      0
survived    0
name        0
sex         0
age         0
sibsp       0
parch       0
ticket      0
fare        0
embarked    0
dtype: int64

其他特徵列處理

對於 sibsp 和 parch 兩列,我們可以抽象成是否是獨自登船,這樣就能夠把兩列合併為一列,並用 0,1 來表示是否獨自登船。

我們新增一列 alone,把兩列都是 0 的數據添加到新列中並設置為 0,把兩列相加不為 0 的數據添加到新列中,並設置數值為 1。那麼原來的兩列就可以刪除了。

data['alone']=np.where((data["sibsp"]+data["parch"])>0, 0, 1)
data.drop('sibsp', axis=1, inplace=True)
data.drop('parch', axis=1, inplace=True)
data.head()

對於 embarked 和 sex 這兩列,都是字符串類型的數據,需要轉化為數字才能被算法模型分析處理。

這裡可以採用獨熱編碼的方式,來轉換數據

data =pd.get_dummies(data, columns=["embarked","sex"])
data.head()

獨熱編碼(one-hot encoding),是一種常用的數據轉換方式,對於每一個特徵,如果它有 m 個可能值,那麼經過獨熱編碼後,就變成了 m 個二元特徵,這些特徵互斥,每次只有一個激活。

對於 name 和 ticket 兩列,由於他們的存在,對於我們的數據分析沒有任何意義,往往會直接刪除掉這樣無意義的數據

data.drop('name', axis=1, inplace=True)
data.drop('ticket', axis=1, inplace=True)

至此,我們就把一份原始的數據,處理成了比較標準的,易於數據分析的數據。

透視表分析

在處理數據之後,我們還可以使用透視表,整體分析下數據

這裡主要查看下各個特徵(船票等級,性別,倉位等)對於存活率的影響

注意數據集 df 與 data 的區別

性別透視表

首先來看下,不同性別,存活率的情況

sex_sur_table = pd.pivot_table(df, index=['sex'], values='survived')
print(sex_sur_table)
>>>
        survived
sex             
female  0.727468
male    0.190985

女性存活率是遠遠高於男性的,ladies first。

船票等級與存活率

pclass_sur_table = pd.pivot_table(df, index=['sex'], columns=['pclass'], values='survived')
print(pclass_sur_table)
>>>
pclass       1.0       2.0       3.0
sex                                 
female  0.965278  0.886792  0.490741
male    0.340782  0.146199  0.152130

可以看到,一等船票的女性存活率是非常高的,同時船票等級越高,無論男女,存活率都越高

不同年齡存活率

將年齡離散化處理

data['age_cut'] = pd.cut(data['age'], [0, 18, 90])
data['sex'] = df['sex']
print(data.head())
>>>
   pclass  survived      age      fare  alone  embarked_C  embarked_Q  \
0     1.0       1.0  29.0000  211.3375      1           0           0   
1     1.0       1.0   0.9167  151.5500      0           0           0   
2     1.0       0.0   2.0000  151.5500      0           0           0   
3     1.0       0.0  30.0000  151.5500      0           0           0   
4     1.0       0.0  25.0000  151.5500      0           0           0      embarked_S  sex_female  sex_male   age_cut     sex  
0           1           1         0  (18, 90]  female  
1           1           0         1   (0, 18]    male  
2           1           1         0   (0, 18]  female  
3           1           0         1  (18, 90]    male  
4           1           1         0  (18, 90]  female  

年齡段與存活率

age_cut_sur_table = pd.pivot_table(data, index=['sex'], columns=['pclass', 'age_cut'], values='survived')
print(age_cut_sur_table)
>>>
pclass        1.0                 2.0                 3.0          
age_cut   (0, 18]  (18, 90]   (0, 18]  (18, 90]   (0, 18]  (18, 90]
sex                                                                
female   0.923077  0.969466  0.952381  0.870588  0.534483  0.474684
male     0.750000  0.321637  0.523810  0.093333  0.208333  0.142857

當然,透視表還有很多強大的功能,你可以試著探索更多。

數據清洗的重要性

要知道,一個好的數據分析師必定是一名數據清洗高手。在數據分析的過程中,數據清洗是最佔用時間與精力的步驟。數據質量的高低,直接影響我們最後分析的結果,千萬馬虎不得。

數據質量的準則

那麼既然數據清洗這麼重要,我需要把原始數據處理到什麼程度,才算是合格的待分析數據呢?如下我總結了一些業界的標準,可以供你參考。

完整性:數據集中是否存在空值,統計的欄位是否完善。

全面性:某列數據,是否能夠全面的反應真實的情況,是否只包含一部分情況。

合法性:數據的類型,內容,大小等是否合理。比如:是否有年齡超過 150 的,是否有成績超過 1 萬的,數據單位是否統一等等。

唯一性:數據是否存在重複記錄。

在進行數據清洗的時候,一定要先耐心的觀察數據,充分的理解每列數據的意義,從真實的情況出發分析數據是否有真實的含義,再根據生活工作中的經驗,來逐一處理數據。

我們再用一個小例子來理解下

姓名身高體重年齡年齡張飛180
500
500關羽18110028
28劉備1.7816030K
30k趙雲17514023
23曹操18015037
37趙雲175
140
23
曹操



把數據轉化成 Pandas 數據結構

mydata = pd.read_csv('mydata.csv', index_col='name')
print(mydata)
>>>
      height  weight  age age.1
name                           
張飛    180.00     NaN  500   500
關羽    181.00   100.0   28    28
劉備      1.78   160.0  30K   30K
趙雲    175.00   140.0   23    23
曹操    180.00   150.0   37    37
趙雲    175.00   140.0   23    23
典韋       NaN     NaN  NaN   NaN

完整性

查看缺失值

mydata1 = mydata.copy()  # copy
mydata1.isnull().sum()  # 查看總體缺失值
>>>
height    1
weight    2
age       1
age.1     1
dtype: int64

一般是處理空值,空行等

mydata1['weight'].fillna(mydata1['weight'].mean(), inplace=True)  # 使用平均值填充
#mydata1['height'].fillna(mydata['height'].value_counts().index[0], inplace=True)  # 使用眾數填充
mydata1.dropna(how='any', inplace=True)  # 刪除空行

一定要先執行空值填充,再執行刪除空行的代碼,否則含有空值的行都會被刪除。

全面性

劉備的身高是「米」的單位,我們需要轉換為「釐米」

mydata1.loc[mydata1['height']<100, 'height'] = mydata1[mydata1['height']<100]['height']*100

合理性

張飛的年齡是 500,顯然不合理,需要處理。因為張飛是三弟,年齡需要比劉備和關羽小,就設置為 27 吧

mydata1.loc['張飛', 'age'] = 27

同時劉備的年齡還存在一個 K 字符,需要去掉

mydata1['age'].replace({r'[K]': ''}, regex=True, inplace=True)

唯一性

數據中還存在重複的行和列,也需要刪除,保證數據的唯一性

mydata1.drop_duplicates(inplace=True)  # 刪除重複行
mydata1.drop('age.1', axis=1, inplace=True)  # 刪除不需要的列

最終我們的數據為

print(mydata1)
>>>
      height  weight age
name                    
張飛     180.0   138.0  27
關羽     181.0   100.0  28
劉備     178.0   160.0  30
趙雲     175.0   140.0  23
曹操     180.0   150.0  37

總結

本節我們共同完成了一個數據清洗的實戰和一個練習小例子。對於缺失值,需要根據其缺失的百分比及數據分布情況,來決定如何填充缺失值。對於一些非數字類型的數據,可以選擇獨熱編碼等方式轉換數據。還總結了數據清洗的準則,只要你遵循這些準則來處理數據,那麼得到的數據基本就是「好」的數據了。

招聘 or 求職,歡迎加數據分析工作交流群(新)

發求職介紹,聯繫小編!

發內推職位,聯繫小編!

直播分享經驗,聯繫小編!

加群交流(禁廣告),聯繫小編!

加群,掃小編微信

相關焦點

  • 數據分析入門系列教程-決策樹實戰
    數據分析入門系列教程-數據清洗數據分析入門系列教程-數據採集數據分析入門系列教程-微博熱點數據分析入門系列教程-KNN原理數據分析入門系列教程-KNN實戰數據分析入門系列教程-決策樹原理在學習了上一節決策樹的原理之後,你有沒有想動手實踐下的衝動呢,今天我們就來用決策樹進行項目實戰。
  • Python數據分析入門教程(一):獲取數據源
    作者 | CDA數據分析師俗話說,巧婦難為無米之炊。不管你廚藝有多好,如果沒有食材,也做不出香甜可口的飯菜來,所以想要做出飯菜來,首先要做的就是要買米買菜。而數據分析就好比是做飯,首先也應該是準備食材,也就是獲取數據源。一、導入外部數據導入數據主要用到的是Pandas裡的read_x()方法,x表示待導入文件的格式。
  • Julia中的數據分析入門
    有關Julia中數據分析入門的分步介紹。Julia的入門非常簡單,尤其是當您熟悉Python時。 在本篇文章中,我們將使用約翰霍普金斯大學系統科學與工程中心在其GitHub存儲庫中提供的Covid-19數據(https://github.com/CSSEGISandData/)。
  • 數據分析入門系列教程-EM原理
    而通常情況下,我們的 EM 聚類大多是基於高斯混合模型(GMM)的,即假設數據點是符合高斯分布的。這樣,我們就擁有了兩個參數來描述一組數據點,均值和方差!其聚類過程如下2.給定每個簇的高斯分布,計算每個數據點屬於一個特定簇的概率。一個點越靠近高斯的中心,它就越可能屬於該簇。3.基於這些概率,我們計算一組新的高斯分布參數使得簇內的數據點的概率最大化。4.重複步驟 2 和 3 直到收斂,其中分布在迭代中的變化不大。
  • 零基礎輕鬆入門Excel數據透視表,看這一篇就夠了!
    今天我帶來的這篇教程,零基礎輕鬆帶你入門數據透視表這個性價比最高的Excel利器!1 數據透視表是什麼?2 什麼時候需要用到數據透視表?3 數據透視表的優勢4 數據透視表的布局結構5 手把手教你創建數據透視表希望能幫到你早日解除禁錮,快上車吧,走起!1、數據透視表是什麼?
  • Excel教程+模板+數據分析等!收藏!
    Excel教程+模板+數據分析等!收藏!含Excel常用的163種使用技巧;Excel宏教程;Excel函數大全(含實例教程);Excel快捷鍵大全;Excel高級使用技巧等多份技巧資料及模板!(文末送上免費完整版領取方式)Excel163種使用技巧Excel2007數據透視表應用大全Excel表格基本操作之從零開始學習(精心整理)Excel2003函數應用完全手冊
  • 大數據入門:Hive和Hbase區別對比
    在大數據技術生態當中,Hive和Hbase無疑都是非常重要的兩個組件,在實際的大數據處理任務當中,這兩者也都不可或缺,尤其是在Hadoop基礎架構的支撐下,這兩者各自佔據著重要地位。今天的大數據入門分享,我們就來講講Hive和Hbase區別對比。
  • 【SPSS教程】數據重構從此不再是煩惱
    很多讀者反映在收集臨床重複測量數據時,不了解SPSS的數據整理格式要求,導致辛辛苦苦收集的數據沒辦法直接用於分析,腫麼辦?
  • 七牛雲數據科學系列論壇嘉賓陳超:七牛雲機器數據分析平臺 Pandora...
    9 月 10 日晚,七牛雲主辦的「雲加數據,智驅未來」數據科學系列論壇如期舉行。在直播中,七牛雲產品與研發副總裁陳超為我們帶來了主題為《七牛雲機器數據分析平臺 Pandora 最佳實踐》的精彩演講。以下是演講實錄。
  • Pandas數據分析小技巧系列
    點擊關註上方「Python數據分析實例」設為「置頂或星標」,送達乾貨不錯過!Pandas數據分析小技巧系列作者:zhenguo來源:Python與算法社區小技巧1:如何使用map對某些列做特徵工程?小技巧2:使用 replace 和正則清洗數據Pandas 的強項在於數據分析,自然就少不了數據清洗。
  • 大數據分析工程師入門9-Spark SQL
    本文為《大數據分析師入門課程》系列的第9篇,在本系列的第8篇-Spark基礎中,已經對Spark做了一個入門介紹,在此基礎上本篇拎出Spark SQL,主要站在使用者的角度來進行講解,需要注意的是本文中的例子的代碼均使用Scala語言。
  • 數據分析師的80%時間都在清洗數據?到底怎麼洗?
    /76307數據分析做完數據採集就可以直接進行挖掘了嗎?在數據挖掘中,數據清洗就是這樣的前期準備工作。對於數據科學家來說,我們會遇到各種各樣的數據,在分析前,要投入大量的時間和精力把數據「整理裁剪」成自己想要或需要的樣子。為什麼呢?因為我們採集到的數據往往有很多問題。我們先看一個例子,假設老闆給你以下的數據,讓你做數據分析,你看到這個數據後有什麼感覺呢?
  • 一個工具解救職場新人,幾分鐘完成數據分析入門
    就算是應屆畢業生也不例外,以後去大公司面試求職的難度也會加大,畢竟也是萬人過河的趨勢,面對不管是重新找工作的朋友還是應屆畢業生,掌握一個過硬的工作技能會不會讓你更有信心呢,比如說:數據分析能力。很多人可能對數據分析不屑一顧,覺得就是用Excel做一些表格,搭配一些統計圖。
  • Flask 入門系列教程(四)
    ↑↑↑關注後"星標"簡說PythonOne old watch, like brief python大家好,我是老表~今天和大家分享的內容是Flask入門系列的第四篇文章,學習了記得點讚、留言、轉發,三連哦~Flask 入門系列教程(一)Flask 入門系列教程
  • 數據分析如何選擇行業
    這個專業女生不去工地基本上只有倆天路徑,第一是招投標,資料員等文職工作;第二是造價員,造價師,BIM工程師等技術工作,BIM可以說是建築行業的人工智慧,有了BIM才有可隨時隨地提取的完整準確的數據,也是一個施工過程的動態數據,才能做建築能耗分析,設備進場,人員安排,施工進度等一系列的分析。
  • Excel數據分析系列(五):Excel 數據可視化
    作者 | CDA數據分析師Excel圖表構成元素認識Excel圖表的基本構成元素,對我們選擇和繪製可視化圖形是非常重要的。很多人都忽視了這一點,以至於製作圖表的效率很低,不知道如何修改圖表元素。Excel圖表由圖表區、繪圖區、標題、數據系列、圖例和網格線等基本部分構成。下面我們以各地區2018年和2019年的銷售數據建立一個條形圖來觀察圖表中各元素的位置:圖表區圖表區是指圖表的全部範圍,雙擊圖表區的空白處即可對圖表區進行設置。繪圖區繪圖區是指圖表區內的圖形表示區域,雙擊繪圖區的空白處即可對圖表區進行設置。
  • 這篇文章把數據講透了(三):數據清洗
    一、前言上兩期文章中,我們已經了解到「數據」是一個龐大的體系(如下圖所示);並用了菜市場的例子,為大家講解數據來源的含義,用買菜的例子,為大家講解數據採集的步驟;而今天小陳主要給講解,我們「買完菜」以後,怎樣進行擇菜、洗菜,即數據清洗的過程。
  • 透視表excel教程:如何用數據透視表匯總數據
    在工作中經常會對數據進行匯決、分析,比如對不同的月份、不同的人員、不同類別進行匯總,從而從中獲得有用的信息。下面我們通過一個銷售表的數據採用透視表的方法來進行學習。我們需要查看哪個產品是最賺錢的嗎?或者哪個銷售人員的銷售額名列前茅?
  • Python數據分析|線性回歸
    Python數據分析學習筆記,今天分享下利用Python對業務進行數據預處理,並利用線性回歸進行數據預測。壹 數據導入Python下載及環境配置這裡就不贅述了哈,網上教程非常多,我們直接一開始就進入乾貨,打它一個開門見山。①導入Python常用數據分析庫:常用的numpy、pandas、matplotlib先導入。
  • 對比解讀五種主流大數據架構的數據分析能力
    數據分析工作雖然隱藏在業務系統背後,但是具有非常重要的作用,數據分析的結果對決策、對業務發展有著舉足輕重的作用。  隨著大數據技術的發展,數據挖掘、數據探索等專有名詞的曝光度越來越高,但是在類似於Hadoop系列的大數據分析系統大行其道之前,數據分析工作已經歷了長足的發展,尤其是以BI系統為主的數據分析,已經有了非常成熟和穩定的技術方案和生態系統,對於BI系統來說,大概的架構圖如下: