数据描述
代码都是在Jupyter NOtebook软件运行。
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all" # 显示
# 导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
# 设置seaborn给图的样式
sns.set(style= "darkgrid")
# 设置字体格式
plt.rcParams["font.family"] = "SimHei"
# 控制字符可以正常显示
plt.rcParams["axes.unicode_minus"] = False
# 忽略警告信息。
import warnings
warnings.filterwarnings("ignore")
# 获取鸢尾花数据集
iris = load_iris()
print(iris)
# 鸢尾花数据对象方法和属性的介绍
iris.data # 取出鸢尾花数据,只包括特征,不包括:目标值(标签值)
iris.target # 取出鸢尾花数据标签
iris.feature_names # 取出鸢尾花数据集特征列的名称
iris.target_names # 鸢尾花数据集标签值名称
# 将数据集以 dataframe格式进行展示
# 将数组合并
data = np.concatenate([iris.data, iris.target.reshape(-1,1)], axis=1)
data
data = pd.DataFrame(data,columns=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'target'])
data.head(7)
设置好鸢尾花的各列名,对它的数据进行数据描述。
# 频数(多少个)
frequency = data["target"].value_counts()
frequency
# 频率(占比)
percrntage = frequency / len(data)
percrntage
1. 求众数 pandas中的mode方法 scipy 中的mode方法
# 以 sepal_width 计算众数
data["sepal_width"].mode()
from scipy import stats
stats.mode(data["sepal_width"]) # 有多个众数,只显示一个众数
# 以 sepal_width 计算中位数
data["sepal_width"].median()
# 以 sepal_width 计算平均数
data["sepal_width"].mean()
2. 四分位计算方式
np.quantile(data["sepal_width"], q=[0.25, 0.5, 0.75])
3. 离散程度度量
- 极差
- 四分位差: 上四分位与下四分位的的差值,不易受极值的影响,差值越小,表示数据越集中,差值越大,表示数据越分散.
- 方差: 各变量值和平均数的离差平方和,用来衡量数据偏离均值的程度
- 标准差:方差开跟号
- 标准分数
# 1.极差:最大值与最小值之差
np.ptp(data['sepal_length'])
# 3.标准差
np.std(data['sepal_length'])
4. 标准分数
- 变量值与其平均数的离差 除以样本标准差后的值称为 标准分数,也叫作z分数;
- 他给出了一组数据中的各数据中的相对位置;
- 对一组数据进行标准化处理不会改变原来数据的分布情况;
- 对数据进行标准化处理后的标准分数,其均值=0,标准差=1;
- z分数通常用来观察数据是否存在异常值(离群值)。
# 验证标准化处理不改变数据分布情况
x = np.concatenate([np.random.randint(200,800,size=1000),
np.random.randint(1,200,size=100),
np.random.randint(200,800,size=200)])
plt.hist(x)
# 将X进行标准化
x_s = (x-np.mean(x))/np.std(x)
plt.hist(x_s)
5. 经验法则(适用于对称分布的数据)¶
-
约有68%的数据在平均数1个标准差的范围之内
-
约有95%的数据在平均数2个标准差的范围之内
-
约有99%的数据在平均数3个标准差的范围之内
注: +3倍标准差之外的数据,统计上称离群点Coutlier), 在实际分析中可以选择将这些数据 点删除后再进行数据分析
6. 切比雪夫不等式(适用于非对称分布)
由上式可知:
- 至少有75%的数据在平均数2个标准差的范围之内
- 至少有89%的数据在平均数3个标准差的范围之内
- 至少有94%的数据在平均数4个标准差的范围之内
7. 偏度与峰度
7.1 偏度
统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征
- 如果数据对称分布(例如正态分布),则偏度为0
- 如果数据左偏分布,则偏度小于0
- 如果数据右偏分布,则偏度大于0
7.2 峰度
描述总体中所有取值分布形态陡缓程度的统计量。可以将峰度理解为数据分布的高矮程度。峰度的比较是相对于标准正态分布的。
- 标准正态分布,峰度为0
- 如果峰度大于0,则密度图高于标准正态分布,数据在分布上比标准正态分布密集,方差(标准差)较小
- 如果峰度小于0,则密度图低于标准正态分布,数据在分布上比标准正态分布分散,方差(标准差)较大
# 进行不同偏度图形绘制
# 制造左偏分布数据
t1 = np.random.randint(1, 11, size=100)
t2 = np.random.randint(11, 21, size=500)
t3 = np.concatenate([t1, t2])
left_skew = pd.Series(t3)
# 制造右偏分布数据
t1 = np.random.randint(1, 11, size=500)
t2 = np.random.randint(11, 21, size=100)
t3 = np.concatenate([t1, t2])
right_skew = pd.Series(t3)
# 模型画图
sns.kdeplot(left_skew, shade= True, label="左偏" )
sns.kdeplot(right_skew, shade= True, label="右偏" )
plt.legend()
print("--"*15)
# 计算偏度
print(left_skew.skew(), right_skew.skew())
# 进行不同峰度图形绘制
# 创建正态分布数据
standard_normal = pd.Series(np.random.normal(0, 1, size=10000))
sns.kdeplot(standard_normal, label="标准正态分布")
sns.kdeplot(data["sepal_width"],label="花萼宽度")
# 计算峰度 .kurt
print("标准正态分布峰度:",standard_normal.kurt())
print("花萼宽度峰度:",data["sepal_width"].kurt())