資料分析實際案例之:pandas在餐廳評分資料中的使用

flydean發表於2022-02-25

簡介

為了更好的熟練掌握pandas在實際資料分析中的應用,今天我們再介紹一下怎麼使用pandas做美國餐廳評分資料的分析。

餐廳評分資料簡介

資料的來源是UCI ML Repository,包含了一千多條資料,有5個屬性,分別是:

userID: 使用者ID

placeID:餐廳ID

rating:總體評分

food_rating:食物評分

service_rating:服務評分

我們使用pandas來讀取資料:

import numpy as np

path = '../data/restaurant_rating_final.csv'
df = pd.read_csv(path)
df
userIDplaceIDratingfood_ratingservice_rating
0U1077135085222
1U1077135038221
2U1077132825222
3U1077135060122
4U1068135104112
..................
1156U1043132630111
1157U1011132715110
1158U1068132733110
1159U1068132594111
1160U1068132660000

1161 rows × 5 columns

分析評分資料

如果我們關注的是不同餐廳的總評分和食物評分,我們可以先看下這些餐廳評分的平均數,這裡我們使用pivot_table方法:

mean_ratings = df.pivot_table(values=['rating','food_rating'], index='placeID',
                                 aggfunc='mean')
mean_ratings[:5]
food_ratingrating
placeID
1325601.000.50
1325611.000.75
1325641.251.25
1325721.001.00
1325831.001.00

然後再看一下各個placeID,投票人數的統計:

ratings_by_place = df.groupby('placeID').size()
ratings_by_place[:10]
placeID
132560     4
132561     4
132564     4
132572    15
132583     4
132584     6
132594     5
132608     6
132609     5
132613     6
dtype: int64

如果投票人數太少,那麼這些資料其實是不客觀的,我們來挑選一下投票人數超過4個的餐廳:

active_place = ratings_by_place.index[ratings_by_place >= 4]
active_place
Int64Index([132560, 132561, 132564, 132572, 132583, 132584, 132594, 132608,
            132609, 132613,
            ...
            135080, 135081, 135082, 135085, 135086, 135088, 135104, 135106,
            135108, 135109],
           dtype='int64', name='placeID', length=124)

選擇這些餐廳的平均評分資料:

mean_ratings = mean_ratings.loc[active_place]
mean_ratings
food_ratingrating
placeID
1325601.0000000.500000
1325611.0000000.750000
1325641.2500001.250000
1325721.0000001.000000
1325831.0000001.000000
.........
1350881.1666671.000000
1351041.4285710.857143
1351061.2000001.200000
1351081.1818181.181818
1351091.2500001.000000

124 rows × 2 columns

對rating進行排序,選擇評分最高的10個:

top_ratings = mean_ratings.sort_values(by='rating', ascending=False)
top_ratings[:10]
food_ratingrating
placeID
1329551.8000002.000000
1350342.0000002.000000
1349862.0000002.000000
1329221.5000001.833333
1327552.0000001.800000
1350741.7500001.750000
1350132.0000001.750000
1349761.7500001.750000
1350551.7142861.714286
1350751.6923081.692308

我們還可以計算平均總評分和平均食物評分的差值,並以一欄diff進行儲存:

mean_ratings['diff'] = mean_ratings['rating'] - mean_ratings['food_rating']

sorted_by_diff = mean_ratings.sort_values(by='diff')
sorted_by_diff[:10]
food_ratingratingdiff
placeID
1326672.0000001.250000-0.750000
1325941.2000000.600000-0.600000
1328581.4000000.800000-0.600000
1351041.4285710.857143-0.571429
1325601.0000000.500000-0.500000
1350271.3750000.875000-0.500000
1327401.2500000.750000-0.500000
1349921.5000001.000000-0.500000
1327061.2500000.750000-0.500000
1328701.0000000.600000-0.400000

將資料進行反轉,選擇差距最大的前10:

sorted_by_diff[::-1][:10]
food_ratingratingdiff
placeID
1349870.5000001.0000000.500000
1329371.0000001.5000000.500000
1350661.0000001.5000000.500000
1328511.0000001.4285710.428571
1350490.6000001.0000000.400000
1329221.5000001.8333330.333333
1350301.3333331.5833330.250000
1350631.0000001.2500000.250000
1326261.0000001.2500000.250000
1350001.0000001.2500000.250000

計算rating的標準差,並選擇最大的前10個:

# Standard deviation of rating grouped by placeID
rating_std_by_place = df.groupby('placeID')['rating'].std()
# Filter down to active_titles
rating_std_by_place = rating_std_by_place.loc[active_place]
# Order Series by value in descending order
rating_std_by_place.sort_values(ascending=False)[:10]
placeID
134987    1.154701
135049    1.000000
134983    1.000000
135053    0.991031
135027    0.991031
132847    0.983192
132767    0.983192
132884    0.983192
135082    0.971825
132706    0.957427
Name: rating, dtype: float64

本文已收錄於 http://www.flydean.com/02-pandas-restaurant/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!

相關文章