一、Python数据分析工具
二、数据探索
一、对数据的质量分析
异常值的分析:
1. 简单的统计量分析:查看最大最小值是否在合理范围
2.3δ原则,在正态分布下异常值被定义为一组定值与平均值的距离超过3倍的标准差。
3.箱形图分析:
异常值被定义为小于QL-1.5IQR 或大于QR+1.5IQR
QL是所有数据的下四分位,QR是所有数据的上四分位。IQR是QR-QL
DataFrame中describe()已经给出了基本的统计
三、数据特征分析
1.可以使用pandas、matplotlib绘制统计图
散点图矩阵可以分析每两个变量的关系。
2.计算相关系数
①Pearson相关系数
②Spearman秩相关系数
③判定系数
使用pandas的corr()计算相关系数
绘制条形图和折线图:
四、数据预处理
缺失:
五、Python数据分析入门
Python入门
基本命令:
# for 循环 s = 0 for k in range(101): #1-100 s = s + k print s # 函数 def add2(x): return x+2 print add2(1) def add2(x=0, y=0): return [x+2, y+2] #返回列表 def add3(x, y): return x+3, y+3 #双重返回 a,b = add3(1, 2) # 匿名函数 f = lambda x : x+2 #定义函数f(x)= x+2 g = lambda x, y : x+y #定义函数g(x,y)= x+y, g(1,2)结果为3 # 数据结构 # a, b是列表 # 列表函数cmp(a, b) len(a) max(a) min(a) sum(a) sorted(a) # 列表对象方法 a.append(1) a.count(1) a.extend([1,2]) a.index(1) a.insert(2,1) a.pop(1) b = a # b是a的别名 b = a[:] #数据复制 # 列表解析 a = [1, 2, 3] b = [] for i in a: b.append(i+2) # 等价于 a =[1, 2, 3] b =[i + 2 for i in a] # 集合 d = {'today' : 20, "tomorrow" : 30} #创建 d['today'] #访问 # 其他创建方法 dict(['today', 20], ['tomorrow', 30]) dict.fromkeys(['today', 'tomorrow'], 20) # 集合 s = {1, 2, 2, 4} s = set([1,2,2,4]) #自动去除多余的值 # 函数式编程 lambda, map, reduce, filter b = map(lambda x :x+2, a) b = list(b); #2.x中不需要,3.x中需要,因为map仅仅创建了一个待运行的命令容器,只有其他函数调用时才返回结果 # map命令将函数逐一运用到map列表的每个元素中,,最后返回一个数组,效率比for循环高一点 # reduce函数用于递归运算 reduce(lambda x, y: x*y, range(1, n+1)) # filter 用于筛选列表中符合条件的元素 b = filter(lambda x :x > 5 and x <8, range(10)) b = list(b) # 同map # 导入库 import math math.sin(1) import math as m m.sin(1) from math import exp as e e(1) sin(1) #出错 from math import * #直接导入,大量导入会引起命名冲突,不建议 exp(1) sin(1) # 导入future特征(2.x) # 将print变为函数形式,即用print(a)格式输出 from __future__ import print_function # 3.x中3/2=1.5, 3//2=1;2.x中3/2=1 from __future__ import division
第三方库
安装
Windows中 pip install numpy 或者下载源代码安装 python setup.py install Pandas默认安装不能读写Excel文件,需要安装xlrd和xlwt库才能支持excel的读写 pip install xlrd pip install xlwt StatModel可pip可exe安装,注意,此库依赖于Pandas和patsy Scikit-Learn是机器学习相关的库,但是不包含人工神经网络 model.fit() #训练模型,监督模型fit(X,y),非监督模型fit(X) # 监督模型接口 model.predict(X_new) #预测新样本 model.predict_proba(X_new) #预测概率 model.score() #得分越高,fit越好 # 非监督模型接口 model.transform() #从数据中学到新的“基空间” model.fit_transform() #从数据中学到新的基,并按照这组基进行转换 Keras是基于Theano的强化的深度学习库,可用于搭建普通神经网络,各种深度学习模型,如自编码器,循环神经网络,递归神经网络,卷积神经网络。Theano也是一个Python库,能高效实现符号分解,速度快,稳定性好,实现了GPU加速,在密集型数据处理上是CPU的10倍,缺点是门槛太高。Keras的速度在Windows会大打折扣。 Windows下:安装MinGWindows--安装Theano---安装Keras--安装配置CUDA Gensim用来处理语言方面的任务,如文本相似度计算、LDA、Word2Vec等,建议在Windows下运行。 Linux中 sudo apt-get install python-numpy sudo apt-get install python-scipy sudo apt-get install python-matplotlib 使用 Matplotlib默认字体是英文,如果要使用中文标签, plt.rcParams['font.sans-serif'] = ['SimHei'] 保存作图图像时,负号显示不正常: plt.rcParams['axes.unicode_minus'] = False
六、数据探索
脏数据:缺失值、异常值、不一致的值、重复数据
异常值分析
简单统计量分析:超出合理范围的值
3sigma原则:若正态分布,异常值定义为偏差超出平均值的三倍标准差;否则,可用远离平均值的多少倍来描述。
箱型图分析:异常值定义为小于Q_L-1.5IQR或者大于Q_U +1.5IQR。Q_L是下四分位数,全部数据有四分之一比他小。Q_U是上四分位数。IQR称为四分位数间距,
IQR=Q_U-Q_L #-*- coding: utf-8 -*- import pandas as pd catering_sale = '../data/catering_sale.xls' #餐饮数据 data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列 import matplotlib.pyplot as plt #导入图像库 plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号 plt.figure() #建立图像 p = data.boxplot() #画箱线图,直接使用DataFrame的方法 x = p['fliers'][0].get_xdata() # 'flies'即为异常值的标签 y = p['fliers'][0].get_ydata() y.sort() #从小到大排序,该方法直接改变原对象 #用annotate添加注释 #其中有些相近的点,注解会出现重叠,难以看清,需要一些技巧来控制。 #以下参数都是经过调试的,需要具体问题具体调试。 #xy表示要标注的位置坐标,xytext表示文本所在位置 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() #展示箱线图
分布分析
定量数据的分布分析:求极差(max-min),决定组距和组数,决定分点,列出频率分布表,绘制频率分布直方图。
定性数据的分布分析:饼图或条形图
对比分析
统计量分析
集中趋势度量:均值、中位数、众数
离中趋势度量:极差、标准差、变异系数、四份位数间距
变异系数为:s表示标准差,x表示均值
#-*- 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 = u'日期') #读取数据,指定“日期”列为索引列 data = data[(data[u'销量'] > 400)&(data[u'销量'] < 5000)] #过滤异常数据 statistics = data.describe() #保存基本统计量 print(statistics) print("--------------") 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) 周期性分析 贡献度分析 又称帕累托分析,原理是帕累托法则,即20/80定律,同样的投入放在不同的地方会产生不同的收益。 #-*- coding: utf-8 -*- #菜品盈利数据 帕累托图 from __future__ import print_function import pandas as pd #初始化参数 dish_profit = '../data/catering_dish_profit.xls' #餐饮菜品盈利数据,菜品ID,菜品名 盈利 data = pd.read_excel(dish_profit, index_col = u'菜品名') data = data[u'盈利'].copy()#保留两列数据 data.sort(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() 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()
相关性分析
途径:绘制散点图、散点图矩阵、计算相关系数
Pearson相关系数:要求连续变量的取值服从正态分布。
相关系数r的取值范围[-1, 1]
Spearman相关系数:不服从正态分布的变量、分类或等级变量之间的关联性可用该系数,也称等级相关系数。
对两个变量分别按照从小到大的顺序排序,得到的顺序就是秩。R_i表示x_i的秩次,Q_i表示y_i的秩次。
判定系数:相关系数的平方,用来解释回归方程对y的解释程度。
#-*- 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 = u'日期') #读取数据,指定“日期”列为索引列 data.corr() #相关系数矩阵,即给出了任意两款菜式之间的相关系数 data.corr()[u'百合酱蒸凤爪'] #只显示“百合酱蒸凤爪”与其他菜式的相关系数 data[u'百合酱蒸凤爪'].corr(data[u'翡翠蒸香茜饺']) #计算“百合酱蒸凤爪”与“翡翠蒸香茜饺”的相关系数 数据探索函数 方法名 函数功能 D.sum() 按列计算总和 D.mean() 计算算数平均 D.var() 方差 D.std() 标准差 D.corr(method = ' pearson') Spearman(Pearson)相关系数矩阵 D.cov() 协方差矩阵 D.skew() 偏度(三阶矩) D.kurt() 峰度(四阶距) D.describe() 给出样本的基础描述 D = pd.DataFrame([range(1,8), range(2, 9)]) D.corr(method = 'spearman') #计算相关系数矩阵 S1 = D.loc[0] #提取第一行 S2 = D.loc[1] #提取第二行 S1.corr(S2, method = 'pearson') #计算S1S2的相关系数 D = pd.DataFrame(np.random.randn(6, 5)) #产生6x5的表格 print D.cov() print D[0].cov(D[1]) #计算第一列和第二列的方差 print D.skew() #D是DataFrame或者Series print D.describe() 方法名 函数功能 cumsum() 依次给出前1-n个数的和 cumprod() 依次给出前1-n个数的积 cummax() 依次给出前1-n个数的最大值 cummin() 依次给出前1-n个数的最小值 方法名 函数功能 rolling_sum() 按列计算数据样本的总和 rolling_mean() 算数平均数 rolling_var() 方差 rolling_std() 标准差 rolling_corr() 相关系数矩阵 rolling_cov() 协方差 rolling_skew() 偏度 rolling_kurt() 峰度 D = pd.Series(range(0,20)) print D.cumsum() print pd.rolling_sum(D, 2) #依次对相邻两项求和 方法名 函数功能 plot() 绘制线性二维图,折线图 pie() 绘制饼形图 hist() 绘制二维条形直方图,可现实数据的分配情形 boxplot() 绘制箱型图 plot(logy = True) 绘制y轴的对数图形 plot(yerr = error) 绘制误差条形图 import matplotlib.pyplot as plt #导入图像库 plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号 plt.figure(figsize = (7, 5)) #创建图像区域,指定比例 plt.show() #显示作图结果 ############################################################################################ x = np.linspace(0, 2*np.pi, 50) y = np.sin(x) plt.plot(x, y, 'bp--') #蓝色带星虚线plt.show() ############################################################################################ 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() ############################################################################################ x = np.random.randn(1000) #1000个服从正态分布的随机数 plt.hist(x, 10) #分成10组 plt.show() ############################################################################################ plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号 x = np.exp(np.arange(20)) #原始数据 plt.subplot(121) plt.plot(range(0,20), x, label = u"原始数据图") plt.legend() plt.subplot(122) plt.semilogy(range(0,20), x, label = u"对数数据图") plt.legend() plt.show() ############################################################################################ plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号 error = np.random.random(10) #定义误差条例 y = pd.Series(np.sin(np.arange(10))) y.plot(yerr = error) plt.show()