數據下載:
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')
紅色部分越大的越不重要