利用众数、中位数、均值、聚类分析等方法,实现对葡萄牙银行电话营销数据(http://archive.ics.uci.edu/ml/datasets/Bank+Marketing#)进行有效清洗。
数据字段说明:
(1)银行客户信息:
- age: 年龄 (数字)
- job: 工作类型 。管理员(admin),蓝领(blue-collar),企业家(entrepreneur),家庭主妇(housemaid),管理者('management'),退休('retired'),个体经营('self-employed'),服务业('services'),学生('student'),技术人员('technician'),无业('unemployed'),未知('unknown')
- marital : 婚姻状态,离婚('divorced'),结婚('married'),单身('single'),未知('unknown')。说明:离婚也包括寡居
- education: 教育情况 : 基本4年('basic.4y'), 基本6年('basic.6y'),基本九年('basic.9y'),高中('high.school'),文盲('illiterate'),专业课程('professional.course'),大学学位('university.degree'),未知('unknown')
- default: 是否有信用违约? ('no','yes','unknown')
- housing: 是否有房贷 ( 'no','yes','unknown')
- loan: 是否有个人贷款 (categorical: 'no','yes','unknown')
(2)与联络相关信息:
- contact: 联系类型,手机( 'cellular'),电话:'telephone'
- month: 年度最后一次联系的月份 (categorical: 'jan', 'feb', 'mar', ..., 'nov', 'dec')
- day_of_week: 最后一次联系的星期 (categorical: 'mon','tue','wed','thu','fri')
- duration: 上一次联系的通话时长(秒). 重要提示:此属性高度影响输出目标(例如,如果持续时间=0,则y='no')。然而,在执行呼叫之前,持续时间还不知道。而且,在通话结束后,Y显然是已知的。因此,这个输入应该只包括在基准测试中,如果想要有一个实际的预测模型,就应该丢弃它。(预测时不知道会通话的时长)
(3)其他属性:
- campaign: 针对该客户,为了此次营销所发起联系的数量。(数字,包括最后一次联络)
- pdays: 上次营销到现在已经过了多少天。(数字,如果是999表示这个客户还没有联系过)
- previous: 在本次营销之前和客户联系过几次(数字)
- poutcome: 上一次营销活动的结果 ( 'failure','nonexistent','success')
(4)社会和经济相关属性
- emp.var.rate: 就业变动率 -系度指标(numeric)
- cons.price.idx: 消费物价指数-月度指标 (numeric)
- cons.conf.idx: 消费者信心指数--月度指标(numeric)
- euribor3m: 欧元同业拆借利率3个月 - 每日指标 (numeric)
- nr.employed: 员工数量-季度指标 (numeric)
(5)输出变量(目标):
- y -客户存钱了吗(被成功营销了吗)? (binary: 'yes','no')
#导入库
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
#导入csv
df = pd.read_csv("C:/Users/ASUS/Desktop/bank-additional-full.csv")
1. 分析各属性的分布情况,并计算其众数、中位数、均值等特征;
代码:
# # 分析各列分布情况
# describe = df.describe()
# print(describe)
# mode = df.mode() # 众数
# print(mode)
代码:
# median = df.median() # 中位数
# print(median)
代码:
# mean = df.mean() # 均值
# print(mean)
- 挖掘属性中存在缺失、不一致、异常的数据点;
代码:
## 找到所有含有缺失值的行
# missing_values = df[df.isnull().any(axis=1)]
# print(missing_values)
代码:
## 找到'age'列中的缺失值
# missing_score = df[df['age'].isnull()]
# print(missing_score)
代码:
# 查看'age'列中的不同取值及其出现次数
# score_counts = df['age'].value_counts()
# # 选择出现次数大于等于2的取值
# consistent_score = score_counts[score_counts >= 30].index.tolist()
# print(consistent_score)
代码:
# # 查看'Score'列的统计信息
# score_stats = df['age'].describe()
# # 计算'Score'列的上下界
# score_upper_bound = score_stats['mean'] + 3 * score_stats['std']
# score_lower_bound = score_stats['mean'] - 3 * score_stats['std']
# # 筛选出'Score'列中超过上下界的数据点
# outliers = df[(df['age'] > score_upper_bound) | (df['age'] < score_lower_bound)]
# print(outliers)
3. 利用众数、中位数、均值、相似性度量等方法,对属性存在问题的数据点进行清洗
。
((请附上详细代码、程序运行截图、运行效果等内容))
代码:
# 计算'Score'列的均值,用于填充缺失值
# score_mean = np.mean(df['Score'])
# # 用均值填充'Score'列中的缺失值
# df['age'].fillna(score_mean, inplace=True)
# print(df)
代码:
# 计算'Score'列的上下界,用于筛选异常值
# score_stats = df['Score'].describe()
# score_upper_bound = score_stats['mean'] + 3 * score_stats['std']
# score_lower_bound = score_stats['mean'] - 3 * score_stats['std']
# # 删除'Score'列中超过上下界的数据点
# df = df[(df['Score'] >= score_lower_bound) & (df['Score'] <= score_upper_bound)]
# print(df)
代码:
# 计算'Score'和'Age'两列的相似性矩阵
X = df[['duration', 'age']]
kmeans = KMeans(n_clusters=3, random_state=0).fit(X)
labels = kmeans.labels_
# 将聚类结果作为新的一列添加到原DataFrame中
df['Cluster'] = labels
print(df)