通过检验数据集的数据质量, 绘制图表, 计算某些特征量等手段, 对样本的数据集的结构和规律性进行分析的过程就是数据探索。数据探索有助于选择合适的数据预处理和建模方法, 甚至可以解决一些通常由数据挖掘解决的问题。
数据探索是数据挖掘的重要组成,可能需要对具体业务的理解, 提取重要的特征,需要花费大量的时间 。
一、数据质量分析:
数据质量分析的主要任务是:检查原始数据中是否存在脏数据, 脏数据一般是指不符合要求,以及不能直接进行相应分析的数据。
脏数据内容及其处理:
1、缺失值:
处理可分为:删除存在缺失值得记录, 对可能值进行插补, 和不进行处理
2、异常值
也称为离群点分析, 是检验数据是否有录入错误,或者含有不合理的数据。处理方法有
(1)3σ 原则,
(2)箱线图分析
画图时,出现很多问题:
1,
ImportError: No module named 'xlrd'
|
2,
TypeError: 'AxesSubplot' object is not subscriptable的解决办法
将代码:p = data.boxplot()
改为:p = data.boxplot(return_type= 'dict')
#coding=gbk
import pandas as pd
import matplotlib.pyplot as plt
catering_data = 'D:\datasets\catering_sale.xls'
data = pd.read_excel(catering_data, index_col='time') #读取数据,指定日期为索引列
#使用箱线图检查异常值
plt.figure()
p = data.boxplot(return_type= 'dict')
x= p['fliers'][0].get_xdata() #'fliers' 标签为异常值的标签
y = p['fliers'][0].get_ydata()
y.sort() #输出4分位数
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、不一致的值
主要发生在数据的集成过程中, 由于数据集是来自于不同的数据源, 对于重复存放的数据没有进行一致性更新所造成的。
4、重复数据及其含有特殊符号的数据
删除重复数据, 将特殊符号的数据当做缺失值处理。二、数据质量分析:
对数据进行质量分析以后, 接下来, 可以通过绘制图表, 计算某些特征量等手段进行数据的特征分析。
1分布分析:
1.1 定量数据的分布分析
一般按照以下步骤进行:
1,求极差
2,决定组距和组数
3, 决定分点
4,列出频率的分布表
5,绘制频率分布直方图
1.2 定性数据的分布分析
对于定性变量, 常常根据变量的分类类型来分组, 可以采用饼图和 条形图来描述定性变量的分布。
2 统计量分析
2,1 离中趋势度量
有:(1)极差,(2)标注差,(3)变异系数,(4)四分位间距
#coding=gbk
import pandas as pd
import matplotlib.pyplot as plt
catering_data = 'D:\datasets\catering_sale.xls'
data = pd.read_excel(catering_data, index_col = 'time')
data = data[(data['sale'] > 400) & (data['sale'] < 5000)] #过滤异常值
statistics = data.describe()
#在describe()函数上增加极差, 变异系数和 四分位间距
# loc——通过行标签索引行数据
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%']
print(statistics)
输出:
sale
count 195.000000
mean 2744.595385
std 424.739407
min 865.000000
25% 2460.600000
50% 2655.900000
75% 3023.200000
max 4065.200000
range 3200.200000
var 0.154755
dis 562.600000
3,周期性分析
周期性分析是探索某个变量是否随时间变量产生周期性的变化的趋势。
4,贡献度分析
又称帕累托分析,原理是帕累托法则,即20/80定律,同样的投入放在不同的地方会产生不同的收益。
data.sort (ascending = False) 此句出现问题
遇到问题:AttributeError: 'Series' object has no attribute 'sort'
解决方法:
原来是在 pandas 在版本 0.17.0之后进行了更新,不再有sort,而是用 sort_values 替代
修改为: data.sort_values(ascending = False)
菜品盈利帕累托图
#coding= gbk
import pandas as pd
filename = r'D:\datasets\catering_dish_profit.xls'
data = pd.read_excel(filename, index_col = u'菜品名')
data = data[u'盈利'].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(u'盈利(元)')
p = 1.0*data.cumsum()/data.sum() #cunsum是累加量
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(u'盈利(比例)')
plt.show()
5,相关性分析:
相关性分析是: 分析连续变量间的线性相关程度的强弱, 并使用适合的统计指标表达出来的过程
途径:绘制散点图、散点图矩阵、计算相关系数
pearson相关系数:要求连续变量的取值需要服从正态分布。
#coding=gbk
#菜品的相关性分析
import pandas as pd
filename = r'D:\datasets\catering_sale_all.xls'
data = pd.read_excel(filename, index_col = u'日期')
#print(data.corr()) #输出全部菜品的相关性系数
print(data.corr()[u'百合酱蒸凤爪']) #输出与 百合酱蒸凤爪 有关的相关系数
# 百合酱蒸凤爪 1.000000
# 翡翠蒸香茜饺 0.009206
# 金银蒜汁蒸排骨 0.016799
# 乐膳真味鸡 0.455638
# 蜜汁焗餐包 0.098085
# 生炒菜心 0.308496
# 铁板酸菜豆腐 0.204898
# 香煎韭菜饺 0.127448
# 香煎罗卜糕 -0.090276
# 原汁原味菜心 0.428316
# Name: 百合酱蒸凤爪, dtype: float64
三,python中主要的数据探索函数:
pandas主要统计函数
协方差
#coding=gbk
#pandas的主要统计函数
import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(16).reshape(4,4),columns=['a','b','c','d'])
print(data)
# a b c d
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
# 3 12 13 14 15
print(data.var()) #计算方差,均值,平均值,按照列来计算
print(data.corr(method= 'pearson')) #计算全部数据元素的相关系数
d1 = data.loc[0]
d2 = data.loc[2]
print(d1.corr(d2,method = 'spearman')) #1.0
#协方差矩阵
np.random.seed(123) #设立随机种子
indexs = ['a','b','c','d','e','f']
d = pd.DataFrame(np.random.randn(6,5),index = indexs)
print(d)
# 0 1 2 3 4
# a -1.085631 0.997345 0.282978 -1.506295 -0.578600
# b 1.651437 -2.426679 -0.428913 1.265936 -0.866740
# c -0.678886 -0.094709 1.491390 -0.638902 -0.443982
# d -0.434351 2.205930 2.186786 1.004054 0.386186
# e 0.737369 1.490732 -0.935834 1.175829 -1.253881
# f -0.637752 0.907105 -1.428681 -0.140069 -0.861755
print(d.cov()) #计算协方差矩阵
# 0 1 2 3 4
# 0 1.094480 -1.046708 -0.533921 0.953298 -0.262925
# 1 -1.046708 2.644581 0.543058 -0.253769 0.325351
# 2 -0.533921 0.543058 1.991994 -0.170512 0.699854
# 3 0.953298 -0.253769 -0.170512 1.293110 -0.041593
# 4 -0.262925 0.325351 0.699854 -0.041593 0.312906
print(d.loc['a'].cov(d.loc['e'])) #计算a行与e行的协方差 ,为-0.04129577067004089
右偏态为正,表明平均值大于中位数。反之为左偏态,为负。尾巴往右,表明为右偏态。
峰度的计算公式:峰度定义为四阶标准矩
#计算偏度 skew
print(d.skew())
# 0 1.100118
# 1 -1.372689
# 2 0.439955
# 3 -0.573245
# 4 1.133158
# dtype: float64
#计算峰度 kurt
print(d.kurt())
# 0 -0.051994
# 1 2.161967
# 2 -1.432841
# 3 -1.425201
# 4 1.951934
# dtype: float64