python学习笔记-数据挖掘(数据分析)

数据质量分析

与本文有关的代码和数据包在以下百度云网盘中,欢迎大家下载实践。
链接:https://pan.baidu.com/s/1O9DXGSGNlT2fkHX1woBpBA
提取码:m69u

主要任务: 检查脏数据
脏数据包括:

  • 缺失值
  • 异常值
  • 不一致的值
  • 重复数据及含有特殊符号(如#,&,*)的数据。
1)缺失值分析:

在这里插入图片描述

2)异常值分析:

在这里插入图片描述在这里插入图片描述
样例:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib as mpl
import seaborn as sns

mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = 'SimHei'

catering_sale = 'catering_sale.xls'
data = pd.read_excel(catering_sale,index_col = u'日期')
print(data.describe())
print(len(data))

得到结果
在这里插入图片描述
由len(data)知有201条,但count有200条,说明缺失值为1.

  • mean(平均值)
  • std(标准差)
  • min (最小值)
  • max (最大值)
  • 1/4,1/2,3/4分位数

箱线法:

以下代码涉及的知识点
当指定return_type=‘dict’时,其结果值为一个字典,字典索引为固定的’whiskers’、‘caps’、‘boxes’、‘fliers’、‘means’

Axes.annotate(s, xy, *args, **kwargs)
  • s:注释文本的内容
  • xy:被注释的坐标点,二维元组形如(x,y)
  • xytext:注释文本的坐标点,也是二维元组,默认与xy相同
  • xycoords:被注释点的坐标系属性,允许输入的值如下

实例操作:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib as mpl
import seaborn as sns

mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = 'SimHei'

catering_sale = 'catering_sale.xls'
data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列

plt.figure() #建立图像
p = data.boxplot(return_type='dict') #画箱线图,直接使用DataFrame的方法
x = p['fliers'][0].get_xdata() # 'flies'即为异常值的标签
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() #展示箱线图

结果如下图:
在这里插入图片描述
从图中可以看出,箱型图中的超过上下界的8个销售额数据可能为异常值。(22,51,60,865,4060.3,4065.2,6607.4,9106.44),之后在结合业务体系判断。

一致性分析

集成的过程中,由于来自不同的数据源,对于重复存放的数据未能进行一致性更新造成的。如:一个用户填了两张表,但用的是不同的手机号码,则这两张表就有不一致的数据了。

数据特征分析

1)分布分析:
分布分析能揭示数的分布特征和分布类型。
对定量的数据:(欲了解其分布形式是对称的还是非对称的,发现某些特大或者特小的可疑值)
可通过绘制频率分布表,绘制频率分布直方图,绘制茎叶图进行直观的分析
对于定性分类的数据:
可用饼图和条形图直观地显示分布情况。
1.定量数据的分布分析
一般按以下步骤:
1)求极差。
2)决定组距与组数。
3)决定分点。
4)列出频率分布表。
5)绘制频率分布直方图。
遵循的主要原则如下:
1)各组之间必须是相互排斥的。
2)各组必须将所有的数据包含在内。
3)各组的组宽最好相等。

(1)求极差
极差=最大值-最小值
(2)分组
组数=极差/组距
(3)决定分点
找出各点
(4)绘制频率分布表
(5)绘制频率分布直方图

1.定性数据的分布分析
对比分析
1)绝对值数比较
2)相对数比较(结构相对数,比例相对数,比较相对数,强度相对数,计划完成程度相对数,动态相对数)
在这里插入图片描述
2)统计量分析
平均水平指标(多用均值和平均数)
异变程度指标(标准差,四分位间距)

这里介绍以下四分位间距:
四分位数包括上四分位数和下四分位数
前面提到了DataFrame 对象的describe(),我们通过这个统计的数据来衍生出我们所需要的统计量。

# statistics.loc 数据获取函数

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib as mpl
import seaborn as sns

mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = 'SimHei'

catering_sale = 'catering_sale.xls'
data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列
data = data[(data[u'销量']>400)&(data[u'销量']<5000)] #过滤异常数据
statistics = data.describe() #保存基本统计量

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)

结果如下:
在这里插入图片描述
4)周期性分析
周期性分析是探索某个变量是否随着时间变化呈现某种周期变化趋势。
5)贡献度分析(又叫帕累托分析)
原理:帕累托原则。又称20/80定律,同样的投入放在不同的地方会产生不同的效益。
实例:
以下代码用到如下知识点:

  • shallow copy 和 deep copy
    复杂的 object, 如 list 中套着 list 的情况,shallow copy 中的 子list,并未从原 object 真的「独立」出来。也就是说,如果你改变原 object 的子 list 中的一个元素,你的 copy 就会跟着一起变。这跟我们直觉上对「复制」的理解不同。
    两种书写方式:
cop1 = copy.copy(origin)
cop2 = copy.deepcopy(origin)
  • sort_values()函数
## 参数    
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')  
#### 参数说明    
axis:{0 or ‘index’, 1 or ‘columns’}, default 0,默认按照索引排序,即纵向排序,如果为1,则是横向排序    
by:str or list of str;如果axis=0,那么by="列名";如果axis=1,那么by="行名";  
ascending:布尔型,True则升序,可以是[True,False],即第一字段升序,第二个降序  
inplace:布尔型,是否用排序后的数据框替换现有的数据框  
kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。似乎不用太关心  
na_position : {‘first’, ‘last’}, default ‘last’,默认缺失值排在最后面  
  • cumsum() :计算轴向元素累加和,返回由中间结果组成的数组
    重点就是返回值是“由中间结果组成的数组”
    在这里插入图片描述
import matplotlib.pyplot as plt#导入图像库
import numpy as np

import pandas as pd
import matplotlib as mpl
import seaborn as sns

plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号

#初始化参数
dish_profit = 'catering_dish_profit.xls'  #餐饮菜品盈利数据
data = pd.read_excel(dish_profit, index_col = u'菜品名')
data = data[u'盈利'].copy()
data.sort_values(ascending = False)# data.sort(ascending = False)错的

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()

结果如下:
在这里插入图片描述
由上图可知,菜品A1 ~ A7公7个菜品,占菜品种类数的70%,总盈利额占该月盈利额的85.0033%。根据帕累托法则,应增加对菜品A1 ~ A7的成本投入,减少对菜品A8 ~ A10的投入以获得更高的盈利额。
6)相关性分析
分析连续变量之间线性相关程度的强弱,并且适当的统计指标表示出来的过程称为线性分析。
1.直接绘制散点图
在这里插入图片描述
2.绘制散点图矩阵
在这里插入图片描述
3.计算相关系数
在二元变量的相关分析过程中比较常用的有Pearson相关系数,Spearman秩相关系数和判定系数。
1)Pearson相关系数
在这里插入图片描述
2)Spearman秩相关系数
在这里插入图片描述
在这里插入图片描述
3)判定系数
在这里插入图片描述
实例:

  • data.corr()
data.corr() #相关系数矩阵,即给出了任意两个变量之间的相关系数
data.corr()[u'好'] #只显示“好”与其他感情色彩的相关系数
data[u'好'].corr(data[u'哭']) #两个感情色彩的相关系数
import pandas as pd

catering_sale = 'catering_sale_all.xls'
data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列

print(data.corr()) #相关系数矩阵,即给出了任意两款菜式之间的相关系数
print(data.corr()[u'百合酱蒸凤爪']) #只显示“百合酱蒸凤爪”与其他菜式的相关系数
print(data[u'百合酱蒸凤爪'].corr(data[u'翡翠蒸香茜饺'])) #计算“百合酱蒸凤爪”与“翡翠蒸香茜饺”的相关系数

结果:
在这里插入图片描述
从上面的结果可以看到,如果顾客点了“百合酱蒸凤爪”,则和点“翡翠蒸香茜饺”“金银蒜汁蒸排骨”“香煎萝卜糕”“铁板酸菜豆腐”“香煎韭菜饺”等主食相关性比较低,反而点“乐膳真味鸡”“生炒菜心”“原汁原味菜心”的相关性比较高。

Python 主要数据探索函数

主要用于数据探索的库:
Pandas(数据分析)主要可分为统计特征函数与统计作图函数
Matplotlib(数据可视化)主要是作图函数

Pandas主要统计特征函数

在这里插入图片描述

  • corr
    功能: 计算数据样本的Spearman(Pearson)相关系数矩阵
    使用格式:
    D.corr(method=‘pearson’)
    D可以是DataFrame,返回相关系数矩阵,method参数为计算方法,支持pearson(皮尔森 相关系数,默认选项),kendall(肯德尔系数),spearman(斯皮尔曼系数)
    S1.corr(S2,method=‘pearson’) S1,S2均为Series,这种格式指定计算两个Series之间的相关 系数。
  • cov
    功能: 计算数据样本的协方差矩阵。
    使用格式:
    D.cov()
    D可为DataFrame,返回矩阵的协方差矩阵;
    S1.cov(S2) 计算两个Series之间的协方差。
  • skew/kurt
    功能: 计算数据样本的偏度(三阶矩)/峰度(四阶矩)(样本D可为Dataframe和Series)
    使用格式:
    D.skew()/D.kurt()

统计作图函数

在这里插入图片描述
在作图之前,通常要加载以下代码:

import matplotlib.pyplot as plt #导入作图库
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure() #创建图像区域
plt.show()

(1) plot
在这里插入图片描述
实例:在区间(0<=x<=2*pi)绘制一条蓝色的正弦虚线,并在每个坐标点标上五角星。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib as mpl
import seaborn as sns

mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = 'SimHei'

x = np.linspace(0,2*np.pi,50) #坐标输入
y = np.sin(x) #计算对应的x的正弦值
plt.plot(x, y, 'bp--') #控制图形格式为蓝色带星虚线,显示正弦曲线
plt.show()

结果如下:
在这里插入图片描述
(2) pie
在这里插入图片描述
实例:通过向量[15,30,45,10]画饼图,并注上标签,并将第二部分分离出来。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib as mpl
import seaborn as sns

mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = 'SimHei'

# The slices will be ordered and plotted counte-clockwise
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' #定义标签
sizes = [15,30,45,10] #每一块的比例
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral'] #每一块的颜色
explode = (0, 0.1, 0, 0) #突出显示,这里仅仅突出显示第二块(即‘Hogs’)

plt.pie(sizes, explode=explode, labels=labels, colors=colors,autopct='%1.1f%%',shadow=True, startangle=90)
plt.axis('equal') #显示为圆(避免比例压缩为椭圆)
plt.show()

结果:
在这里插入图片描述
(3)hist
功能:绘制二维条形直方图,可显示数据的分布情形
在这里插入图片描述
实例:绘制二维条形直方图,随机生成有1000个元素的服从正态分布的数组,分成10组绘制直方图。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib as mpl
import seaborn as sns

mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = 'SimHei'

x = np.random.randn(1000) #1000个服从正态分布的随机数
plt.hist(x, 10) #分成10组进行绘制直方图
plt.show()

结果:
在这里插入图片描述
(4) boxplot
在这里插入图片描述
实例:绘制样本数据的箱形图,样本由两组正态分布的随机数据组成。其中,一组数据均值为0,标准差为1,另一组数据均为1,标准差为1.

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib as mpl
import seaborn as sns

mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = 'SimHei'

x = np.random.randn(1000) #1000个服从正态分布的随机数
D = pd.DataFrame([x,x+1]).T #构造两列的DataFrame
D.plot(kind = 'box')#调用Series内置的作图方法画图,用kind参数指定箱型图box
plt.show()

结果:
在这里插入图片描述
(5)plot(logx = Ture)/plot(logy = True)
在这里插入图片描述
实例:构造指数函数数据使用plot(logy = True)函数进行绘图

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib as mpl
import seaborn as sns

mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = 'SimHei'

x = pd.Series(np.exp(np.arange(20))) #原始数据
# x.plot(label = u'原始数据图', legend = True)
# plt.show()
x.plot( logy = True, label = u'对数数据图', legend = True)
plt.show()

结果:
在这里插入图片描述在这里插入图片描述
(6)plot(yerr = error)
在这里插入图片描述
实例:绘制误差棒图:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib as mpl
import seaborn as sns

mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = 'SimHei'

error = np.random.randn(10) #定义误差列
y = pd.Series(np.sin(np.arange(10))) #均值数据列
y.plot(yerr = error) #绘制误差图
plt.show()

在这里插入图片描述
小结:我们通常都是用Matplotlib和Pandas结合使用。

猜你喜欢

转载自blog.csdn.net/qq_43333395/article/details/89200133