一、统计
1. 统计概念
统计学是一门研究数据收集、分析、解释和呈现的科学。它涉及收集数据、总结数据、分析数据和从数据中得出结论的过程。统计学帮助我们理解数据,揭示数据中的模式和趋势,支持决策制定,并为解决各种问题提供有力的工具。
2. 常见统计名称概念
(1) 均值( Mean )
均值是一组数据的平均值。计算方法是将所有数据值相加,然后除以数据点的数量。
例如,对于数据集[5, 10, 15, 20, 25],均值为(5+10+15+20+25)/5 = 15。
(2) 中位数( Median )
中位数是一组数据中的中间值,将数据按顺序排列后,中间的值即为中位数。
如果数据集有偶数个数据点,中位数是中间两个数据点的均值。
例如,对于数据集[5, 10, 15, 20, 25],中位数为15。
(3) 标准差( Standard Deviation )
标准差衡量了数据的离散程度,它是每个数据点与均值之间差值的平方的平均值的平方根。
标准差越小,数据越集中在均值周围;标准差越大,数据越分散。
(4) 方差( Variance )
方差是标准差的平方。它表示数据的离散程度的平均值。
方差的计算方法是将每个数据点与均值之间的差值平方后求平均值。
(5) 分位数( Quantile )
分位数表示数据的分布,包括中位数、第一四分位数(Q1)和第三四分位数(Q3)。
中位数是数据的中间值;Q1是数据的前25%的值;Q3是数据的前75%的值。
(6) 正态分布( Normal Distribution )
正态分布是统计学中最常见的分布,也称为高斯分布。它具有钟形曲线,均值、中位数和众数相等。
正态分布在自然界和社会科学中广泛存在,因此在数据分析中经常假设数据服从正态分布。
(7) 偏态( Skewness )
偏态度量了数据分布的不对称程度。正偏态表示数据向右倾斜,负偏态表示数据向左倾斜。
偏态为0表示数据分布对称。 如果是左偏,说明大多数是集中在右边的,即众数 > 中位数 > 均值;如果是右偏,说明大多数是集中在左边的,即众数 < 中位数 < 均值。
我们可以用偏态系数来衡量具体的偏离程度,偏态系数大于0则右偏,小于0则左偏,值越大越偏。
3. python中的统计分级
(1) 描述性统计
描述性统计是用来总结和描述数据集的统计方法,通常包括 均值、中位数、标准差、方差、最小值、最大值等。这些统计指标帮助我们了解数据的中心趋势、分散程度和分布形状
(2)假设检验
假设检验是一种统计方法,用于评估一个关于数据总体的假设是否成立。在Python中,可以使用Scipy库进行假设检验,如t检验、ANOVA等,以确定样本之间或组之间的显著性差异。
- t检验
t 检验的核心是用统计学方法判断 “两组数据的均值差异” 是抽样误差导致的偶然现象,还是总体真实存在的差异,适用于小样本(n<30)或总体标准差未知的场景
自由度和p值:
p值: p值是在假设检验中用于判断结果是否具有统计学显著性的一个指标。它表示在原假设(通常是两组数据没有差异或没有关系)成立的情况下,观察到当前样本数据或者更极端情况的概率。一般来说,如果p值小于预先设定的显著性水平(通常为0.05),则拒绝原假设,认为结果具有统计学显著性;如果p值大于显著性水平,则不能拒绝原假设,即没有足够的证据表明存在显著差异或关系。
自由度:t检验的自由度,本质是 “计算统计量时,不受约束的独立数据个数”,且直接由样本量决定(不同 t 检验的约束条件不同,自由度公式不同)- 自由度越小,t 分布越 “扁平”,尾部越粗(意味着小样本时,抽样误差导致极端 t 值的概率更高); 自由度越大,t 分布越接近正态分布(大样本时,抽样误差的影响被稀释
而 t 分布的形状会直接影响 p 值的计算 —— 同样的 t 值,自由度越小,p 值越大(越难拒绝原假设);自由度越大,p 值越小(越容易拒绝原假设)。
想证明 “有差异”(如实验有效):盼 p 值越小越好(最好 < 0.05); 想证明 “无差异”(如等效性检验):盼 p 值越大越好(≥0.05)
from scipy import stats
# 示例数据
group1 = [65, 70, 75, 80, 85]
group2 = [70, 75, 80, 85, 90]
# 执行独立样本t检验
t_statistic, p_value = stats.ttest_ind(group1, group2)
print(f"t统计量: {t_statistic}")
print(f"p值: {p_value}")
# 判断显著性水平
alpha = 0.05
if p_value < alpha:
print("拒绝零假设:两组数据的均值显著不同。") //零假设是假设两组数据均值无明显差异
else:
print("接受零假设:两组数据的均值没有显著差异。")
- ANOVA(Analysis of Variance)
ANOVA(方差分析)的核心是检验 “三组及以上数据的总体均值是否存在显著差异” ,是 t 检验的延伸(t 检验仅适用于两组) ANOVA 的最终判断依据是 F 值,公式为
-
(MS_B):组间均方(Mean Square Between Groups)→ 衡量 “不同组之间的平均变异”;
-
(MS_W):组内均方(Mean Square Within Groups)→ 衡量 “同一组内部的平均变异”;
-
核心逻辑:F 值越大,说明 “组间差异” 远大于 “组内随机波动”,越可能存在真实差异。
-
单位变异 (Total Variation)
总变异,表示所有数据点与总平均值之间的差异总和,反映数据的整体离散程度。 -
组间变异 (Between-group Variation)
不同组之间的差异,反映因不同处理或条件导致的组间差异。 -
组内变异 (Within-group Variation)
同一组内部数据点的变异,反映随机误差或个体差异。 -
MS between (Mean Square Between)
组间均方,计算公式为 ,用于估计组间变异。 -
MS within (Mean Square Within)
组内均方,计算公式为 ,用于估计组内随机误差。 -
SS between (Sum of Squares Between)
组间平方和,表示各组均值与总均值之间差异的加权平方和。 -
df between (Degrees of Freedom Between)
组间自由度,计算公式为 ,其中 为组数。 -
SS within (Sum of Squares Within)
组内平方和,表示各组内数据点与该组均值之间差异的平方和。 -
df within (Degrees of Freedom Within)
组内自由度,计算公式为 ,其中 为总样本量, 为组数。Python 代码示例:
from scipy import stats
# 示例数据,假设有三个组
group1 = [45, 50, 55, 60, 65]
group2 = [55, 60, 65, 70, 75]
group3 = [70, 75, 80, 85, 90]
# 执行单因素方差分析(ANOVA)
f_statistic, p_value = stats.f_oneway(group1, group2, group3)
print(f"F统计量: {f_statistic}")
print(f"p值: {p_value}")
# 判断显著性水平
alpha = 0.05
if p_value < alpha:
print("拒绝零假设:至少有一组数据的均值显著不同。")
else:
print("接受零假设:所有组数据的均值没有显著差异。")
(3)相关性分析
相关性分析用于衡量两个或多个变量之间的关系,包括线性相关性和非线性相关性。在Python中,可以计算Pearson相关系数、Spearman秩相关系数等来度量相关性的强度和方向。 -** Pearson 相关系数(皮尔逊相关系数)** 核心定义
衡量两个变量之间线性相关关系的强度和方向,取值范围为 [-1, 1]。
- 取值 = 1:完全正线性相关(一个变量增,另一个同步增,呈直线);
- 取值 =-1:完全负线性相关(一个变量增,另一个同步减,呈直线);
- 取值 = 0:无线性相关(但可能存在非线性关系)。
Pytho代码示例 Pearson相关系数:
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据框
data = {'X': [1, 2, 3, 4, 5],
'Y': [2, 3, 4, 5, 6]}
df = pd.DataFrame(data)
# 计算Pearson相关系数
corr_coefficient = df['X'].corr(df['Y'])
print(f"Pearson相关系数: {corr_coefficient}")
# 绘制散点图
plt.scatter(df['X'], df['Y'])
plt.xlabel('X')
plt.ylabel('Y')
plt.title('X与Y的关系')
plt.show()
- Spearman 秩相关系数(斯皮尔曼相关系数)
核心定义
衡量两个变量之间单调关系的强度和方向,取值范围同样为 [-1, 1],属于 “非参数方法”(不依赖数据分布)。
- 单调关系:变量 A 增大时,变量 B 始终增大(或始终减小),但不一定是直线(可能是曲线);
- 取值 = 1:完全正单调相关;取值 =-1:完全负单调相关;取值 = 0:无单调相关。
二、数据可视化
数据可视化是将数据转化为图形或图表的过程,以更直观和易于理解的方式呈现数据信息。 可视化有助于发现趋势、模式和异常,同时帮助与他人共享数据分析结果。
常见数据可视化类型:
- 直方图(Histogram):用于展示数据的分布情况,特别适用于连续型数据。
- 密度图(Density Plot):用于估计数据分布的平滑版本,通常基于直方图生成。
- 箱线图(Box Plot):用于可视化数据的中位数、四分位数和异常值,帮助识别数据的分散程度。
- 小提琴图(Violin Plot):结合了箱线图和密度图的特点,展示了数据分布的形状和分散程度。
- 散点图(Scatter Plot):用于显示两个变量之间的关系,有助于观察数据的相关性。
- 线图(Line Plot):用于显示随时间变化的数据趋势,特别适用于时间序列数据。
- 热力图(Heatmap):用于可视化矩阵数据的热度,通常用颜色表示数值大小。
- 地图可视化(Geospatial Visualization):用于地理数据的可视化,包括地图、点状地图和热力图。
Python 代码示例:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# 创建示例数据框
data = {'Age': [25, 30, 35, 40, 45, 50, 55, 60, 65, 70],
'Salary': [50000, 60000, 75000, 80000, 90000, 95000, 100000, 110000, 120000, 130000]}
df = pd.DataFrame(data)
# 创建直方图
plt.hist(df['Age'], bins=4, color='skyblue', edgecolor='black')
plt.xlabel('年龄')
plt.ylabel('频数')
plt.title('年龄分布直方图')
plt.show()
# 创建散点图
sns.scatterplot(data=df, x='Age', y='Salary', color='blue')
plt.xlabel('年龄')
plt.ylabel('薪水')
plt.title('年龄与薪水的散点图')
plt.show()
# 创建箱线图
sns.boxplot(data=df, x='Age', color='green')
plt.xlabel('年龄')
plt.title('年龄的箱线图')
plt.show()
# 创建热力图
correlation_matrix = df.corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('相关性热力图')
plt.show()