Обмен технологиями

Распространенные проблемы с большими данными: произвольные и грязные

2024-07-08

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

Представьте, что вы только что присоединились к крупному предприятию, которое утверждает, что проходит «цифровую трансформацию» в качестве инженера по разработке больших данных. В первую неделю работы вы полны энтузиазма и вам не терпится потренировать мышцы и использовать свои навыки для принятия решений на основе данных в компании.
изображение.png

Однако, когда вы начинаете глубже копаться в инфраструктуре и процессах данных вашей компании, вы начинаете понимать, что предстоящие задачи намного серьезнее, чем вы ожидали:

  • Вы пытаетесь получить некоторые исторические данные о продажах для анализа, но обнаруживаете, что данные отдела продаж хранятся в старой базе данных, полностью изолированной от основной системы компании.
  • Когда вы попытаетесь интегрировать данные о клиентах из разных отделов, вы обнаружите, что каждый отдел использует свой формат идентификатора клиента, что чрезвычайно затрудняет сопоставление данных.
  • Вы пишете сценарий обработки данных, но во время выполнения обнаруживаете множество проблем с качеством данных, включая пропущенные значения, выбросы и очевидный неправильный ввод.
  • Когда вы спрашиваете, что означают некоторые поля данных, никто не может дать вам четкого ответа, и вы не можете найти соответствующий словарь данных или документацию.
  • Вы предлагаете перенести некоторые конфиденциальные данные в облако для обработки, но команда ИТ-безопасности выражает серьезную обеспокоенность тем, что это может создать риск утечки данных.
  • Вы разрабатываете прогнозную модель, которая работает хорошо, но когда вы показываете ее бизнесу, они говорят, что не понимают, что означают данные.

Столкнувшись с этими проблемами, вы понимаете, что до достижения настоящего принятия решений на основе данных в этой компании еще предстоит пройти долгий путь. Вы решаете систематически разобраться в этих проблемах, чтобы лучше их понять и решить.

Распространенные проблемы с большими данными

1. Один — остров данных

изображение.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. Нарушение – сбой в цепочке создания стоимости данных.

изображение.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. Отсутствие стандартов, управления, данных и т. д.

Эта проблема затрагивает многие аспекты управления данными, включая отсутствие единых стандартов, механизмов управления данными, необходимых данных, стандартизированных процессов, специализированных организаций и систем управления и т. д.

изображение.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. Сложность. Данные сложно получить, понять и отследить.

Эта проблема связана с доступностью, понятностью и отслеживаемостью данных.

пример:

  • Исторические данные компании хранятся в устаревших системах, что затрудняет доступ к данным и их понимание новыми сотрудниками.
  • Некоторые результаты проекта анализа данных невозможно отследить до исходного источника данных, что влияет на достоверность результатов.
    изображение.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. Грязно – плохое качество данных

Проблемы качества данных включают неточности, неполноту, несогласованность, дублирование и т. д.

изображение.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']