01-案例:航空用戶聚類案例.py
"""
目標:
對用戶進行聚類
對聚類後的用戶評估其價值
對不同價值的客戶實行不同營銷策略
客戶價值:
收入來源於20%的頂端客戶
90%收入來自於現有客戶
大量資金被投入拓展用戶上面
瞭解航空公司的現狀
行業內存在競爭
行業間存在競爭
2012-03-31 ---2014-3-31兩年的數據 ---62988樣本,44個特徵
加載數據並進行數據處理
數據清洗
# 丟棄票價爲空的數據 ---保留存在票價的數據
# 丟棄票價爲0,折扣不爲0,飛行里程>0 的數據 ----航空公司沒有盈利的數據
# 保留盈利的數據---保留票價>0,折扣>0,飛行里程>0
特徵篩選與特徵構建 ---LRFMC
數據規約 ---標準化
進行客戶聚類
(1)實例化算法對象
(2)訓練數據並構建模型
(3)預測--將客戶聚爲不同簇
結果展示
# 雷達圖
根據結果--取劃分不同重要程度的客戶
#
應用--針對於不同的客戶實行不同的營銷策略
"""
import pandas as pd
import numpy as np
def build_data():
"""
加載數據
:return: data
"""
data = pd.read_csv('./air_data.csv', encoding='ansi')
return data
def desc_sca(data):
"""
小數定標標準化
:param data: df 或者series
:return: 標準化之後的數據
"""
# np.floor() --->向下取整
data = data / (10 ** int(np.ceil(np.log10(data.abs().max()))))
return data
def deal_data(data):
"""
數據處理
:param data: 需要的數據
:return: 數據處理之後的data
"""
# 數據清洗
# (1)丟棄票價爲空的數據
# ---保留存在票價的數據 -- SUM_YR_1 SUM_YR_2
# 個人認爲 :SUM_YR_1 SUM_YR_2 同時不爲空的情況下,票價纔不爲空
bool_index_1 = data.loc[:, 'SUM_YR_1'].notnull()
bool_index_2 = data.loc[:, 'SUM_YR_2'].notnull()
# 同時滿足
bool_index = bool_index_1 & bool_index_2
# 篩選數據
data = data.loc[bool_index, :]
# (2)丟棄票價爲0,折扣不爲0,飛行里程>0 的數據 ----航空公司沒有盈利的數據
# 保留盈利的數據---保留票價>0,折扣>0,飛行里程>0
# 個人認爲:SUM_YR_1 SUM_YR_2 只要有一個 > 0 ,就認爲票價>0
bool_id_1 = data.loc[:, 'SUM_YR_1'] > 0
bool_id_2 = data.loc[:, 'SUM_YR_2'] > 0
# 折扣係數 > 0
bool_id_3 = data.loc[:, 'avg_discount'] > 0
# 飛行里程 > 0
bool_id_4 = data.loc[:, 'SEG_KM_SUM'] > 0
#
bool_id = (bool_id_1 | bool_id_2) & bool_id_3 & bool_id_4
# 篩選滿足條件的數據
data = data.loc[bool_id, :]
# print('清洗之後的數據:\n', data)
# 篩選特徵 --並構建特徵 ----LRFMC
# FFP_DATE --入會時間
# LOAD_TIME --窗口結束時間
# LAST_TO_END --最後一次乘機時間距窗口結束的時長
# FLIGHT_COUNT --飛行次數
# SEG_KM_SUM --飛行里程
# avg_discount ---折扣係數
data = data.loc[:, ['FFP_DATE', 'LOAD_TIME', 'LAST_TO_END', 'FLIGHT_COUNT', 'SEG_KM_SUM', 'avg_discount']]
# print('篩選結束之後的結果:\n',data)
# 構建特徵---LRFMC
# 構建L
# 將 FFP_DATE、LOAD_TIME轉化爲pandas默認支持的時間序列
data.loc[:, 'FFP_DATE'] = pd.to_datetime(data.loc[:, 'FFP_DATE'])
data.loc[:, 'LOAD_TIME'] = pd.to_datetime(data.loc[:, 'LOAD_TIME'])
# 結束 - 入會
data.loc[:, 'L_days'] = data.loc[:, 'LOAD_TIME'] - data.loc[:, 'FFP_DATE']
data.loc[:, 'L'] = [tmp.days / 30 for tmp in data.loc[:, 'L_days']]
# print(data.loc[:, 'L'])
# 構建R
data.loc[:, 'R'] = data.loc[:, 'LAST_TO_END'] / 30
# print(data.loc[:, 'R'])
# 構建F
data.loc[:, 'F'] = data.loc[:, 'FLIGHT_COUNT']
# 構建M
data.loc[:, 'M'] = data.loc[:, 'SEG_KM_SUM']
# 構建C
data.loc[:, 'C'] = data.loc[:, 'avg_discount']
# 篩選出最終的特徵
data = data.loc[:, ['L', 'R', 'F', 'M', 'C']]
# 標準化數據
# 小數定標標準化
for column in data.columns:
data.loc[:, column] = desc_sca(data.loc[:, column])
# print('構建好特徵之後的結果:\n', data)
return data
def main():
"""
主函數
:return:
"""
# 加載數據
data = build_data()
print('data:\n', data)
print('data 的列索引:\n', data.columns)
print('*' * 100)
# 數據處理
data = deal_data(data)
print('data:\n', data)
# 聚類
# 結果展示
if __name__ == '__main__':
main()