参考文献:《Python数据分析与挖掘实战》张良均等
数据挖掘建模过程
- 定义挖掘目标:理解任务,确定指标
- 数据采样:注意数据的完整性和有效性
- 数据探索:异常值分析、缺失值分析、相关性分析、周期性分析
- 数据预处理:数据筛选、数据变量转换、缺失值处理、坏数据处理、数据标准化、主成分分析、属性选择、数据规约
- 挖掘建模:所属问题分析(分类、聚类、关联规则、时序模式、智能推荐),选用算法
- 模型评价:应用模型对应的评价方法,根据业务对模型进行解释和应用
数据挖掘建模工具
- SAS Enterprise Miner
- IBM SPSS Modeler
- SQL Server
- Python
- WEKA
- KNIME
- RapidMiner/YALE
- TipDM
数据探索
一、数据质量分析
数据预处理的前提,检查数据中是否存在脏数据(缺失值、异常值、不一致的值、重复数据、含特殊符号的数据),箱线图可以检测异常值。
file_name = r'../data/catering_sale.xls'
catering_sale = file_name
data = pd.read_excel(catering_sale, index_col=u'日期') #加载数据
plt.figure()
plt.rcParams['font.sans-serif'] = ['SimHei'] #正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #正常显示±号
# 画箱线图
p = data.boxplot(return_type='dict')
x = p['fliers'][0].get_xdata() #fliers为异常值标签
y = p['fliers'][0].get_ydata()
y.sort() #对y从小到大排序
for i in range(len(x)):#处理临界情况, i=0时temp = y[i] - y[i - 1] if i != 0 else -78 / 3#添加注释, xy指定标注数据,xytext指定标注的位置(所以需要特殊处理)plt.annotate(y[i], xy=(x[i], y[i]), xytext=(x[i] + 0.05 - 0.8 / temp, y[i]))plt.show()
二、数据特征分析
- 分布分析:解释数据的分布特征和分布类型:频率分布直方图、茎叶图、饼图、条形图
- 定量数据分布分析:求极差、决定组距和组数(极差/组距)、决定分点(分布区间)、列出频率分布表、绘制频率分布直方图。
- 定性数据分布分析:百分比/频数
- 对比分析:折线图
- 统计量分析:均值、中位数、标准差、四分位间距、变异系数CV=sbxˉ×100CV=\frac{s}{b}\bar{x}×100%CV=bsxˉ×100 Pandas中提供的describe方法可以得到基本统计量
file_name = r'../data/catering_sale.xls'
catering_sale = file_name
data = pd.read_excel(catering_sale, index_col=u'日期')
data = data[(data[u'销量'] > 400) & data[u'销量'] < 5000]
statistics = data.describe()[u'销量']
statistics['range'] = statistics['max'] - statistics['min'] #极差
statistics['var'] = statistics['std'] / statistics['mean'] #方差
statistics['dis'] = statistics['75%'] - statistics['25%'] #四分距
print(statistics)
- 周期性分析:时序折线图
- 贡献度分析:帕累托法则8/2定律,80%的利润来自20%的投入,应该重点关注80%利润的部分,绘制帕累托图
file_name = '../data/catering_dish_profit.xls'
dish_profit = file_name #餐饮菜品盈利数据
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 正常显示±号
data = pd.read_excel(dish_profit, index_col=u'菜品名')
data = data[u'盈利'].copy()
data.sort_values(ascending=False)
plt.figure()
data.plot(kind='bar')
plt.ylabel(u'盈利(元)')
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(u'盈利(比例)')
plt.show()
8. 相关性分析:散点图、散点矩阵图、计算相关系数(Pearson、Spearman)
Pearson线性相关系数要求连续变量的取值服从正态分布
Pearson=∑i=1n(xi−xˉ)(yi−yˉ)∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2Pearson=\frac{\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i-\bar{x})^2\sum_{i=1}^{n}(y_i-\bar{y})^2}}Pearson=∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
不符合正态分布的变量,分类或等级变量之间的关联性采用Spearman秩相关系数,也称为等级相关系数,对两个变量成对的取值按照升序或降序编秩,RiR_iRi表示xix_ixi的秩次,QiQ_iQi表示yiy_iyi的秩次,Ri−QiR_i-Q_iRi−Qi表示秩次之差。(秩次:排序时的位置)
Spearman=1−6∑i=1n(Ri−Qi)2n(n2−1)Spearman=1-\frac{6\sum_{i=1}^{n}(R_i-Q_i)^2}{n(n^2-1)}Spearman=1−n(n2−1)6∑i=1n(Ri−Qi)2
判定系数是相关系数的平方,用r2∈[0,1]r^2∈[0,1]r2∈[0,1]表示,其值越接近于1则相关性越强,越接近于0则几乎无直线相关关系。
file_name = r'../data/catering_sale_all.xls'
catering_sale = file_name
data = pd.read_excel(catering_sale, index_col=u'日期')
print(data.corr())
print(data.corr()[u'百合酱蒸凤爪'])
print(data[u'百合酱蒸凤爪'].corr(data[u'翡翠蒸香茜饺']))
- 主要数据探索函数:
方法 | 函数功能 |
---|---|
sum() | 求和 |
mean() | 求均值 |
var() | 求方差 |
std() | 求均值 |
corr() | 计算相关系数矩阵 |
cov() | 计算协方差矩阵 |
skew() | 计算样本值的偏度(三阶矩) |
kurt() | 计算样本值的峰度(四阶矩) |
describe() | 样本基本描述 |
- 扩展统计函数
方法 | 函数功能 |
---|---|
cumsum() | 依次给出前1,2,…,n个数的和 |
cumprod() | 依次给出前1,2,…,n个数的积 |
cummax() | 依次给出前1,2,…,n个数的最大值 |
cummin() | 依次给出前1,2,…,n个数的最小值 |
rolling_sum() | 按列计算数据样本的总和 |
rolling_mean() | 数据样本的算数平均数 |
rolling_var() | 计算数据样本的方差 |
rolling_std() | 计算数据样本的标准差 |
rolling_corr() | 计算数据样本的相关系数矩阵 |
rolling_cov() | 计算数据样本的协方差矩阵 |
rolling_skew() | 样本值的偏度 |
rolling_kurt() | 样本值的峰度 |
cum系列是DataFrame对象和Series对象的方法
rolling_是pandas的函数,每k列计算一次,滚动计算
- Python统计作图
方法 | 函数功能 |
---|---|
plot() | 折线图 |
pie() | 饼状图 |
hist() | 折线图 |
boxplot() | 箱型图 |
plot(logy=True) | 绘制y轴的对数图形 |
plot(yerr=error) | 绘制误差条形图 |