1電商平臺零售資料分析
import plotly as py
py.offline.init_notebook_mode()
pyplot = py.offline.iplot
import plotly.graph_objs as go
from plotly.graph_objs import Scatter
from scipy import stats
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import os
os.chdir(r'E:\2020 年 Python 資料分析師特訓營全套 84 節影片完結版(就業向零基礎友好) \2020 年 Python 資料分析師特訓營全套 84 節影片完結版 ')
df = pd.read_excel(' 超市資料 .xlsx', dtype= {'Row ID':str})
df
# 缺失率
df.apply(lambda x:sum(x.isnull())/len(x),axis=0)
# 複製原檔案為 df1 ,防止資料丟失
df1 = df.copy()
df1
# 去掉有缺失值的資料
df1.dropna(how='any')
# # 去掉指定的兩列
# df1.drop(['Unnamed: 24','Unnamed: 25'],axis=1,inplace=True)
# 將 Shipping Cost 這一列中的缺失值替換為 U
df['Shipping Cost'] = df['Shipping Cost'].fillna('U')
# 先匯入 re 模組,可以使用 split 一次加入多個切割條件
import re
# 取出 Ship Date 這一列的每行字串中以 / 分隔開的第一、二、三個元素
df1['ship_day'] = [re.split('\/|\-',x)[0] for x in df1['Ship Date']]
df1['ship_month'] = [re.split('\/|\-',x)[1] for x in df1['Ship Date']]
df1['ship_year'] = 外匯跟單gendan5.com[re.split('\/|\-',x)[2] for x in df1['Ship Date']]
# 將 Order Date 轉換為 datetime 格式
df1['Order Date'] = pd.to_datetime(df1['Order Date'],errors='coerce')
df1['Order Date'] = df1['Order Date'].dt.date
# 去重
df1 = df1.drop_duplicates()
# 檢視資料型別
df1.info()
# 異常值處理之前先探索資料
df1.describe()
# 將 Sales Quantity Profit 轉換為 float64
df1['Sales'] = pd.to_numeric(df1['Sales'], errors='coerce')
df1['Quantity'] = pd.to_numeric(df1['Quantity'], errors='coerce')
df1['Profit'] = pd.to_numeric(df1['Profit'], errors='coerce')
# 計算 Sales*Quantity 儲存為新的一列 Price
df1['Price'] = df1.apply(lambda x:x['Sales']*x['Quantity'],axis=1)
df1.info()
df1
# 異常值處理
df3 = df1.loc[df1['Quantity']<=0]
# 計算異常值佔比
df3.shape[0]/df1.shape[0]
# 對異常值中的數量分類計數
df3['Quantity'].groupby(df3['Quantity']).count()
#df3 中不同的年對應的不同的月份的退貨金額
tt=pd.pivot_table(df3,index=['ship_year'],columns=['ship_month'],values=['Price'],aggfunc={'Price':np.sum},margins=False)
tt
# 計算 Profit>0 的數量 Quantity 並按照 State 分組求和,按照降序排列,顯示前十行,儲存為 quantity_first_10
quantity_first_10=df1[df1['Profit']>0].groupby(by='State').sum()['Quantity'].sort_values(ascending=False).head(10)
# 畫圖
trace_basic=[go.Bar(x=quantity_first_10.index.tolist(),y=quantity_first_10.values.tolist(),marker=dict(color='orange'),opacity=0.50)]
layout=go.Layout(title=' 購買數量前十的國家 ',xaxis=dict(title=' 國家 '))
figure_basic=go.Figure(data=trace_basic,layout=layout)
pyplot(figure_basic)
# 交易額前十
price_first_10=df1[df1['Profit']>0].groupby(by='State').sum()['Price'].sort_values(ascending=False).head(10)
trace_basic1=[go.Bar(x=price_first_10.index.tolist(),y=price_first_10.values.tolist(),marker=dict(color='orange'),opacity=0.50)]
layout1=go.Layout(title=' 交易額前十的國家 ',xaxis=dict(title=' 國家 '))
figure_basic1=go.Figure(data=trace_basic1,layout=layout1)
pyplot(figure_basic1)
# 將 Order Date 轉換為 datetime 格式
df1['Order Date'] = pd.to_datetime(df['Order Date'],errors='coerce')
# 提取 Order Date 中的月份
df1['Month'] = df1['Order Date'].dt.month
# 十二個月份盈利
profit_12=df1[df1['Profit']>0].groupby(by='Month').sum()['Profit'].sort_values(ascending=False)
trace_basic2=[go.Bar(x=profit_12.index.tolist(),y=profit_12.values.tolist(),marker=dict(color='orange'),opacity=0.50)]
layout2=go.Layout(title=' 十二個月份盈利條形圖 ',xaxis=dict(title=' 月份 '))
figure_basic2=go.Figure(data=trace_basic2,layout=layout2)
pyplot(figure_basic2)
#seaborn 畫圖
sns.set(style='darkgrid',context='notebook',font_scale=1.2)
profit_12=df1[df1['Profit']>0].groupby(by='Month').sum()['Profit'].sort_values(ascending=False).plot(kind='bar')
# 把 x 軸月份數字正過來
plt.xticks(rotation=360)
# 客單價,就是每個客戶的消費金額
# 客單價 = 總消費金額 / 訂單總量
# 總消費金額
sum_price = df1[df1['Quantity']>0]['Price'].sum()
# 計算客戶 ID 數量
count_ID = df1[df1['Quantity']>0]['Customer ID'].count()
# 客單價
avgprice = sum_price/count_ID
print(avgprice)
# 客戶 ID 去重計數
count_ID1=df1[df1['Quantity']>0]['Customer ID'].drop_duplicates().count()
print(count_ID1)
# 按照 Customer ID 聚合時,對 Row ID 去重計算下單次數,對 Quantity 和 Price 求和
customer=df1[df1['Quantity']>0].groupby('Customer ID').agg({'Row ID':'nunique','Quantity':np.sum,'Price':np.sum})
print(customer)
customer.describe()
#df2 是取出 df1 中既滿足 ['Quantity']>0 又滿足 ['Sales']>0 的資料
df2 = df1[(df1['Quantity']>0) & (df1['Sales']>0)]
#RFM
# R_value 是使用者最近一次交易距今的時間
# 按照 Customer ID 分類選出 Order Date 的最大值
R_value = df2.groupby('Customer ID')['Order Date'].max()
# Order Date 中的最近時間 - 每位使用者最近一次交易時間
R_value = (df2['Order Date'].max() - R_value).dt.days
# F_value 是使用者在限定的時間內所購買的次數
# 按照 Customer ID 分類對 Order ID 去重計數
F_value = df2.groupby('Customer ID')['Order ID'].nunique()
# M_value 是使用者的交易金額
# 按照 Customer ID 分類對 Price 求和
M_value = df2.groupby('Customer ID')['Price'].sum()
# 描述分析 R_value
R_value.describe()
# 畫出 F_value 滿足 F_value<200 的分佈柱狀圖
plt.hist(F_value[F_value<200],bins=30)
plt.show()
# 設定分段標準
R_bins = [0,30,60,90,180,720]
F_bins = [1,2,5,10,20,500]
M_bins = [0,500,2000,5000,10000,200000]
# 對使用者最近一次交易距今的時間分段
R_score = pd.cut(R_value,R_bins,labels = [5,4,3,2,1],right=False)
R_score
# 對使用者在限定的時間內所購買的次數分段
F_score = pd.cut(F_value,F_bins,labels = [1,2,3,4,5],right=False)
# 對使用者的交易金額分段
M_score = pd.cut(M_value,M_bins,labels = [1,2,3,4,5],right=False)
# 將 R 、 F 、 M 組合起來
RFM = pd.concat([R_score,F_score,M_score],axis=1)
# 重新命名各個變數
RFM.rename(columns={'Order Date':'R_score','Order ID':'F_score','Price':'M_score'},inplace=True)
# 將 RFM 中的資料轉換為 float
for i in ['R_score','F_score','M_score']:
RFM[i] = RFM[i].astype(float)
# 看平均值
RFM.describe()
# 進行使用者價值評測:大於平均值為高價值使用者,否則為低價值使用者
RFM['R'] = np.where(RFM['R_score'] > 3.594560,' 高 ',' 低 ')
RFM['F'] = np.where(RFM['F_score'] > 3.857862,' 高 ',' 低 ')
RFM['M'] = np.where(RFM['M_score'] > 4.243703,' 高 ',' 低 ')
# 將 R 、 F 、 M 三個評測等級以字串形式連線儲存為 value 一列
RFM['value'] = RFM['R'].str[:] + RFM['F'].str[:] + RFM['M'].str[:]
# 去除 value 一列字串頭尾的空格
RFM['value'] = RFM['value'].str.strip()
# 定義使用者等級分類函式
def trans_value(x):
if x == ' 高高高 ':
return ' 重要價值客戶 '
elif x == ' 低高高 ':
return ' 重要保持客戶 '
elif x == ' 低低高 ':
return ' 重要挽留客戶 '
elif x == ' 高高低 ':
return ' 一般價值客戶 '
elif x == ' 高低低 ':
return ' 一般發展客戶 '
elif x == ' 低高低 ':
return ' 一般保持客戶 '
elif x == ' 高低高 ':
return ' 重要發展客戶 '
else:
return ' 一般挽留客戶 '
# 對 value 一列使用使用者等級分類函式
RFM[' 使用者等級 '] = RFM['value'].apply(trans_value)
# 分類計數
RFM[' 使用者等級 '].value_counts()
# 畫條形圖
trace_basic=[go.Bar(x=RFM[' 使用者等級 '].value_counts().index,y=RFM[' 使用者等級 '].value_counts().values,marker=dict(color='orange'),opacity=0.50)]
layout=go.Layout(title=' 使用者等級情況 ',xaxis=dict(title=' 使用者重要度 '))
figure_basic=go.Figure(data=trace_basic,layout=layout,)
pyplot(figure_basic)
# 畫餅圖
trace_basic1 = [go.Pie(labels = RFM[' 使用者等級 '].value_counts().index,values = RFM[' 使用者等級 '].value_counts().values,hole=0.2,textfont = dict(size=12,color='white'))]
layout1 = go.Layout(title = ' 使用者等級比例 ')
figure_basic1 = go.Figure(data = trace_basic1,layout = layout1,)
pyplot(figure_basic1)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2765175/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分享個常用的跨境電商資料分析平臺
- 掌握電商資料的4個要點!電商平臺資料分析其實很簡單
- 電商平臺資料採集介面
- 資料分析專案精講!電商平臺人、貨、場分析實戰,附資料來源
- 分析平臺Tableau推出資料和分析平臺新功能
- 大資料平臺搭建(1)大資料
- CDS — 資料管理分析平臺
- 資料分析平臺搭建指南
- 如何利用API介面獲取電商平臺資料?API
- 如何搭建遊戲資料分析平臺遊戲
- EXCEEDDATA — 工程大資料分析平臺大資料
- tiktok商品資料分析平臺
- 資料分析平臺哪個好
- 觀遠資料智慧分析2.0平臺釋出,讓零售決策更智慧
- 圖資料平臺引領零售業走向成功
- Windows平臺下不能建立資料庫連線出錯分析 (1)Windows資料庫
- 大資料分析平臺功能板塊大資料
- 大資料分析平臺如何構建大資料
- 財務資料分析不可錯過的大資料分析平臺大資料
- B2B電商交易平臺業務模式分析模式
- 智慧警務大資料平臺開發,資料視覺化分析平臺搭建大資料視覺化
- 數商雲新零售電商平臺解決方案:業務需求、行業架構、優勢整合分析行業架構
- ViCANdo — 智慧駕駛資料採集及資料分析平臺
- 貨拉拉自助資料分析平臺實踐
- 大資料分析平臺搭建方式有哪些大資料
- 電商資料分析必備的4種資料分析方法
- 電商RPA助力電商運營做好資料分析
- TDS:標籤平臺+API平臺+資料共享平臺,助力資料運營平臺建設API
- 從0到1搭建DeltaLake大資料平臺大資料
- 大資料分析平臺的目的是什麼大資料
- 大資料分析平臺的搭建方式有哪些大資料
- 大資料分析平臺的作用有什麼大資料
- 大資料分析平臺安全的重要性大資料
- 大資料分析平臺究竟是什麼大資料
- 國內典型資料交易平臺對比分析
- 資料平臺、大資料平臺、資料中臺……還分的清不?大資料
- 從0到1搭建自助分析平臺
- 七牛大資料平臺的實時資料分析實戰大資料