數據輸入

導入並了解數據

從本章開始,您可使用 Colab 或 Jupyter 上同步學習。如果您不熟悉 Colab,請先閱讀 Colab 和 Jupyter 教學 。本課程需要您瞭解 Python 的基本運作,可前往 Python 101 學習。

下載 Colab 同步學習

現在我們終於進入了數據處理的第一章。我們將使用鐵達尼號數據,這章我們先觀察與分析其結構與分布,初步了解數據分布。這是做好分析數據的必要一環,我們開始吧!

.read_csv

首先,我們導入 pandas 並從 GitHub(https://raw.githubusercontent.com/aicourse-org/dataset/main/titanic/titanic.csv) 擷取鐵達尼號數據。 輸入數據。

.read_csv 是一個 pandas 的方法,它將 csv 轉成一個 DataFrame 格式。我們使用它並將數據取名為:df

import pandas as pd

csv_url = 'https://raw.githubusercontent.com/aicourse-org/dataset/main/titanic/titanic.csv'

df = pd.read_csv(csv_url)
print(df)
     survived  pclass                                               name  \
0           0       3                            Braund, Mr. Owen Harris   
1           1       1  Cumings, Mrs. John Bradley (Florence Briggs Th...   
2           1       3                             Heikkinen, Miss. Laina   
3           1       1       Futrelle, Mrs. Jacques Heath (Lily May Peel)   
4           0       3                           Allen, Mr. William Henry   
..        ...     ...                                                ...   
886         0       2                              Montvila, Rev. Juozas   
887         1       1                       Graham, Miss. Margaret Edith   
888         0       3           Johnston, Miss. Catherine Helen "Carrie"   
889         1       1                              Behr, Mr. Karl Howell   
890         0       3                                Dooley, Mr. Patrick   

        sex   age  sibsp  parch            ticket     fare cabin embarked  
0      male  22.0      1      0         A/5 21171   7.2500   NaN        S  
1    female  38.0      1      0          PC 17599  71.2833   C85        C  
2    female  26.0      0      0  STON/O2. 3101282   7.9250   NaN        S  
3    female  35.0      1      0            113803  53.1000  C123        S  
4      male  35.0      0      0            373450   8.0500   NaN        S  
..      ...   ...    ...    ...               ...      ...   ...      ...  
886    male  27.0      0      0            211536  13.0000   NaN        S  
887  female  19.0      0      0            112053  30.0000   B42        S  
888  female   NaN      1      2        W./C. 6607  23.4500   NaN        S  
889    male  26.0      0      0            111369  30.0000  C148        C  
890    male  32.0      0      0            370376   7.7500   NaN        Q  

[891 rows x 11 columns]

以下是這個鐵達尼號的數據解釋:

  • survival: 存活 0 = 未存活、 1 = 存活
  • pclass: 船艙等級 1 = 頭等、 2 = 2級、 3 = 3級
  • sex: 性別
  • Age: 年紀
  • sibsp: 兄弟姐妹/配偶數目
  • parch: 父母/孩子數目
  • ticket: 票號
  • fare: 票價
  • cabin: 船艙號碼
  • embarked: 上船港口

.head()

部分 df 訊息被 ... 取代。下面我們用 .head() 方法輸出最前面的五個行的數據。

df.head()
survived pclass name sex age sibsp parch ticket fare cabin embarked
0 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th… female 38.0 1 0 PC 17599 71.2833 C85 C
2 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

我們也可以用 .tail() 來輸出最後五個行。

df.tail()
survived pclass name sex age sibsp parch ticket fare cabin embarked
886 0 2 Montvila, Rev. Juozas male 27.0 0 0 211536 13.00 NaN S
887 1 1 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.00 B42 S
888 0 3 Johnston, Miss. Catherine Helen “Carrie” female NaN 1 2 W./C. 6607 23.45 NaN S
889 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.00 C148 C
890 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

如果你想隨意挑,可以用 .sample() 方法然後在參數裡填入行數。

df.sample(3)
survived pclass name sex age sibsp parch ticket fare cabin embarked
558 1 1 Taussig, Mrs. Emil (Tillie Mandelbaum) female 39.0 1 1 110413 79.6500 E67 S
649 1 3 Stanley, Miss. Amy Zillah Elsie female 23.0 0 0 CA. 2314 7.5500 NaN S
847 0 3 Markoff, Mr. Marin male 35.0 0 0 349213 7.8958 NaN C

接下來我們用 .info() 方法來列出所有 的資訊。

.info()

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 11 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   survived  891 non-null    int64  
 1   pclass    891 non-null    int64  
 2   name      891 non-null    object 
 3   sex       891 non-null    object 
 4   age       714 non-null    float64
 5   sibsp     891 non-null    int64  
 6   parch     891 non-null    int64  
 7   ticket    891 non-null    object 
 8   fare      891 non-null    float64
 9   cabin     204 non-null    object 
 10  embarked  889 non-null    object 
dtypes: float64(2), int64(4), object(5)
memory usage: 76.7+ KB

.info() 是一個非常重要的方法,幾乎在每個數據科學的專案都會看到。

首先我們從 RangeIndex: 891 entries 看到有 891 行,Data columns (total 11 columns) 11 列。

Non-Null Count 裡可以看出 AgeCabinEmbarked 有遺失或存在不完整的數據。

另外 Dtype 告訴我們總又有三種類型的資料:

  • int64: 整數
  • object: 物件(在這裡為非整數)
  • float64: 浮點數/小數

為了確定 df 的行與列,我們可以用 pandas 的屬性 .shape 來輸出(,

df.shape
(891, 11)

行與列

我們可以使用 index 屬性來輸出索引訊息:

df.index
RangeIndex(start=0, stop=891, step=1)

從零開始 start=0,結束在 891(不包含 891),step=1 每次增加一所以總共有 891 行。

接下來用 .columns 方法輸出所有列的標題:

df.columns
Index(['survived', 'pclass', 'name', 'sex', 'age', 'sibsp', 'parch', 'ticket',
       'fare', 'cabin', 'embarked'],
      dtype='object')

我們可以用 .values 方法來單獨輸出數值(沒有行與列):

df.values
array([[0, 3, 'Braund, Mr. Owen Harris', ..., 7.25, nan, 'S'],
       [1, 1, 'Cumings, Mrs. John Bradley (Florence Briggs Thayer)', ...,
        71.2833, 'C85', 'C'],
       [1, 3, 'Heikkinen, Miss. Laina', ..., 7.925, nan, 'S'],
       ...,
       [0, 3, 'Johnston, Miss. Catherine Helen "Carrie"', ..., 23.45,
        nan, 'S'],
       [1, 1, 'Behr, Mr. Karl Howell', ..., 30.0, 'C148', 'C'],
       [0, 3, 'Dooley, Mr. Patrick', ..., 7.75, nan, 'Q']], dtype=object)

統計數據總結

最後我們用 .describe() 來用統計學的角度了解 df 的數據分佈。

df.describe()
survived pclass age sibsp parch fare
count 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200

左邊索引分別代表的意義是:

  • count: 所有有效數值的總數
  • mean: 平均值
  • std: 標準差(Standard Deviation)數據的離散程度,越小越集中
  • min: 最小數值
  • 25%: 後25%中最大的數值
  • 50%: 後50%中最大的數值
  • 75%: 後75%中最大的數值
  • max: 最大數值

所們我們從表中得知:

  • 大約 38% 的人存活 survived mean = 0.383838
  • 超過一半的人都住在三等艙 pclass 50%=3
  • 約 99.7% 的人年齡在 0.6 到 59 之間 age std: 29.69±(2*14.52)
  • 超過一半的人沒有兄弟姊妹 sibsp 50%=0
  • 超過 75% 的人沒有跟爸媽或小孩 parch 75%=0
  • 小於 1% 的人付超過 $512 的船票 fare std: 32.2+(2*49.69)

.describe() 會依照數據種類(文字或數字)顯示不同資訊。如下,我們用 include=['O'] 參數來顯示非數字物件的資訊:

df.describe(include=['O'])
name sex ticket cabin embarked
count 891 891 891 204 889
unique 891 2 681 147 3
top Mineff, Mr. Ivan male 1601 B96 B98 S
freq 1 577 7 4 644
  • count: 所有有效數值的總數
  • unique: 有幾個不同的值
  • top: 哪個值出現最多次
  • freq: 出現最多次數的頻率

所們我們從表中得知:

  • 男生約佔總人數 64% Sex freq/count=0.6475
  • 681 種票價
  • 147 種艙位
  • 3 種港口,S 是最多人上船的港口,共有 644 人次。

我們透過 unique 知道有幾個不同的值,但到底是什麼,我們可以用 .unique() 方法顯示:

df['cabin'].unique()
array([nan, 'C85', 'C123', 'E46', 'G6', 'C103', 'D56', 'A6',
       'C23 C25 C27', 'B78', 'D33', 'B30', 'C52', 'B28', 'C83', 'F33',
       'F G73', 'E31', 'A5', 'D10 D12', 'D26', 'C110', 'B58 B60', 'E101',
       'F E69', 'D47', 'B86', 'F2', 'C2', 'E33', 'B19', 'A7', 'C49', 'F4',
       'A32', 'B4', 'B80', 'A31', 'D36', 'D15', 'C93', 'C78', 'D35',
       'C87', 'B77', 'E67', 'B94', 'C125', 'C99', 'C118', 'D7', 'A19',
       'B49', 'D', 'C22 C26', 'C106', 'C65', 'E36', 'C54',
       'B57 B59 B63 B66', 'C7', 'E34', 'C32', 'B18', 'C124', 'C91', 'E40',
       'T', 'C128', 'D37', 'B35', 'E50', 'C82', 'B96 B98', 'E10', 'E44',
       'A34', 'C104', 'C111', 'C92', 'E38', 'D21', 'E12', 'E63', 'A14',
       'B37', 'C30', 'D20', 'B79', 'E25', 'D46', 'B73', 'C95', 'B38',
       'B39', 'B22', 'C86', 'C70', 'A16', 'C101', 'C68', 'A10', 'E68',
       'B41', 'A20', 'D19', 'D50', 'D9', 'A23', 'B50', 'A26', 'D48',
       'E58', 'C126', 'B71', 'B51 B53 B55', 'D49', 'B5', 'B20', 'F G63',
       'C62 C64', 'E24', 'C90', 'C45', 'E8', 'B101', 'D45', 'C46', 'D30',
       'E121', 'D11', 'E77', 'F38', 'B3', 'D6', 'B82 B84', 'D17', 'A36',
       'B102', 'B69', 'E49', 'C47', 'D28', 'E17', 'A24', 'C50', 'B42',
       'C148'], dtype=object)

所以 Carbin 裡有很多不同艙位。你可以用這個方法來查看其他列的內容。

df['embarked'].unique()
array(['S', 'C', 'Q', nan], dtype=object)

我們大致瞭解了輸入數據的樣貌,接下來學習如何調整與排序數據。

v1.0

請告訴我們

請告訴我們您的問題或勘誤建議。
您的意見是我們前進的動力,非常感激!