Skip to content

第七讲(上) 一元统计与Python应用

一、课程介绍

Python是一种广泛使用的高级编程语言,它在数据分析和统计领域有着强大的应用。通过使用Python进行基本统计分析,我们可以对数据进行描述、推断和预测。本课程将涵盖Python基本统计分析的主要内容,包括数据的描述性统计、概率分布、假设检验、相关性分析和回归分析等。通过本课程的学习,你将能够使用Python进行基本的统计分析,并为更高级的数据分析和机器学习打下坚实的基础。

二、Python统计分析基础

(一)Python统计分析相关库

1. NumPy

  • NumPy是Python中用于科学计算的基础库,提供了强大的数组操作功能。它支持大量的维度数组与矩阵运算,此外也提供了大量的数学函数库。

  • 安装pip install numpy

  • 示例

    import numpy as np
    
    # 创建数组
    data = np.array([1, 2, 3, 4, 5])
    print(data)
    
    # 数组运算
    print(data + 1)  # 输出 [2 3 4 5 6]
    print(data * 2)  # 输出 [2 4 6 8 10]
    

2. Pandas

  • Pandas是一个开源的Python数据分析库,提供了强大的数据结构和数据分析工具。它基于NumPy构建,提供了DataFrame和Series等数据结构,方便进行数据清洗、筛选、分组等操作。

  • 安装pip install pandas

  • 示例

    import pandas as pd
    
    # 创建DataFrame
    data = {"Name": ["Alice", "Bob", "Charlie"],
            "Age": [25, 30, 35],
            "City": ["New York", "Los Angeles", "Chicago"]}
    df = pd.DataFrame(data)
    print(df)
    
    # 数据筛选
    print(df[df["Age"] > 30])  # 输出 Age > 30 的行
    

3. SciPy

  • SciPy是基于NumPy的一个扩展库,提供了大量的科学计算功能,包括统计分析、优化、信号处理等。

  • 安装pip install scipy

  • 示例

    from scipy import stats
    
    # 计算描述性统计量
    data = [1, 2, 3, 4, 5]
    print(stats.describe(data))
    

4. Statsmodels

  • Statsmodels是一个Python模块,提供了许多统计模型的估计和测试功能,包括线性回归、时间序列分析等。

  • 安装pip install statsmodels

  • 示例

    import statsmodels.api as sm
    
    # 创建数据
    X = [1, 2, 3, 4, 5]
    y = [2, 3, 5, 7, 11]
    X = sm.add_constant(X)  # 添加常数项
    
    # 拟合线性回归模型
    model = sm.OLS(y, X).fit()
    print(model.summary())
    

5. Matplotlib和Seaborn

  • Matplotlib和Seaborn是Python中用于数据可视化的库。Matplotlib提供了基本的绘图功能,而Seaborn则在Matplotlib的基础上提供了更高级的接口和美观的默认样式。

  • 安装

    pip install matplotlib seaborn
    
  • 示例

    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # 绘制散点图
    sns.scatterplot(x=[1, 2, 3, 4, 5], y=[2, 3, 5, 7, 11])
    plt.title("Scatter Plot Example")
    plt.show()
    

(二)数据类型和数据结构

1. 数据类型

  • Python中的数据类型包括整数(int)、浮点数(float)、字符串(str)、布尔值(bool)等。

  • 示例

    a = 10  # 整数
    b = 3.14  # 浮点数
    c = "Hello, World!"  # 字符串
    d = True  # 布尔值
    print(type(a))  # 输出 <class 'int'>
    print(type(b))  # 输出 <class 'float'>
    print(type(c))  # 输出 <class 'str'>
    print(type(d))  # 输出 <class 'bool'>
    

2. 数据结构

  • 列表(List)

    :有序的集合,可以存储多个元素,支持动态扩展和修改。

    • 示例

    my_list = [1, 2, 3, 4, 5]
    print(my_list[0])  # 输出 1
    my_list.append(6)  # 添加元素
    print(my_list)  # 输出 [1, 2, 3, 4, 5, 6]
    
  • 元组(Tuple)

    :有序的集合,一旦创建,不能修改。

    • 示例

    my_tuple = (1, 2, 3, 4, 5)
    print(my_tuple[0])  # 输出 1
    
  • 字典(Dictionary)

    :无序的键值对集合,通过键访问值。

    • 示例

    my_dict = {"name": "Alice", "age": 25, "city": "New York"}
    print(my_dict["name"])  # 输出 Alice
    my_dict["country"] = "USA"  # 添加键值对
    print(my_dict)  # 输出 {'name': 'Alice', 'age': 25, 'city': 'New York', 'country': 'USA'}
    
  • 集合(Set)

    :无序的不重复元素集合,支持集合运算(如并集、交集、差集等)。

    • 示例

    my_set = {1, 2, 3, 4, 5}
    print(my_set)  # 输出 {1, 2, 3, 4, 5}
    my_set.add(6)  # 添加元素
    print(my_set)  # 输出 {1, 2, 3, 4, 5, 6}
    

三、描述性统计

(一)集中趋势

1. 均值(Mean)

  • 均值是所有数据的总和除以数据的数量。

  • 示例

    import numpy as np
    
    data = [1, 2, 3, 4, 5]
    mean = np.mean(data)
    print(mean)  # 输出 3.0
    

2. 中位数(Median)

  • 中位数是将数据从小到大排序后位于中间的值。

  • 示例

    median = np.median(data)
    print(median)  # 输出 3.0
    

3. 众数(Mode)

  • 众数是数据中出现次数最多的值。

  • 示例

    from scipy import stats
    
    mode = stats.mode(data)
    print(mode)  # 输出 ModeResult(mode=array([3]), count=array([1]))
    

(二)离散程度

1. 极差(Range)

  • 极差是数据中的最大值与最小值之差。

  • 示例

    range_val = np.ptp(data)
    print(range_val)  # 输出 4
    

2. 方差(Variance)

  • 方差是各数据与其均值差的平方的平均值。

  • 示例

    variance = np.var(data)
    print(variance)  # 输出 2.0
    

3. 标准差(Standard Deviation)

  • 标准差是方差的平方根。

  • 示例

    std_dev = np.std(data)
    print(std_dev)  # 输出 1.4142135623730951
    

4. 变异系数(Coefficient of Variation)

  • 变异系数是标准差与均值的比值。

  • 示例

    cv = std_dev / mean
    print(cv)  # 输出 0.4714045207910317
    

(三)分布形状

1. 偏度(Skewness)

  • 偏度是数据分布的对称性度量。

  • 示例

    skewness = stats.skew(data)
    print(skewness)  # 输出 0.0
    

2. 峰度(Kurtosis)

  • 峰度是数据分布的尖峭度或尾部厚度的度量。

  • 示例

    kurtosis = stats.kurtosis(data)
    print(kurtosis)  # 输出 -1.3
    

四、概率分布

(一)离散分布

1. 伯努利分布(Bernoulli Distribution)

  • 伯努利分布是单次随机试验的结果只有两种可能(成功或失败)的概率分布。

  • 示例

    from scipy.stats import bernoulli
    
    # 参数 p 为成功概率
    p = 0.7
    bern = bernoulli(p)
    
    # 计算概率质量函数
    print(bern.pmf(1))  # 输出 0.7
    print(bern.pmf(0))  # 输出 0.3
    

2. 二项分布(Binomial Distribution)

  • 二项分布是 n 次独立的伯努利试验中成功的次数的概率分布。

  • 示例

    from scipy.stats import binom
    
    # 参数 n 为试验次数,p 为成功概率
    n = 10
    p = 0.7
    binom_dist = binom(n, p)
    
    # 计算概率质量函数
    print(binom_dist.pmf(7))  # 输出 0.2668279320000001
    

3. 泊松分布(Poisson Distribution)

  • 泊松分布是单位时间内随机事件发生次数的概率分布。

  • 示例

    from scipy.stats import poisson
    
    # 参数 mu 为平均发生率
    mu = 3
    poisson_dist = poisson(mu)
    
    # 计算概率质量函数
    print(poisson_dist.pmf(2))  # 输出 0.22404180765538775
    

(二)连续分布

1. 均匀分布(Uniform Distribution)

  • 均匀分布是区间内所有值出现概率相等的概率分布。

  • 示例

    from scipy.stats import uniform
    
    # 参数 loc 为区间下限,scale 为区间长度
    loc = 0
    scale = 1
    uniform_dist = uniform(loc, scale)
    
    # 计算概率密度函数
    print(uniform_dist.pdf(0.5))  # 输出 1.0
    

2. 正态分布(Normal Distribution)

  • 正态分布是连续随机变量的概率分布,其概率密度函数呈钟形。

  • 示例

    from scipy.stats import norm
    
    # 参数 loc 为均值,scale 为标准差
    loc = 0
    scale = 1
    norm_dist = norm(loc, scale)
    
    # 计算概率密度函数
    print(norm_dist.pdf(0))  # 输出 0.3989422804014327
    

3. 指数分布(Exponential Distribution)

  • 指数分布是描述泊松过程中事件之间时间的概率分布。

  • 示例

    from scipy.stats import expon
    
    # 参数 scale 为平均发生时间间隔
    scale = 1
    expon_dist = expon(scale=scale)
    
    # 计算概率密度函数
    print(expon_dist.pdf(1))  # 输出 0.36787944117144233
    

五、假设检验

(一)t检验

1. 单样本t检验(One-Sample t-Test)

  • 单样本t检验用于检验样本均值是否与已知的总体均值相等。

  • 示例

    from scipy import stats
    
    # 样本数据
    sample = [1, 2, 3, 4, 5]
    # 已知总体均值
    population_mean = 3
    
    # 进行单样本t检验
    t_stat, p_val = stats.ttest_1samp(sample, population_mean)
    print(t_stat)  # 输出 t统计量
    print(p_val)  # 输出 p值
    

2. 双样本t检验(Two-Sample t-Test)

  • 双样本t检验用于检验两个独立样本的均值是否相等。

  • 示例

    # 样本数据
    sample1 = [1, 2, 3, 4, 5]
    sample2 = [2, 3, 4, 5, 6]
    
    # 进行双样本t检验
    t_stat, p_val = stats.ttest_ind(sample1, sample2)
    print(t_stat)  # 输出 t统计量
    print(p_val)  # 输出 p值
    

(二)卡方检验(Chi-Square Test)

1. 独立性检验(Chi-Square Test of Independence)

  • 独立性检验用于检验两个分类变量之间是否存在关联。

  • 示例

    from scipy.stats import chi2_contingency
    
    # 列联表数据
    contingency_table = [[10, 10, 20], [20, 20, 10]]
    
    # 进行卡方检验
    chi2, p_val, dof, expected = chi2_contingency(contingency_table)
    print(chi2)  # 输出 卡方值
    print(p_val)  # 输出 p值
    

2. 拟合优度检验(Chi-Square Goodness of Fit Test)

  • 拟合优度检验用于检验样本数据是否符合某个理论分布。

  • 示例

    # 样本数据
    observed = [10, 20, 30]
    # 理论分布
    expected = [15, 15, 30]
    
    # 进行拟合优度检验
    chi2, p_val = stats.chisquare(observed, expected)
    print(chi2)  # 输出 卡方值
    print(p_val)  # 输出 p值
    

(三)方差分析(ANOVA)

1. 单因素方差分析(One-Way ANOVA)

  • 单因素方差分析用于检验多个样本的均值是否相等。

  • 示例

    from scipy.stats import f_oneway
    
    # 样本数据
    sample1 = [1, 2, 3, 4, 5]
    sample2 = [2, 3, 4, 5, 6]
    sample3 = [3, 4, 5, 6, 7]
    
    # 进行单因素方差分析
    f_stat, p_val = f_oneway(sample1, sample2, sample3)
    print(f_stat)  # 输出 F统计量
    print(p_val)  # 输出 p值
    

六、相关性分析

(一)皮尔逊相关系数(Pearson Correlation Coefficient)

  • 皮尔逊相关系数用于衡量两个变量之间的线性相关程度。

  • 示例

from scipy.stats import pearsonr

# 变量数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]

# 计算皮尔逊相关系数
corr, p_val = pearsonr(x, y)
print(corr)  # 输出 相关系数
print(p_val)  # 输出 p值

(二)斯皮尔曼秩相关系数(Spearman Rank Correlation Coefficient)

  • 斯皮尔曼秩相关系数用于衡量两个变量之间的单调相关程度。

  • 示例

from scipy.stats import spearmanr

# 变量数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]

# 计算斯皮尔曼秩相关系数
corr, p_val = spearmanr(x, y)
print(corr)  # 输出 相关系数
print(p_val)  # 输出 p值

(三)肯德尔秩相关系数(Kendall Tau Correlation Coefficient)

  • 肯德尔秩相关系数用于衡量两个变量之间的单调相关程度。

  • 示例

from scipy.stats import kendalltau

# 变量数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]

# 计算肯德尔秩相关系数
corr, p_val = kendalltau(x, y)
print(corr)  # 输出 相关系数
print(p_val)  # 输出 p值

七、回归分析

(一)简单线性回归(Simple Linear Regression)

  • 简单线性回归用于建立一个自变量与一个因变量之间的线性关系。

  • 示例

import statsmodels.api as sm

# 自变量和因变量
X = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
X = sm.add_constant(X)  # 添加常数项

# 拟合线性回归模型
model = sm.OLS(y, X).fit()
print(model.summary())

(二)多元线性回归(Multiple Linear Regression)

  • 多元线性回归用于建立多个自变量与一个因变量之间的线性关系。

  • 示例

# 自变量和因变量
X = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
y = [2, 3, 5, 7, 11]
X = sm.add_constant(X)  # 添加常数项

# 拟合多元线性回归模型
model = sm.OLS(y, X).fit()
print(model.summary())

(三)逻辑回归(Logistic Regression)

  • 逻辑回归用于处理因变量为二分类的情况。

  • 示例

from sklearn.linear_model import LogisticRegression

# 自变量和因变量
X = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
y = [0, 0, 1, 1, 1]

# 拟合逻辑回归模型
model = LogisticRegression()
model.fit(X, y)

# 预测
predictions = model.predict(X)
print(predictions)

八、总结与实践

通过本课程的学习,你已经掌握了如何使用Python进行基本的统计分析。你可以使用NumPy和Pandas进行数据处理,使用SciPy进行描述性统计和概率分布计算,使用Statsmodels进行假设检验、相关性分析和回归分析。此外,你还可以使用Matplotlib和Seaborn进行数据可视化。

为了更好地掌握这些技能,建议你通过实际项目进行练习。例如,可以尝试加载一个实际的数据集,使用Python进行描述性统计分析,进行假设检验,计算相关性,拟合回归模型,并对结果进行可视化。通过实践,你将更深入地理解Python在统计分析中的应用。

九、参考文献

  1. Python官方文档:https://docs.python.org/
  2. NumPy官方文档:https://numpy.org/doc/
  3. Pandas官方文档:https://pandas.pydata.org/docs/
  4. SciPy官方文档:https://docs.scipy.org/doc/scipy/
  5. Statsmodels官方文档:https://www.statsmodels.org/stable/index.html
  6. Matplotlib官方文档:https://matplotlib.org/stable/contents.html
  7. Seaborn官方文档:https://seaborn.pydata.org/