Python数据分析:统计学知识补充

一、总体和样本:

1、什么是总体(population)?什么是样本(sample)?

1)总体:是你研究对象的整个群体;

2)样本:是从总体中选取的一部分,用于代表总体;

3)样本数量:是你有多少个样本。

样本大小(样本容量):是每个样本里面有多少个数据。

4)抽样分布:是指将样本平均值的分布可视化。

2、什么是中心极限定理(central limit theorem)?

1)样本平均值等于总体平均值;

2)不管总体是什么分布,任意一个总体的样本平均值都会围绕在总体的平均值周围,并且呈正态分布。

3、如何用样本估计总体?

1)样本平均值约等于总体平均值;

2)总体标准差估计=




python 相同项数据合计汇总_python 相同项数据合计汇总


4、如何在工作、生活、投资中避免偏见?

1)样本偏差;

2)幸存者偏差;

3)概率偏见;

4)信息茧房。

5、Python实现案例:抽奖 - random模块 + Pandas数据框抽样

随机数random模块

随机数random模块使用教程:http://www.runoob.com/python3/python3-random-number.html


# 导入 random(随机数) 模块
import random
'''
使用random 模块的 randint() 函数来生成随机数
语法是:random.randint(a,b)
函数返回数字 N ,
N 为a到b之间的数字(a <= N <= b),包含 a 和 b
下面案例是生成0 ~ 9 之间的随机数,
你每次执行后都返回不同的数字(0 到 9)
'''
a = random.randint(0,9)
print(a)
2


案例:抽奖

range() 函数可创建一个整数列表,一般用在 for 循环中。

使用语法:

range(start, stop[, step])

参数说明:

start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5)

start: 计数从 start 开始,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5

step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)


'''
抽奖:生成多个随机数
应用案例:从395个用户中随机抽取10个人作为中奖者
'''
for i in range(10):
    userId = random.randint(0, 395)
    #用%s格式化字符串
    print('第 %s 位获奖用户id是 %s' % (i,userId) )
第 0 位获奖用户id是 13
第 1 位获奖用户id是 132
第 2 位获奖用户id是 278
第 3 位获奖用户id是 123
第 4 位获奖用户id是 279
第 5 位获奖用户id是 364
第 6 位获奖用户id是 319
第 7 位获奖用户id是 128
第 8 位获奖用户id是 330
第 9 位获奖用户id是 234


pandas数据框(DataFrame)的抽样方法


#导入包
import numpy as np #数组包
import pandas as pd #数据分析包
'''
arange产生一个含有5*4个元素的一维数组
reshape:将数组转换成5行4列的二维数组
'''
df = pd.DataFrame(np.arange(5 * 4).reshape((5, 4)))
df


0 1 2 3 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 3 12 13 14 15 4 16 17 18 19


#随机选择一个n行的子集
sample1 = df.sample(n=3)
sample1


0 1 2 3 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11

二、概率分布

1、随机变量(Random Variable):

一个量化随机事件的函数,它将随机事件每一个可能出现的实验结果赋予一个数字。

2、概率分布:

1)概率分布 = 随机变量 + 概率 + 分布(在统计图中的形状)

2)Python实现:科学计算包Scipy的stats模块

3、离散(Discrete)概率分布:

1)伯努利分布(Bernoulli distribution):也叫做“零一分布”,“两点分布”;

2)二项分布(Binomial Distribution):就是重复n次独立的伯努利分布:

如何检验是二项分布?满足以下四点条件即可:

a)做某件事的次数是固定的,次数用n表示,n次某件事是相互独立的;

b)每一次事件都有两个可能的结果(成功,或者失败);

c)每一次成功的概率都相等,成功的概率用p表示;

d)想知道成功k次的概率是多少;

3)几何分布(Geometric Distribution):

如何检验是几何分布?满足以下四点条件即可,前三点和二项分布相似:

a)做某件事的次数是固定的,次数用n表示,n次某件事是相互独立的;

b)每一次事件都有两个可能的结果(成功,或者失败);

c)每一次成功的概率都相等,成功的概率用p表示;

d)想知道第k次做某件事情,才取到第1次成功的概率是多少;

4)泊松分布(Poisson Distribution):描述某段时间内事件具体发生概率:

如何验证是泊松分布?满足以下三点条件即可:

a)时间是独立事件;

b)在任意相同的时间范围内,事件发生的概率是相同的;

c)你想知道某个时间范围内,发生某件事情k次的概率是多大;

4、连续(Continuous)概率分布:

1)正态分布(The Normal Distribution):

好的少,差的也少,呈现一种“倒钟型”的分布;

2)幂律分布(Power-law Dsitribution):

好的越来越好,差的越来越差,呈现“剪刀型”分布;

5、Python实现案例:离散概率分布(伯努利分布+二项分布+几何分布+泊松分布) + 连续概率分布(正态分布)

离散概率分布

伯努利分布(Bernoulli Distribution)

要先在当前notebook所在的环境下安装科学计算包scipy。如果已安装忽略下面安装步骤。

安装步骤:

1)在conda中先进入python环境:activate py3

2)在conda中运行以下命令:conda install scipy

如果还没有安装numpy包和matplotlib包,也按上述命令安装这些包


#导入包
#数组包
import numpy as np
#统计计算包的统计模块
from scipy.stats import bernoulli
#绘图包
import matplotlib.pyplot as plt
%matplotlib inline
'''
arange用于生成一个等差数组,arange([start, ]stop, [step, ]
使用见文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html
'''

'''
第1步,定义随机变量:1次抛硬币
成功指正面朝上记录为1,失败指反面朝上记录为0
'''
X = np.arange(0, 2, 1)
X
array([0, 1])
'''
伯努利分布官方使用文档:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.bernoulli.html#scipy.stats.bernoulli
'''
#第2步,#求对应分布的概率:概率质量函数 (PMF)
#它返回一个列表,列表中每个元素表示随机变量中对应值的概率
p = 0.5 # 硬币朝上的概率
pList = bernoulli.pmf(X, p)
pList
array([0.5, 0.5])
#第3步,绘图
'''
plot默认绘制折线,这里我们只绘制点,所以传入下面的参数:
marker:点的形状,值o表示点为圆圈标记(circle marker)
linestyle:线条的形状,值None表示不显示连接各个点的折线
'''
plt.plot(X, pList, marker='o', linestyle="None")
'''
vlines用于绘制竖直线(vertical lines),
参数说明:vline(x坐标值, y坐标最小值, y坐标值最大值)
我们传入的X是一个数组,是给数组中的每个x坐标值绘制竖直线,
竖直线y坐标最小值是0,y坐标值最大值是对应pList中的值
官网文档:https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.vlines
'''
plt.vlines(X, 0, pList)
#x轴文本
plt.xlabel('random: coin one')
#y轴文本
plt.ylabel('probability')
#标题
plt.title('Bernoulli: p=%.2f' %  p)
Text(0.5, 1.0, 'Bernoulli: p=0.50')


python 相同项数据合计汇总_5位随机数重复的概率 php_02


二项分布(Binomial Distribution)

需要先在当前notebook所在的环境下安装科学计算包scipy。如果已安装忽略下面安装步骤。

安装步骤:

1)在conda中先进入python环境:activate py3

2)在conda中运行以下命令:conda install scipy

如果还没有安装numpy包和matplotlib包,也按上述命令安装这些包


#导入包
#数组包
import numpy as np
#统计计算包的统计模块
from scipy.stats import binom
#绘图包
import matplotlib.pyplot as plt
%matplotlib inline
'''
arange用于生成一个等差数组,arange([start, ]stop, [step, ]
使用见文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html
'''
#第1步,定义随机变量:5次抛硬币,正面朝上的次数
n = 5   # 做某件事情的次数
p = 0.5 # 做某件事情成功的概率
X = np.arange(0, n+1, 1)
X
array([0, 1, 2, 3, 4, 5])
'''
二项分布官方使用文档:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.binom.html#scipy.stats.binom
'''
#第2步,#求对应分布的概率:概率质量函数 (PMF)
#它返回一个列表,列表中每个元素表示随机变量中对应值的概率
pList = binom.pmf(X, n, p)
pList
array([0.03125, 0.15625, 0.3125 , 0.3125 , 0.15625, 0.03125])
#第3步,绘图
'''
plot默认绘制折线,这里我们只绘制点,所以传入下面的参数:
marker:点的形状,值o表示点为圆圈标记(circle marker)
linestyle:线条的形状,值None表示不显示连接各个点的折线
'''
plt.plot(X, pList, marker='o', linestyle='None')
'''
vlines用于绘制竖直线(vertical lines),
参数说明:vline(x坐标值, y坐标最小值, y坐标值最大值)
我们传入的X是一个数组,是给数组中的每个x坐标值绘制竖直线,
竖直线y坐标最小值是0,y坐标值最大值是对应pList中的值
官网文档:https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.vlines
'''
plt.vlines(X, 0, pList)
#x轴文本
plt.xlabel('random: coin up')
#y轴文本
plt.ylabel('probabilty')
#标题
plt.title('binom:n=%i,p=%.2f' % (n,p))
Text(0.5, 1.0, 'binom:n=5,p=0.50')


python 相同项数据合计汇总_html_03


几何分布(Geometric Distribution

需要先在当前notebook所在的环境下安装科学计算包scipy。如果已安装忽略下面安装步骤。

安装步骤:

1)在conda中先进入python环境:activate py3

2)在conda中运行以下命令:conda install scipy

如果还没有安装numpy包和matplotlib包,也按上述命令安装这些包


#导入包
#数组包
import numpy as np
#统计计算包的统计模块
from scipy.stats import geom
#绘图包
import matplotlib.pyplot as plt
%matplotlib inline
'''
arange用于生成一个等差数组,arange([start, ]stop, [step, ]
使用见文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html
'''

'''
第1步,定义随机变量:
首次表白成功的次数,可能是1次,2次,3次等

'''
#第k次做某件事情,才取到第1次成功
#这里我们想知道5次表白成功的概率
k = 5
# 做某件事情成功的概率,这里假设每次表白成功概率都是60%
p = 0.6 
X = np.arange(1, k+1, 1)
X
array([1, 2, 3, 4, 5])
'''
几何分布官方使用文档:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.geom.html#scipy.stats.geom
'''
#第2步,#求对应分布的概率:概率质量函数 (PMF)
#它返回一个列表,列表中每个元素表示随机变量中对应值的概率
#分别表示表白第1次才成功的概率,表白第2次才成功的概率,表白第3次才成功的概率,表白第4次才成功的概率,表白第5次才成功的概率
pList = geom.pmf(X, p)
pList
array([0.6    , 0.24   , 0.096  , 0.0384 , 0.01536])
#第3步,绘图
'''
plot默认绘制折线,这里我们只绘制点,所以传入下面的参数:
marker:点的形状,值o表示点为圆圈标记(circle marker)
linestyle:线条的形状,值None表示不显示连接各个点的折线
'''
plt.plot(X, pList, marker='o', linestyle='None')
'''
vlines用于绘制竖直线(vertical lines),
参数说明:vline(x坐标值, y坐标最小值, y坐标值最大值)
我们传入的X是一个数组,是给数组中的每个x坐标值绘制竖直线,
竖直线y坐标最小值是0,y坐标值最大值是对应pList中的值
官网文档:https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.vlines
'''
plt.vlines(X, 0, pList)
#x轴文本
plt.xlabel('random:show love k times sucess')
#y轴文本
plt.ylabel('probabilty')
#标题
plt.title('geom:p=%.2f' % p)
Text(0.5, 1.0, 'geom:p=0.60')


python 相同项数据合计汇总_ci_04


泊松分布(Poisson Distribution)

需要先在当前notebook所在的环境下安装科学计算包scipy。如果已安装忽略下面安装步骤。

安装步骤:

1)在conda中先进入python环境:activate py3

2)在conda中运行以下命令:conda install scipy

如果还没有安装numpy包和matplotlib包,也按上述命令安装这些包


#导入包
#数组包
import numpy as np
#统计计算包的统计模块
from scipy.stats import poisson
#绘图包
import matplotlib.pyplot as plt
%matplotlib inline
'''
arange用于生成一个等差数组,arange([start, ]stop, [step, ]
使用见文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html
'''

'''
第1步,定义随机变量:
已知某路口发生事故的比率是每天2次,
那么在此处一天内发生k次事故的概率是多少?
'''
mu = 2   # 平均值:每天发生2次事故
k=4 #次数,现在想知道每天发生4次事故的概率
#包含了发生0次、1次、2次,3次,4次事故
X = np.arange(0, k+1, 1)
X
array([0, 1, 2, 3, 4])
'''
泊松分布官方使用文档:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.poisson.html#scipy.stats.poisson
'''
#第2步,#求对应分布的概率:概率质量函数 (PMF)
#它返回一个列表,列表中每个元素表示随机变量中对应值的概率
#分别表示发生1次,2次,3次,4次事故的概率
pList = poisson.pmf(X, mu)
pList
array([0.13533528, 0.27067057, 0.27067057, 0.18044704, 0.09022352])
#第3步,绘图
'''
plot默认绘制折线,这里我们只绘制点,所以传入下面的参数:
marker:点的形状,值o表示点为圆圈标记(circle marker)
linestyle:线条的形状,值None表示不显示连接各个点的折线
'''
plt.plot(X, pList, marker='o', linestyle='None')
'''
vlines用于绘制竖直线(vertical lines),
参数说明:vline(x坐标值, y坐标最小值, y坐标值最大值)
我们传入的X是一个数组,是给数组中的每个x坐标值绘制竖直线,
竖直线y坐标最小值是0,y坐标值最大值是对应pList中的值
官网文档:https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.vlines
'''
plt.vlines(X, 0, pList)
#x轴文本
plt.xlabel('random:road accident k times')
#y轴文本
plt.ylabel('probablity')
#标题
plt.title('Poisson: mean: mu=%i' % mu)
Text(0.5, 1.0, 'Poisson: mean: mu=2')


python 相同项数据合计汇总_5位随机数重复的概率 php_05


连续概率分布

连续概率分布:正态分布(Normal Distribution)

需要先在当前notebook所在的环境下安装科学计算包scipy。如果已安装忽略下面安装步骤。

安装步骤:

1)在conda中先进入python环境:activate py3

2)在conda中运行以下命令:conda install scipy

如果还没有安装numpy包和matplotlib包,也按上述命令安装这些包


#导入包
#数组包
import numpy as np
#统计计算包的统计模块
from scipy.stats import norm
#绘图包
import matplotlib.pyplot as plt
%matplotlib inline
'''
arange用于生成一个等差数组,arange([start, ]stop, [step, ]
使用见文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html
'''

'''
第1步,定义随机变量:

'''
mu=0 #平均值
sigma= 1 #标准差
X = np.arange(-5, 5, 0.1)
X
array([-5.00000000e+00, -4.90000000e+00, -4.80000000e+00, -4.70000000e+00,
       -4.60000000e+00, -4.50000000e+00, -4.40000000e+00, -4.30000000e+00,
       -4.20000000e+00, -4.10000000e+00, -4.00000000e+00, -3.90000000e+00,
       -3.80000000e+00, -3.70000000e+00, -3.60000000e+00, -3.50000000e+00,
       -3.40000000e+00, -3.30000000e+00, -3.20000000e+00, -3.10000000e+00,
       -3.00000000e+00, -2.90000000e+00, -2.80000000e+00, -2.70000000e+00,
       -2.60000000e+00, -2.50000000e+00, -2.40000000e+00, -2.30000000e+00,
       -2.20000000e+00, -2.10000000e+00, -2.00000000e+00, -1.90000000e+00,
       -1.80000000e+00, -1.70000000e+00, -1.60000000e+00, -1.50000000e+00,
       -1.40000000e+00, -1.30000000e+00, -1.20000000e+00, -1.10000000e+00,
       -1.00000000e+00, -9.00000000e-01, -8.00000000e-01, -7.00000000e-01,
       -6.00000000e-01, -5.00000000e-01, -4.00000000e-01, -3.00000000e-01,
       -2.00000000e-01, -1.00000000e-01, -1.77635684e-14,  1.00000000e-01,
        2.00000000e-01,  3.00000000e-01,  4.00000000e-01,  5.00000000e-01,
        6.00000000e-01,  7.00000000e-01,  8.00000000e-01,  9.00000000e-01,
        1.00000000e+00,  1.10000000e+00,  1.20000000e+00,  1.30000000e+00,
        1.40000000e+00,  1.50000000e+00,  1.60000000e+00,  1.70000000e+00,
        1.80000000e+00,  1.90000000e+00,  2.00000000e+00,  2.10000000e+00,
        2.20000000e+00,  2.30000000e+00,  2.40000000e+00,  2.50000000e+00,
        2.60000000e+00,  2.70000000e+00,  2.80000000e+00,  2.90000000e+00,
        3.00000000e+00,  3.10000000e+00,  3.20000000e+00,  3.30000000e+00,
        3.40000000e+00,  3.50000000e+00,  3.60000000e+00,  3.70000000e+00,
        3.80000000e+00,  3.90000000e+00,  4.00000000e+00,  4.10000000e+00,
        4.20000000e+00,  4.30000000e+00,  4.40000000e+00,  4.50000000e+00,
        4.60000000e+00,  4.70000000e+00,  4.80000000e+00,  4.90000000e+00])
#第2步,概率密度函数(PDF)
y = norm.pdf(X, mu, sigma)
#第3步,绘图
'''
plot默认绘制折线
'''
plt.plot(X, y)
#x轴文本
plt.xlabel('random:x')
#y轴文本
plt.ylabel('random:y')
#标题
plt.title('norm:$mu$=%.1f,$sigma^2$=%.1f' % (mu,sigma))
#网格
plt.grid()


python 相同项数据合计汇总_数组_06