目录
假设校领导关注于某班级学生的期末考试成绩,我们会怎样进 行汇报? A 某班成绩还可以。 B 张三90分,李四88分...... C 班级平均分85.2分,最高分100分,最低分72分。
1.频数和频率
-
描述性统计,就是从数据中提取变量的主要信息(总和,均值等),从而从综合层面上, 对数据进行统计性说明。在统计的过程中,通常会配合绘制相关的统计图来进行辅助。
-
描述性统计所提取统计的信息,我们称为统计量
-
频数,指数据中类别变量每个不同取值出现的次数。 比如,抛硬币,抛了10次,6次是正面,4次是反面,6和4就是频数
-
频率,指每个类别变量的频数与总次数的比值,通常采用百分数表示。 频繁,一天上20次厕所 频率,抛硬币,6除以10,正面的频率(概率),4除以10,反面的频率
1.1.类别变量和数值变量
-
类别变量:
无序类别变量:教师、医生、律师 有序类别变量:小学、初中、高中、大学、研究生、博士生
-
数值变量:
连续变量:在一定范围内,能取无限个值 比如商品价格[1,100],在范围内能取任意数 离散变量:在一定范围内,取有限个值,比如性别:男、女、中
1.2示例:花的频数和频率
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
# 花数据
iris = load_iris()
# print(iris)
# 花数据转成df
data = np.concatenate([iris.data,iris.target.reshape(-1,1)],axis=1)
# print(data)
data_df = pd.DataFrame(data,columns=['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)','type'])
print('花原始数据:')
print(data_df)
print('*'*30)
#频数,花的各个类型出现了多少次
print('花的频数:')
pre = data_df['type'].value_counts()
print(pre)
print('*'*30)
# 频率
print('各类花出现的频率:')
perc = pre*100/len(data)
print(round(perc,2).astype(str)+'%')
print('*'*30)
# 也可以用sns.countplot统计唯一值画出出现的次数图形
sns.countplot(x='type',data=data_df)
plt.show()
运行结果:
花原始数据:
sepal length (cm) sepal width (cm) ... petal width (cm) type
0 5.1 3.5 ... 0.2 0.0
1 4.9 3.0 ... 0.2 0.0
2 4.7 3.2 ... 0.2 0.0
3 4.6 3.1 ... 0.2 0.0
4 5.0 3.6 ... 0.2 0.0
.. ... ... ... ... ...
145 6.7 3.0 ... 2.3 2.0
146 6.3 2.5 ... 1.9 2.0
147 6.5 3.0 ... 2.0 2.0
148 6.2 3.4 ... 2.3 2.0
149 5.9 3.0 ... 1.8 2.0
[150 rows x 5 columns]
******************************
花的频数:
type
0.0 50
1.0 50
2.0 50
Name: count, dtype: int64
******************************
各类花出现的频率:
type
0.0 33.33%
1.0 33.33%
2.0 33.33%
Name: count, dtype: object
******************************
2.集中趋势分析
了解整体分布情况
- 均值:即平均值,其为一组数据的总和除以数据的个数。
- 中位数:将一组数据升序排列,位于该组数据最中间位置的值,就是中位数。如果数据个数为偶数,则取中间两个数值的均值。
- 众数:一组数据中出现次数最多的值
现在,某城市要统计居民的总体收入水平,使用哪项指标衡量更合适?
A 均值
B 中位数
C众数
D 中位数或众数
E 都可以
中位数?
2.1示例:花萼片的宽度的平均数、中位数、众数
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
# 花数据
iris = load_iris()
# 花数据转成df
data = np.concatenate([iris.data,iris.target.reshape(-1,1)],axis=1)
# print(data)
data_df = pd.DataFrame(data,columns=['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)','type'])
print('花原始数据:')
print(data_df)
print('*'*30)
print('sepal width平均值为:')
mean = data_df['sepal width (cm)'].mean()
print(mean)
print('*'*30)
print('sepal width中位数为:')
median = data_df['sepal width (cm)'].median()
print(median)
print('*'*30)
# mode()返回值类型为series
print('sepal width众数为:')
mode = data_df['sepal width (cm)'].mode()[0]
print(mode)
print('*'*30)
"""
sns.displot是用于绘制直方图和密度图的函数。
直方图是一种用来表示数据分布的图表,它将数据划分为相等间隔的区间,并计算每个区间中的观测频次。
密度图是直方图的平滑版本,它通过估计概率密度函数来表示数据的分布。
"""
sns.displot(data_df['sepal width (cm)'])
#绘制垂直线,这里中位数和众数相等,两条垂直线重合了
plt.rcParams['font.family'] = ['KaiTi']
plt.axvline(mean,ls='-',c='r',label='均值')
plt.axvline(median,ls='--',c='g',label='中位数')
plt.axvline(mode,ls='-.',c='c',label='众数')
plt.legend()
plt.show()
运行结果:
花原始数据:
sepal length (cm) sepal width (cm) ... petal width (cm) type
0 5.1 3.5 ... 0.2 0.0
1 4.9 3.0 ... 0.2 0.0
2 4.7 3.2 ... 0.2 0.0
3 4.6 3.1 ... 0.2 0.0
4 5.0 3.6 ... 0.2 0.0
.. ... ... ... ... ...
145 6.7 3.0 ... 2.3 2.0
146 6.3 2.5 ... 1.9 2.0
147 6.5 3.0 ... 2.0 2.0
148 6.2 3.4 ... 2.3 2.0
149 5.9 3.0 ... 1.8 2.0
[150 rows x 5 columns]
******************************
sepal width平均值为:
3.0573333333333337
******************************
sepal width中位数为:
3.0
******************************
sepal width众数为:
3.0
******************************
- 分位数:分位数,通过n-1个分位将数据划分为n个区间,使得每个区间的数值个数相等(或
近似相等)。其中,n为分位数的数量。
2.2示例:分位数
import numpy as np
import pandas as pd
# numpy 分位数
"""
numpy 分位数
np.quantile(x,q),q 参数是在 [0, 1] 范围内
np.percentile(x,q),q参数是在 [0, 100] 范围内
"""
x=[1,3,10,15,18,20,21,23,40]
print(np.quantile(x,q=[0.25,0.8,0.9]))
print('*'*30)
print(np.percentile(x,q=[25,80,90]))
print('*'*30)
# pandas 分位数
x=[1,3,10,15,18,20,21,23,40]
s = pd.Series(x)
print(s.describe())
print('*'*30)
print(s.describe(percentiles=[0.2,0.55,0.8]))
print('*'*30)
运行结果:
******************************
[10. 21.8 26.4]
******************************
[10. 21.8 26.4]
******************************
count 9.000000
mean 16.777778
std 11.702326
min 1.000000
25% 10.000000
50% 18.000000
75% 21.000000
max 40.000000
dtype: float64
******************************
count 9.000000
mean 16.777778
std 11.702326
min 1.000000
20% 7.200000
50% 18.000000
55% 18.800000
80% 21.800000
max 40.000000
dtype: float64
******************************
3.离散程度分析
了解稳定性,波动大不大
- 极差
极差指一组数据中,最大值与最小值之差。
- 方差
方差体现的是一组数据中,每个元素与均值偏离的大小。
- 标准差
标准差为方差的开方。
说明:
极差的计算非常简单,但是极差没有充分的利用数据信息。
当数据较大时,也可以使用n代替n-1,
3.1示例:奖金应发给谁
计算总分和方差
df = pd.DataFrame(data=[[93,98, 89],[94,95, 91], [93,93, 93]], index=['li','wang','zhang'])
print('成绩数据df:')
print(df)
print('*'*30)
# 总分
print('计算总分:')
print(df.sum(axis=1))
print('*'*30)
# 方差
print('计算方差:')
print(df.var(axis=1))
print('*'*30)
运行结果:
成绩数据df:
0 1 2
li 93 98 89
wang 94 95 91
zhang 93 93 93
******************************
计算总分:
li 280
wang 280
zhang 279
dtype: int64
******************************
计算方差:
li 20.333333
wang 4.333333
zhang 0.000000
dtype: float64
从总分和方差来看,王同学综合能力稳定些,全面发展
3.2示例:萼片长度的极差、方差和标准差
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
# 花数据
iris = load_iris()
# print(iris)
# 花数据转成df
data = np.concatenate([iris.data,iris.target.reshape(-1,1)],axis=1)
# print(data)
data_df = pd.DataFrame(data,columns=['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)','type'])
print('花原始数据:')
print(data_df)
print('*'*30)
# 极差
print('萼片长度的极差:')
sub = np.ptp(data_df['sepal length (cm)'])
print(sub)
print('*'*30)
# 方差
print('萼片长度的方差:')
var = data_df['sepal length (cm)'].var()
print(var)
print('*'*30)
# 标准差
print('萼片长度的标准差:')
std = data_df['sepal length (cm)'].std()
print(std)
print('*'*30)
运行结果:
花原始数据:
sepal length (cm) sepal width (cm) ... petal width (cm) type
0 5.1 3.5 ... 0.2 0.0
1 4.9 3.0 ... 0.2 0.0
2 4.7 3.2 ... 0.2 0.0
3 4.6 3.1 ... 0.2 0.0
4 5.0 3.6 ... 0.2 0.0
.. ... ... ... ... ...
145 6.7 3.0 ... 2.3 2.0
146 6.3 2.5 ... 1.9 2.0
147 6.5 3.0 ... 2.0 2.0
148 6.2 3.4 ... 2.3 2.0
149 5.9 3.0 ... 1.8 2.0
[150 rows x 5 columns]
******************************
萼片长度的极差:
3.6000000000000005
******************************
萼片长度的方差:
0.6856935123042507
******************************
萼片长度的标准差:
0.828066127977863
******************************
4.分布形状
4.1偏度
偏度是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。其计算公式为三阶中心距与标准差三次方的比值。
示例
seaborn.kdeplot核密度估计图
"""
seaborn.kdeplot 是 Seaborn 库中的一个函数,
用于创建核密度估计图(Kernel Density Estimate plot)。
核密度估计是一种非参数方法,用于估计一个变量的概率密度函数。
与直方图类似,但核密度估计图通过平滑的曲线来表示分布,而不是通过离散的柱状图。
主要参数:
data:DataFrame对象,包含要绘制的数据。
x, y:字符串或向量,分别表示x轴和y轴的数据。
shade:布尔值,表示是否在曲线下方填充颜色。
vertical:布尔值,如果为True,则密度曲线将垂直放置。
kernel:字符串或可调用对象,表示要使用的核函数。常见的核函数有 'gau'(高斯核)、'cos'(余弦核)等。
bw:字符串、数字或可调用对象,表示核的宽度。如果为字符串,可以是 'scott'、'silverman' 或 'mlcv',这些表示不同的方法来估计最佳带宽。
gridsize:整数,表示用于离散化数据的网格的大小。
cut:标量,表示在极值点之外绘制的数据的范围。
clip:元组,表示数据的范围,用于限制计算和绘图的数据范围。
legend:布尔值,表示是否显示图例。
cumulative:布尔值,如果为True,则绘制累积分布函数。
shade_lowest:布尔值,如果为True,则在最低密度区域下方填充颜色。
cbar:布尔值,是否添加一个颜色条(当shade=True时)。
cbar_ax:matplotlib轴对象,用于绘制颜色条。
cbar_kws:字典,传递给颜色条的其他关键字参数。
linewidths:标量或数组,表示线宽。
colors:颜色名称、列表或'cmap',用于曲线的颜色。
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#左偏,左边低位数的数量较少,拉低了均值
t1 = np.random.randint(1,11,size=100)
t2 = np.random.randint(11,21,size=500)
t3 = np.concatenate([t1,t2])
# 计算偏度,结果小于0就是左偏,结果大于0就是右偏
left_skew = pd.Series(t3)
print('偏度为:')
print(left_skew.skew())
print('*'*30)
#右偏,右边高位数的数量较少,拉高了均值
t1 = np.random.randint(1,11,size=500)
t2 = np.random.randint(11,21,size=100)
t3 = np.concatenate([t1,t2])
# 计算偏度,结果小于0就是左偏,结果大于0就是右偏
right_skew = pd.Series(t3)
print('偏度为:')
print(right_skew.skew())
print('*'*30)
plt.rcParams['font.family'] = ['KaiTi']
sns.kdeplot(left_skew,shade=True,label='左偏')
sns.kdeplot(right_skew,shade=True,label='右偏')
plt.legend()
plt.show()
运行结果:
******************************
偏度为:
-0.8303629447749028
******************************
偏度为:
0.9702592787579505
******************************
4.2峰度
峰度是描述数据分布陡缓程度的统计量。可以将峰度理解为数据分布的高矮程度。其计算公式为四阶中心距与标准差四次方的比值。
示例
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import kurtosis
# 生成示例数据
# data = np.random.normal(size=1000)
data = np.random.randn(100)
# print(data)
# 计算峰度
data_kurtosis = kurtosis(data)
# 创建一个图形
plt.figure(figsize=(8, 6))
# 绘制直方图,kde表示绘制核密度图
sns.histplot(data, bins=30, kde=True, color='skyblue', alpha=0.5)
# 添加峰度值到图形标题
plt.title(f'Kurtosis: {data_kurtosis:.2f}')
# 显示图形
plt.show()
运行结果:
后续持续学习更新