第3章 数据探索
3.1 数据质量分析
数据质量分析是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础。其主要任务是检查原始数据中是否存在脏数据:
(1)缺失值
(2)异常值(outliers)
(3)不一致的值
(4)重复数据及含有特殊符号的数据
3.1.1 缺失值分析
3.1.2 异常值分析
异常值是指样本中数值明显偏离其余观测值的个别值,也称为离群点。
(1)简单统计量分析
先对变量做描述性统计,检查数据是否合理。常用的统计量是最大、最小值。
(2)
3
σ
3\sigma
3σ原则
若数据服从正态分布,根据
3
σ
3\sigma
3σ原则,异常值定义为一组测量值中与均值偏差超过3倍标准差的值。由正态分布假设可知,与均值距离大于
3
σ
3\sigma
3σ的值出现概率为
P
(
∣
x
−
μ
∣
>
3
σ
)
≤
0.003
P(|x – \mu| > 3 \sigma) \leq 0.003
P(∣x−μ∣>3σ)≤0.003,属于极小概率事件。
若数据不服从正态分布,可用远离均值的
n
n
n倍标准差描述。
(3)箱型图分析
异常值通常定义为小于
Q
L
−
1.5
I
Q
R
Q_L – 1.5 IQR
QL−1.5IQR或大于
Q
U
+
1.5
I
Q
R
Q_U + 1.5 IQR
QU+1.5IQR。
Q
L
Q_L
QL:下四分位数,全部观察值中有四分之一的数据取值比它小;
Q
U
Q_U
QU:上四分位数,全部观察值中有四分之一的数据取值比它大;
I
Q
R
IQR
IQR:四分位数间距,上四分位数
Q
U
Q_U
QU与下四分位数
Q
L
Q_L
QL之差,包含全部观察值的一半
%matplotlib inline
- 1
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
- 1
- 2
- 3
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
- 1
- 2
data = pd.read_excel("../data/catering_sale.xls", index_col=u"日期", header=0)
print(data.describe())
print(data.head())
print("data size: {}".format(data.shape))
fig = plt.figure()
ax = fig.add_subplot(111)
p = data.plot(ax=ax, kind="box", return_type="dict")
plt.show()
x = p["fliers"][0].get_xdata()
y = p["fliers"][0].get_ydata()
y.sort()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
销量
count 200.000000
mean 2755.214700
std 751.029772
min 22.000000
25% 2451.975000
50% 2655.850000
75% 3026.125000
max 9106.440000
销量
日期
2015-03-01 51.0
2015-02-28 2618.2
2015-02-27 2608.4
2015-02-26 2651.9
2015-02-25 3442.1
data size: (201, 1)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
# Listing 3-1 餐饮销售额数据异常值检测
# -*- coding: utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 显示中文字体
plt.rcParams["axes.unicode_minus"] = False # 显示负号
catering_sale = r"../data/catering_sale.xls" # 餐饮数据
data = pd.read_excel(catering_sale, index_col="日期", header=0) # 读取数据,指定“日期”为索引
plt.figure()
p = data.plot.box(return_type='dict')
x = p["fliers"][0].get_xdata() # flier:异常值标签
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()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
<Figure size 432x288 with 0 Axes>
- 1
该例中,865、4060.3、4065.2可归为正常值;22、51、60、6607.4、9106.44归为异常值。
3.1.3 一致性分析
数据不一致是指数据中存在矛盾、不相容。
3.2 数据特征分析
3.2.1 分布分析
定量数据:频率分布表、频路分布直方图、茎叶图
定性分类数据:饼图、条形图
1. 定量数据的分布分析
选择“组数”和“组宽”
(1)求极差
(2)确定组距与组数
(3)确定分点
(4)列出频率分布表
(5)绘制频率分布直方图
主要原则:
(1)各组间互斥
(2)各组必须包含所有数据
(3)各组组宽相等
例:菜品“捞起生鱼片”销售数据
df_data = pd.read_excel("../data/catering_fish_congee.xls",
header=None,
index_col=0)
print(df_data.describe())
print("data size: {}".format(df_data.shape))
- 1
- 2
- 3
- 4
- 5
1
count 91.000000
mean 1232.307692
std 940.025008
min 45.000000
25% 420.000000
50% 900.000000
75% 1785.000000
max 3960.000000
data size: (91, 1)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
# (1)求极差
# 极差 = 最大值 - 最小值
data_range = (df_data.max() - df_data.min())[1]
print("极差:{}".format(data_range))
# (2)分组
# 组数 = 极差 / 组距
class_interval = 500
class_num = data_range / class_interval
print("组数:{},组距:{}".format(class_num, class_interval))
# (3)确定分点
splits = np.arange(start=0, stop=4500, step=500)
print("分点:{}".format(splits))
# (4)列出频率分布表
dict_bars = {}
for idx in range(len(splits) - 1):
# dict_bars["{}-{}".format(splits[idx], splits[idx + 1])] = \
# len(df_data[df_data >= splits[idx]].dropna()
# [df_data < splits[idx + 1]].dropna())
dict_bars["{}-{}".format(splits[idx], splits[idx + 1])] = \
len(df_data[(df_data[1] >= splits[idx]) & (df_data[1] < splits[idx + 1])])
df_bars = pd.Series(data=dict_bars) / len(df_data)
print("*" * 10)
print(df_bars.describe())
print("*" * 10)
print("频率分布表:\n{}".format(df_bars))
# (4)绘制频率分布直方图
fig = plt.figure()
ax = fig.add_subplot(111)
df_bars.plot.bar(ax=ax)
plt.xticks(rotation=45)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
极差:3915
组数:7.83,组距:500
分点:[ 0 500 1000 1500 2000 2500 3000 3500 4000]
**********
count 8.000000
mean 0.125000
std 0.101047
min 0.032967
25% 0.041209
50% 0.109890
75% 0.153846
max 0.318681
dtype: float64
**********
频率分布表:
0-500 0.318681
500-1000 0.219780
1000-1500 0.131868
1500-2000 0.131868
2000-2500 0.087912
2500-3000 0.032967
3000-3500 0.043956
3500-4000 0.032967
dtype: float64
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
2. 定性数据分布分析
对于定性变量,常根据变量的分类类型进行分组,可以采用饼图和条形图描述定性变量的分布。
fig = plt.figure(figsize=(10, 4))
ax = fig.add_subplot(121)
df_bars.plot.pie(ax=ax)
ax.set_title("pie chart")
ax = fig.add_subplot(122)
df_bars.plot.bar(ax=ax)
ax.set_title("bar chart")
plt.xticks(rotation=45)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
3.2.2 对比分析
对比分析是指比较两个相互联系的指标,从数量上展示、说明研究对象规模、水平、速度,以及各种关系是否协调,适用于指标间的横纵向比较、时间序列比较分析。对比分析主要形式有:
(1)绝对数值比较:通过绝对数对比,寻找差异;
(2)相对数值比较:两个相关指标对比计算,以反映客观现象间数量联系程度的综合指标,其数值表现为相对数值。
相对数值分为:
-
结构相对数:计算同一总体内部分数值与全部数值间的比值,以说明事物的性质、结构或质量。
-
比例相对数:计算同一总体内不同部分间数值比值,表明总体内各部分的比例关系。
-
比较相对数:计算同一时期两个性质相同指标间的数值比值,说明同类现象在不同空间条件下数量对比关系。
-
强度相对数:计算两个性质不同但有相关性的总量指标间的比值,以说明现象的强度、密度和普遍程度。
-
计划完成程度相对数:某时期内实际完成数与计划完成数的比值,以说明计划完成程度
-
动态相对数:同一现象在不同时期的指标间的数值比值,以说明发展方向和变化速度。
3.2.3 统计量分析
用统计指标对定量数据进行统计描述,常从集中趋势和离中趋势两个方面进行分析。
平均水平指标是对个体集中趋势的度量,主要有均值和中位数
反映变异程度的指标是对个体离开平均水平的度量,主要有标准差(方差)、四分位间距。
1. 集中趋势度量
(1)均值
均值:
m
e
a
n
(
x
)
=
x
ˉ
=
∑
x
i
n
\mathrm{mean}(x) = \bar{x} = \frac{\sum x_i}{n}
mean(x)=xˉ=n∑xi
加权均值:
m
e
a
n
(
x
)
=
x
ˉ
=
∑
w
i
x
i
∑
w
i
\mathrm{mean}(x) = \bar{x} = \frac{\sum w_i x_i}{\sum w_i}
mean(x)=xˉ=∑wi∑wixi
频率分布均值:
m
e
a
n
(
x
)
=
x
ˉ
=
∑
f
i
x
i
\mathrm{mean}(x) = \bar{x} = \sum f_i x_i
mean(x)=xˉ=∑fixi,式中
x
1
,
x
2
,
…
,
x
k
x_1, x_2, \dots, x_k
x1,x2,…,xk为
k
k
k个组段各组的中值;
f
1
,
f
2
,
…
,
f
k
f_1, f_2, \dots, f_k
f1,f2,…,fk为
k
k
k个组段各组的频率。
均值对极端值敏感,如果数据中存在极端值或者数据呈偏态分布,则均值不能很好地度量数据的集中趋势。可用截断均值或者中位数代替均值度量数据的集中趋势,以消除少数极端值的影响。截断均值是指去掉高、低极端值后的均值。
(2)中位数
中位数:对观察值排列,取中间位置的数值,即在全部数据中,小于和大于中位数的数据个数相等。
对数据集
{
x
1
,
x
2
,
…
,
x
n
}
\{ x_1, x_2, \dots, x_n \}
{x1,x2,…,xn}排序:
{
x
(
1
)
,
x
2
,
…
,
x
n
}
\{ x_{(1)}, x_2, \dots, x_n \}
{x(1),x2,…,xn}
M
=
{
x
(
n
+
1
2
)
,
n
is odd
1
2
(
x
(
n
2
)
+
x
(
n
+
1
2
)
)
,
n
is even
M =
M={x(2n+1),21(x(2n)+x(2n+1)),n is oddn is even
(3)众数
众数:数据集中出现最频繁的值,众数通常用来度量定性变量的中心位置而非定量变量;众数通常不唯一;众数一般用于离散型变量而非连续型变量。
2. 离中趋势度量
(1)极差
极差 = 最大值 – 最小值
极差对数据集的极端值非常敏感,且忽略了最大值与最小值之间的数据分布。
(2)标准差
标准差度量数据偏离均值的程度:
s
=
∑
(
x
i
−
x
ˉ
)
2
n
s = \sqrt{\frac{\sum (x_i – \bar{x})^2}{n}}
s=n∑(xi−xˉ)2
(3)变异系数
变异系数度量标准差相对于均值的离中趋势:
c
v
=
s
x
ˉ
×
100
%
cv = \frac{s}{\bar{x}} \times 100 \%
cv=xˉs×100%
变异系数用来比较两个或多个单位或波动幅度不同的数据集的离中趋势。
(4)四分位数间距
四分位数包括上四分位数和下四分位数。将所有数据排序并按数量分成四等份,位于第一分割点的数值为下四分位数,第二个分割点(中间位置)的数值为中位数,第三个分割点的数值为上四分位数。
四分位数间距为上四分位数
Q
U
Q_U
QU与下四分位数
Q
L
Q_L
QL之差,包含全部观察值的一半;其值越大,说明数据的变异程度越大;反之,变异程度越小。
# List 3-2 餐饮销量数据统计量分析代码
# -*- coding: utf-8 -*-
import pandas as pd
catering_sale = r"../data/catering_sale.xls" # 餐饮数据
data = pd.read_excel(catering_sale, index_col="日期", header=0) # 读取数据,指定“日期”为索引
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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
销量
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
3.2.4 周期性分析
周期性分析是探索某个变量是否随着时间变化而呈现周期性变化趋势。
时间尺度相对较长的周期性趋势有年度周期性趋势、季节性周期趋势;相对较短的有月度周期性趋势、周度周期性趋势;甚至更短的天、小时周期性趋势
3.2.5 贡献度分析
贡献度分折又称帕累托分析,其原理为帕累托法则,又称20/80定律。同样的投入放在不同地方会产生不同的效益。
# List 3-3 菜品盈利帕累托图
# -*- coding: utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 显示中文字体
plt.rcParams["axes.unicode_minus"] = False # 显示负号
dish_profile = "../data/catering_dish_profit.xls"
data = pd.read_excel(dish_profile, index_col=u"菜品名")
print(data.head())
data = data[u"盈利"].copy()
data.sort_values(ascending=False)
p = data.cumsum() / data.sum()
plt.figure()
data.plot(kind="bar")
p.plot(secondary_y=True, color="r", style="-o", linewidth=2)
plt.annotate("{:.4f}".format(p[6]),
xy=(6, p[6]),
xytext=(6 * 0.9, p[6] * 0.9),
arrowprops={"arrowstyle": "->", "connectionstyle": "arc3, rad=.2"})
plt.ylabel(u"盈利(元)")
plt.title(u"Pareto Chart")
plt.show()
# print(help(data))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
菜品ID 盈利
菜品名
A1 17148 9173
A2 17154 5729
A3 109 4811
A4 117 3594
A5 17151 3195
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.2.6 相关性分析
相关分析:分析连续变量间线性相关程度,并用适当的统计指标表示的的过程
1. 绘制散点图
判断两个变量是否相关最直观的方法是绘制散点图。
2. 绘制散点图矩阵
需要同时考察多个变量间的相关性时,可采用散点图矩阵同时绘制各变量间的散点图,其在多元线性回归问题中尤为重要。
3. 计算相关系数
通过计算相关系数,能够准确描述变量间的线性相关程度。二元变量相关性分析中常用Pearson相关系数、Spearman秩相关系数和判定系数。
(1)Pearson相关系数
用于分析两个连续性变量之间的相关性:
r
=
∑
i
=
1
n
(
x
i
−
x
ˉ
)
(
y
i
−
y
ˉ
)
∑
i
=
1
n
(
x
i
−
x
ˉ
)
2
∑
i
=
1
n
(
y
i
−
y
ˉ
)
2
r = \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}}
r=∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
相关系数
r
r
r的取值范围:
−
1
≤
r
≤
1
-1 \leq r \leq 1
−1≤r≤1
{
r
>
0
,
正相关
r
<
0
,
负相关
∣
r
∣
=
0
,
线性不相关
∣
r
∣
=
1
,
完全线性相关
⎩⎪⎪⎪⎨⎪⎪⎪⎧r>0,r<0,∣r∣=0,∣r∣=1,正相关负相关线性不相关完全线性相关
0
<
∣
r
∣
<
1
0 \lt |r| \lt 1
0<∣r∣<1表示线性相关程度:
{
∣
r
∣
≤
0.3
,
几乎线性不相关
0.3
<
∣
r
∣
≤
0.5
,
低度线性相关
0.5
<
∣
r
∣
≤
0.8
,
显著线性相关
∣
r
∣
>
0.8
,
高度线性相关
⎩⎪⎪⎪⎨⎪⎪⎪⎧∣r∣≤0.3,0.3<∣r∣≤0.5,0.5<∣r∣≤0.8,∣r∣>0.8,几乎线性不相关低度线性相关显著线性相关高度线性相关
(2)Spearman秩相关系数
Pearson线性相关系数要求连续变量服从正态分布。不服从正态分布的变量、分类或等级变量间的相关性可用Spearrnan秩相关系数(等级相关系数)描述:
r
s
=
1
−
6
∑
i
=
1
n
(
R
i
−
Q
i
)
2
n
(
n
2
−
1
)
r_s = 1 – \frac{6 \sum_{i=1}^{n} (R_i – Q_i)^2}{n(n^2 – 1)}
rs=1−n(n2−1)6∑i=1n(Ri−Qi)2
对两个变量分别排序编秩,
R
i
R_i
Ri表示
x
i
x_i
xi的秩次,
Q
i
Q_i
Qi表示
y
i
y_i
yi的秩次,
R
i
−
Q
i
R_i – Q_i
Ri−Qi表示
x
i
x_i
xi、
y
i
y_i
yi的秩次之差。
秩次计算:
由于一个变量中同一取值其秩次也应相同,因此该值的秩次为排序后所有位置的均值。
只要两个变量严格单调,则它们是完全Spearman相关的;而Pearsan相关只有当变量间具有线性关系时,才是完全相关的。
实际应用中,需要对两种相关系数进行假设检验,使用
t
t
t检验方法检验其显著性水平以确定其相关程度。在正态分布假设定下,Spearnan秩相关系数与Pearson相关系数在效率上等价;对于连续测量数据,用Pearson相关系数来进行分析更为适合。
(3)判定系数
判定系数是相关系数
r
r
r的平方,
r
2
r^2
r2,用于衡量回归方程对
y
y
y的解释程度,其取值范围为
0
≤
r
2
≥
1
0 \leq r^2 \geq 1
0≤r2≥1。
r
2
r^2
r2越接近1,表明
x
x
x与
y
y
y之间相关性越强;
r
2
r^2
r2越接近0,表明两个变量之间几乎没有线性相关性。
catering_sale_all = "../data/catering_sale_all.xls"
data = pd.read_excel(catering_sale_all, index_col=u"日期", header=0)
print(data.head())
- 1
- 2
- 3
百合酱蒸凤爪 翡翠蒸香茜饺 金银蒜汁蒸排骨 乐膳真味鸡 蜜汁焗餐包 生炒菜心 铁板酸菜豆腐 香煎韭菜饺 香煎罗卜糕 \
日期
2015-01-01 17 6 8 24 13.0 13 18 10 10
2015-01-02 11 15 14 13 9.0 10 19 13 14
2015-01-03 10 8 12 13 8.0 3 7 11 10
2015-01-04 9 6 6 3 10.0 9 9 13 14
2015-01-05 4 10 13 8 12.0 10 17 11 13
原汁原味菜心
日期
2015-01-01 27
2015-01-02 13
2015-01-03 9
2015-01-04 13
2015-01-05 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
# List 3-4 餐饮销量数据相关性分析
# -*- coding: utf-8 -*-
import pandas as pd
catering_sale = "../data/catering_sale_all.xls"
data = pd.read_excel(catering_sale, index_col=u"日期", header=0)
print("correlation matrix:\n{}".format(data.corr())) # 相关系数矩阵,给出任意两款菜品间的相关系数
print("*" * 10)
print("correlation matrix:\n{}".format(data.corr()[u"百合酱蒸凤爪"]))
print("*" * 10)
print("correlation matrix:\n{}".format(data[u"百合酱蒸凤爪"].corr(data[u"翡翠蒸香茜饺"])))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
correlation matrix:
百合酱蒸凤爪 翡翠蒸香茜饺 金银蒜汁蒸排骨 乐膳真味鸡 蜜汁焗餐包 生炒菜心 铁板酸菜豆腐 \
百合酱蒸凤爪 1.000000 0.009206 0.016799 0.455638 0.098085 0.308496 0.204898
翡翠蒸香茜饺 0.009206 1.000000 0.304434 -0.012279 0.058745 -0.180446 -0.026908
金银蒜汁蒸排骨 0.016799 0.304434 1.000000 0.035135 0.096218 -0.184290 0.187272
乐膳真味鸡 0.455638 -0.012279 0.035135 1.000000 0.016006 0.325462 0.297692
蜜汁焗餐包 0.098085 0.058745 0.096218 0.016006 1.000000 0.308454 0.502025
生炒菜心 0.308496 -0.180446 -0.184290 0.325462 0.308454 1.000000 0.369787
铁板酸菜豆腐 0.204898 -0.026908 0.187272 0.297692 0.502025 0.369787 1.000000
香煎韭菜饺 0.127448 0.062344 0.121543 -0.068866 0.155428 0.038233 0.095543
香煎罗卜糕 -0.090276 0.270276 0.077808 -0.030222 0.171005 0.049898 0.157958
原汁原味菜心 0.428316 0.020462 0.029074 0.421878 0.527844 0.122988 0.567332
香煎韭菜饺 香煎罗卜糕 原汁原味菜心
百合酱蒸凤爪 0.127448 -0.090276 0.428316
翡翠蒸香茜饺 0.062344 0.270276 0.020462
金银蒜汁蒸排骨 0.121543 0.077808 0.029074
乐膳真味鸡 -0.068866 -0.030222 0.421878
蜜汁焗餐包 0.155428 0.171005 0.527844
生炒菜心 0.038233 0.049898 0.122988
铁板酸菜豆腐 0.095543 0.157958 0.567332
香煎韭菜饺 1.000000 0.178336 0.049689
香煎罗卜糕 0.178336 1.000000 0.088980
原汁原味菜心 0.049689 0.088980 1.000000
**********
correlation matrix:
百合酱蒸凤爪 1.000000
翡翠蒸香茜饺 0.009206
金银蒜汁蒸排骨 0.016799
乐膳真味鸡 0.455638
蜜汁焗餐包 0.098085
生炒菜心 0.308496
铁板酸菜豆腐 0.204898
香煎韭菜饺 0.127448
香煎罗卜糕 -0.090276
原汁原味菜心 0.428316
Name: 百合酱蒸凤爪, dtype: float64
**********
correlation matrix:
0.009205803051836475
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
3.3 Python数据探索数数
3.3.1 基本统计特征函数
统计量函数用于计算数据的均值、方差、标准差、分位数、相关系数、协方差……等,这些统计量能反映出数据的整体分布。
# 相关系数矩阵
D = pd.DataFrame([range(1, 8), range(2, 9)])
print("D:\n{}".format(D))
print("spearman: {}".format(D.corr(method="spearman")))
S1 = D.loc[0]
S2 = D.loc[1]
print("S1:\n{}\nS2:\n{}".format(S1, S2))
print(S1.corr(S2, method="pearson"))
print("*" * 10)
# 协方差矩阵
D = np.random.randn(6, 5)
D = pd.DataFrame(D)
print("D:\n{}".format(D))
print("covariance:\n{}".format(D.cov()))
# print("covariance:\n{}".format(np.dot((D - D.mean()).T, D - D.mean()) / 5))
print("*" * 10)
# 偏度(三阶矩)
print("skew:\n{}".format(D.skew()))
print("*" * 10)
# 峰度(四阶矩)
print("kurt:\n{}".format(D.kurt()))
print("*" * 10)
# 统计量
print("describe:\n{}".format(D.describe()))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
D:
0 1 2 3 4 5 6
0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
spearman: 0 1 2 3 4 5 6
0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0 1.0 1.0 1.0
5 1.0 1.0 1.0 1.0 1.0 1.0 1.0
6 1.0 1.0 1.0 1.0 1.0 1.0 1.0
S1:
0 1
1 2
2 3
3 4
4 5
5 6
6 7
Name: 0, dtype: int64
S2:
0 2
1 3
2 4
3 5
4 6
5 7
6 8
Name: 1, dtype: int64
1.0
**********
D:
0 1 2 3 4
0 0.700189 1.682666 -0.424465 1.286456 0.842151
1 0.381888 1.212358 1.784826 -0.018628 -1.107436
2 0.179708 0.766350 -0.102609 -0.419223 -0.093757
3 -0.508831 0.149807 -0.097038 0.059809 0.260661
4 -0.743518 0.640148 -0.493826 -1.260529 0.298683
5 -0.209494 -0.631345 0.524312 0.408741 0.160667
covariance:
0 1 2 3 4
0 0.303469 0.297267 0.142476 0.328273 -0.045286
1 0.297267 0.657450 -0.009818 0.145750 -0.019681
2 0.142476 -0.009818 0.733599 0.056691 -0.496928
3 0.328273 0.145750 0.056691 0.718022 0.168936
4 -0.045286 -0.019681 -0.496928 0.168936 0.421135
**********
skew:
0 0.008633
1 -0.459628
2 1.623054
3 0.009524
4 -1.201530
dtype: float64
**********
kurt:
0 -1.478457
1 0.144594
2 2.516066
3 0.973004
4 2.583137
dtype: float64
**********
describe:
0 1 2 3 4
count 6.000000 6.000000 6.000000 6.000000 6.000000
mean -0.033343 0.636664 0.198533 0.009438 0.060162
std 0.550880 0.810833 0.856504 0.847362 0.648949
min -0.743518 -0.631345 -0.493826 -1.260529 -1.107436
25% -0.433997 0.272392 -0.344001 -0.319074 -0.030151
50% -0.014893 0.703249 -0.099824 0.020590 0.210664
75% 0.331343 1.100856 0.368974 0.321508 0.289178
max 0.700189 1.682666 1.784826 1.286456 0.842151
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
3.3.2 拓展统计特征函数
累积计算(cum)
滚动计算(rolling)
D = pd.Series(range(0, 20))
print("cumulative sum:\n{}".format(D.cumsum()))
print("*" * 10)
print("rolling sum:\n{}".format(D.rolling(2).sum()))
- 1
- 2
- 3
- 4
cumulative sum:
0 0
1 1
2 3
3 6
4 10
5 15
6 21
7 28
8 36
9 45
10 55
11 66
12 78
13 91
14 105
15 120
16 136
17 153
18 171
19 190
dtype: int64
**********
rolling sum:
0 NaN
1 1.0
2 3.0
3 5.0
4 7.0
5 9.0
6 11.0
7 13.0
8 15.0
9 17.0
10 19.0
11 21.0
12 23.0
13 25.0
14 27.0
15 29.0
16 31.0
17 33.0
18 35.0
19 37.0
dtype: float64
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
3.3.3 统计作图函数
箱形图可以表示多个样本的均值;误差条形图能同时显示下限误差和上限误差:最小二乘拟合曲线图能分析两变量间的关系。
# plot
x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
plt.plot(x, y, "bp--")
plt.show()
- 1
- 2
- 3
- 4
- 5
# pie
# the slices will be ordered and plotted counter-clockwise
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=45)
plt.axis("equal")
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
# hist
x = np.random.randn(1000)
plt.hist(x, 10) # 分成10组绘制直方困
plt.show()
- 1
- 2
- 3
- 4
# boxplot
x = np.random.randn(1000)
D = pd.DataFrame([x, x + 1]).T
D.plot(kind="box")
plt.show()
- 1
- 2
- 3
- 4
- 5
# plot logx, logy
x = pd.Series(np.exp(np.arange(20)))
fig = plt.figure(figsize=(8, 4))
axs = fig.subplots(1, 2)
x.plot(ax=axs[0], label=u"原始数据图", legend=True)
x.plot(ax=axs[1], logy=True, label=u"对数数据图", legend=True)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
# plot xerr, yerr
# 绘制误差条形图
error = np.random.randn(10)
y = pd.Series(np.sin(np.arange(10)))
y.plot(yerr=error)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6