1 描述性统计是什么?
2 使用NumPy和SciPy进行数值分析
2.1 基本概念
2.2 中心位置(均值、中位数、众数)
2.3 发散程度(极差,方差、标准差、变异系数)
2.4 偏差程度(z-分数)
2.5 相关程度(协方差,相关系数)
2.6 回顾
3 使用Matplotlib进行图分析
3.1 基本概念
3.2 频数分析
3.2.1 定性分析(柱状图、饼形图)
3.2.2 定量分析(直方图、累积曲线)
3.3 关系分析(散点图)
3.4 探索分析(箱形图)
3.5 回顾
4 总结
5 参考资料
In [1]:
import numpy as np
from numpy import array
from numpy.random import normal, randint
#使用List来创造一组数据
data = [1, 2, 3]
print(data)
In [2]:
#使用ndarray来创造一组数据
data = array([1, 2, 3])
print(data)
In [3]:
#创造一组服从正态分布的定量数据
data = normal(0, 10, size=10)
print(data)
In [4]:
#创造一组服从均匀分布的定性数据
data = randint(0, 10, size=10)
print(data)
In [5]:
from numpy import mean, median
#计算均值
mean(data)
Out[5]:
In [6]:
#计算中位数
median(data)
Out[6]:
对于定性数据来说,众数是出现次数最多的值,使用SciPy计算众数:
In [7]:
from scipy.stats import mode
# 计算众数
mode(data)
Out[7]:
In [8]:
# 极差ptp = max(data) - min(data)
np.ptp(data)
Out[8]:
In [9]:
# 方差var = sum((data[i] - mean)^2) / N i=1,2,3...N
np.var(data)
Out[9]:
In [10]:
# 标准差std = var ^ 0.5
np.std(data)
Out[10]:
In [11]:
# 变异系数cv = std / mean
cv = np.std(data) / np.mean(data)
print(cv)
In [12]:
# 计算第一个值的z分数
z_score = (data[1] - np.mean(data)) / np.std(data)
print(z_score)
In [13]:
data1 = [1, 3, 9]
data2 = [2, 5, 8]
data = np.array([data1, data2])
#计算两组数的协方差
#参数bias=1表示结果需要除以N,否则只计算了分子部分
#返回结果为矩阵,第i行第j列的数据表示第i组数与第j组数的协方差。对角线为方差
np.cov(data, bias=1)
Out[13]:
In [14]:
#计算两组数的相关系数
#返回结果为矩阵,第i行第j列的数据表示第i组数与第j组数的相关系数。对角线为1
np.corrcoef(data)
Out[14]:
In [15]:
def gen_data():
heights = []
weights = []
grades = []
N = 10000
for i in range(N):
while True:
# 身高用人均值172,标准差为6的正态分布
height = np.random.normal(172, 6)
if 0 < height:
break
while True:
# 体重由身高作为自变量的线性回归模型产生,误差服从标准正态分布
weight = (height - 80) * 0.7 + np.random.normal(0, 1)
if 0 < weight:
break
while True:
# 分数服从均值为70,标标准差为15的正态分布
score = np.random.normal(70, 15)
if 0 < score and score <= 100:
grade = 'E' if score < 60\
else ('D' if score < 70\
else ('C' if score < 80\
else ('B' if score < 90\
else 'A')))
break
heights.append(height)
weights.append(weight)
grades.append(grade)
return np.array(heights), np.array(weights), np.array(grades)
heights, weights, grades = gen_data()
print(heights)
print(weights)
print(grades)
In [16]:
import matplotlib.pyplot as plt
# 绘制柱状图
def draw_bar(grades):
xticks = ['A', 'B', 'C', 'D', 'E']
grade_group = {}
# 对每一类成绩进行频数统计
for grade in grades:
grade_group[grade] = grade_group.get(grade, 0) + 1
# 创建柱状图
# 第一个参数为柱的横坐标
# 第二个参数为文字说明内容
plt.bar(range(5), [grade_group.get(xtick, 0) for xtick in xticks],\
align='center')
# 设置柱的文字说明
# 第一个参数为文字说明的横坐标
# 第二个参数为文字说明的内容
plt.xticks(range(5), xticks)
# 设置横坐标的文字说明
plt.xlabel('Grade')
# 设置纵坐标的文字说明
plt.ylabel('Frequency')
# 设置标题
plt.title('Grade Of Male Students')
# 绘图
plt.show()
draw_bar(grades)
而饼形图是以扇形的面积来指代某种类型的频率,使用Matplotlib对成绩这一定性变量绘制饼形图的代码如下:
In [17]:
# 绘制饼形图
def draw_pie(grades):
labels = ['A', 'B', 'C', 'D', 'E']
grade_group = {}
for grade in grades:
grade_group[grade] = grade_group.get(grade, 0) + 1
# 创建饼图
# 第一个参数为扇形的面积
# labels参数为扇形的说明文字
# autopct参数为扇形占比的显示格式
plt.pie([grade_group.get(label, 0) for label in labels], \
labels=labels, autopct='%1.1f%%')
plt.title('Grade Of Male Students')
plt.show()
draw_pie(grades)
In [18]:
# 绘制直方图
def draw_hist(heights):
# 第一个参数为待绘制的定量数据,不同于定性数据,这里并没有事先进行频数统计
# 第二个参数为划分的区间个数
plt.hist(heights, 100)
plt.xlabel('Heights')
plt.ylabel('Frequency')
plt.title('Heights Of Male Students')
plt.show()
draw_hist(heights)
直方图对应数据的密度函数,由于身高变量是属于服从正态分布的,从绘制出来的直方图上也可以直观地看出来
使用Matplotlib对身高这一定量变量绘制累积曲线的代码如下:
In [19]:
# 创建累积曲线
def draw_cumulative_hist(heights):
# 创建累积曲线
# 第一个参数为待绘制的定量数据
# 第二个参数为划分的区间个数
# normed参数为是否无量纲划
# histtype参数为'step',绘制阶梯状的曲线
# cumulative参数为是否累积
plt.hist(heights, 20, normed=True, histtype='step', cumulative=True)
plt.xlabel('Heights')
plt.ylabel('Frequency')
plt.title('Heights Of Male Students')
plt.show()
draw_cumulative_hist(heights)
累积曲线对应数据的分布函数,由于身高变量是属于服从正态分布的,从绘制出来的累积曲线图上也可以直观地看出来:
In [20]:
# 绘制散点图
def draw_scatter(heights, weights):
# 第一个参数为点的横坐标
# 第二个参数为点的纵坐标
plt.scatter(heights, weights)
plt.xlabel('Heights')
plt.ylabel('Weights')
plt.title('Heights & Weights Of Male Students')
plt.show()
draw_scatter(heights, weights)
我们在创建数据时,体重这一变量的确是由身高变量通过线性回归产生,绘制出来的散点图
In [22]:
# 绘制箱形图
def draw_box(heights):
# 第一个参数为待绘制的定量数据
# 第二个参数为数据的文字说明
plt.boxplot([heights], labels=['Heights'])
plt.title('Heights Of Male Students')
plt.show()
draw_box(heights)
绘制出来的箱形图中,包含3种信息:
Q2所指的红线为中位数
Q1所指的蓝框下侧为下四分位数,Q3所指的蓝框上侧为上四分位数,Q3-Q1为四分为差。四分位差也是衡量数据的发散程度的指标之一。
上界线和下界线是距离中位数1.5倍四分位差的线,高于上界线或者低于下界线的数据为异常值。