數據背景
數據來源:某無人機航拍服務平臺的訂單數據
這份數據是我通過 scrapy 框架爬取該平臺網站公開的訂單數據得到的。數據僅以分析之用,故在下文中,特意隱藏該平臺網站的信息。
分析目的:
- 分析該平臺的運營情況
- 總結如果開展同類型項目可能會出現的問題
爬蟲思路:
- 根據網站鏈接 http://www.abc.cn/page/job_xxx.html 中「xxx」,從 xxx=55 作遞增處理;
- 爬取訂單詳情頁里所有與訂單有關的屬性,并以 csv 的文件格式保存到本地。
最后共抓取到 138 條帶有效數據的鏈接,在該網站中代表著有 138 個公開的訂單。
數據概況
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
pd.options.display.max_rows = 250
df = pd.read_csv('../scrapy_projects/abc/abc.csv')
df = df[['標題', '任務日期', '任務天數', '地點', '預算', '最終報價', '搶單飛手', '已選飛手', '服務評分', '電池塊數', '拍攝內容', '人員配置', '拍攝機型', '飛手飛齡', '飛行環(huán)境', '拍攝用途', '任務說明']]
print(df.duplicated().value_counts()) # duplicated() 為 False 的有 138,代表 df 的每條數據都是非重復的。
df

結論
df 是一個 138x18 的不重復的數據集,也代表有著 138 個有效訂單數據;
結合網站時間跨度從 2016 年 12 月 24 日,到最新更新的任務訂單的日期 2017 年 10 月 23 日,相隔 303 天,跟訂單數相除,平均 2.19 天一個訂單。
任務日期分布(按月)
df['任務日期'] = df['任務日期'].str.split(" ", expand=True).get(0)
df['任務日期'] = df['任務日期'].str.replace("年|月", "-")
df['任務日期'] = df['任務日期'].apply(lambda x: x[0:7])
print("每月的訂單分布如下:\n\n", df.groupby(by='任務日期').size())
每月的訂單分布如下:
任務日期
2016-12 10
2017-01 14
2017-02 7
2017-03 16
2017-04 21
2017-05 22
2017-06 25
2017-07 14
2017-08 3
2017-09 4
2017-10 2
dtype: int64
from matplotlib.font_manager import FontProperties
font_zh = FontProperties(fname='/Library/Fonts/Microsoft/SimHei.ttf')
# for style in plt.style.available:
plt.style.use('fivethirtyeight')
ax = df.groupby(by='任務日期').size().plot(kind='line', ylim=(0,30), title="訂單日期分布(按月)")
ax.title.set_fontproperties(font_zh)
ax.set_xlabel("月份").set_fontproperties(font_zh)
ax.set_ylabel("訂單總數").set_fontproperties(font_zh)

結論
由上面的折線圖,2 月份和 8 月份的訂單數量有明顯的回落,2 月份是農歷新年假期,數據回落可以理解。但在 8 月份,訂單數量驟降至只有 3 個訂單,有幾個可能性,一是用戶需求量突然下降,二是關閉了用戶自行發(fā)布需求的入口(改成現在這種由平臺的運營進行選擇性發(fā)布)。不過我不清楚他們之前發(fā)布需求的方式,所以現在還只是推測。如果第二種可能性是真的,那很可能他們在 8 月份的時候便開始內部調整了。
省份城市分布
df['省份'] = df['地點'].str.split(" ", expand=True).get(0)
df['城市'] = df['地點'].str.split(" ", expand=True).get(1)
# 對缺少「省」「市」的字段進行填補
df.loc[df['省份'].isin(['廣東', '湖南', '山東', '黑龍江']), '省份'] += '省'
df.loc[df['省份'].isin(['北京', '上海']), '省份'] += '市'
plt.rcParams['font.sans-serif']=['SimHei']
plt.style.use('ggplot')
font_zh = FontProperties(fname='/Library/Fonts/Microsoft/SimHei.ttf')
ax = df['省份'].value_counts()[:10].plot(kind='pie', figsize=(6,6))
ax.title.set_fontproperties(font_zh)
# ax.set_fontproperties(font_zh)
ax.set_title('訂單省份分布', fontsize=20)

df.loc[df['城市'].str.len()==2, '城市'] += '市'
df.loc[df['城市']=='哈爾濱', '城市'] += '市'
# 對「城市」列上空白字符的值,可以根據「地點」列的值進行提取
df.loc[df['城市']=='', '城市'] = df.loc[df['城市']=="", '地點'].str.split(" ", expand=True).get(3)
ax = df['城市'].value_counts()[:10].plot(kind='bar', title='訂單城市分布')
ax.title.set_fontproperties(font_zh)

結論
結合「訂單省份分布」及「訂單城市分布」的圖表,過半數的訂單來自廣東,同時訂單量前十的城市中,有 4 個來自廣東的,也符合「發(fā)跡于珠三角」的戰(zhàn)略路線。
交易數據
df.loc[:, '預算'] = df['預算'].str.replace("¥", "").astype('float32')
df.loc[:, '最終報價'] = df['最終報價'].str.replace("¥", "").astype('float32')
df['差價'] = df['預算'] - df['最終報價']
print("訂單成交金額:",df['最終報價'].sum())
訂單成交金額: 404459.0
bins = [0, 1000, 2000, 3000, 4000, 5000, 10000, 20000]
level = ['1000以下', '1000-2000', '2000-3000', '3000-4000', '4000-5000', '5000-10000', '10000以上']
df['level'] = pd.cut(df['預算'], bins=bins, labels=level)
df_price_pct = pd.DataFrame(df['level'].value_counts())
df_price_pct['pct'] = ((df_price_pct['level']/df_price_pct['level'].sum())*100).round(2)
df_price_pct = df_price_pct.sort_index(axis=0, level=['1000以下', '1000-2000', '2000-3000', '3000-4000', '4000-5000', '5000-10000', '10000以上'])
df_price_pct

plt.style.use('bmh')
df_price_pct['level'].plot(kind='pie', title='訂單預算價格', figsize=(6,6))

結論
- 訂單的預算,即需求方的報價,介于 500 至 19500,平均預算為 3119.93 元,平均接單價(最后報價)2930.86 元,平均下來,比預算節(jié)省 189.07 元。
- 將最終報價進行匯總處理,可得知所有訂單的成交金額為: 404459 元,假設網站抽傭高達 10%,網站將受益 40445.9 元??紤]到統(tǒng)計時間段橫跨 10 個月,所以網站靠訂單抽傭的方式盈利金額其實并不高。
- 由上面的餅圖可得知,訂單預算金額在 2000 元以下的已經超過一半了。再擴大范圍,預算金額在 4000 以下的則高達 78.26%。可見客單價較低會是比較普遍的情況。
搶單數據
print("平均每個訂單的搶單數:",df['搶單飛手'].mean().round(2))
平均每個訂單的搶單數: 13.22
df['搶單飛手'].describe()
count 138.000000
mean 13.217391
std 11.230004
min 1.000000
25% 6.000000
50% 11.000000
75% 15.750000
max 75.000000
Name: 搶單飛手, dtype: float64
print("中標團隊數量:", len(df['已選飛手'].unique()))
df_team = df['已選飛手'].value_counts().reset_index()
df_team[df_team['已選飛手']>1]
print("中標多于 1 單的團隊數量:", len(df_team[df_team['已選飛手']>1]))
print("中標團隊平均服務評分:", df['服務評分'].mean().round(2))
中標團隊數量: 97
中標多于 1 單的團隊數量: 19
中標團隊平均服務評分: 87.64
結論
- 從「搶單飛手」一列的平均數據得知,平均每個訂單的搶單數為 13.22,對需求方是個正反饋不錯的數值。
- 這 138 個訂單,實際上只有 97 個團隊成果「中標」過,但「中標」數量多于 1 的團隊只有 19 個,那就說明還有 78 個團隊是只「中標」過一次。還沒包括沒有出現在這份數據上的,沒有成功「中標」過的團隊。所以該網站對服務方(飛手團隊)的正反饋十分匱乏。
任務說明
df['任務說明'] = df['任務說明'].str.strip()
df['任務說明'] = df['任務說明'].str.replace("\r|\n|\t", "")
import re
# pat = r'【(\s+)([\u4e00-\u9fa5]+)(\s+)】| 【([\u4e00-\u9fa5]+)】'
pat = r'【(.*?)+】| [(.*?)+]'
df.loc[:, '標題'] = df['標題'].str.replace(pat , "")
text = "".join(df['標題'].values.tolist())
import jieba
segments = []
wordlist = jieba.cut(text, cut_all=True)
for seg in wordlist:
if len(seg)>1:
segments.append(seg)
segmentDF = pd.DataFrame({'segment': segments})
segstat = segmentDF.groupby('segment').size().reset_index()
segstat = segstat.rename(columns = {0:'counts'})
segstat = segstat.sort_values(by='counts', ascending=False)
segstat.head(10)

結論
單從訂單的標題里分析拍攝需求,除「航拍」「拍攝」外,「建筑」這個詞出現次數最高,證明建筑航拍在航拍需求量里是最高的,但鑒于數據量較小,此處的結論應輔以其他字段的分析進行驗證。
小結
月訂單數據在 8 月份開始突然驟降,一是可能跟團隊內部調整有關,可以研究網站背后運作的公司的其他產品的動態(tài)輔以論證。二是可能這種商業(yè)模式依然不明朗,雖然平均訂單單價 2930.86 元,但訂單價在 2000 元以下的依然占超過一半,并且作為網站核心數據的訂單量并不高,說明網站還處于低頻低客單價的狀態(tài)。從訂單量看,需要結合他們團隊的推廣手段,來評估核心數據不高是因為推廣力度不足,還是因為行業(yè)需求量偏低導致的。至于客單價的問題,可以考慮加入附加值更高的航拍服務(如電力航拍、測繪航拍)來提高訂單價格。