CDA LEVEL2 大綱解析案例題Python實現代碼

數據下載:
http://exam.cda.cn/static/exam_attachment/L2jmjxshiti.zip

導入庫

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
pd.options.display.max_columns = None

train_data = pd.read_csv('broadband_TrainingData.csv')
train_data.describe()

Q1:在訓練數據集中,有接受服務(BROADBAND=1)的用戶比例爲何?

#方法一
train_data[train_data['BROADBAND']==1].shape[0] / train_data.shape[0]

#方法二
train_data.groupby('BROADBAND')['CUST_ID'].count() / train_data.shape[0]

在這裏插入圖片描述

Q2:在訓練數據集中,哪兩個申辦通路(CHANNEL)用戶接受服務的比例較高?

channel_pivot = train_data.pivot_table(index='CHANNEL', columns='BROADBAND', values='CUST_ID', aggfunc='count').reset_index()
channel_pivot['acc_per'] = channel_pivot[1] / (channel_pivot[0]+channel_pivot[1])
channel_pivot = channel_pivot.sort_values(by='acc_per', ascending=False)
channel_pivot

在這裏插入圖片描述

Q3:在訓練集中,以下哪些描述是正確的?
A.用戶往來期間(TENURE)越高者,接受服務的比例越高;
B.年齡(AGE)越大者,接受服務的比例越高;
C.最近3個月平均電話費(ARPB_3M)越高者,接受服務的比例越低;
D.有辦自動轉賬扣繳(AUTOPAY)者,接受服務的比例越高。

# A:TENURE
quartiles = pd.cut(np.sort(train_data['TENURE'].unique()), list(range(0, 75, 3))) #這邊按步長3分組
grouped = train_data.groupby('TENURE')['BROADBAND'].agg(['count', 'sum']).reset_index()
new_grouped = grouped.groupby(quartiles)['count', 'sum'].sum()
new_grouped['acc_per'] = new_grouped['sum'] / new_grouped['count']
new_grouped['acc_per'].plot.bar()
# B:AGE
quartiles = pd.cut(np.sort(train_data['AGE'].unique()), list(range(0, 80, 3))) #這邊按步長3分組
grouped = train_data.groupby('AGE')['BROADBAND'].agg(['count', 'sum']).reset_index()
new_grouped = grouped.groupby(quartiles)['count', 'sum'].sum()
new_grouped['acc_per'] = new_grouped['sum'] / new_grouped['count']
new_grouped['acc_per'].plot.bar()
# C:ARPB_3M
quartiles = pd.cut(np.sort(train_data['ARPB_3M'].unique()), list(range(0, 1400, 100))) #這邊按步長3分組
grouped = train_data.groupby('ARPB_3M')['BROADBAND'].agg(['count', 'sum']).reset_index()
new_grouped = grouped.groupby(quartiles)['count', 'sum'].sum()
new_grouped['acc_per'] = new_grouped['sum'] / new_grouped['count']
new_grouped['acc_per'].plot.bar()
# D:AUTOPAY
grouped = train_data.groupby('AUTOPAY')['BROADBAND'].agg(['count', 'sum']).reset_index()
grouped['acc_per'] = grouped['sum'] / grouped['count']
grouped['acc_per'].plot.bar()

Q4:在訓練數據集中,以下哪些字段的分佈是屬於右偏?
A、ARPB_3M
B、TENURE
C、NIGHT_MOU
D、以上皆非

#偏度大於0是右偏
train_data.skew()

在這裏插入圖片描述
Q5:在訓練數據集中,以平均值法來偵測離羣值(Outlier),以下哪些字段會有離羣值的出現?
A、AGE B、TENURE C、AFTERNOON_MOU D、DAY_MOU

def find_outlier(df):
    '''偵測離羣值'''
    if (t_mean - 3*t_std) <= df[col_name] <= (t_mean + 3*t_std):
        return 1
    else:
        return 0

for col_name in ['AGE', 'TENURE', 'AFTERNOON_MOU', 'DAY_MOU']:
    df_temp = train_data.copy()
    t_mean = train_data[col_name].mean()
    t_std = train_data[col_name].std()
    df_temp['answer'] = df_temp.apply(find_outlier, axis=1)
    if df_temp['answer'].sum() == df_temp.shape[0]:
        print('{}無離羣值'.format(col_name))
    else:
        print('{}有離羣值,個數爲{}'.format(col_name, df_temp.shape[0] - df_temp['answer'].sum()))

在這裏插入圖片描述
Q6:在訓練數據集中,最近3個月平均電話費(ARPB_3M)經分析也有嚴重的離羣值出現,利用平均法計算出其值的上線爲625.請將ARPB_3M>625的記錄篩選出來,其有接受服務(BROADBAND=1)的用戶比例爲何?
A、70.23% B、14.29% C、85.71% D、65.71%

train_data[train_data['ARPB_3M']>625]['BROADBAND'].sum()/train_data[train_data['ARPB_3M']>625]['BROADBAND'].count()

Q7:下列的描述何者是正確的?
A、無效的字段包括不相關(Irrelevant)及多餘(Redundant)的字段
B、多餘的字段可通過統計的檢驗來加以排除
C、可用卡方檢驗來檢驗TENUNE與目標字段BROADBAND的相關性
D、可用AVOVA檢驗來檢驗AFTERNOON_MOU與目標字段BROADBAND的相關性
在這裏插入圖片描述
Q8:在訓練數據集中,請根據統計的檢驗的計算結果,分析以下哪個字段是最不重要的字段?
A、TENURE B、AGE C、AVG_CALL_LENGTH D、NIGHT_MOU

import statsmodels.stats.anova as anova
from statsmodels.formula.api import ols

for col in ['TENURE', 'AGE', 'AVG_CALL_LENGTH', 'NIGHT_MOU']:
    print(col + '的ANOVA結果是:')
    print(anova.anova_lm(ols('{}~BROADBAND'.format(col),train_data).fit()))
    print('\n')

在這裏插入圖片描述
紅色部分越大的越不重要

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章