目录
1、数据挖掘基础
1.1 数据挖掘的基本任务:
数据挖掘的基本任务包括利用分类与预测、聚类分析、关联规则、时序模式、偏差检测、智能推荐等方法,帮助企业提取数据中蕴含的商业价值,提高企业竞争力。
1.2数据挖掘建模过程:
1、目标定义
- 任务理解
- 指标确定
2、数据采集
- 建模抽样
- 质量把控
- 实时采集
3、数据整理
- 数据探索
- 数据清洗
- 数据变换-预处理
4、构建模型
- 模式发现
- 构建模型
- 验证模型
5、模型评价
- 设定模型评价标准
- 多模型对比
- 模型优化
6、模型发布
- 模型部署
- 模型重构
1.3常用的数据挖掘建模工具
- SAS Enterprise Miner
- IBM SPSS Modeler
- SQL Server
- Python
- WEKA
- KNIME
- RapidMiner
- TipDM
2、python数据分析简介
2.1 python环境搭建
略·········
2.2 python数据分析第三方库
库 | 简介 |
Numpy | 提供数组支持,以及相应的高效的处理函数 |
Pandas | 强大,灵活的数据分析和探索工具 |
Matplotlib | 强大的数据可视化工具、作图库 |
Scipy | 提供矩阵支持,以及矩阵相关的数值计算模块 |
StatsModels | 统计建模和计量经济学,包括描述统计、统计建模估计和推断 |
Scikit-Learn | 支持回归、分类、聚类等强大的机器学习库 |
Keras | 深度学习库,用于建立神经网络以及深度学习模型 |
Gensim | 用来做文本主题模型的库,文本挖掘可能用到 |
涉及图片处理可以用Pillow,涉及视频处理可以用OpenCV,设计高精度运算可以用GMPY2等,使用pip install 安装即可
2.2.1 Numpy基本操作
# -*- coding: utf-8 -*-
import numpy as np
# 创建数组
a = np.array([2, 0, 1, 5])
print(a)
print(a[:3]) # 取前三个,切片
print(a.min()) # 最小值
a.sort() # 升序排列
print(a)
b = np.array([[1, 2, 3], [4, 5, 6]]) # 创建二维数组
print(b)
print(b * b) # 输出数组的平方
2.2.2 Pandas简单例子
# -*- coding: utf-8 -*-
import pandas as pd
s = pd.Series([1, 2, 3], index=['a', 'b', 'c']) # 创建一个序列s
d = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c']) # 创建一个表
d2 = pd.DataFrame(s) # 也可以用已有的序列来创建表格
print(d.head()) # 预览前5行数据
print('==' * 10)
print(d.describe()) # 数据基本统计量
# 读取文件,注意文件的存储路径不能带有中文,否则读取可能出错。
pd.read_excel('data.xls') # 读取Excel文件,创建DataFrame。
pd.read_csv('data.csv', encoding='utf-8') # 读取文本格式的数据,一般用encoding指定编码。
另外,pandas 会频繁读取和写入Excel,所以需要安装 xlrd(读取)和 xlwt(写入)库,只需要pip install 安装即可。
如果没有安装读取Excel会报错,安装命令:pip install xlrd 和 pip install xlwt
2.2.3 Matplotlib作图的基本代码
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
def test1():
x = np.linspace(0, 10, 1000) # 作图的变量自变量
y = np.sin(x) + 1 # 因变量y
z = np.cos(x ** 2) + 1 # 因变量z
plt.figure(figsize=(8, 4)) # 设置图像大小
plt.plot(x, y, label='$\sin x+1$', color='red', linewidth=2) # 作图,设置标签、线条颜色、线条大小
plt.plot(x, z, 'b--', label='$\cos x^2+1$') # 作图,设置标签、线条类型
plt.xlabel('Time(s)') # x轴名称
plt.ylabel('Volt') # y轴名称
plt.title('A Simple Example') # 标题
plt.ylim(0, 2.2) # 显示的y轴范围
plt.legend() # 显示图例
plt.show() # 显示作图结果
def test2():
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
x = ['1月', '2月', '3月', '4月', '5月', '6月']
y = [20, 10, 30, 25, 15, 18]
plt.bar(x, y, width=0.5, fc='r', tick_label=x)
plt.title('某公司前半年销售额(百万)')
plt.show()
if __name__ == '__main__':
test1()
test2()
test1:
test2:
3、数据探索
3.1 数据质量分析
数据质量分析时数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础。
脏数据指不符合要求、以及不能直接进行相应分析的数据,包括如下内容:缺失值、异常值、不一致的值、重复数据及含有特殊符号(如#、¥、*)的数据。
3.1.1 缺失值分析
数据的缺失主要包括记录的缺失和某个字段信息的缺失。
1、缺失值产生的原因
- 信息无法获取
- 有些信息被遗漏
- 属性值不存在
2、缺失值的影响
- 数据挖掘建模将丢失大量有用信息
- 模型不确定性更显著
- 导致不可靠的输出
3、缺失值的分析
使用统计分析,得到含有缺失值的属性的个数,以及每个属性的未缺失值数、缺失数与缺失率。
3.1.2 异常值分析
异常值值样本中的个别值,其数值明显偏离其余的观测值。异常值也称为离群点,异常值的分析也称为离群点分析。
- 简单统计量分析
- 3σ原则
- 箱型图分析
pandas 库使用describe()查看数据基本情况
# -*- coding: utf-8 -*-
import pandas as pd
file_path = r'data/catering_sale.xls'
data = pd.read_excel(file_path, index_col=u'日期') # 读取数据,指定日期为索引列
print(len(data)) # 数据总数
print('=' * 20)
print(data.describe())
运行结果如下:
201
====================
销量
count 200.000000
mean 2755.214700
std 751.029772
min 22.000000
25% 2451.975000
50% 2655.850000
75% 3026.125000
max 9106.440000
其中,count为非空值总数,因此缺失值记录为1条,mean平均值,std标准差,min最小值,max最大值,25%、50%、75%分别为1/4、1/2、3/4分位数
数据异常值检测代码:
# -*- coding: utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
file_path = r'data/catering_sale.xls'
data = pd.read_excel(file_path, index_col=u'日期') # 读取数据,指定日期为索引列
# print(len(data))
# print('=' * 20)
# print(data.describe())
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()
其中,p = data.boxplot(return_type='dict')须指定return_type,否则报如下错误:TypeError: 'AxesSubplot' object is not subscriptable
效果如下(异常值检测箱型图):
3.1.3 一致性分析
数据的不一致性是指数据的矛盾性、不相容性。不一致数据的产生主要发生在数据集成过程中。
3.2 数据特征分析
对数据进行质量分析以后,接下来可绘制图表、计算某些特征量等手段对数据进行特征分析。
3.2.1 分布分析
分布分析能揭示数据的分布特征和分布类型。
1.定量数据的分布分析
步骤:
- 求极差
- 决定组距与组数
- 决定分点
- 列出频率分布表
- 绘制频率分布直方图
遵循的原则:
- 各组之间必须相互排斥
- 各组必须将所有的数据包含在内
- 各组的组宽最好相等
2.定型数据的分布分析
对于定性变量,常常根据变量的分类类型来分组,可以采用饼图和条形图来描述定性变量的分布。
3.2.2 对比分析
对比分析是指把两个相互联系的指标进行比较
主要有以下两种形式:
1.绝对数比较
绝对数比较是利用绝对数进行对比,从而寻找差异的一种方法。
2.相对数比较
相对数比较是由两个有联系的指标对比计算的,用以反映客观现象之间数量联系程度的综合指标,其数值表现为相对数。
分为以下几种:结构相对数、比例相对数、比较相对数、强度相对数、计划完成程度相对数、动态相对数
3.2.3 统计量分析
餐饮销量数据统计量分析代码:
# -*- coding: utf-8 -*-
"""餐饮销量数据统计量分析"""
from __future__ import print_function
import pandas as pd
catering_sale = 'data/catering_sale.xls'
data = pd.read_excel(catering_sale, index_col='日期') # 读取数据,指定日期为索引列
data = data[(data['销量'] > 400) & (data['销量'] < 5000)] # 过滤异常数据
sta = data.describe() # 保存基本统计量
sta.loc['range'] = sta.loc['max'] - sta.loc['min'] # 极差
sta.loc['var'] = sta.loc['std'] / sta.loc['mean'] # 变异系数
sta.loc['dis'] = sta.loc['75%'] - sta.loc['25%'] # 四分位数间距
print(sta)
运行结果如下:
3.2.4 周期性分析
周期性分析是探索某个变量是否随着时间变化而呈现出某种周期变化趋势。
3.2.5 贡献度分析
贡献度分析又称帕累托分析,原理是帕累托法则,又称2/8定律。
菜品盈利帕累托图代码:
# -*- coding: utf-8 -*-
"""菜品盈利数据 帕累托图"""
from __future__ import print_function
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号'-'
dish_profit = 'data/catering_dish_profit.xls'
data = pd.read_excel(dish_profit, index_col='菜品名')
data = data['盈利'].copy()
# data.sort(ascending=False)
# data.sort_values(ascending=False)
data.sort_index(ascending=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')
) # 添加注释,即85%处的标记,这里包括了指定箭头样式
plt.ylabel('盈利(比例)')
plt.show()
注意第14行代码,书中代码data.sort(ascending=False)会报错:AttributeError: 'Series' object has no attribute 'sort'
写成第15行data.sort_values(ascending=False)或第16行data.sort_index(ascending=False)均可正常显示,效果如下:
3.2.6 相关性分析
分析连续变量之间线性相关程度的强弱,并用适当的统计指标表示出来的过程称为相关分析。
1. 绘制散点图
2.绘制散点图矩阵
3.计算相关系数
- Pearson相关系数
- Spearman秩相关系数
- 判定系数
餐饮销量数据相关性分析代码:
# -*- coding: utf-8 -*-
"""餐饮销量数据相关性分析"""
from __future__ import print_function
import pandas as pd
catering_sale = 'data/catering_sale_all.xls'
data = pd.read_excel(catering_sale, index_col='日期')
print(data.corr()) # 相关系数矩阵,即给出了任意两款菜式之间的相关系数
"""
百合酱蒸凤爪 翡翠蒸香茜饺 金银蒜汁蒸排骨 ... 香煎韭菜饺 香煎罗卜糕 原汁原味菜心
百合酱蒸凤爪 1.000000 0.009206 0.016799 ... 0.127448 -0.090276 0.428316
翡翠蒸香茜饺 0.009206 1.000000 0.304434 ... 0.062344 0.270276 0.020462
金银蒜汁蒸排骨 0.016799 0.304434 1.000000 ... 0.121543 0.077808 0.029074
乐膳真味鸡 0.455638 -0.012279 0.035135 ... -0.068866 -0.030222 0.421878
蜜汁焗餐包 0.098085 0.058745 0.096218 ... 0.155428 0.171005 0.527844
生炒菜心 0.308496 -0.180446 -0.184290 ... 0.038233 0.049898 0.122988
铁板酸菜豆腐 0.204898 -0.026908 0.187272 ... 0.095543 0.157958 0.567332
香煎韭菜饺 0.127448 0.062344 0.121543 ... 1.000000 0.178336 0.049689
香煎罗卜糕 -0.090276 0.270276 0.077808 ... 0.178336 1.000000 0.088980
原汁原味菜心 0.428316 0.020462 0.029074 ... 0.049689 0.088980 1.000000
"""
print(data.corr()['百合酱蒸凤爪']) # 只显示 百合酱蒸凤爪 与其他菜式的相关系数
"""
百合酱蒸凤爪 1.000000
翡翠蒸香茜饺 0.009206
金银蒜汁蒸排骨 0.016799
乐膳真味鸡 0.455638
蜜汁焗餐包 0.098085
生炒菜心 0.308496
铁板酸菜豆腐 0.204898
香煎韭菜饺 0.127448
香煎罗卜糕 -0.090276
原汁原味菜心 0.428316
"""
print(data['百合酱蒸凤爪'].corr(data['翡翠蒸香茜饺'])) # 计算 百合酱蒸凤爪 与 翡翠蒸香茜饺 的相关系数
"""0.009205803051836475"""
3.3 Python主要数据探索函数
3.3.1 基本统计特征函数
主要作为Pandas的对象DataFrame或Series的方法:
sum()求和、mean()平均数、var()方差、std()标准差、corr()计算相关系数矩阵、cov()协方差矩阵、skew()/kurt()偏度(三阶矩)/峰度(四阶矩)、describe()直接给出数据的基本统计量,包括均值、标准差、最大值、最小值等
3.3.2 拓展统计特征函数
主要有累积计算(cum)和滚动计算(pd.rolling_)
3.3.3 统计作图函数
统计作图函数示例代码:
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号'-'
plt.figure(figsize=(7, 5)) # 建立图像, figsize指定比例
def plot_func():
"""正弦曲线图"""
x = np.linspace(0, 2 * np.pi, 50) # x坐标输入
y = np.sin(x) # 计算对应x的正弦值
plt.plot(x, y, 'bp--')
plt.show()
def pie_func():
"""饼形图"""
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' # 定义标签
sizes = [15, 30, 45, 10] # 比例
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral'] # 颜色
explode = (0, 0.1, 0, 0) # 突出显示,这里仅仅突出显示第二块
plt.pie(
sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90
)
plt.axis('equal')
plt.show()
def hist_func():
"""二维条形直方图"""
x = np.random.randn(1000) # 1000个服从正态分布的随机数
plt.hist(x, 10) # 分成10组绘制直方图
plt.show()
def box_plot_func():
"""箱型图"""
x = np.random.randn(1000)
D = pd.DataFrame([x, x+1]).T # 构造两列的DataFrame
D.plot(kind='box') # 调用Series内置的作图方法画图, 用kind参数指定箱型图box
plt.show()
def plot_log_func():
"""x或y轴的对数图形"""
x = pd.Series(np.exp(np.arange(20))) # 原始数据
x.plot(label='原始数据图', legend=True)
plt.show()
x.plot(logy=True, label='对数数据图', legend=True)
plt.show()
def plot_yerr_func():
"""误差条形图"""
error = np.random.randn(10) # 定义误差列
y = pd.Series(np.sin(np.arange(10))) # 均值数据列
y.plot(yerr=error) # 绘制误差图
plt.show()
if __name__ == '__main__':
plot_func()
pie_func()
hist_func()
box_plot_func()
plot_log_func()
plot_yerr_func()