1、加载相关库和数据集
使用的库主要有:pandas、numpy、sklearn、matplotlib、seaborn
使用的数据集:sklearn库中的鸢尾花数据集
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
plt.rcParams["font.family"] = "SimHei" # 设置可以显示中文字体
plt.rcParams["axes.unicode_minus"] = False
warnings.filterwarnings("ignore") # 忽略警告信息
2、数据集数据概览
2.1 数据总体概览
iris = load_iris() # 加载鸢尾花数据集
print(type(iris))
print(iris)
In [1]: list(iris.keys())
Out[1]: ['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']
2.2 使用主要信息构造DataFrame
使用 np.concatenate 拼接不同的数据信息
# 拼接data信息和target信息,用于构造DataFrame
data = np.concatenate([iris.data,iris.target.reshape(-1,1)],axis=1)
feature_names = iris.feature_names # 特征名列,包含花萼和花瓣的长度和宽度
feature_names.append("target") # 将"target"添加至特征名列表,作为拼接数据的列名
df = pd.DataFrame(data,columns=feature_names)
2.3 构造后的数据概览
df.info() # 展示df的概览信息
df.describe() # 展示df 数值类型字段的统计信息
df.sample(10) # 随机抽样10条数据
3、使用相关函数进行描述性统计
3.1 频率和频数分析
数据的频数与频率统计适用于类别变量
频数:数据中类别变量每个不同取值出现的次数
频率:每个类别变量的频数与总次数的比值,通常采用百分数进行表示。
frequency = df["target"].value_counts() # value_counts() 计算频数
percentage = frequency / len(df["target"]) # 计算频率
print(frequency)
print(percentage)
3.2 数据的集中趋势分析
均值:即平均值,为一组数据的总和除以数据的个数。
中位数:将一组数据升序排列,位于该组数据最中间位置的值(如果数据个数为偶数,则取中间两个数值的均值)。
众数:一组数据中出现次数最多的值。
分位数:通过n-1个分位将数据划分为n个区间,使得每个区间的数值个数相等(或近似相等),那么n为分位数的数量。
以鸢尾花的花萼长度为例,下同:
sepal_length = df["sepal length (cm)"]sepal_length.mean() # mean() 计算均值
sepal_length.median() # median() 计算中位数
sepal_length.mode().iloc[0] # mode() 计算众数
df.describe() # 统计信息中包含分位数
# numpy内置函数quantile计算分位值,q取值范围[0,1]np.quantile(sepal_length, q=[0.25, 0.5, 0.75])
# numpy内置函数percentile计算分位值,q取值范围[0,100]np.percentile(sepal_length, q=[25, 50, 75])
3.3 手动计算分位数
常用的分位数有四分位数与百分位数
分位值未必一定等同于数组中的某个元素
分位值是数组中的某个元素:
list1 = np.arange(9)
n = len(list1)
# 计算四分位的位置(索引)
q1_index = (n-1) * 0.25
q2_index = (n-1) * 0.5
q3_index = (n-1) * 0.75
q_index = np.array([q1_index, q2_index, q3_index])
q_index = q_index.astype(np.int32) # 将索引转成int类型
q = list1[q_index] # 根据索引获取分位值
分位值不是数组中的某个元素:
sepal_length = sorted(sepal_length) # 记得计算分位值之前要先给数据排序
sepal_length = np.array(sepal_length) # 转成数组
n = len(sepal_length)
q1_index = (n-1) * 0.25
q2_index = (n-1) * 0.5
q3_index = (n-1) * 0.75
q_index = np.array([q1_index, q2_index, q3_index])
left_index = np.floor(q_index).astype(np.int32) # np.floor() 向下取整
right_index = np.ceil(q_index).astype(np.int32) # np.ceil() 向上取整
weight,_ = np.modf(q_index) # np.modf() 获取小数部分作为权重
# 按照权重计算分位值,每个整数的权重为距离的反比。
q = sepal_length[left_index] * (1-weight) + sepal_length[right_index] * weight
3.4 数据的离散程度分析
极差:一组数据中,最大值与最小值之差
方差:每个样本值与全体样本值的平均数之差的平方值的平均数,体现一组数据中,每个元素与均值偏离的大小。
标准差:标准差是方差的开方
sepal_length.max() - sepal_length.min() # max() - min() 计算极差
sepal_length.var() # var() 计算方差
sepal_length.std() # std() 计算标准差
3.5 数据的分布形状分析
偏度:统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。(如果数据对称分布,如正态分布,则偏度为0;如果数据左偏分布,则偏度小于0;如果数据右偏分布,则偏度大于0)
峰度:描述总体中所有取值分布形态陡缓程度的统计量,可以连接为数据分布的高矮程度。(峰度的比较是相对于标准正太分布的,对于标准正太分布,峰度为0;如果峰度大于0,则密度图高于标准正太分布,此时方差较小;如果峰度小于0,则密度图低于标准正太分布,此时方差较大。)
# 标准正态分布的偏度和峰度,np.random.normal() 构造标准正态分布数据
standard_normal = pd.Series(np.random.normal(0, 1, size=10000))
standard_normal.skew()# skew() 计算偏度
standard_normal.kurt()# kurt() 计算峰度
# 鸢尾花花萼长度的偏度和峰度
sepal_length = df["sepal length (cm)"]sepal_length.skew()
sepal_length.kurt()
绘制标准正太分布、鸢尾花花萼宽度的密度图:
# 绘制核密度图
sns.kdeplot(standard_normal, shade=True, label="标准正太分布")
sns.kdeplot(df["sepal width (cm)"], shade=True, label="鸢尾花花萼宽度")
plt.legend()
作者:Minions2020