6000字我就寫了個(gè)數(shù)據(jù)探索分析?
大家好,我是寶器!
今天的這篇文章比較肝,是一篇比較貼合實(shí)際工作的數(shù)分實(shí)戰(zhàn)案例
全文 6000 多字,可能閱讀會(huì)花一些時(shí)間,但是 絕對(duì)物超所值。特別是對(duì)于沒有項(xiàng)目可以練手的同學(xué)來說,建議跟著實(shí)操一遍,收獲很大!
下面是正文:
這個(gè)項(xiàng)目官方給出的背景是這樣的:

解讀一下,大致意思是:現(xiàn)在有一批已經(jīng)更換5G套餐的用戶數(shù)據(jù),數(shù)據(jù)維度有很多,包括:基礎(chǔ)信息、消費(fèi)行為、超套信息、寬帶信息、其他信息,共 46 個(gè)用戶特征。
目的是 通過這批用戶數(shù)據(jù)去分析什么樣的用戶更傾向于更換5G套餐,從而進(jìn)行潛客營(yíng)銷
如果是第一次做分析類項(xiàng)目的同學(xué),可能拿到這個(gè)數(shù)據(jù)的第一印象是:靠,咋這么多特征列?
其實(shí)數(shù)據(jù)一共就 14w 條,5 個(gè)用戶維度一共 46 個(gè)特征,比較正常的數(shù)據(jù),實(shí)際真正應(yīng)用的話這個(gè)數(shù)據(jù)量甚至還有點(diǎn)點(diǎn)少,訓(xùn)練出來的模型需要多輪測(cè)試才能部署。
ok,背景也說完了,下面開始正文
整體分析
在分析之前需要明確,當(dāng)前的工作是探索性數(shù)據(jù)分析(EDA)。探索性數(shù)據(jù)分析屬于數(shù)據(jù)清洗之前的部分,主要是探索數(shù)據(jù),只看數(shù)據(jù)不操作數(shù)據(jù)
先來看看數(shù)據(jù):

整體數(shù)據(jù)就這樣,一共 14w 條數(shù)據(jù),46 個(gè)特征
1. 缺失分析
缺失分析應(yīng)該算是最早應(yīng)該做的,如果有缺失值,后面的探索 不要忘了考慮缺失 情況
一個(gè) 46 個(gè)特征,肯定會(huì)有缺失值,代碼也很簡(jiǎn)單:
"""查看數(shù)據(jù)整體缺失情況"""
df_data.isnull().sum()
圖很長(zhǎng),放一部分吧:

這個(gè)圖看的不是很明了,換種方式,我們可以計(jì)算每個(gè)特征的缺失程度,然后排序一下
代碼如下:
"""查看特征的缺失程度"""
missing_series = df_data.isnull().sum()/df_data.shape[0]
missing_df = pd.DataFrame(missing_series).reset_index()
missing_df = missing_df.rename(columns={'index': 'col', 0: 'missing_pct'})
missing_df = missing_df.sort_values('missing_pct', ascending=False).reset_index(drop=True)
效果是這樣的:


1.2 缺失分析-看圖分析
用戶標(biāo)識(shí)維度無數(shù)據(jù)缺失
用戶基礎(chǔ)信息維度中星級(jí)缺失 6849 條數(shù)據(jù)、細(xì)分市場(chǎng)缺失 691 條數(shù)據(jù) 消費(fèi)行為信息維度、超套信息維度中所有特征均分別缺失 89、392 條數(shù)據(jù) 寬帶信息維度中寬帶貸款和寬帶是否激活特征缺失 101060 條數(shù)據(jù),缺失較嚴(yán)重 簽約信息維度、套餐信息維度中所有特征均分別缺失 774、6617 條數(shù)據(jù) 流量飽和度信息維度中所有特征均缺失 9000+ 條數(shù)據(jù),需要進(jìn)一步分析 其他信息特征中,5G流量特征缺失 132559 條數(shù)據(jù),缺失非常嚴(yán)重
另外,缺失分析不光是特征分析,還需要 對(duì)樣本進(jìn)行缺失分析
如果一個(gè)樣本在多個(gè)特征上都缺失,那默認(rèn)該樣本可用價(jià)值比較少,可以直接丟棄
代碼如下:
"""查看樣本的缺失程度"""
missing_series = df_data.isnull().sum(axis=1)
list_missing_num = sorted(list(missing_series.values))
繪圖如下:

1.3 缺失分析-總結(jié)
首先,數(shù)據(jù)呈現(xiàn)階段性缺失,可以初步判定同一維度中的多個(gè)特征缺失實(shí)為同一樣本的缺失。
其次,部分樣本的特征缺失較多,可以考慮刪除此部分樣本
2. 類別分析
常見的數(shù)據(jù)類型一般分為兩種:類別型特征和數(shù)值型特征
像樣本數(shù)據(jù)中的 細(xì)分市場(chǎng) 就屬于類別特征,屬性包括:校園用戶、集團(tuán)用戶等等,對(duì)應(yīng)的 5G流量 就屬于數(shù)值特征,有具體的數(shù)值大小。
pandas 中對(duì)于類別和數(shù)值特征的區(qū)分很簡(jiǎn)單:
# 查看特征的數(shù)值特征有哪些,類別特征有哪些
numerical_fea = list(df_data.select_dtypes(exclude=['object']).columns)
category_fea = list(filter(lambda x: x not in numerical_fea, list(df_data.columns)))
但是,上述代碼存在根本上的問題
pandas 在讀取數(shù)據(jù)的時(shí)候會(huì)自動(dòng)聲明數(shù)據(jù)類別,導(dǎo)致有部分脫敏后的類別數(shù)據(jù)會(huì)被其認(rèn)為是數(shù)值數(shù)據(jù)
例如,終端類型、是否異網(wǎng)寬帶用戶特征,因?yàn)閿?shù)據(jù)需要脫敏處理,所以你看到的數(shù)據(jù)值為:1、2... ,實(shí)質(zhì)上它們都是類別特征,像終端類型的原始數(shù)據(jù)可能是:華為、小米、蘋果這些
這里推薦一種比較取巧的方法:同值過濾法
解釋一下:如果一個(gè)被 pandas 認(rèn)定的數(shù)值特征中出現(xiàn)不同值的個(gè)數(shù)超過 10,那么這個(gè)特征就是數(shù)值特征,否則就是類別特征
上面的 10 你也可以人為調(diào)整
代碼如下:
"""劃分?jǐn)?shù)值型變量中的連續(xù)變量和分類變量"""
def get_numerical_serial_fea(data, feas):
numerical_serial_fea = []
numerical_noserial_fea = []
for fea in feas:
temp = data[fea].nunique()
# 如果同值個(gè)數(shù)小于10,則認(rèn)為是類別型數(shù)據(jù)
if temp <= 10:
numerical_noserial_fea.append(fea)
else:
numerical_serial_fea.append(fea)
return numerical_serial_fea,numerical_noserial_fea
在今天的項(xiàng)目中,這個(gè)方法效果很明顯:

原本認(rèn)定的 4 個(gè)類別特征,增加到 19 個(gè)
3. 同值化分析
同值化就是一個(gè)特征中某個(gè)屬性的占比很高,那么用這個(gè)特征去分類極有可能得不出好效果
同值化在類別特征中比較容易出現(xiàn),代碼如下:
"""查看特征中特征的單方差(同值化)性質(zhì)"""
threshold_const = 0.95
const_list = [x for x in df_data.columns if x!='label']
const_col = []
const_val = []
for col in const_list:
# value_counts 的最多的一個(gè)樣本類別的樣本數(shù)
max_samples_count = df_data[col].value_counts().iloc[0]
# 總體非空樣本數(shù)
sum_samples_count = df_data[df_data[col].notnull()].shape[0]
# 計(jì)算特征中類別最多的樣本占比
const_val.append(max_samples_count/sum_samples_count)
# 過濾同值化特征
if max_samples_count/sum_samples_count >= threshold_const:
const_col.append(col)
print('常變量/同值化比例大于{}的特征個(gè)數(shù)為{}'.format(threshold_const, len(const_col)))
效果如下:

可以發(fā)現(xiàn),同值化比例大于 95% 的有 5 個(gè)特征,甚至有一個(gè)特征全為同一個(gè)值,需要特別注意
單特征深度分析
單特征分析主要是針對(duì)類別型特征和數(shù)值型特征挨個(gè)進(jìn)行分析
但是用戶信息中缺失情況比較一致,處于同一維度的特征也可以同時(shí)做對(duì)比分析
1. 類別特征分析-整體
先來看整體類別特征的分布情況:

1. 類別特征分析-看圖說話
從上圖可以得出很多有用的信息,其中:
性別中,男性5G用戶開通率略微高于女性 市場(chǎng)中,集團(tuán)用戶更傾向于開通5G 星級(jí)中,四星級(jí)用戶更愿意使用5G 本網(wǎng)寬帶用戶比異網(wǎng)寬帶用戶更傾向于使用5G,而且寬帶帶寬為100的用戶占比更高、200次之 寬帶、終端捆綁的用戶更愿意使用5G 家庭用戶比非家庭用戶更愿意使用5G 終端類型為1的用戶最多,為2的5G用戶率最高
另外:
寬帶是否激活特征只有唯一值和缺失值 當(dāng)月是否保號(hào)保號(hào)用戶特征同值化較高
還有:星級(jí)、寬帶帶寬特征個(gè)別特征占比較低,可以考慮分箱處理;上述傾向于使用5G的用戶特征(例如:細(xì)分市場(chǎng))中類別存在空值,缺失的是否重要?同值化特征是否可以刪除?
別急著下結(jié)論,都需要進(jìn)一步分析
1.1 星級(jí)特征-分析
上面說過,星級(jí)特征需要特別考慮缺失值是否重要
小技巧:將缺失值單獨(dú)分為一列
代碼如下:
"""進(jìn)一步對(duì)上述類別特征進(jìn)行分析"""
df_data_2 = df_data.copy()
# 星級(jí)特征
df_data_2.loc[df_data_2['星級(jí)'].isnull(), '星級(jí)'] = '空'
"""星級(jí)特征對(duì)應(yīng)的5G用戶"""
plt.figure(figsize=(13, 5))
# 設(shè)置標(biāo)題
plt.title('不同星級(jí)特征對(duì)應(yīng)的5G用戶')
sns.countplot(x='星級(jí)', hue='label', data=df_data_2)
plt.show()
效果如下:

另外,也可以看看星級(jí)用戶對(duì)應(yīng)的5G用戶具體占比情況
"""星級(jí)對(duì)應(yīng)的5G用戶占比"""
df_bucket = df_data_2.groupby('星級(jí)')
user_5G_trend = pd.DataFrame()
user_5G_trend['total'] = df_bucket['label'].count()
user_5G_trend['5G'] = df_bucket['label'].sum()
user_5G_trend['5G_rate'] = user_5G_trend['5G']/user_5G_trend['total']
user_5G_trend = user_5G_trend.reset_index()
user_5G_trend
繪圖如下:

1.1 星級(jí)特征-結(jié)論
星級(jí) 0、1、2、3、4 對(duì)應(yīng)的5G用戶占比逐漸增高,星級(jí) 5、6、7 用戶數(shù)較少,但是整體5G用戶占比還是高于平均值
操作建議:可以進(jìn)行分箱,空值對(duì)應(yīng)的5G用戶可單獨(dú)分為一類,或者根據(jù)5G用戶占比率進(jìn)行分箱合并
具體的,后期可根據(jù)模型的具體預(yù)測(cè)效果進(jìn)行選擇
1.2 細(xì)分市場(chǎng)特征-分析
和星級(jí)特征一樣,先考慮缺失值,然后在分析
代碼類似上一步,直接看圖


1.2 細(xì)分市場(chǎng)特征-結(jié)論
校園用戶占比最少,5G開通率最低;集團(tuán)用戶5G用戶占比最高
操作建議:空值對(duì)應(yīng)的5G用戶 占比極低,分箱會(huì)影響其他箱的5G用戶占比,所以不建議進(jìn)行箱體合并,可嘗試直接單獨(dú)當(dāng)做一箱
具體的,后期可根據(jù)模型的具體預(yù)測(cè)效果進(jìn)行選擇
1.3 寬帶帶寬&是否激活特征-分析
同樣的思路,先考慮缺失值,然后在分析
不同的是,寬帶帶寬 特征與另一個(gè)特征 寬帶是否激活 需要綜合考慮


1.3 寬帶帶寬&是否激活特征-結(jié)論
寬帶帶寬特征:
帶寬在60以下的特征因?yàn)闃颖緮?shù)據(jù)太少,可以進(jìn)行合箱 帶寬在100以上的因?yàn)榭傮w5G用戶占比較高,可以進(jìn)行合箱
操作建議:最終的寬帶帶寬特征可以分為3箱:<=60、>100、空
寬帶是否激活特征:
因?yàn)閷傩灾挥?,表示寬帶已經(jīng)激活,所以這里大膽預(yù)測(cè)缺失的數(shù)據(jù)就是表示寬帶沒有激活,對(duì)應(yīng)的可以用0表示
1.4 其他類別特征-分析
剩余 6 個(gè)特征中 4 個(gè)為簽約維度特征,2 個(gè)為其他維度特征,可以一并進(jìn)行分析



1.4 其他類別特征-總結(jié)
前 4 個(gè)簽約維度特征中存在缺失數(shù)據(jù),任選兩個(gè)特征分析發(fā)現(xiàn)缺失數(shù)據(jù)的5G用戶占比較低
提供如下操作建議:
合并到概率相近的箱中,例如上述特征中的0屬性 用眾數(shù)填充 用同類別用戶該特征的眾數(shù)填充 直接刪除樣本
后 2 個(gè)特征雖然同值化較嚴(yán)重,但是樣本少的5G用戶占比較高,或許在模型訓(xùn)練中會(huì)拿到一個(gè)不錯(cuò)的貢獻(xiàn)分
暫時(shí)不做處理,后面特征工程中嘗試通過 lgb 進(jìn)行特征篩選后在確定
2. 數(shù)值特征分析-整體
離散特征中有兩個(gè)例外的特征需要單獨(dú)分析:年齡和在網(wǎng)時(shí)長(zhǎng)
年齡字段雖然是數(shù)值型,但是將其進(jìn)行分箱后模型的性能會(huì)大大提升,分析如下:
2.1 年齡特征-分析
計(jì)算每個(gè)年齡5G用戶占比情況,觀察是否可以分箱,以及分箱策略
代碼如下:
"""
年齡特征分析
計(jì)算不同年齡的5G用戶分布情況
"""
df_bucket = df_data_2.groupby('年齡')
user_5G_trend = pd.DataFrame()
user_5G_trend['total'] = df_bucket['label'].count()
user_5G_trend['5G'] = df_bucket['label'].sum()
user_5G_trend['5G_rate'] = user_5G_trend['5G']/user_5G_trend['total']
user_5G_trend = user_5G_trend.reset_index()
繪圖如下:

2.1 年齡特征-總結(jié)
從圖中可以發(fā)現(xiàn):
25-50歲 之間5G用戶整體占比較高,基本在 20% 上方波動(dòng) 13-25歲 的5G用戶占比隨著年齡呈上升趨勢(shì) 50歲 以上的5G用戶占比隨著年齡呈下降趨勢(shì)
基于這個(gè)特性,可以將年齡特征進(jìn)行分箱,大致如下:
13-20、20-25、25-45、45-50、>50
上面分組不絕對(duì),例如對(duì)于第1、2組也可以合為一組,3、4組合為一組
具體的分組效果需要根據(jù)模型的得分去判斷
2.2 在網(wǎng)時(shí)長(zhǎng)特征-分析
思路同年齡特征,直接統(tǒng)計(jì)各自的5G用戶占比情況
繪圖如下:

2.2 在網(wǎng)時(shí)長(zhǎng)特征-總結(jié)
從圖中可以發(fā)現(xiàn):
在網(wǎng)時(shí)長(zhǎng)為 1 的樣本占比最多,但同時(shí)5G用戶占比率也最低
當(dāng)在網(wǎng)時(shí)長(zhǎng)在 2-10 之間時(shí),5G用戶占比在 25%-30% 中間波動(dòng)
當(dāng)在網(wǎng)時(shí)長(zhǎng) >10 時(shí),5G用戶占比率高于 30%,并呈現(xiàn)加速上升趨勢(shì)
其實(shí),分析到這,不難猜出,對(duì)應(yīng)的數(shù)字應(yīng)該代表用戶在網(wǎng)年份
具體的操作建議:還是分箱操作 ① 0-1 ② 2-10 ③ >10
具體的分組效果還是需要根據(jù)模型的得分去判斷,這里不絕對(duì)
2.3 數(shù)值特征-分析
數(shù)值特征的分析比較簡(jiǎn)單,最常見的是對(duì)極大極小值進(jìn)行過濾,或者設(shè)定一個(gè)最大值賦給超過該值的所有值
其次是對(duì)數(shù)據(jù)進(jìn)行無量綱化,使得不同的特征能夠保持在一個(gè)量綱上,模型訓(xùn)練起來也快一些
直接繪圖看特征分布:


操作建議:去極值、標(biāo)準(zhǔn)化,常見的操作手法
總結(jié)一下
以上就是在數(shù)據(jù)探索階段需要做的事情,常見的探索手法還會(huì)對(duì)多個(gè)特征特征進(jìn)行聯(lián)立分析
例如:不同星級(jí)的男性和女性5G用戶占比是什么樣的?不同細(xì)分市場(chǎng)不同年齡段的5G用戶占比又是什么樣的?
很多時(shí)候,特征之間的互相融合就是源自于多維度的探索分析
總結(jié)一下今天的內(nèi)容,方便在特征工程部分進(jìn)行相應(yīng)的處理
首先很明顯能看出:
性別中,男性5G用戶開通率略微高于女性 市場(chǎng)中,集團(tuán)用戶更傾向于開通5G 星級(jí)中,四星級(jí)用戶更愿意使用5G 本網(wǎng)寬帶用戶更傾向于使用5G,而且寬帶帶寬為100的用戶意愿更強(qiáng) 寬帶、終端捆綁的用戶更愿意使用5G 家庭用戶比非家庭用戶更愿意使用5G 終端類型為為2的5G用戶率最高
更細(xì)致一點(diǎn)的:
星級(jí) 0、1、2、3、4 對(duì)應(yīng)的5G用戶占比逐漸增高,星級(jí) 5、6、7 用戶數(shù)最少,但是5G用戶占比率相近
校園用戶占比最少,5G開通率最低;集團(tuán)用戶5G開通率最高
帶寬在 60 以下的樣本數(shù)據(jù)太少,帶寬在100以上的5G用戶占比較高
寬帶是否激活中屬性只有1,表示寬帶已經(jīng)激活
簽約維度特征中簽約信息為空的5G用戶占比較低
是否抵消保號(hào)用戶和當(dāng)月是否換機(jī)這兩個(gè)特征雖然同值化較嚴(yán)重,但是樣本少的屬性5G用戶占比較高

推薦閱讀
歡迎長(zhǎng)按掃碼關(guān)注「數(shù)據(jù)管道」
