python 描述性统计分析

目录

1.频数和频率

1.1.类别变量和数值变量

1.2示例:花的频数和频率

2.集中趋势分析

2.1示例:花萼片的宽度的平均数、中位数、众数

2.2示例:分位数

3.离散程度分析

3.1示例:奖金应发给谁

3.2示例:萼片长度的极差、方差和标准差

4.分布形状

4.1偏度

4.2峰度


假设校领导关注于某班级学生的期末考试成绩,我们会怎样进
行汇报?
A 某班成绩还可以。
B 张三90分,李四88分......
C 班级平均分85.2分,最高分100分,最低分72分。

1.频数和频率

  • 描述性统计,就是从数据中提取变量的主要信息(总和,均值等),从而从综合层面上,
    对数据进行统计性说明。在统计的过程中,通常会配合绘制相关的统计图来进行辅助。
  • 描述性统计所提取统计的信息,我们称为统计量
  • 频数,指数据中类别变量每个不同取值出现的次数。
    比如,抛硬币,抛了10次,6次是正面,4次是反面,6和4就是频数
  • 频率,指每个类别变量的频数与总次数的比值,通常采用百分数表示。
    频繁,一天上20次厕所
    频率,抛硬币,6除以10,正面的频率(概率),4除以10,反面的频率

 

1.1.类别变量和数值变量

  1. 类别变量:
    无序类别变量:教师、医生、律师
    有序类别变量:小学、初中、高中、大学、研究生、博士生
  2. 数值变量:
    连续变量:在一定范围内,能取无限个值   比如商品价格[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()

 运行结果:

后续持续学习更新 

  • 22
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python有很多库可以用于描述性统计分析。其中最常用的是numpy和pandas库。下面是一些常见的描述性统计分析的函数: 1.平均数:使用numpy库中的mean函数计算一个数组的平均值,例如: ```python import numpy as np a = np.array([1, 2, 3, 4, 5]) mean_a = np.mean(a) print(mean_a) ``` 2.中位数:使用numpy库中的median函数计算一个数组的中位数,例如: ```python import numpy as np a = np.array([1, 2, 3, 4, 5]) median_a = np.median(a) print(median_a) ``` 3.众数:使用scipy库中的mode函数计算一个数组的众数,例如: ```python from scipy import stats a = np.array([1, 2, 3, 3, 4, 4, 4, 5]) mode_a = stats.mode(a) print(mode_a) ``` 4.方差和标准差:使用numpy库中的var和std函数计算一个数组的方差和标准差,例如: ```python import numpy as np a = np.array([1, 2, 3, 4, 5]) var_a = np.var(a) std_a = np.std(a) print(var_a, std_a) ``` 5.四分位数:使用numpy库中的percentile函数计算一个数组的四分位数,例如: ```python import numpy as np a = np.array([1, 2, 3, 4, 5]) q1 = np.percentile(a, 25) q2 = np.percentile(a, 50) q3 = np.percentile(a, 75) print(q1, q2, q3) ``` 6.相关系数:使用numpy库中的corrcoef函数计算两个数组的相关系数,例如: ```python import numpy as np a = np.array([1, 2, 3, 4, 5]) b = np.array([6, 7, 8, 9, 10]) corr = np.corrcoef(a, b) print(corr) ``` 以上是一些常用的描述性统计分析函数,使用这些函数可以很方便地进行数据分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值