py数据科学学习笔记day3-Python基本统计分析和可视化

79 阅读10分钟

一、统计

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则左偏,值越大越偏。

image.png

3. python中的统计分级

(1) 描述性统计

描述性统计是用来总结和描述数据集的统计方法,通常包括 均值、中位数、标准差、方差、最小值、最大值等。这些统计指标帮助我们了解数据的中心趋势、分散程度和分布形状

(2)假设检验

假设检验是一种统计方法,用于评估一个关于数据总体的假设是否成立。在Python中,可以使用Scipy库进行假设检验,如t检验、ANOVA等,以确定样本之间或组之间的显著性差异。

  • t检验

t 检验的核心是用统计学方法判断 “两组数据的均值差异” 是抽样误差导致的偶然现象,还是总体真实存在的差异,适用于小样本(n<30)或总体标准差未知的场景

image.png

自由度和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 值越大,说明 “组间差异” 远大于 “组内随机波动”,越可能存在真实差异。 image.png

  • 单位变异 (Total Variation)
    总变异,表示所有数据点与总平均值之间的差异总和,反映数据的整体离散程度。

  • 组间变异 (Between-group Variation)
    不同组之间的差异,反映因不同处理或条件导致的组间差异。

  • 组内变异 (Within-group Variation)
    同一组内部数据点的变异,反映随机误差或个体差异。

  • MS between (Mean Square Between)
    组间均方,计算公式为 SSbetweendfbetween\frac{SS_{\text{between}}}{df_{\text{between}}},用于估计组间变异。

  • MS within (Mean Square Within)
    组内均方,计算公式为 SSwithindfwithin\frac{SS_{\text{within}}}{df_{\text{within}}},用于估计组内随机误差。

  • SS between (Sum of Squares Between)
    组间平方和,表示各组均值与总均值之间差异的加权平方和。

  • df between (Degrees of Freedom Between)
    组间自由度,计算公式为 k1k - 1,其中 kk 为组数。

  • SS within (Sum of Squares Within)
    组内平方和,表示各组内数据点与该组均值之间差异的平方和。

  • df within (Degrees of Freedom Within)
    组内自由度,计算公式为 NkN - k,其中 NN 为总样本量,kk 为组数。

    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:无单调相关。

二、数据可视化

数据可视化是将数据转化为图形或图表的过程,以更直观和易于理解的方式呈现数据信息。 可视化有助于发现趋势、模式和异常,同时帮助与他人共享数据分析结果。

常见数据可视化类型:

  1. 直方图(Histogram):用于展示数据的分布情况,特别适用于连续型数据。
  2. 密度图(Density Plot):用于估计数据分布的平滑版本,通常基于直方图生成。
  3. 箱线图(Box Plot):用于可视化数据的中位数、四分位数和异常值,帮助识别数据的分散程度。
  4. 小提琴图(Violin Plot):结合了箱线图和密度图的特点,展示了数据分布的形状和分散程度。
  5. 散点图(Scatter Plot):用于显示两个变量之间的关系,有助于观察数据的相关性。
  6. 线图(Line Plot):用于显示随时间变化的数据趋势,特别适用于时间序列数据。
  7. 热力图(Heatmap):用于可视化矩阵数据的热度,通常用颜色表示数值大小。
  8. 地图可视化(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()