我是一名技術創作者
在網際網絡行業,電商領域絕對是資料分析使用最多的場所,各大電商平台都依靠資料分析來幫助他們挖掘使用者訂單增長機會。 例如,購買寶藏的核心思想是根據使用者每天的瀏覽內容和停留時間,以及訂單的相關性來推薦它。
在本文中,我們將通過乙個真實的電子商務資料集進行分析,在回顧之前的內容的基礎上,我們也可以感受到電子商務資料分析的分析過程。
最近,一家電子商務公司**需要策劃一項促銷活動,通過傳送簡訊向客戶傳送廣告和優惠,以吸引他們購物。 但是,由於預算和簡訊的限制,不可能傳送給所有客戶,因此有必要找出最有可能轉換的人,並有針對性地傳送促銷資訊。
基於以上要求,作為資料分析師,我們需要根據自己的需求制定自己的分析方案。 那麼我們的任務是:
通過資料分析,找到最有可能轉化的人群特徵(如年齡、性別、地區等)。 通過資料分析,我們可以給出最合適的時間傳送促銷簡訊。 任務明確後,我們需要考慮完成上述任務需要哪些資料支援,並開始尋找資料部門提供相應的資料支援。
通過一頓飯的友情(唇)好(槍)合作(舌)商(戰),最終從資料部得到以下資料:
使用者行為表:過去6個月的使用者行為資料。 即訂單資料VIP資料:使用者VIP會員開戶資料。 使用者資料:與使用者個人資訊相關的資料。 一旦我們有了資料,我們就可以盡力而為。
為了方便我們學習,我們需要自己模擬一些相關資料,如果不想模擬,可以聯絡***獲取。
獲取資料後,解壓後可以看到以下檔案:
user_beh**ior_time_resampled.CSV(使用者行為資料)VIP使用者CSV(VIP 使用者資料)使用者資訊csv(使用者資料) 我們先來看一下每個表的字段說明:
user_beh**ior_time_resampled.csvvip_users.csv
user_info.csv
從這裡開始,我們將開始使用我們之前了解的一些包和庫來讀取資料,從 pandas 開始載入資料。
import pandas as pd
df_user_log = pd.read_csv("ecomm/user_beh**ior_time_resampled.csv")
df_vip_user = pd.read_csv("ecomm/vip_user.csv")
df_user_info = pd.read_csv("ecomm/user_info.csv")
df_user_log
df_vip_user
df_user_info
載入後,輸出如下所示:
這裡,df 使用者日誌表中有乙個時間戳和時間戳字段,我們需要了解這兩個欄位的含義。讓我們看一下這兩個欄位的邊界值。
time_stamp_max = str(df_user_log['time_stamp'].max())
time_stamp_min = str(df_user_log['time_stamp'].min())
print("time_stamp max: " + time_stamp_max, "time_stamp min: " + time_stamp_min)
timestamp_max = str(df_user_log['timestamp'].max())
timestamp_min = str(df_user_log['timestamp'].min())
print("timestamp max: " + timestamp_max, "timestamp min: " + timestamp_min)
輸出如下:
time_stamp max: 1112, time_stamp min: 511
timestamp max: 86399.99327792758, timestamp min: 0.10787397733480476
如您所見,時間戳的最大值為 1112,最小值為 511,時間戳的最大值為 8639999 的最小值為 01。
從資料集的描述來看,使用者行為表是使用者 6 個月的行為,時間戳最多 1112,最小值為 511,看起來很像乙個日期。 表示最短日期為 5 月 11 日,最長日期為 11 月 12 日。
那麼既然時間戳是日期,那麼時間戳會是特定時間嗎? 時間戳的最大值為 86399,而一天中的最大秒數為 24*3600 = 86400。 如果這兩個數字非常接近,則可以假定時間戳表示發生此行為的一天中的秒數。
解決了兩個時間欄位的問題,為了避免歧義,我們將時間戳列重新命名為 date。
df_user_log.rename(columns=, inplace = true)
df_user_log
一旦我們讀取了資料並理解了每個欄位的含義,我們就可以開始清理資料了。
對於資料分析中使用的資料集,我們需要盡可能了解資料的完整性,不清理與我們的資料分析無關的字段也沒關係。 但是,如果關鍵分析維度缺少部分,我們需要考慮是完成還是直接刪除。
讓我們先看一下缺失值:
df_user_log.isnull().sum()
輸出如下:
user_id 0
item_id 0
cat_id 0
seller_id 0
brand_id 18132
date 0
action_type 0
timestamp 0
dtype: int64
從以上結果來看,日誌表中缺少品牌資料的資料超過18000條,缺失率相對較低,為016%(1.8w 1098w),一般這個數量級不會影響資料分析的整體嚴謹性,我們暫且不處理。
df_user_info.isnull().sum()
輸出如下:
user_id 0
age_range 2217
gender 6436
dtype: int64
從結果中可以看出,資訊表中缺少 2217 個年齡資料和 6436 個缺失的性別字段。 但是我們對使用者的年齡和性別進行了分析,完成度完全不規則,所以這裡我們直接刪除它。
df_user_info = df_user_info.dropna()
df_user_info
df_vip_user.isnull().sum()
輸出:
user_id 0
merchant_id 0
label 0
dtype: int64
從結果來看,VIP桌沒有丟失,不需要處理。
完成上述準備工作後,是時候開始我們的核心資料分析工作了。
還記得我們的分析任務嗎? 第乙個是針對需要推廣的人,第二個是確定推廣資訊的傳送時間。 因此,讓我們專注於我們的兩個任務,讓我們做下乙個工作。
讓我們通過 DataFrame 的 value counts 函式看一下年齡分布
df_user_info.age_range.value_counts()
輸出:
name: age_range, dtype: int64
除了未知資料外,我們可以發現 3 和 4 的值佔比最大。 3 和 4 分別代表 25-30 歲和 30-34 歲。 然後我們用**來計算25-34歲的使用者比例。
user_ages = df_user_info.loc[df_user_info["age_range"] != 0, "age_range"]
user_ages.loc[(user_ages == 3) |user_ages == 4) ]shape[0] / user_ages.shape[0]
輸出:
可以看出,25-34歲年齡段的使用者比例為58%。
(2)使用者性別分析接下來,我們使用值計數函式來分析性別。
df_user_info.gender.value_counts()
輸出:
name: gender, dtype: int64
就字段含義而言,0 代表女性,1 代表男性,2 代表未知。 由此可以得出結論,該平台的核心使用者群體是女性,男性數量為235倍。
到現在為止,通過對使用者群體的分析,我們已經可以得出結論,平台的核心使用者是25-34歲的女性,但這種情況現實嗎? 畢竟,我們只分析了註冊使用者資訊,並沒有將其與訂單資料相結合。 也許只是註冊的女性多了,訂購的女性卻少了。 所以下一步就是結合使用者資訊和訂單資料,驗證猜想是否合理。
如上所述,我們需要結合使用者資訊和訂單資訊來分析是否是女性具有更強的購買力。 但是使用者資料和訂單資料屬於未使用的表,那我們該怎麼辦? 如果你看一下資料,我們可以看到 user 表和 order 表都有乙個名為 user id 的字段,因此我們有辦法將這兩個表關聯起來。
按使用者 ID 關聯兩個表:
df_user_log = df_user_log.join(df_user_info.set_index('user_id'), on = 'user_id')
df_user_log
輸出:
從上面的輸出中可以看出,使用者表的年齡和性別被合併到訂單表中。 接下來,我們可以根據下單的使用者來分析使用者的性別和年齡。
df_user_log.loc[df_user_log["action_type"] == "order", ["age_range"]].age_range.value_counts()
輸出:
name: age_range, dtype: int64
通過以上結果可以看出,訂單的年齡段和使用者資訊的分析基本一致,25-34歲的人佔比為599%。
df_user_log.loc[df_user_log["action_type"] == "order", ["gender"]].gender.value_counts()
輸出:
name: gender, dtype: int64
從以上結果可以看出,下訂單較多的還是女性。 至此,我們基本可以得出結論:我們向 25-34 歲的女性使用者傳送促銷資訊。 至此,任務已經接近一半,我們已經確定了傳送簡訊的組。 但另一項任務是確定何時傳送。 讓我們繼續前進。
在這裡,我們將每個日期分組,看看哪個時間段的下訂單的人最多。 由於資料是最近 6 個月的資料,那麼我們將資料分為 6 組並檢視:
df_user_log.loc[df_user_log["action_type"] == "order", ["date"]].date.value_counts(bins = 6)
輸出:
name: date, dtype: int64
可以看出,10月11日至11月11日下單量最多。 分析完日期後,我們來看看哪個時間段的訂單更多。
timestamp 字段儲存每條記錄的排序時間,即從當天午夜開始累積的秒數。 它並不直觀,我們更希望能夠根據小時級資料對其進行分析。 因此,讓我們考慮根據時間戳列建立乙個新的時間列來表示小時。
df_user_log.loc["time_hours_view"] = df_user_log["timestamp"]/3600
df_user_log
輸出:
我們可以直接使用 Value Count 來統計新新增的 Time Hours View 字段,然後我們可以分配一天的小時級分布。 我們以兩小時為單位檢視分布情況,因此將其分為 12 組。
df_user_log.loc[df_user_log["action_type"] == "order", ["time_hours_view"]].time_hours_view.value_counts(bins = 12)
輸出:
name: time_hours_view, dtype: int64
從以上結果可以看出,晚上 8 點到 10 點是最有序的至此,我們已經完成了根據要求分析資料的任務。 基本確定簡訊傳送群的推廣是:對於25-34歲的女性使用者,傳送簡訊的最佳時間是10月下旬至11月中旬的晚上8點至10點
歡迎關注***伺服器端技術選型。
如果您有任何問題或其他需求,可以留言。