![]()
0、本文介绍
统计不像数学一样形而上,统计就是理解,通过运用数据,解决实际问题。从统计学的基础知识讲起,帮助我们从头开始学习统计预测的方法。只有理解统计预测,才能摆脱“只会调用机器学习库”的困境。
Python的语法较简单,可通过简短的代码实现复杂的分析。另外,Python 也非常适合用于机器学习。因此,用 Python 学习统计学,是最有助于从统计学基础到机器学习的过渡。
基于此,本文不仅分享了如何用Python计算统计学概念,而且还为大家赠送5本下方的书籍,超级适合统计学初学者。 ![]()
1、什么是描述性统计?
2、统计量
![]()
1)常用统计量
* 频数与频率
+ 预数
+ 频率
* 集中趋势分析
+ 均值
+ 中位数
+ 众数
+ 分位数
* 离散程度分析
+ 极差
+ 方差
+ 标准差
* 分布形状
+ 偏度
+ 峰度2)变量的类型
* 类别变量
+ 无序类别变量
+ 有序类别变量
* 数值变量
+ 连续变量
+ 离散型变量3)本文章使用的相关python库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
from sklearn.datasets import load_iris
from scipy import stats
sns.set(style="darkgrid")
mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
warnings.filterwarnings("ignore")3、频率与频数
1)频率与频数的概念
![]()
2)代码:计算鸢尾花数据集中每个类别的频数和频率 iris = load_iris()
# iris是一个类字典格式的数据,data、target、feature_names、target_names都是键
display(iris.data[:5],iris.target[:5])
# feature_names是每一列数据的特征名。target_names是鸢尾花的属种名
display(iris.feature_names,iris.target_names)
# reshape(-1,1)表示将原始数组变为1列,但是行数这里我写一个-1,表示系统
# 会根据我指定的列数,自动去计算出行数。reshape(1,-1)含义同理
dt = np.concatenate([iris.data,iris.target.reshape(-1,1)],axis=1)
df = pd.DataFrame(dt,columns=iris.feature_names + ["types"])
display(df.sample(5))
# 计算鸢尾花数据集中每个类别出现的频数
frequency = df["types"].value_counts()
display(frequency)
percentage = frequency / len(df)
display(percentage)
frequency.plot(kind="bar")结果如下: ![]()
4、集中趋势
1)均值、中位数、众数概念
![]()
2)均值、中位数、众数三者的区别 ![]()
3)不同分布下,均值、中位数、众数三者之间的关系
![]()
![]()
4)代码:计算鸢尾花数据集中花萼长度的均值、中位数、众数
mean = df["sepal length (cm)"].mean()
display(mean)
median = df["sepal length (cm)"].median()
display(median)
# 由于series中没有专门计算众数的函数,因此需要我们统计频数最大的那些值
s = df["sepal length (cm)"].value_counts()
s = s[s.values == s.values[0]]
s.index.tolist()
t = s.index[0]
t
# scipy的stats模块中,可以计算众数
from scipy import stats
t = stats.mode(df["sepal length (cm)"])
# 注意:t展示的类字典格式的数据类型,mode展示众数,count用于展示众数出现的次数
display(t.mode,t.count)
sns.distplot(df["sepal length (cm)"])
plt.axvline(mean,ls="-",color="r",label="均值")
plt.axvline(median,ls="-",color="g",label="中值")
plt.axvline(t,ls="-",color="indigo",label="众数")
plt.legend(loc="best")结果如下: ![]()
5、集中趋势:分位数
1)分位数的概念
![]()
2)怎么求分位数
![]()
3)分位数是数组中的元素的情况
x = np.arange(10,19)
n = len(x)
# 计算每个分位数的位置,这个位置是从1开始的。但是数组元素索引从0开始的
q1_index=1+(n-1)*0.25
q2_index=1+(n-1)*0.5
q3_index=1+(n-1)*0.75
# 这里计算出来的数字是浮点类型,需要转化为小数,才能当作索引
q1_index,q2_index,q3_index
# 计算分位数
index = np.array([q1_index,q2_index,q3_index]).astype(np.int32)
index -= 1
q = x[index]
q结果如下: ![]()
绘制图形: plt.figure(figsize=(15,4))
plt.xticks(x)
plt.plot(x,np.zeros(len(x)),ls="",marker="D",ms=15,label="元素值")
plt.plot(x[index],np.zeros(len(index)),ls="",marker="X",ms=15,label="四分位值")
plt.legend()结果如下: ![]()
4)分位数不是数组中的元素的情况
x = np.arange(10,20)
n = len(x)
# 计算每个分位数的位置,这个位置是从1开始的。但是数组元素索引从0开始的
q1_index=1+(n-1)*0.25
q2_index=1+(n-1)*0.5
q3_index=1+(n-1)*0.75
q1_index,q2_index,q3_index
# 计算分位数
index = np.array([q1_index,q2_index,q3_index])
index
left = np.floor(index).astype(np.int32)
left
right = np.ceil(index).astype(np.int32)
right
weight = np.modf(index)[0]
weight
q = x[left] + (x[right] - x[left]) *weight
q结果如下: ![]()
绘制图形: plt.figure(figsize=(15,4))
plt.xticks(x)
plt.plot(x,np.zeros(len(x)),ls="",marker="D",ms=15,label="元素值")
plt.plot(q,np.zeros(len(q)),ls="",marker="X",ms=15,label="四分位值")
plt.legend()
for v in q:
plt.text(v,0.01,v,fontsize=15)
plt.legend()结果如下: ![]()
5)numpy中计算分位数的函数:quantile()
x = np.arange(10,19)
np.quantile(x,[0.25,0.5,0.75])
x = np.arange(10,20)
np.quantile(x,[0.25,0.5,0.75])结果如下: ![]()
![]()
6)pandas中计算分位数的函数:describe()
x = pd.Series(np.arange(10,19))
x.describe()
x = pd.Series(np.arange(10,20))
x.describe()结果如下: ![]()
![]()
x = pd.Series(np.arange(10,19))
x.describe(percentiles=[0.25,0.5,0.75,0.9])结果如下: ![]()
6、离散程度
1)极差、方差、标准差的概念
![]()
2)极差、方差、标准差的作用
![]()
3)代码:计算鸢尾花数据集中花萼长度的极差、方差、标准差
iris = load_iris()
dt = np.concatenate([iris.data,iris.target.reshape(-1,1)],axis=1)
df = pd.DataFrame(dt,columns=iris.feature_names + ["types"])
display(df.sample(5))
sub = df["sepal length (cm)"].max() - df["sepal length (cm)"].min()
sub
var = df["sepal length (cm)"].var()
var
std = df["sepal length (cm)"].std()
std
var == std ** 2结果如下: ![]()
绘制图形: plt.figure(figsize=(15,4))
plt.ylim(-0.5,1.5)
plt.plot(df["sepal length (cm)"],np.zeros(len(df)),ls="",marker="o",ms=10,color="g",label="花瓣长度")
plt.plot(df["sepal width (cm)"],np.ones(len(df)),ls="",marker="o",ms=10,color="b",label="花瓣宽度")
plt.axvline(df["sepal length (cm)"].mean(),ls="--",color="g",label="花瓣长度均值")
plt.axvline(df["sepal width (cm)"].mean(),ls="-",color="b",label="花瓣宽度均值")
plt.legend()结果如下: ![]()
7、分布形状:偏度和峰度
1)偏度
① 概念
![]()
② 代码如下
t1 = np.random.randint(1,11,100)
t2 = np.random.randint(11,21,500)
t3 = np.concatenate([t1,t2])
left_skew = pd.Series(t3)
t1 = np.random.randint(1,11,500)
t2 = np.random.randint(11,21,100)
t3 = np.concatenate([t1,t2])
right_skew = pd.Series(t3)
display(left_skew.skew(),right_skew.skew())
sns.kdeplot(left_skew,shade=True,label="左偏")
sns.kdeplot(right_skew,shade=True,label="右偏")
plt.legend()结果如下: ![]()
2)峰度
① 概念
![]()
② 代码如下
standard_normal = pd.Series(np.random.normal(0,1,10000))
display("标准正态分布峰度",standard_normal.kurt(),"标准差:",standard_normal.std())
display("花萼长度峰度",df["sepal length (cm)"].kurt(),"标准差:",df["sepal length (cm)"].std())
display("花萼宽度峰度",df["sepal width (cm)"].kurt(),"标准差:",df["sepal width (cm)"].std())
sns.kdeplot(standard_normal,label="标准正态分布")
sns.kdeplot(df["sepal length (cm)"],label="花萼长度")
sns.kdeplot(df["sepal width (cm)"],label="花萼宽度")结果如下: ![]()
8、赠书规则【仔细看】
哈哈,这次打赏环节是真的来了!
今天推荐的是《用Python动手学统计学》,由图灵出版社赞助。
这里为大家准备了3种参与方式,为了提高自身中奖概率,大家可以都参与一下。
给文本打赏任意金额后,扫描下方二维码,添加黄同学个人微信,领取抽奖码【记得备注:已打赏】
② 转发本文到朋友圈,然后留言点赞,排名第1赠送这本书;
转发本文到朋友圈,留言集赞,点赞排名第1朋友获奖。领奖的时候,需提供转发朋友圈截图。
③ 添加下方黄同学的私人微信,在朋友圈送2本;
扫描添加下方:黄同学微信,等候朋友圈参与抽奖哦。以后会在朋友圈多多送书,这样比较公平,避免某些人刷数据。【记得备注:朋友圈抽奖】





