數據分析與數據挖掘 - 02基礎操練


一 知識體系

在這一章我們將使用基礎的Python庫pandas,numpy,matplotlib來完成一個數據分析的小項目,推薦使用Anaconda環境下的jupter-notebook來進行練習。

二 背景介紹

這是一組航空公司用戶的數據,我們希望能夠從這些數據中分析出有價值的信息,數據如下。
chapter2-1.zip

三 分析方法

有關於對用戶的分析,比較廣泛的分析方法是使用RFM模型,其中R代表recently最近消費時間間隔,F代表frequency消費頻率,M代碼money消費金額。考慮到我們這個項目,如果購買了長度的打折機票和一個購買了短途的高等倉位機票的用戶,雖然他們的消費金額是一樣的,但是顯然購買高等倉位機票的用戶更有價值。於是,我們用M-mileage飛行里程和C-coefficient折扣系數來替換消費金額,並且增了L-long關系時長這樣一個參數,關系時長代表入會時間。由此,我們把RFM模型修改成LRFMC模型。

image.png

四 分析流程

回顧一下分析的流程,主要分為以下五步:

  1. 數據源 - 從業務系統中得到
  2. 數據抽取 - 抽取歷史數據
  3. 數據探索 - 探索數據中的缺失值,異常值
  4. 數據預處理 - 清洗轉換數據
  5. 數據建模 - 建立機器學習模型
  6. 結果反饋 - 給出策略

接下來我們要做的就是數據探索了

五 探索性分析

我們可以使用以下代碼很容易找到數據中的缺失值,最大值和最小值

import pandas as pd

# 1 定義文件名稱
datafile = 'air_data.csv'  # 初始文件
resultfile = 'explore.csv'  # 目標文件

# 2 讀取文件信息
data = pd.read_csv(datafile, encoding='utf-8')  # 使用pd.read_csv來讀取csv文件

# 3 呈現文件內容
explore = data.describe().T  # 獲取描述信息后在進行據陣轉置

# 4 計算空白數量
explore['null'] = len(data) - explore['count']

# 5 構造問題矩陣
explore = explore[['null', 'max', 'min']]  # 通過這個矩陣來初步觀察問題

# 6 修改矩陣名稱
explore.columns = ['空值數量', '最大值', '最小值']

# 7 保存探索文件
explore.to_csv(resultfile)

六 數據預處理

數據預處理主要采用數據清洗和數據變換的方法,這是構造模型的必要條件,數據清洗的原則必須是根據業務場景而定,根據業務場景,我們制定出如下規則:保留票價非零數據,或平局折扣率不為零且總飛行里程大於零的數據,然后清洗數據,具體代碼如下

import numpy as np
import pandas as pd

# 1 讀取原始數據
datafile = 'air_data.csv'
cleanedfile = 'data_cleaned.csv'
data = pd.read_csv(datafile)
print("原始數據的形狀", data.shape)

# 2 刪除缺失數據
airline_notnull = data.loc[data['SUM_YR_1'].notnull() & data['SUM_YR_1'].notnull()]
print("刪除缺失數據后的形狀", airline_notnull.shape)

"""
3 定制規則:保留票價非零數據,或平局折扣率不為零且總飛行里程大於零的數據,然后清洗數據
"""
index1 = airline_notnull['SUM_YR_1'] != 0  # 保留票價非零
index2 = airline_notnull['SUM_YR_2'] != 0
index3 = airline_notnull['SEG_KM_SUM'] > 0  # 保留飛行里程大於零
index4 = airline_notnull['avg_discount'] != 0  # 保留平局折扣率不為零

# 保留年齡小於100
index5 = airline_notnull['AGE'] < 100

# 數據整合
airline = airline_notnull[(index1 | index2) & index3 & index4 & index5]
print("清洗后的數據形狀", airline.shape)

# 保存數據
airline.to_csv(cleanedfile)

七 數據變換

數據標准化處理是預處理的最后一步,就是需要把數據格式變化成模型需要的樣子。

我要不斷努力進去,才能在最美好的樣子遇到你,希望你剛好也是如此。

# L 關系長度- LOAD_TIME - FFP_DATE
# R 最近消費時間間隔- LAST_TO_END
# F 消費頻率- FLIGHT_COUNT
# M 飛行里程- SEG_KM_SUM
# C 平均折扣系數- AVG_DISCOUNT

# 數據標准化處理
import pandas as pd
import numpy as np

cleanedfile = 'data_cleaned.csv'
data = pd.read_csv(cleanedfile)

# 選取需要的屬性
airline_selection = data[['LOAD_TIME', 'FFP_DATE', 'LAST_TO_END', 'FLIGHT_COUNT', 'SEG_KM_SUM', 'avg_discount']]

# 選取前五的數據
airline_selection.head()

# L的值的運算
L = pd.to_datetime(airline_selection['LOAD_TIME']) - pd.to_datetime(airline_selection['FFP_DATE'])
L.head()

# L的數據類型轉化
L = L.astype('str').str.split().str[0]
L.head()
L = L.astype('int') / 30
L.head()

# 把計算完成的L與上面不需要計算的屬性合並
airline_features = pd.concat([L, airline_selection.iloc[:, 2:]], axis=1)
airline_features.head()

# 修改列名
airline_features.columns = ['L','R','F','M','C']
airline_features.head()

# 標准化處理:可以理解為 (原始數值-均值)/標准差
from sklearn.preprocessing import StandardScaler
data = StandardScaler().fit_transform(airline_features)

np.savez('airline_scale.npz', data)

data[:, :5]

八 數據建模

標准化處理完成之后就是數據建模了,客戶價值分析模型的構建主要分為兩個部分,一是根據客戶的五個指標數據對客戶進行聚類分群,就是把相似的人聚集到一起,這樣做的好處是后續我們可以專門對這一類人采取相同的營銷策略。第二,就是結合業務對每個客戶進行特征分析,對客戶群體進行排名,分析客戶價值,后續的策略優先服務排名靠前的重要客戶。

我們使用kmeans算法來完成聚類分析,分析過程如下

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt


airline_scale = np.load('airline_scale.npz')['arr_0']

k = 5  # 把相似的對象分成幾類,k值就設置成幾

# 構建模型
kmeans_model = KMeans(n_clusters = k, random_state=123)  # random_state為隨即種子

# 訓練模型
fit_means = kmeans_model.fit(airline_scale)

# 獲取聚類中心
kmeans_cc = kmeans_model.cluster_centers_
print(kmeans_cc)  # 每一行代碼五維空間中的一個點

# 獲取樣本類別標簽
kmeans_labels = kmeans_model.labels_
print(kmeans_labels)

# 統計不同類別樣本數目
r1 = pd.Series(kmeans_labels).value_counts()

# 轉換數據格式
cluster_center = pd.DataFrame(kmeans_model.cluster_centers_, columns=['L','R','F','M','C'])

# 順序重置
cluster_center.index = pd.DataFrame(kmeans_model.labels_).drop_duplicates().iloc[:,0]
print(cluster_center)  # 用聚類算法,把幾萬個用戶聚成5類

關於聚類算法,現在我們可以不必關系他的原理,后續我們會有專門的章節來講解,現在只需要跟着我的代碼,一步一步了解這個過程即可。

九 數據可視化

用純數據的方式不利於我們觀察聚類分析的結果,讓我們數據可視化的方法繪制成圖形來看一下吧。

import matplotlib.pyplot as plt

labels = ['L','R','F','M','C']  # 指標
legen = ['customer' + str(i + 1) for i in cluster_center.index]  # 名稱
lstype = ['-','--',(0,(3,5,1,5,1,5)),':','-.']  # 樣式

kinds = list(cluster_center.iloc[:,0])  # 分類
kinds

# 數據閉合,雷達圖需要數據閉合
cluster_center = pd.concat([cluster_center, cluster_center[['L']]], axis=1)
cluster_center

centers = np.array(cluster_center.iloc[:, 0:])
centers

# 分割圓周的長
n = len(labels)

angle = np.linspace(0,2*np.pi, n, endpoint=False)
angle = np.concatenate((angle, [angle[0]]))
angle

# 畫布
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, polar=True)

for i in range(len(kinds)):
    ax.plot(angle, centers[i], linestyle=lstype[i], linewidth=2, label=kinds[i])

    ax.set_thetagrids(angle*180/np.pi, labels)
plt.title('customer type')

plt.legend(legen)  # 添加圖例
plt.show()

十 結合業務做分析報告

一個優秀的數據分析師的功底即將呈現的時刻到了,上面我們做的所有的工作就是為了最后這一步,如何結合業務場景分析出用戶價值和后續應對策略已以及營銷方案才是我們做數據分析的重中之重。

image.png

  • L 關系長度- LOAD_TIME - FFP_DATE
  • R 最近消費時間間隔- LAST_TO_END
  • F 消費頻率- FLIGHT_COUNT
  • M 飛行里程- SEG_KM_SUM
  • C 平均折扣系數- AVG_DISCOUNT

我們把圖形和每一緯度對應的指標都放在這里,下面就和我一起根據圖形來做分析。根據上面的特征分析圖標說明每類用戶都有顯著不同的表現特征,基於這些特征的描述,我們把這些用戶分為五個等級的客戶類別:重要保持客戶,重要發展客戶,重要挽留客戶,一般客戶,其中每類客戶類別的特征如下:

  1. 重要保持客戶:customer1,這類客戶的平均折扣率(C)較高,說明一般所乘坐航班的艙位等級較高,最近乘坐本航班(R)低,乘坐次數(F)和里程(M)最高,他們是航空公司的高價值用戶,是最為理想的客戶類型,對航空公司貢獻最大,所占比例卻小,航空公司應該優先將資源投放到他們身上,對他們進行差異化管理和一對一服務,提高這類客戶的忠誠度和滿意度,盡可能延長這類客戶的高消費水平。
  2. 重要發展用戶:customer2,這類客戶平均折扣率最高,雖然當前價值不高,卻是航空公司的潛在價值客戶,要努力使這類客戶增加消費,加強客戶滿意度,提高他們轉向競爭對手的轉移成本,是他們逐漸成為公司的忠誠客戶。
  3. 重要挽留用戶:customer3,這類客戶入會時間最長,但其他屬性都比較低。航空公司應該根據這些客戶的最近消費時間,消費次數的變化情況,對其采取一定的營銷手段,延長客戶的生命周期。
  4. 一般價值用戶:customer4,customer5,這類客戶沒有什么忠誠度可言,應該是機票打折才會購買的。

十一 補充分析

1 每年新增會員人數

import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt

data = pd.read_csv('air_data.csv')
ffp = data['FFP_DATE'].apply(lambda x: datetime.strptime(x, '%Y/%m/%d'))
ffp_year = ffp.map(lambda x: x.year)
fig = plt.figure(figsize=(8, 5))
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.hist(ffp_year, bins='auto')

plt.xlabel('year')
plt.ylabel('New membership')
plt.title('New membership every year')
plt.show()

結果如下圖所示:
image.png

2 男女比例分析

male = pd.value_counts(data['GENDER'])['男']
female = pd.value_counts(data['GENDER'])['女']

fig = plt.figure(figsize=(7, 4))
plt.pie([male, female], labels=['male', 'female'])
plt.title('male and female')
plt.show()

結果如下圖所示:

image.png

以上就是一些最為常用的圖形,當然還有很多的圖形等待着我們后續的學習,每一種數據總有一種圖形適合去表示它,所以數據的可視化操作在數據分析以及AI領域都有非常重要的作用。相信通過這一章的學習,你一定能夠掌握數據分析的整個流程,並且對數據有一個全新的認知了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM