未记录事实核验 · 状态:现行内容

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用边界与维护说明

本文适用于四种统计测量尺度的入门学习及示例数据的基础分析,不是仅凭尺度选择统计检验的规则;检验仍须满足研究设计、独立性及具体方法的条件。代码应在已导入 pandas、NumPy 和 Matplotlib 的环境中按文中顺序使用。两处排序取中间类别的写法仅适用于示例中的奇数个有效观测,偶数个定序观测不能直接平均类别编码,定序四分位数也不意味着类别间距可作数值运算。ratio_data_analysis 仅适用于至少两个严格正的有限数值,未提供输入校验,含零或负值的数据不能直接照搬其对数几何平均数计算。“温度偏好”的定距解释仅限于示例假设的摄氏温度读数,不适用于普通舒适度等级。本次仅作全文结构审阅,未执行代码或进行外部事实核验。

🗂️ 数据类型(Data Types in Statistics)

abstract 📋 本节概览

  • 🎯 学习目标:掌握统计学中的常见数据类型及其应用
  • 📚 前置知识:统计学是什么|统计学是什么
  • ⏱️ 预计用时:5分钟

🎯 核心概念

note 📖 **为什么数据类型很重要?**

数据类型决定了你能使用什么统计方法。选错方法可能导致错误结论!

直观理解:

  • 性别、颜色等只能比较"不同",不能比较"大小"
  • 满意度可以排序但间隔不一定相等
  • 身高、收入可以进行加减乘除运算

📊 四大数据类型详解

1. 🏷️ 定类数据 (Nominal Data)

特征:只能区分类别,无大小和顺序关系

典型例子:

  • 性别:男、女
  • 血型:A、B、AB、O
  • 专业:计算机、数学、物理
  • 地区:北京、上海、广州

适用统计方法:

  • 频数统计
  • 众数
  • 卡方检验
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 定类数据示例
gender_data = ['男', '女', '女', '男', '男', '女', '男', '女']
blood_type = ['A', 'B', 'O', 'AB', 'A', 'O', 'B', 'A']

# 频数统计
gender_counts = pd.Series(gender_data).value_counts()
print("性别分布:")
print(gender_counts)
print(f"众数(包含并列情况): {pd.Series(gender_data).mode().tolist()}")

# 可视化
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
gender_counts.plot(kind='bar')
plt.title('性别分布')
plt.ylabel('人数')

plt.subplot(1, 2, 2)
pd.Series(blood_type).value_counts().plot(kind='pie', autopct='%1.1f%%')
plt.title('血型分布')
plt.tight_layout()
plt.show()

2. 📏 定序数据 (Ordinal Data)

特征:有明确的顺序关系,但间隔不一定相等

典型例子:

  • 满意度:非常不满意 < 不满意 < 一般 < 满意 < 非常满意
  • 教育程度:小学 < 中学 < 大学 < 研究生
  • 疼痛等级:轻微 < 中等 < 严重
  • 产品评级:A+ > A > B+ > B > C

适用统计方法:

  • 中位数
  • 四分位数
  • 非参数检验(如Mann-Whitney U检验)
# 定序数据示例
satisfaction = ['满意', '非常满意', '一般', '不满意', '满意', '非常满意', '一般']
education = ['大学', '中学', '研究生', '大学', '中学', '大学', '研究生']

# 定义顺序
satisfaction_order = ['非常不满意', '不满意', '一般', '满意', '非常满意']
education_order = ['小学', '中学', '大学', '研究生']

# 转换为有序分类变量
df_ordinal = pd.DataFrame({
    '满意度': pd.Categorical(satisfaction, categories=satisfaction_order, ordered=True),
    '教育程度': pd.Categorical(education, categories=education_order, ordered=True)
})

print("满意度中位类别(本例为奇数个观测):", df_ordinal['满意度'].sort_values().iloc[len(df_ordinal) // 2])
print("教育程度分布:")
print(df_ordinal['教育程度'].value_counts().sort_index())

# 有序数据的可视化
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
df_ordinal['满意度'].value_counts().sort_index().plot(kind='bar')
plt.title('满意度分布(保持顺序)')
plt.xticks(rotation=45)

plt.subplot(1, 2, 2)
df_ordinal['教育程度'].value_counts().sort_index().plot(kind='bar')
plt.title('教育程度分布(保持顺序)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

3. 📐 定距数据 (Interval Data)

特征:有相等间隔,可以进行加减运算,但没有绝对零点

典型例子:

  • 温度(摄氏度、华氏度):20°C和10°C的差等于30°C和20°C的差
  • 时间(年份):2020年和2010年的差等于2010年和2000年的差
  • IQ分数:差值有意义,但不能说IQ 200是IQ 100的两倍

适用统计方法:

  • 均值、标准差
  • t检验
  • 方差分析
  • 相关分析
# 定距数据示例
temperatures = [20, 25, 18, 22, 27, 19, 24, 21]  # 温度(摄氏度)
years = [2018, 2019, 2020, 2021, 2022, 2023, 2024]  # 年份
iq_scores = [100, 110, 95, 120, 105, 98, 115, 108]  # IQ分数

# 计算统计量
temp_stats = {
    '均值': np.mean(temperatures),
    '中位数': np.median(temperatures),
    '标准差': np.std(temperatures),
    '极差': max(temperatures) - min(temperatures)
}

print("温度数据统计:")
for key, value in temp_stats.items():
    print(f"{key}: {value:.2f}")

# 定距数据特点:差值有意义
print(f"\n温度差值示例:")
print(f"25°C - 20°C = {25-20}°C")
print(f"22°C - 17°C = {22-17}°C")
print("这两个差值是相等的,具有相同的物理意义")

# 但不能说比值有意义
print(f"\n注意:不能说25°C是20°C的{25/20:.1f}倍热!")

4. 🔢 定比数据 (Ratio Data)

特征:有绝对零点,可以进行所有数学运算

典型例子:

  • 身高、体重:0表示没有
  • 收入:0表示没有收入
  • 年龄:0表示刚出生
  • 销售额:0表示没有销售

适用统计方法:

  • 可计算均值、标准差等统计量,但统计方法仍须满足各自的适用条件
  • 几何平均数:本文采用的对数计算方式要求数据严格为正
  • 变异系数:通常用于均值为正且具有有意义零点的数据
  • 参数检验:须结合研究设计、独立性及具体分布假设选择
# 定比数据示例
heights = [170, 165, 180, 175, 160, 185, 172, 168]  # 身高(cm)
incomes = [5000, 8000, 12000, 6000, 9000, 15000, 7000, 10000]  # 月收入(元)
ages = [25, 30, 35, 28, 32, 40, 26, 29]  # 年龄

# 定比数据的全面统计分析
def ratio_data_analysis(data, name):
    stats = {
        '算术平均数': np.mean(data),
        '几何平均数': np.exp(np.mean(np.log(data))),  # 定比数据特有
        '中位数': np.median(data),
        '众数(包含并列情况)': pd.Series(data).mode().tolist(),
        '标准差': np.std(data, ddof=1),
        '变异系数': np.std(data, ddof=1) / np.mean(data),  # 定比数据特有
        '极差': max(data) - min(data),
        '四分位距': np.percentile(data, 75) - np.percentile(data, 25)
    }
    
    print(f"\n{name}统计分析:")
    for key, value in stats.items():
        if isinstance(value, (int, float)):
            print(f"{key}: {value:.2f}")
        else:
            print(f"{key}: {value}")

ratio_data_analysis(heights, "身高")
ratio_data_analysis(incomes, "收入")

# 定比数据特点:比值有意义
print(f"\n定比数据的比值意义:")
print(f"身高180cm是身高90cm的{180/90}倍")
print(f"收入12000元是收入6000元的{12000/6000}倍")
print("这些比值具有实际意义!")

🎯 数据类型选择指南

📋 判断标准

def identify_data_type(data_description):
    """
    帮助判断数据类型
    """
    questions = [
        "1. 数据是否只能区分类别,无顺序关系?",
        "2. 数据是否有明确的顺序,但间隔不等?", 
        "3. 数据是否有相等间隔,但无绝对零点?",
        "4. 数据是否有绝对零点,比值有意义?"
    ]
    
    data_types = ["定类数据", "定序数据", "定距数据", "定比数据"]
    
    print("数据类型判断指南:")
    for i, question in enumerate(questions):
        print(f"{question} → {data_types[i]}")
    
    print(f"\n你的数据: {data_description}")
    print("请根据上述问题判断数据类型")

# 实际应用示例
examples = [
    "客户满意度评分(1-5分)",
    "员工姓名",
    "产品销售金额", 
    "温度读数",
    "学历等级"
]

for example in examples:
    identify_data_type(example)
    print("-" * 40)

🛠️ 统计方法对应表

数据类型 集中趋势 离散程度 适用检验 Python处理
定类 众数 - 卡方检验 astype('category')
定序 中位数 四分位距 非参数检验 pd.Categorical(ordered=True)
定距 均值 标准差 t检验、方差分析 数值类型
定比 均值、几何平均(本文算法要求严格正值) 标准差、变异系数(通常要求均值为正) 满足具体方法条件时选用参数检验 数值类型

💻 Python实战应用

# 综合示例:处理混合数据类型
def process_mixed_data():
    """处理包含多种数据类型的数据集"""
    
 # 创建混合数据
    data = {
        '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
        '性别': ['男', '女', '男', '女', '男'],  # 定类
        '教育': ['本科', '硕士', '博士', '本科', '硕士'],  # 定序
        '温度偏好': [20, 22, 18, 25, 21],  # 示例假设:偏好的摄氏温度读数,按定距尺度处理
        '收入': [8000, 12000, 18000, 9000, 15000],  # 定比
        '满意度': [4, 5, 3, 4, 5]  # 定序
    }
    
    df = pd.DataFrame(data)
    
 # 设置正确的数据类型
    df['性别'] = df['性别'].astype('category')
    df['教育'] = pd.Categorical(df['教育'], 
                              categories=['本科', '硕士', '博士'], 
                              ordered=True)
    df['满意度'] = pd.Categorical(df['满意度'], 
                                categories=[1, 2, 3, 4, 5], 
                                ordered=True)
    
    print("数据类型设置:")
    print(df.dtypes)
    print("\n" + "="*50)
    
 # 针对不同数据类型进行相应分析
    print("定类数据分析(性别):")
    print(df['性别'].value_counts())
    
    print("\n定序数据分析(教育程度):")
    print(f"众数(包含并列情况): {df['教育'].mode().tolist()}")
    print(f"中位类别(本例为奇数个观测): {df['教育'].sort_values().iloc[len(df) // 2]}")
    
    print("\n定距数据分析(温度偏好):")
    print(f"均值: {df['温度偏好'].mean():.1f}")
    print(f"标准差: {df['温度偏好'].std():.1f}")
    
    print("\n定比数据分析(收入):")
    print(f"算术平均数: {df['收入'].mean():.0f}")
    print(f"几何平均数: {df['收入'].apply(lambda x: x**(1/len(df['收入']))).prod():.0f}")
    print(f"变异系数: {df['收入'].std()/df['收入'].mean():.2f}")
    
    return df

# 运行综合示例
df_mixed = process_mixed_data()

⚠️ 常见错误与注意事项

🚫 典型错误

  1. 对定类数据计算均值:如对"专业编号"求平均
  2. 对定序数据进行等距运算:假设满意度1-2的差等于4-5的差
  3. 混淆定距和定比:对温度数据计算几何平均数
  4. 忽略数据类型:选择了不合适的统计方法

💡 最佳实践

  • 数据收集前明确每个变量的类型
  • 使用pandas的分类数据类型提高效率
  • 根据数据类型选择合适的可视化方法
  • 在统计分析前验证数据类型假设

🔗 相关知识

#统计学 #数据类型 #基础