未记录事实核验 · 状态:现行内容
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
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的差等于4-5的差
- 混淆定距和定比:对温度数据计算几何平均数
- 忽略数据类型:选择了不合适的统计方法
💡 最佳实践
- 数据收集前明确每个变量的类型
- 使用pandas的分类数据类型提高效率
- 根据数据类型选择合适的可视化方法
- 在统计分析前验证数据类型假设
🔗 相关知识
#统计学 #数据类型 #基础