python数据与挖掘实战学习:第三章数据探索 笔记


前言

通过检验数据集的数据质量、绘制图表、计算某些特征量等手段,对样本数据集的的结构和规律进行分析的过程就是数据分析。
本章从数据质量分析和数据特征分析两个角度对数据进行探索。


第三章 数据探索

3.1 数据质量分析

数据质量分析是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础,主要任务是检查原始数据中是否存在脏数据
脏数据一般是指不符合要求,以及不能直接进行相应分析的数据:

  • 缺失值
  • 异常值
  • 不一致的值
  • 重复数据及含有特殊符号(如#、¥、*)的数据

3.1.1 缺失值分析

数据的缺失主要包括记录的缺失记录中某个字段信息的缺失
(1)缺失值产生的原因
1)有些信息暂时无法获取,或者获取信息的代价太大。
2)有些信息是被遗漏的(人为因素和非人为原因)。
3)属性值不存在(例如未婚者的配偶姓名)。
(2)缺失值的影响
1)数据挖掘建模将丢失大量的有用信息。
2)数据挖掘模型所表现出的不确定性更加显著,模型中蕴含的规律更难把握。
3)包含空值的数据会使建模过程陷入混乱,导致不可靠的输出。
(3)缺失值的分析
使用简单的统计分析,可以得到含有缺失值的属性的个数,以及每个属性的未缺失数、缺失数与缺失率等。

缺失值的处理分为删除存在缺失值的记录、对可能值进行插补和不处理三种情况,在4.1.1节会介绍。

3.1.2 异常值分析

异常值分析是检验数据是否录入错误以及含有不合常理的数据。
异常值是指样本中的个别值,其数据明显偏离其余的观测值。异常值也称为离散点,异常值的分析也称为离群点分析
(1)简单统计量分析
对变量做一个描述性统计,进而查看不合理数据。最常用的统计量是最大值和最小值,用来判断这个变量的取值是否超出了合理的范围。
(2)3σ原则
如果数据服从正态分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值。这种值的出现属于小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。
(3)箱型图分析
箱型图定义,异常值为小于QL - 1.5IQR 或大于QU + 1.5IQR 的值。
其中,QL称为下四分位数,表示全部观察值中有四分之一的数据取值比它小;QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它大;IQR称为四分位数间距,是QU与QL之差,其间包含了全部观察值的一半。
箱型图

使用describe()函数查看数据基本情况

import pandas as pd

sale = './data/某服装店各类服装销量.xlsx'  # 服装店数据
data =pd.read_excel(sale, index_col=u'日期')  # 读取数据,指定“日期”列为索引列
print(data.describe())
print(len(data))  # 与count值对比检测是否有缺失值
'''
输出
             销量
count   15.000000
mean   123.666667
std    117.203527
min      5.000000
25%     14.500000
50%    123.000000
75%    197.000000
max    345.000000
15  # 与count值相同,没有缺失值
'''
# 画箱型图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.figure()
p = data.boxplot(return_type='dict')  # 画箱型图,直接使用DataFrame的方法,指定返回对象类型为字典
x = p['fliers'][0].get_xdata()   # 'fliers'即为异常值的标签
y = p['fliers'][0].get_ydata()
y.sort()  # 从小到大排序,会直接改变原对象

# 用annotate添加注释
for i in range(len(x)):
    if i > 0:
        plt.annotate(y[i], xy = (x[i], y[i]), xytext = (x[i]+0.05 - 0.8/(y[i]-y[i-1]), y[i]))
    else:
        plt.annotate(y[i], xy=(x[i], y[i]), xytext=(x[i] + 0.08, y[i]))

plt.show()

3.1.3 一致性分析

数据不一致性是指数据的矛盾性、不相容性。
不一致数据的产生主要发生在数据集成的过程中,可能由于被挖掘数据是来自于从不同的数据源、对于重复存放的数据未能进行一致性更新造成的。

3.2 数据特征分析

3.2.1 分布分析

分布分析能揭示数据的分布特征和分布类型。
1.定量数据的分布分析
对定量变量而言,选择“组数”和“组宽”是做频率分布分析时最主要的问题,按以下步骤进行:
1)求极差
2)决定组距与组数
3)决定分点
4)列出频率分布表
5)绘制频率分布直方图
遵循的主要原则:
1)各组直接必须是相互排斥的
2)各组必须将所有的数据包含在内
3)各组的组宽最好相等

# 示例代码
import pandas as pd
import numpy as np
# 读取数据
data = pd.read_excel('../data/某品牌沐浴露销售数量情况.xlsx', names=['data', 'quantity'])
bins = [0, 170, 340, 510, 680, 850, 1020, 1190, 1360]
labels = ['[0, 170)', '[170, 340)', '[340, 510)',  '[510, 680)', 
          '[680, 850)', '[850, 1020)', '[1020, 1190)', '[1190, 1360)']
# 统计在每个销售数量区间范围的数量
data['quantity分层'] = pd.cut(data.quantity, bins, labels=labels)  # 将数据按bins分段分组
aggResult = data.groupby(by=['quantity分层']).agg({'quantity' : np.size})
print(aggResult)
pAggResult = round(aggResult / aggResult.sum(), 2) * 100  # 归一化
print(pAggResult)

# 绘制销售数量区间频率分布直方图
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))  # 设置图框大小尺寸
pAggResult['quantity'].plot(kind='bar', width=0.8, fontsize=10)  # 绘制频率直方图
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文标签
plt.title('1月份至2月份销售数量区间频率分布', fontsize=20)
plt.xlabel('销售数量区间')
plt.ylabel('销售数量(瓶)')
plt.xticks(rotation=0)  # 这里是调节横坐标的倾斜度,rotation是度数
plt.show()

2.定性数据的分布分析
对于定性变量,常常根据变量的分类类型来分组,采用饼图和条形图来描述定性变量的分布。

# 示例代码
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_excel('../data/不同菜系在某段时间内的销售额.xlsx')  # 读取数据

# 绘制各菜系销售额分布饼图
x = data['销售额']
labels = data['菜系']
plt.figure(figsize=(8, 6))  # 设置画布大小
plt.pie(x, labels=labels, labeldistance=1.2, autopct="%1.2f%%", pctdistance=1.1)  # 绘制饼图
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.title('各菜系销售额分布(饼图)', y=1.1, fontsize=18)  # 设置标题
plt.axis('equal')
plt.show()

# 绘制各菜系销售额分布条形图
x = data['菜系']
y = data['销售额']
plt.figure(figsize=(8, 4))  # 设置画布大小
plt.bar(x, y)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.xlabel('菜系')  # 设置x轴标题
plt.ylabel('销售额(元)')  # 设置y轴标题
plt.title('各菜系销售额分布(条形图)')  # 设置标题
plt.show()  # 展示图片

3.2.2 对比分析

对比分析是指把两个相互联系的指标进行比较,从数量上展示和说明研究对象规模的大小,水平的高低,速度的快慢,以及各种关系是否协调。
(1)绝对数比较
绝对数比较是利用绝对数进行对比,从而寻找差异的一种方法。
(2)相对数比较
相对数比较是由两个有联系的指标对比计算的,用以反映客观现象之间数量联系程度的综合指标,其数值表现为相对数。
分类:结构相对数、比例相对数、比较相对数、强度相对数、计划完成程度相对数、动态相对数。

# 示例代码
# 绘制不同部门的各月份销售额折线图
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_excel('../data/各月份各部门销售额.xlsx')
plt.figure(figsize=(6, 4))
plt.plot(data['月份'], data['销售部'], color='green', label='销售部', marker='o')
plt.plot(data['月份'], data['事业部'], color='red', label='事业部', marker='s')
plt.plot(data['月份'], data['行政部'], color='skyblue', label='行政部', marker='x')
plt.legend()  # 显示图例
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.title('各部门各月份销售额')
plt.ylabel('销售额(万元)')
plt.xlabel('月份')
plt.show()

# 绘制销售部各年份各月份的销售额折线图
data = pd.read_excel('../data/销售部在各年份各月份中的销售额.xlsx')
plt.figure(figsize=(6, 4))
plt.plot(data['月份'], data['2017年'], color='green', label='2017年', marker='o')
plt.plot(data['月份'], data['2018年'], color='red', label='2018年', marker='s')
plt.plot(data['月份'], data['2019年'], color='skyblue', label='2019年', marker='x')
plt.legend()  # 显示图例
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.title('销售部各年份各月份销售额')
plt.ylabel('销售额(万元)')
plt.xlabel('月份')
plt.show()

3.2.3 统计量分析

用统计指标对定量数据进行统计描述,常从集中趋势和离中趋势两个方面进行分析。
平均水平的指标是个体集中趋势的度量(均值、中位数);反应变异程度的指标是对个体离开平均水平的度量(标准差、方差、四分位间距)
1.集中趋势度量
(1)均值
均值是所有数据的平均值:平均数、加权均值、频率均值。
如果数据中存在极端值或者数据是偏态分布的,均值不能很好度量数据的集中趋势,这种情况可以使用截断均值或者中位数。
(2)中位数
中位数是将一组观察值按从小到大的顺序排列,位于中间的那个数。
(3)众数
众数是指数据集中出现最频繁的值。更适用于定性变量,且一般用于离散型变量而非连续型变量。
2.离中趋势度量
(1)极差
极差=最大值-最小值
(2)标准差
标准差度量数据偏离均值的程度。
(3)变异系数
变异系数度量标准差相对于均值的离中趋势。主要用来比较两个或多个具有不同单位或不同波动幅度的数据集的离中趋势。
(4)四分位数间距
四分位数包括上四分位数和下四分位数。四分位数间距是上四分位数和下四分位数之差,其值越大,说明数据的变异程度越大,反之越小。

# 计算其他的统计量
statistics.loc['range'] = statistics.loc['max'] - statistics.loc['min']  # 极差
statistics.loc['var'] = statistics.loc['std'] / statistics.loc['mean']  # 变异系数
statistics.loc['dis'] = statistics.loc['75%'] - statistics.loc['25%']  # 四分位数间距

3.2.4 周期性分析

周期性分析是探索某个变量是否随着时间变化而呈现出某种周期变化趋势。时间尺度不同对应的周期性趋势不同。

import pandas as pd
import matplotlib.pyplot as plt
# 绘制景区人流量趋势折线图
normal = pd.read_excel('../data/某观光景区3月份人流量.xlsx')
plt.figure(figsize=(8, 4))
plt.plot(normal['日期'], normal['人流量'])
plt.xlabel('日期')
x_major_locator = plt.MultipleLocator(7)  # 设置x轴刻度间隔
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.ylabel('人流量')
plt.title('景区人流量趋势')
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文标签
plt.show()  # 展示图片

3.2.5 贡献度分析

贡献度分析又称帕累托分析,原理是帕累托法则,又称20/80定律,同样的投入在不同的地方会产生不同的效益。例如,对一个公司来讲,80%的利润常常来自于20%最畅销的产品,而其他80%的产品只产生了20%的利润。

import pandas as pd
# 初始化数据参数
data = pd.read_excel('../data/服装企业秋装盈利数据.xlsx', index_col='服装名')
data = data['盈利'].copy()
data.sort_values(ascending=False)  # 排序

# 绘制各服装盈利的帕累托图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用于正常显示负号
plt.figure()
data.plot(kind='bar')
plt.ylabel('盈利(元)')
p = 1.0 * data.cumsum() / data.sum()  # 分别计算总盈利额占该盈利额的值
p.plot(color='r', secondary_y=True, style='-o', linewidth=2)
plt.annotate(format(p[6], '.4%'), xy=(6, p[6]), xytext=(6 * 0.9, p[6] * 0.9), 
             arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=.2'))
plt.ylabel('盈利比例')
plt.title('各服装盈利额')
plt.show()

3.2.6 相关性分析

分析连续变量之间线性相关程度的强弱,并用适当的统计指标表示出来。
1.直接绘制散点图
判断两个变量是否有线性相关关系
2.绘制散点图矩阵
考察多个变量间的相关关系
3.计算相关系数
(1)Pearson相关系数
一般用于分析两个连续性变量之间的关系:
pearson相关系数计算公式

  • 相关系数r的取值范围:-1<=r<=1
    • r>0为正相关,r<0为负相关
    • |r|=0表示不存在线性关系
    • |r|=1表示完全线性关系
  • 0<|r|<1表示存在不同程度线性相关
    • |r|<=0.3 为不存在线性相关
    • 0.3<|r|<=0.5 为低度线性相关
    • 0.5<|r|<=0.8 为显著线性相关
    • |r|>0.8 为高度线性相关

(2)Spearman秩相关系数
Pearson线性相关系数要求连续变量的取值服从正态分布。不服从正态分布的变量、分类或等级变量之间的关联性可采用Spearman秩相关系数(等级相关系数)。
Spearman相关系数公式
对两个变量成对的取值分别按照从小到大(或者从大到小)顺序编秩,
di=Ri-Qi为xi、yi的秩次之差,Ri代表xi的秩次,Qi代表yi的秩次。
只要两个变量具有严格单调的函数关系,那么它们就是完全Spearman相关的。

一个变量的相同取值必须有相同的秩次,所以计算时采用的秩次是排序后所在位置的平均值。
使用t检验方法检验其显著性水平以确定其相关程度

(3)判定系数
判断系数是相关系数的平方,用r2表示,用来衡量回归方程对y的解释程度。判断系数越接近1,x与y之间的相关性越强,越接近0,x与y之间几乎没有直线相关关系。

import pandas as pd
data = pd.read_excel('../data/餐饮菜品.xlsx', index_col='日期')  # 读取数据,指定“日期”列为索引列
print(data.corr())  # 相关系数矩阵,即给出了任意两款菜式之间的相关系数
print(data.corr()['铁板烧豆腐'])  # 只显示“铁板烧豆腐”与其他菜式的相关系数

3.3 Python主要数据探索函数

主要是pandas的对象DataFrame或Series的方法

3.3.1 基本统计特征函数

  • sum() 求和
  • mean() 算术平均数
  • var()方差
  • std()标准差
  • corr(method=’ ')Spearma(Pearson)相关系数矩阵
  • cov()协方差矩阵
  • skew()样本值的偏度(三阶矩)
  • kurt()样本值的峰度(四阶矩)
  • describe()描述性统计

3.3.2 拓展统计特征函数

基础库:pandas
依次计算:cumsum()、cumprod()、cummax()、cummin()
滚动计算:rolling_sum()、rolling_mean()、rolling_var()、rolling_std()…

cum系列函数是作为DataFrame或Series对象的方法出现
rolling_系列是pandas的函数,使用格式pd.rolling_mean(D,k)

3.3.3 统计作图函数

  • plot() 绘制线性二维图,折线图
  • pie() 绘制饼图
  • hist() 绘制二维条形直方图,可显示数据的分配情形
  • boxplot() 绘制样本数据的箱型图
  • plot(logy=True) 绘制y轴的对数图形
  • plot(yerr=error) 绘制误差条形图

3.4 小结

数据质量分析是对数据检测是否存在缺失值和异常值;
数据特征分析是在数据挖掘建模前,通过频率分布分析、对比分析、帕累托分析、周期性分析、相关性分析等方法,对采集的样本数据的特征规律进行分析,以了解数据的规律和趋势,为数据挖掘的后续环节提供支持。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值