统计学初步

for循环的赋值用法,极其精妙

  • 一个数组的每一个值增加500赋值给另一个空数组
    new_list = [ f + 500 for f in old_list]
  • 一个数组包含元素的排列顺序1,2,3,4,另一个数组为其内容的离散排列数组,需要得到离散数组中内容在数组1中编号组成的新数组。
survey_scale = ["none","a few","some","a lot"]
survey = ["none","some","a lot","a few","some"]
survey_number = [survey_scale.index(item) for item in survey]

Skew数据倾斜

  • 如果数据直方图集中在图像右侧,被称为消极倾斜


  • 如果数据集中在图像左侧,被称为积极倾斜


    image.png
  • 如果数据集中在直方图中部,被称为无倾斜


    image.png

为倾斜赋值
将数组数据赋值给倾斜对象

from scipy.stats import skew
positive_skew = skew(test_scores_positive)
negative_skew = skew(test_scores_negative)
no_skew = skew(test_scores_normal)
print(negative_skew,positive_skew,no_skew)

output
-0.6093247474592195 0.5376950498203763 0.0223645171350847

kurtosis峰态

  • 直方图分布均匀,被称为平峰态即platykurtic


    platykurtic
  • 直方图分布出现只有高耸点,所有数据几乎相同,被称为尖峰态即leptokurtic


    leptokurtic
  • 直方图所有值不低也不甚高,叫做常峰态即mesokurtic


    mesokurtic

负值分布代表平峰态,正值分布代表尖峰态,0值附近表示常峰态
峰态对象由数组赋值如下

from scipy.stats import kurtosis
kurt_platy = kurtosis(test_scores_platy)
kurt_lepto = kurtosis(test_scores_lepto)
kurt_meso = kurtosis(test_scores_meso)
print(kurt_platy,kurt_lepto,kurt_meso)

output
-0.9283967256161696 0.023335026722224317 -0.042791859857727044

modaility 模态

  • 直方图只有一个模式,称为单峰unimodal


    unimodal
  • 直方图有两个模式,称为双峰bimodal


    bimodal
  • 直方图多个模式,称为多峰multimodal


    multimodal

mean()
平均值是数组所有值求和后除以数组元素数量,求平均值plt展示方法,plt.axvline直接画一条垂直于X轴的线,标注平均值,求数组平均值则采用array.mean()
下面是求平均值并画图

mean_test_score = test_scores_normal.mean()
plt.axvline(mean_test_score)
mean平均数

median 中位数
中位数是数组排序,取中间一个数,或者两个数的mean,中位数对于特大或者特小数不敏感,即我们称之为outliers(异常值)的值。

  • 求中位数的方法需要调用numpy框架
    from numpy import median
    使用函数
    numpy.median(array)
    如下列为求positive数组平均值与中位数的对比
plt.hist(test_scores_positive)
positive_median = numpy.median(test_scores_positive)
positive_mean = test_scores_positive.mean()
plt.axvline(positive_median,color = "green")
plt.axvline(positive_mean,color = "red")
plt.show()
median中位数

方差 variance|标准差 Standard deviation

Variance

Standard deviation

求标准差的函数举例:求nab_stats数据表中mp列和ast列的标准差,求方差方法雷同

import numpy
def standard(column):
    mean = column.mean()
    a = 0
    for num in column:
        a += (num - mean) ** 2 / len(column)
    sigma = a ** (1/2)
    return sigma

mp_dev = standard(nba_stats["mp"])
ast_dev = standard(nba_stats["ast"])
print(mp_dev)
print(ast_dev)

output
896.32565278
130.883290708

正态分布 normal distribution
正态分布绘制需要依赖几率密度函数,需要加载norm模块中的pdf函数来实现,比如绘制从-10到10步进为0.1的图形内,平均值为0方差为2的正态分布图

import numpy as np
import matplotlib.pyplot as plt
# The norm module has a pdf function (pdf stands for probability density function)
from scipy.stats import norm

points2 = np.arange(-10,10,0.1)  
probabilities2 = norm.pdf(points,0,2)
plt.plot(points,probabilities2)
plt.show()
正态分布

求正态分布中距离mean多少个标准差内的比例问题的方法,思路可以转换为算出每一个值与mean的差值除以标准差,就能够得到一个所有值距离mean的标准差数量list,然后直接调用一个函数就能够计算出某个标准差内的数据比例是多少,具体代码如下

import numpy
def standard(column):  #求标准差的函数
    mean = sum(column)/len(column)
    a = 0
    for num in column:
        a += (num - mean) ** 2 / len(column)
    sigma = a ** (1/2)
    return sigma
wing_lengths = [36, 37, 38, 38, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 53, 53, 54, 55]

mean = sum(wing_lengths)/len(wing_lengths)
standard_deviation = standard(wing_lengths)

standard_deviations = [(item - mean)/standard_deviation for item in wing_lengths]  #关键步骤,求出了每个值跟mean差几个标准差的数组

def percentage(column,count):    #标准差数组在某个标准差数量内的比例函数
    num = len([item for item in column if item <= count and item >= -count])/len(wing_lengths)
    return num

within_one_percentage = percentage(standard_deviations,1)  #求一个标准差内的数据比例
within_two_percentage = percentage(standard_deviations,2)  #求两个标准差内的数据比例
within_three_percentage = percentage(standard_deviations,3)  #求三个标准差内的数据比例
print(within_one_percentage,within_two_percentage,within_three_percentage)

output
0.68 0.96 1.0

正相关positively correlated、负相关negative correlated、不相关uncorrelated

positively correlated

negative correlated

uncorrelated

使用离散图画法可明了观察出x轴与y轴两种变量的相关性

import matplotlib.pyplot as plt
plt.scatter(nba_stats["fga"], nba_stats["pts"])
plt.show()

相关系数 Pearson's r

需要import pearsonr 框架,求得两组serices数据对应的相关性值,r值取值范围为[-1,1],越接近[-1,0)为负相关,0为不相关,(0,1] 为正相关

from scipy.stats.stats import pearsonr
r_fta_pts, p_value = pearsonr(nba_stats["fta"],nba_stats["pts"])
print(r_fta_pts)
r_stl_pf, p_value = pearsonr(nba_stats["stl"],nba_stats["pf"])
print(r_stl_pf)

output
0.918978538402
0.737628216749

协方差 covariance

两个变量是相互独立的,但也有相似的方式。例如,当一个变量上升时,另一个变量也会上升。这就是所谓的协方差。协方差指的是不同的数字是如何相互变化的。

有两个变量可以相互改变的极限。这是因为每个变量都有自己的方差。这些方差为两个变量之间的协方差设定了最大的理论极限。换句话说,一组变量不能因均值而异,而这两个变量的均值各不相同。当两个变量以一种完全相同的方式变化时,两个变量可以达到最大可能的协方差(ux是x serices的mean值)


covariance

下面是举了两个column数据的协方差求法,先定义了一个求协方差公式

def covariance(column1,column2):
    mean1 = column1.mean()
    mean2 = column2.mean()
    cov = [(column1[i] -mean1)*(column2[i] - mean2) for i in range(len(column1))]     #核心语句,用range迭代生成cov数组
    cov_total = sum(cov)/len(column1)
    return cov_total

cov_stl_pf = covariance(nba_stats["stl"],nba_stats["pf"])
cov_fta_pts = covariance(nba_stats["fta"],nba_stats["pts"])
print(cov_stl_pf,cov_fta_pts)

Output
1823.35484805 56618.4139807

r值的实际计算方法

r值是实际协方差和最大可能正协方差的比值。

r值

计算标准差最终我们使用std()函数
nba_stats["pf"].std()
计算协方差我们是用numpy框架中cov函数进行计算
cov(nba_stats["pf"], nba_stats["stl"])[0,1]

下面是计算协方差的一个举例

from numpy import cov
r_fta_blk = cov(nba_stats["fta"],nba_stats["blk"])[0,1]/ (nba_stats["fta"].std() * nba_stats["blk"].std())#将协方差和两组column的标准差代入到公式中,就能得到r的值,即相关系数
r_ast_stl = cov(nba_stats["ast"],nba_stats["stl"])[0,1]/ (nba_stats["ast"].std() * nba_stats["stl"].std())
print(r_fta_blk,r_ast_stl)

你可能感兴趣的:(统计学初步)