fbpx

Open Data:

Mobile App Statistics (Apple iOS app store)

上一篇我們提到了pandas最重要的兩個資料物件(沒有看過的可以點這個連結),但我們光會存取資料是不夠的,假設我們今天要分析的資料有一萬多筆,且每筆資料都有一百多個欄位,要能直接從如此龐大的資料中分析趨勢或是關聯,基本上是不可能的,所以今天的重點就是介紹如何檢視與定位資料。

  • 使用資料表

Notebook Content:

這次我們一樣會使用apple(AppleStore.csv)的公開資料,其中紀錄了兩個app平台商店中所有app的分類、評分、下載量、名稱、大小⋯⋯等相關資料,假設我們是一間app開發公司的分析人員,我們想研究目前市場中哪些分類的評分以及下載量是比較高的。

首先我們先試著利用 pd.read_csv() 讀取檔案:

import pandas as pd
    app = pd.read_csv('AppleStore.csv')

pd.read_csv() 讀取檔案方法 (官方document):

  • 常用參數

這邊我們做一個小補充,大部分我們在進行資料分析時,常會遇到不同的檔案類型,像是.csv, .txt 甚至是.spss之類的檔案,為了能夠方便讀取各類型的檔案,pandas套件提供了非常多的方法讓我們使用,其中最常使用的莫過於 pd.read_csv() ,畢竟各大公開資料平台以及所有統計相關軟體都可以接受csv檔,所以csv檔案算是非常常見的一種資料檔案類型。

要讀入csv檔也非常的簡單,只要使用 pd.read_csv() 方法並在括號內引入檔案名稱加上副檔名即可,不過有時候會遇到編碼的問題,大部分檔案都可以使用 UTF-8 編碼, 不過有些檔案的編碼可能比較不一樣,會導致檔案讀取錯誤或是出現亂碼,所以要調整 encoding 參數:

data1 = pd.read_csv('DataScience/data1.csv',encoding='UTF-8')  #UTF-8編碼
data2 = pd.read_csv('DataScience/data2.csv',encoding='iso-8859-1')  #其他編碼

除了上面的 iso-8859-1 編碼之外,也可以試試看 encoding=’latin1′, encoding=’cp1252′ 這些編碼(編碼的使用可能會因為語系的不同而有差異,這邊提供的主要是英文常用的編碼)。

以上是csv檔案基本的讀取方法,如果有其他類型檔案的讀取需求,可以詳閱官方文件

df.head() / Series.head() 顯示前幾筆資料 (官方document):


在讀入資料之後,接著就是查看資料內容以及確認有哪些欄位,所以我們常會使用 df.head() 方法,顯示前五筆資料,講到這邊你可能會有個小疑問就是「前面的方法都是pd 開頭,這邊怎麼變成 df 了?!」,這是因為前面的方法都是直接在pandas套件本身的方法,而上一篇文章我們有說過,我們進行資料讀取之後,會回傳 DataFrame 或是 Series 物件,所以針對 DataFrameSeries 的資料操作都是隸屬這兩個物件之下的方法,另外我們在解釋這些方法時為了方便,會簡稱 Dataframedf ,不過要記得!在使用這些方法時,前面不是掛 dfSeries 而是使用你存取二維陣列的變數。就像下面這樣:

import pandas as pd
app = pd.read_csv('AppleStore.csv')
print(app.head())
          id               track_name  size_bytes currency  price  
0  284882215                 Facebook   389879808      USD    0.0   
1  389801252                Instagram   113954816      USD    0.0   
2  529479190           Clash of Clans   116476928      USD    0.0   
3  420009108               Temple Run    65921024      USD    0.0   
4  284035177  Pandora - Music & Radio   130242560      USD    0.0   

   rating_count_tot  rating_count_ver  user_rating  user_rating_ver      ver  
0           2974676               212          3.5              3.5     95.0   
1           2161558              1289          4.5              4.0    10.23   
2           2130805               579          4.5              4.5  9.24.12   
3           1724546              3842          4.5              4.0    1.6.2   
4           1126879              3594          4.0              4.5    8.4.1   

  cont_rating        prime_genre  sup_devices.num  ipadSc_urls.num  lang.num  
0          4+  Social Networking               37                1        29   
1         12+      Photo & Video               37                0        29   
2          9+              Games               38                5        18   
3          9+              Games               40                5         1   
4         12+              Music               37                4         1   

   vpp_lic  
0        1  
1        1  
2        1  
3        1  
4        1

然而 df.head() 本身是預設顯示前五筆資料,這個資料顯示數量是可以調整的,我們只要在括號裡輸入我們要顯示的數量即可,例如:df.head(10) 這樣就會顯示前10筆資料。

 

df.tail() / Series.tail() 顯示最後幾筆資料 (官方document):


df.head() 相反,df.tail() 會顯示DataFrame最後面的5筆資料,而且資料顯示數量也是可調整的,這個方法相對於 df.head() 比較不常使用到,大部分是在進行double check 資料是否如我們所想像一樣的時候。

以上兩種方法是最基本的資料顯示方式,接下來要介紹如何查看DataFrame的範圍大小、檢視基本的資料分佈與欄位類型。

 

df.shape 資料表的範圍大小 (官方document):


df.shape 是二維陣列的其中一個屬性,他記錄了整張資料的長度(資料筆數)與寬度(欄位數量),它可以幫助我們快速建立對於這張資料的範圍認知,以便選擇要用什麼樣的策略進行下一步分析。

print(app.shape)
>>> (7197, 16)

上面的範例中,我們列印出 app.shape 檢視app的資料範圍,可以看見它回傳了一個 tuple(), 第一個數字代表了資料筆數(共7197筆資料),第二個數字代表了欄位數量(每筆資料有16個欄位)。

 

df.columns | df.index 顯示所有欄位/索引名稱 :


有時候我們會遇到資料出現過多欄位,造成顯示長度不夠而有些不方便的情況,這時候我們會先觀察所有欄位的名稱,畢竟光是欄位名稱有時候就包含非常多的資訊了:

print(app.columns)
print(app.index)

下面的結果分別是df.columnsdf.index ,他們都是 DataFrame物件的屬性且類似 list() 或是 range() ,兩個屬性除了能夠方便我們了解所有欄位或索引的名稱與排列之外,也是在下一個階段「資料清理」中非常重要的兩個屬性。

#app.columns
Index(['id', 'track_name', 'size_bytes', 'currency', 'price',
       'rating_count_tot', 'rating_count_ver', 'user_rating',
       'user_rating_ver', 'ver', 'cont_rating', 'prime_genre',
       'sup_devices.num', 'ipadSc_urls.num', 'lang.num', 'vpp_lic'],
      dtype='object')

#app.index
RangeIndex(start=0, stop=7197, step=1)

 

df.describe() / Series.describe() 顯示每一個欄位的資料分佈 (官方document):


想必大家應該都有基本資料分佈的概念,df.describe() 方法會計算資料中所有欄位的平均數、中位數、最大值、最小值⋯⋯等統計數值。讓我們可以大致上了解每個欄位的資料分佈。

print(app.describe())

不過如果仔細數一下下面的結果,會發現只顯示了11個欄位,但剛才 df.shape 卻顯示有16欄位啊!?出現這樣的差異是因為,這張app資料有些欄位型別是非數值的,例如:app名稱、分類,如果用 df.describe() 方法顯示整張資料的所有欄位,他只會顯示數值資料的欄位,除非你選定的欄位都是非數值資料,而如何選定資料的方法我們會在下面提到。

                 id    size_bytes        price  rating_count_tot  
count  7.197000e+03  7.197000e+03  7197.000000      7.197000e+03   
mean   8.631310e+08  1.991345e+08     1.726218      1.289291e+04   
std    2.712368e+08  3.592069e+08     5.833006      7.573941e+04   
min    2.816565e+08  5.898240e+05     0.000000      0.000000e+00   
25%    6.000937e+08  4.692275e+07     0.000000      2.800000e+01   
50%    9.781482e+08  9.715302e+07     0.000000      3.000000e+02   
75%    1.082310e+09  1.819249e+08     1.990000      2.793000e+03   
max    1.188376e+09  4.025970e+09   299.990000      2.974676e+06   

       rating_count_ver  user_rating  user_rating_ver  sup_devices.num  
count       7197.000000  7197.000000      7197.000000      7197.000000   
mean         460.373906     3.526956         3.253578        37.361817   
std         3920.455183     1.517948         1.809363         3.737715   
min            0.000000     0.000000         0.000000         9.000000   
25%            1.000000     3.500000         2.500000        37.000000   
50%           23.000000     4.000000         4.000000        37.000000   
75%          140.000000     4.500000         4.500000        38.000000   
max       177050.000000     5.000000         5.000000        47.000000   

       ipadSc_urls.num     lang.num      vpp_lic  
count      7197.000000  7197.000000  7197.000000  
mean          3.707100     5.434903     0.993053  
std           1.986005     7.919593     0.083066  
min           0.000000     0.000000     0.000000  
25%           3.000000     1.000000     1.000000  
50%           5.000000     1.000000     1.000000  
75%           5.000000     8.000000     1.000000  
max           5.000000    75.000000     1.000000

 

df.info() 資料欄位屬性與非空值數量 (官方document):


接下來的這個方法 df.info() 也非常實用,這個方法會回傳所有欄位的屬性像是 int (整數), float64 (浮點數)或是 object (字串),以及該欄位有多少非空值空值在資料處理中是一個非常重要的概念,因為我們有時收集的資料並不會非常完整,可能會因為一些不可控因素而有缺漏,所以這些缺漏的資料就會顯示為空值(NaN),過多的空值會嚴重影響我們的分析結果,是我們相當不樂見的,而 df.info() 這個方法最重要的價值也就在於它可以讓我們清楚知道哪些欄位有非常多的空值,哪些欄位擁有較完整的資料,以及這些資料的屬性是什麼,可以如何運用:

print(app.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7197 entries, 0 to 7196
Data columns (total 16 columns):
id                  7197 non-null int64
track_name          7197 non-null object
size_bytes          7197 non-null int64
currency            7197 non-null object
price               7197 non-null float64
rating_count_tot    7197 non-null int64
rating_count_ver    7197 non-null int64
user_rating         7197 non-null float64
user_rating_ver     7197 non-null float64
ver                 7197 non-null object
cont_rating         7197 non-null object
prime_genre         7197 non-null object
sup_devices.num     7197 non-null int64
ipadSc_urls.num     7197 non-null int64
lang.num            7197 non-null int64
vpp_lic             7197 non-null int64
dtypes: float64(3), int64(8), object(5)
memory usage: 899.7+ KB
None

上面的結果從左到右分別是「欄位名稱」→ 「非空值數量」→ 「欄位型別」,從非空值數量上來看,我們所使用的公開資料非常的完整,每個欄位都沒有空值出現,這是非常好的現象,代表這些資料的分析的準確性不會受到空值的影響。

 

以上所有的屬性與方法都是在檢視資料時很常用到的工具,基本上在讀取新資料時,我們都會利用這些工具初步掌握整張資料的概況,讓自己不會再龐大的資料中「迷失方向」,接下來我們要介紹這篇文章的另一個重點——「如何定位資料」。

 

df.loc[:,:] | df[…] 資料定位方法 (官方document):


在前面介紹 df.columns 的時候有提到,有時候會發生因為顯示長度不夠導致資料會換行顯示,讓資料在比較的時候有些不方便的情況。其實我們在分析資料的時候大多時間都是聚焦在「跟研究目標有關係的幾個欄位」,並不用無時無刻都要把整張資料叫出來,所以我們非常需要一個方法讓我們可以只呼叫某幾個欄位或是某幾筆資料,也就是「資料定位」,之所以會稱之為「定位」,是因為我們的資料就像是一個直角坐標,x軸為欄位(columns)y軸為索引(index),單筆資料就是直角座標上的「橫線」,每一個欄位就是一條條「直線」,一格資料可以把它視為一個「點」,而我們就是使用這個類似直角坐標的系統方法定位出我們所需要的資料。

pandas套件中,進行資料定位的方法就是 df.loc[:,:] 這是最完整的使用方式,在我們要定位的DataFrame後面加上 .loc[,] ,這邊的中掛號被逗號(,)隔開,逗號左邊為索引值;右邊為欄位值,例如,我們想要提取 track_name , price , user_rating 這三個欄位的前10筆資料:

print(app.loc[0:9,['track_name','price','user_rating']])

從上面的範例中可以看到:

逗號左邊是 0:9 就是呼叫前10筆資料,這個功能有點像是 list() 物件的slice功能,不同的地方是冒號後面的序數是包含的,所以有顯示到第九號資料。

逗號右邊就是提取 track_name , price , user_rating 欄位,提取方式跟 index 不同,因為 columns 的名稱是字串,用slice的方式提取較不直觀,所以建議使用 list() 把所有的欄位包起來放在逗號右邊。

                 track_name  price  user_rating
0                  Facebook    0.0          3.5
1                 Instagram    0.0          4.5
2            Clash of Clans    0.0          4.5
3                Temple Run    0.0          4.5
4   Pandora - Music & Radio    0.0          4.0
5                 Pinterest    0.0          4.5
6                     Bible    0.0          4.5
7          Candy Crush Saga    0.0          4.5
8             Spotify Music    0.0          4.5
9               Angry Birds    0.0          4.5

上面這種定位方式是提取多筆資料多個欄位的方式,如果只要提取多筆資料的全部欄位,或是多個欄位的全部資料,可以用下面的方式進行定位:

 

ps.如果只有冒號,代表提取全部資料。

app.loc[0:9,:]  #提取0~9前十筆資料的全部欄位
app.loc[:,['track_name','price']]  #提取track_name,price欄位的所有資料
app.loc[0,:]  #提取第一筆資料的所有欄位
app.loc[:,'track_name']  #提取track_name欄位的所有資料
app.loc[0,'track_name']  #提取第一筆資料的track_name欄位

上面就是各種不同定位資料的形式,因為篇幅問題就不特別把結果顯示出來了~大家可以複製上方的程式碼試試看結果會是什麼樣子。

 

不過 df.loc[] 如果是提取多個或單個欄位全部的資料時,是可以直接使用中括號提取的,就像下方的程式碼:

app['track_name']  #提取單一欄位的所有資料
app[['track_name','price']]  #提取track_name,price欄位的所有資料

cols = ['track_name','price']  #將要提取欄位名稱的list賦值為變數,再將變數作為app[]的定位欄位
app[cols]

因為我們在分析資料時,很常需要提取特定 columns,分析這些欄位的資料或數值,比較少會
需要提取某幾筆 index 的資料做分析, 這樣的情形比較多會發生在要做資料篩選的時候,像是全部
資料中符合某一條件的資料有哪些之類的情形,這個部分就會使用條件作為遮罩(mask)進行資料篩選
這也是我們下一篇要介紹的重點。

 

Written by

Glove Yen

一個不務正業的企管人,喜歡有創造性的事物,從管理到設計到程式,目前正在鑽研資料科學以及網頁前端開發,不知從什麼時候開始已經習慣了每天coding的日子。

—轉自好文作者Glove Yen_Data Science_Python資料處理套件part2 – Pandas 檢視與定位資料
如果你喜歡他的文章、Python資料分析有興趣,歡迎回到他的Blog: glove-coding看更多:)

或接續觀看Pandas 第4講:Python資料處理套件Pandas條件篩選資料

 

📒 Python Pandas 系列文章:

Pandas 第1講:Python資料處理套件Pandas簡介

Pandas 第2講:Python資料處理套件Pandas資料儲存物件

Pandas 第3講:Python資料處理套件Pandas檢視與定位資料(本文)

Pandas 第4講:Python資料處理套件Pandas條件篩選資料

Pandas 第5講:Python資料處理套件Pandas整理資料欄位與型別

Pandas 第6講:Python資料處理套件Pandas 資料字串處理

Pandas 第7講:Python資料處理套件Pandas數值處理與基礎統計量

快樂學程式在Udemy 也推出了以Pandas 套件進行資料處理的實戰課程,這次是將Python已視覺化的方式

對資料進行解析,只要一個假日拉高你的職場競爭力!快來這裡一起快樂學程式!

如果你的入門還在單打獨鬥,歡迎來到快樂學程式找到志同道合的夥伴,你的自學之路不孤單。

Leave a Reply