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") # 忽略警告信息
iris = load_iris() # 加载鸢尾花数据集
print(type(iris))
print(iris)
In [1]: list(iris.keys())
Out[1]: ['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']
# 拼接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)
df.info() # 展示df的概览信息
df.describe() # 展示df 数值类型字段的统计信息
df.sample(10) # 随机抽样10条数据
frequency = df["target"].value_counts() # value_counts() 计算频数
percentage = frequency / len(df["target"]) # 计算频率
print(frequency)
print(percentage)
均值:即平均值,为一组数据的总和除以数据的个数。
中位数:将一组数据升序排列,位于该组数据最中间位置的值(如果数据个数为偶数,则取中间两个数值的均值)。
众数:一组数据中出现次数最多的值。
分位数:通过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])
分位值是数组中的某个元素:
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
极差:一组数据中,最大值与最小值之差
方差:每个样本值与全体样本值的平均数之差的平方值的平均数,体现一组数据中,每个元素与均值偏离的大小。
标准差:标准差是方差的开方
sepal_length.max() - sepal_length.min() # max() - min() 计算极差
sepal_length.var() # var() 计算方差
sepal_length.std() # std() 计算标准差
# 标准正态分布的偏度和峰度,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()