技术共享

大数据中的常见数据问题:独断脏

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

想象你刚刚入职一家声称正在进行"数字化转型"的大型企业,担任大数据开发工程师。在入职的第一周,你满怀热情,迫不及待地想要大展拳脚,用你的技能来推动公司的数据驱动决策。
image.png

然而,随着你开始深入了解公司的数据基础设施和流程,你逐渐意识到面前的挑战比你预想的要大得多:

  • 你试图获取一些历史销售数据进行分析,但发现销售部门的数据存储在一个与公司主系统完全隔离的老旧数据库中。
  • 当你尝试整合来自不同部门的客户数据时,你发现每个部门都使用不同的客户ID格式,使得数据匹配变得极其困难。
  • 你编写了一个数据处理脚本,但在运行时发现大量的数据质量问题,包括缺失值、异常值和明显的错误输入。
  • 当你询问某些数据字段的含义时,没有人能给你一个明确的答案,而且你找不到任何相关的数据字典或文档。
  • 你提出要将一些敏感数据传输到云端进行处理,但IT安全团队表示严重担忧,认为这可能会带来数据泄露的风险。
  • 你开发的一个预测模型表现良好,但当你向业务部门展示时,他们表示看不懂这些数据意味着什么。

面对这些挑战,你意识到在这家公司实现真正的数据驱动决策还有很长的路要走。你决定系统地梳理这些问题,以便更好地理解和解决它们。

大数据中的常见数据问题

1. 独 - 数据孤岛

image.png

数据孤岛是指信息系统或组织单元之间无法有效共享数据的情况。这导致了重复开发和资源浪费。

例子:

  • 一家大型零售公司的销售部门和库存管理部门使用不同的系统,无法实时共享数据。
  • 政府不同部门之间的信息系统不互通,导致公民需要重复提供相同信息。

代码示例(Python):

# 销售部门的数据库
sales_db = {
    "product_a": {"sales": 1000, "revenue": 50000},
    "product_b": {"sales": 800, "revenue": 40000}
}

# 库存部门的数据库
inventory_db = {
    "product_a": {"stock": 500},
    "product_b": {"stock": 200}
}

# 由于数据孤岛,我们无法直接获取销售和库存的综合信息
# 需要手动整合数据
def get_product_info(product):
    if product in sales_db and product in inventory_db:
        return {
            "sales": sales_db[product]["sales"],
            "revenue": sales_db[product]["revenue"],
            "stock": inventory_db[product]["stock"]
        }
    return None

print(get_product_info("product_a"))

2. 断 - 数据价值链断层

image.png

数据价值链断层指的是数据从收集到最终利用的过程中出现断裂,导致数据价值无法充分发挥。

例子:

  • 一家电商平台收集了大量用户浏览数据,但分析团队缺乏相应的技能来解读这些数据。
  • 医疗机构收集了患者的基因数据,但缺乏将这些数据转化为个性化治疗方案的能力。

代码示例(Python):

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 假设我们有用户浏览数据
df = pd.DataFrame({
    'user_id': range(1000),
    'page_views': np.random.randint(1, 100, 1000),
    'time_spent': np.random.randint(10, 3600, 1000),
    'purchases': np.random.randint(0, 5, 1000)
})

# 尝试建立一个预测模型
X = df[['page_views', 'time_spent']]
y = df['purchases']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)

# 模型评分
print(f"Model Score: {model.score(X_test, y_test)}")

# 但是,如果分析团队不理解这个模型或不知道如何解释结果,
# 那么这个模型就无法为业务决策提供有价值的指导

3. 缺 - 标准、治理、数据等缺失

这个问题涉及到数据管理的多个方面,包括缺乏统一标准、数据治理机制、必要数据、规范流程、专门组织和管理制度等。

image.png

例子:

  • 一家跨国公司在不同国家的分支机构使用不同的客户信息格式,导致数据整合困难。
  • 一个研究项目缺少关键的人口统计数据,影响了分析的准确性。

代码示例(Python):

# 假设我们有来自不同国家的客户数据,格式不统一
us_customers = [
    {"name": "John Doe", "phone": "1234567890"},
    {"name": "Jane Smith", "phone": "0987654321"}
]

uk_customers = [
    {"full_name": "David Brown", "tel": " 44 1234567890"},
    {"full_name": "Emma Wilson", "tel": " 44 0987654321"}
]

# 由于缺乏统一标准,我们需要手动处理数据
def standardize_customer(customer, country):
    if country == "US":
        return {
            "full_name": customer["name"],
            "phone_number": " 1 "   customer["phone"]
        }
    elif country == "UK":
        return {
            "full_name": customer["full_name"],
            "phone_number": customer["tel"]
        }

# 标准化数据
standardized_customers = (
    [standardize_customer(c, "US") for c in us_customers]  
    [standardize_customer(c, "UK") for c in uk_customers]
)

print(standardized_customers)

4. 难 - 数据难以获取、理解和追溯

这个问题涉及到数据的可访问性、可理解性和可追溯性。

例子:

  • 一家公司的历史数据存储在旧系统中,新员工难以访问和理解这些数据。
  • 一个数据分析项目中的某些结果无法追溯到原始数据源,影响了结果的可信度。
    image.png

代码示例(Python):

import hashlib
import json
from datetime import datetime

class DataRecord:
    def __init__(self, data, source):
        self.data = data
        self.source = source
        self.timestamp = datetime.now().isoformat()
        self.hash = self._calculate_hash()

    def _calculate_hash(self):
        record = json.dumps({"data": self.data, "source": self.source, "timestamp": self.timestamp})
        return hashlib.sha256(record.encode()).hexdigest()

    def __str__(self):
        return f"Data: {self.data}, Source: {self.source}, Timestamp: {self.timestamp}, Hash: {self.hash}"

# 创建一些数据记录
record1 = DataRecord("User A purchased Product X", "Sales System")
record2 = DataRecord("Product X inventory decreased by 1", "Inventory System")

print(record1)
print(record2)

# 这种方法可以帮助追踪数据的来源和变化,但仍然需要额外的系统来管理这些记录

5. 脏 - 数据质量差

数据质量问题包括不准确、不完整、不一致、重复等情况。

image.png

例子:

  • 客户数据库中存在大量重复或过时的联系信息。
  • 传感器数据中包含异常值,影响了数据分析的准确性。

代码示例(Python):

import pandas as pd
import numpy as np

# 创建一个包含一些"脏"数据的DataFrame
df = pd.DataFrame({
    'name': ['John', 'Jane', 'John', 'Bob', 'Alice', np.nan],
    'age': [30, 25, 30, -5, 200, 35],
    'email': ['[email protected]', 'jane@example', '[email protected]', '[email protected]', '[email protected]', 'invalid']
})

print("Original data:")
print(df)

# 数据清洗
def clean_data(df):
    # 删除重复行
    df = df.drop_duplicates()
    
    # 处理缺失值
    df['name'] = df['name'].fillna('Unknown')
    
    # 修正异常值
    df.loc[df['age']