第6章 数据质量评估
理论4课时 + 上机4课时 | 难度:中等
6.1 数据质量的五个维度
评价数据好不好,有五个标准维度: 完整性:数据有没有缺?缺了多少? 准确性:数据对不对?有没有填错的? 一致性:同一数据在不同地方是否一致? 及时性:数据是不是最新的?多久更新一次? 唯一性:有没有重复记录?
6.2 完整性评估
完整性 = 有值的记录数 / 总记录数。可以用这个指标量化数据缺失的严重程度。
import pandas as pd
# 计算每列的完整率
completeness = (1 - df.isnull().sum() / len(df)) * 100
print('各列完整率(%):')
print(completeness)
# 计算整表的完整率
total_cells = df.shape[0] * df.shape[1]
missing_cells = df.isnull().sum().sum()
overall = (1 - missing_cells / total_cells) * 100
print(f'整体完整率: {overall:.2f}%')
# 完整率低于90%的列标红
low_cols = completeness[completeness < 90].index.tolist()
print(f'完整率低于90%的列: {low_cols}')
6.3 准确性评估
准确性评估需要结合业务规则来判断数据是否合理。比如手机号应该是11位,邮箱应该包含@符号。
# 规则1:手机号必须是11位数字
phone_valid = df['手机号'].astype(str).str.match(r'^\d{11}$')
print(f'手机号有效比例: {phone_valid.mean()*100:.2f}%')
# 规则2:邮箱必须包含@
email_valid = df['邮箱'].str.contains('@', na=False)
print(f'邮箱有效比例: {email_valid.mean()*100:.2f}%')
# 规则3:年龄必须在合理范围
age_valid = (df['年龄'] >= 0) & (df['年龄'] <= 120)
print(f'年龄合理比例: {age_valid.mean()*100:.2f}%')
# 综合准确率
accuracy = (phone_valid & email_valid & age_valid).mean() * 100
print(f'综合准确率: {accuracy:.2f}%')
6.4 一致性评估
一致性检查数据在不同列或不同表中是否矛盾。比如"出生日期"和"年龄"应该对应,"省份"和"城市"应该匹配。
# 检查日期一致性:注册日期不应晚于最后登录日期
inconsistent = df[df['注册日期'] > df['最后登录日期']]
print(f'日期不一致记录数: {len(inconsistent)}')
# 检查枚举值一致性:性别只能是男/女
valid_gender = df['性别'].isin(['男', '女'])
print(f'性别规范比例: {valid_gender.mean()*100:.2f}%')
# 检查金额一致性:订单金额 = 单价 * 数量
df['计算金额'] = df['单价'] * df['数量']
amount_match = (df['订单金额'] - df['计算金额']).abs() < 0.01
print(f'金额一致比例: {amount_match.mean()*100:.2f}%')
6.5 及时性评估
及时性关注数据是否足够新鲜。比如股票价格必须是实时的,昨天的价格对今天的交易决策帮助不大。
from datetime import datetime
# 计算数据年龄(距离现在多久)
now = datetime.now()
df['数据年龄_天'] = (now - pd.to_datetime(df['采集时间'])).dt.days
# 统计各年龄段的数据量
print(df['数据年龄_天'].value_counts().sort_index())
# 及时性指标:24小时内的数据占比
timely = (df['数据年龄_天'] <= 1).mean() * 100
print(f'24小时内数据占比: {timely:.2f}%')
6.6 生成数据质量报告
把各项质量指标汇总成一份报告,方便查看和存档。
report = {
'总记录数': len(df),
'总字段数': len(df.columns),
'整体完整率(%)': round((1 - df.isnull().sum().sum() / (df.shape[0]*df.shape[1])) * 100, 2),
'重复记录数': df.duplicated().sum(),
'重复率(%)': round(df.duplicated().mean() * 100, 2),
}
for k, v in report.items():
print(f'{k}: {v}')
# 保存报告
pd.DataFrame([report]).to_csv('quality_report.csv', index=False)
自学拓展素材
- 阅读材料:DAMA-DMBOK数据管理知识体系(数据质量章节)
- 视频教程:B站搜索"数据质量评估方法"
- 工具:Great Expectations(Python数据验证库,开源)
- 案例学习:搜索"数据质量报告模板",了解企业级报告格式
- 实训数据集:使用自己清洗过的数据,编写完整质量评估报告
自学自检小问题
- 数据质量的五个维度分别是什么?各举一个实际例子。
- 如何计算一列数据的完整率?写出代码。
- 一致性检查和准确性检查有什么区别?
- 如果你的数据是"一周前的气温数据",在及时性维度上得分高还是低?为什么?
- 数据质量报告应该包含哪些核心指标?
基础巩固层练习
0/5
第1题
选择题
数据质量维度中,"数据是否最新"属于哪个维度?
答案解析
及时性关注数据是否足够新鲜、是否是最新的。完整性关注缺失,准确性关注正确性,一致性关注前后是否矛盾。
第2题
选择题
"同一客户在不同系统中姓名不一致"属于哪个数据质量问题?
答案解析
同一数据在不同地方不一致,这是典型的数据一致性问题。
第3题
判断题
完整性 = 有值的记录数 / 总记录数。
答案解析
完整性的计算公式确实是:完整性 = 有值的记录数 / 总记录数,可以用(1 - 缺失率)来计算。
第4题
选择题
以下哪个不是数据质量的评估维度?
答案解析
数据质量的五个维度是:完整性、准确性、一致性、及时性、唯一性。美观性不是数据质量评估维度。
第5题
填空题
数据质量的五个维度是:完整性、______、一致性、及时性、唯一性。
答案解析
数据质量的五个维度是:完整性、准确性、一致性、及时性、唯一性。
0/0