数据分析实战二——清洗数据

今日食餐

  • ployinterp_column-->拉格朗日填充数值
  • programmer_1-->筛选异常数据(包括NaN)进行填充
  • programmer_2-->最小-最大规范化、零-均值规范化、小数定标规范化
  • programmer_3-->利用PCA计算特征向量,用于降维分析
import os 
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import matplotlib.pyplot as plt

import pywt
from scipy.interpolate import lagrange
from scipy.io import loadmat  # mat是MATLAB的专用格式,调用loadmat方法读取
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

1 lagrange填充空值

可视化的理解
公式推导

path = os.getcwd()
inputfile = path + '/chapter4/data/catering_sale.xls'
outputfile = path + '/tmp/tmp4/sales.xls'

data = pd.read_excel(inputfile)
data.head()
360截图18430704113413.png
data[(data['销量'] < 400) | (data['销量'] > 5000)] = None

def ployinterp_column(index, df, k=5):
    y = df[list(range(index - k, index))
            + list(range(index + 1, index + 1 + k))]
    y = y[y.notnull()]
    #取空值数据周围12个非空数据为已知数样本
    
    return lagrange(y.index, list(y))(index)

y.index:已有数据的x。list(y):已有数据的y。 index:要插入的x 的值。

df = data[data['销量'].isnull()] #销量为空值的数据

index_list = df['销量'].index #销量为空值的数据的索引

for index in index_list:
    data.loc[index,'销量']= ployinterp_column(index, data['销量'])

data.to_excel(outputfile)

2规范化处理

(1)不同规范化处理方法的选择

  • 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,StandardScaler表现更好(避免不同量纲对方差、协方差计算的影响);
  • 在不涉及距离度量、协方差、数据不符合正态分布、异常值较少的时候,可使用MinMaxScaler。(eg:图像处理中,将RGB图像转换为灰度图像后将其值限定在 [0, 255] 的范围);
  • 在带有的离群值较多的数据时,推荐使用RobustScaler。

(2)preprocessing.scale 与 preprocessing.StandardScaler

使用sklearn.preprocessing.StandardScaler类,使之fit(X_Train)

datafile = path + '/chapter4/data/normalization_data.xls'
data = pd.read_excel(datafile, header=None)
#指定作为列名的行,默认0,即取第一行,数据为列名行以下的数据;
#若数据不含列名,则设定 header = None;
data.head()
360截图18430702597672.png
print('最大最小规范化')
print((data - data.min()) / (data.max() - data.min()))

print('零均值规范化')
print((data - data.mean()) / data.std()) #按列标准化

print('单列')
print((data.iloc[:,0] - data.iloc[:,0].mean()) / data.iloc[:,0].std())
360截图1624122095136134.png
from  sklearn import preprocessing
print('\n  sklearn-preprocessing.scale')
data_scale=preprocessing.scale(data)
#在SciKit-Learn中的preprocessing.scale()可以直接将给定数据进行Z-Score规范化。按列标注化
print(data_scale,'\n')
print(data_scale.mean(axis=0))
print(data_scale.std(axis=0))#默认按行计算
360截图18500828194268.png
print('\n小数定标规范化')
#np.ceil返回大于等于该值的最小整数,np.log10计算最高位是几位数,log10(100)=2
#通过移动小数点的位置来进行规范化。小数点移动的位数取决于该属性数据取值的最大绝对值。
print(data / 10**np.ceil(np.log10(data.abs().max())))
360截图18430710251424.png

3 聚类

datafile = path + '/chapter4/data/discretization_data.xls'
data = pd.read_excel(datafile)
data.head()
360截图17001019102137115.png
data = data['肝气郁结证型系数'].copy()
k = 4
方法一 直接对数组进行分类--分箱等距
d1 = pd.cut(data, k, labels=range(k))
方法二: 等频率离散化
w = [1.0 * i / k for i in range(k + 1)]
# percentiles表示特定百分位数,同四分位数
w = data.describe(percentiles=w)[4:4 + k + 1]
#取几个分位数的值作为不等长列表,用于cut函数
w[0] = w[0] * (1 - 1e-10)
d2 = pd.cut(data, w, labels=range(k))
方法三: 使用Kmeans
kmodel = KMeans(n_clusters=k, n_jobs=4)
kmodel.fit(data.values.reshape(len(data), 1))

# 输出聚类中心,并且排序
c = DataFrame(kmodel.cluster_centers_).sort_values(0)

# 相邻两项求中点,作为边界点
w = DataFrame.rolling(c, 2).mean().iloc[1:]
# 加上首末边界点
w = [0] + list(w[0]) + [data.max()]
d3 = pd.cut(data, w, labels=range(k))
def cluster_plot(d, k):
    plt.figure(figsize=(8, 3))
    for j in range(0, k):
        plt.plot(data[d == j], [j for i in d[d == j]], 'o')
        plt.ylim(-0.5, k - 0.5)
    return plt

cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()

print('d1等距\n',d1[:5])
print('d2百分位\n',d2[:5])
print('d3聚类\n',d3[:5])
360截图17970217292761.png

4利用PCA计算特征向量,用于降维分析

PCA(Principal Component Analysis,主成分分析)。降维致力于解决三类问题。

  • 降维可以缓解维度灾难问题;
  • 降维可以在压缩数据的同时让信息损失最小化;
  • 理解几百个维度的数据结构很困难,两三个维度的数据通过可视化更容易理解。

当数据集不同维度上的方差分布不均匀的时候,PCA最有用。如果是一个球壳形数据集,PCA不能有效的发挥作用,因为各个方向上的方差都相等;没有丢失大量的信息维度一个都不能忽略。

inputfile = path + "/chapter4/data/principal_component.xls"
outputfile = "tmp/tmp4/dimention_reducted.xls"

data = pd.read_excel(inputfile, header=None)
data.head()
360截图18430702749187.png
pca = PCA()
data_pca=pca.fit(data)

#禁用科学计数法
np.set_printoptions(suppress=True,   precision=10,  threshold=2000,  linewidth=150)  
pd.set_option('display.float_format',lambda x : '%.2f' % x)

# 返回各个模型的特征向量
pca.components_
# 返回各个成分各自的方差百分比
pca.explained_variance_ratio_

data.to_excel(outputfile, index=False)

遗留问题:pca之后是不是就该怎么建模怎么建模了,它只是减少了输入维度?(请路过的高人指教~)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335