实现对数据进行有效清洗

利用众数、中位数、均值、聚类分析等方法,实现对葡萄牙银行电话营销数据(http://archive.ics.uci.edu/ml/datasets/Bank+Marketing#)进行有效清洗。

数据字段说明:

(1)银行客户信息:

  1. age: 年龄 (数字)
  2. job: 工作类型 。管理员(admin),蓝领(blue-collar),企业家(entrepreneur),家庭主妇(housemaid),管理者('management'),退休('retired'),个体经营('self-employed'),服务业('services'),学生('student'),技术人员('technician'),无业('unemployed'),未知('unknown')
  3. marital : 婚姻状态,离婚('divorced'),结婚('married'),单身('single'),未知('unknown')。说明:离婚也包括寡居
  4. education: 教育情况 : 基本4年('basic.4y'), 基本6年('basic.6y'),基本九年('basic.9y'),高中('high.school'),文盲('illiterate'),专业课程('professional.course'),大学学位('university.degree'),未知('unknown')
  5. default: 是否有信用违约? ('no','yes','unknown')
  6. housing: 是否有房贷 ( 'no','yes','unknown')
  7. loan: 是否有个人贷款 (categorical: 'no','yes','unknown')

(2)与联络相关信息:

  1. contact: 联系类型,手机( 'cellular'),电话:'telephone'
  2. month: 年度最后一次联系的月份 (categorical: 'jan', 'feb', 'mar', ..., 'nov', 'dec')
  3. day_of_week: 最后一次联系的星期 (categorical: 'mon','tue','wed','thu','fri')
  4. duration: 上一次联系的通话时长(秒). 重要提示:此属性高度影响输出目标(例如,如果持续时间=0,则y='no')。然而,在执行呼叫之前,持续时间还不知道。而且,在通话结束后,Y显然是已知的。因此,这个输入应该只包括在基准测试中,如果想要有一个实际的预测模型,就应该丢弃它。(预测时不知道会通话的时长)

(3)其他属性:

  1. campaign: 针对该客户,为了此次营销所发起联系的数量。(数字,包括最后一次联络)
  2. pdays: 上次营销到现在已经过了多少天。(数字,如果是999表示这个客户还没有联系过)
  3. previous: 在本次营销之前和客户联系过几次(数字)
  4. poutcome: 上一次营销活动的结果 ( 'failure','nonexistent','success')

(4)社会和经济相关属性

  1. emp.var.rate: 就业变动率 -系度指标(numeric)
  2. cons.price.idx: 消费物价指数-月度指标 (numeric)
  3. cons.conf.idx: 消费者信心指数--月度指标(numeric)
  4. euribor3m: 欧元同业拆借利率3个月 - 每日指标 (numeric)
  5. nr.employed: 员工数量-季度指标 (numeric)

(5)输出变量(目标):

  1. y -客户存钱了吗(被成功营销了吗)? (binary: 'yes','no')

#导入库

import numpy as np

import pandas as pd

from sklearn.cluster import KMeans

扫描二维码关注公众号,回复: 17350833 查看本文章

#导入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)

  1. 挖掘属性中存在缺失、不一致、异常的数据点;

代码:

## 找到所有含有缺失值的行

# 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)

猜你喜欢

转载自blog.csdn.net/m0_72935705/article/details/135013483