数据仓库与数据挖掘课程设计

一、需求分析

       零售行业在竞争日益激烈的市场环境下,面临着诸多挑战和需求。从商品管理角度看,了解商品之间的关联关系对于优化商品陈列、制定促销策略至关重要。例如,发现某些商品在销售过程中频繁出现一起购买的情况,这不仅可以帮助企业合理安排商品摆放位置,提高顾客购买便利性,还能通过组合销售增加销售额。

在客户管理方面,对客户进行分群能够实现精准营销。通过分析客户的购买行为、消费习惯、偏好等特征,将客户划分为不同的群体,针对不同群体制定个性化的营销方案。这有助于提高客户满意度,增强客户忠诚度,从而提升企业的市场竞争力。

同时,数据分析在提升运营效率方面也发挥着重要作用。通过对销售数据、库存数据、客户信息等进行分析,企业能够及时发现问题,优化业务流程,降低运营成本。

二、数据的预处理

本次课程使用在线零售数据集,对数据进行了全面的预处理。

数据清洗

  • 缺失值处理:通过删除含有缺失值的记录,确保数据的完整性。
  • 排除退货记录:去除 InvoiceNo 包含 'C' 的记录,因为退货记录会影响销售数据的准确性。
  • 移除数量小于等于 0 的记录:这些记录不符合正常销售的情况,予以删除。

特征工程

  • 计算总金额:通过 Quantity * UnitPrice 计算每个订单的总金额。
  • 提取最常见的 100 个商品:根据商品的销售频率,选取最常见的 100 个商品作为特征。
  • 移除异常值:采用 IQR(四分位距)方法识别并去除异常值。

收集的数据集

三、数据仓库的建立

       在数据仓库的建立过程中,我们选择星型模型作为基础架构。星型模型以事实表为核心,通过维度表与事实表建立关联。在零售管理场景下,事实表记录了销售相关的信息,如销售订单、客户购买行为等。维度表则包含了与销售相关的各种维度信息,例如客户维度、产品维度、时间维度等。

对于客户维度,我们收集了客户的基本信息,如姓名、年龄、性别、地址等。产品维度则涵盖了产品的详细信息,包括产品名称、类别、价格、库存等。时间维度则记录了销售发生的时间信息,如年、月、日、小时等。通过这些维度表与事实表的关联,能够有效地对销售数据进行分析和管理。

在数据仓库的构建过程中,还需要考虑数据的存储和管理。我们采用了关系型数据库来存储数据,并使用 SQL 语句进行数据的插入、更新和查询操作。同时,为了提高数据的存储效率和查询性能,我们对数据库进行了优化,例如创建索引、分区等。

四、相关代码

import sqlite3
import pandas as pd
import os

class DatabaseOperations:
    def __init__(self, db_path):
        """初始化数据库连接"""
        self.db_path = db_path
        self.conn = None
        self.cursor = None

    def connect(self):
        """连接到数据库"""
        try:
            self.conn = sqlite3.connect(self.db_path)
            self.cursor = self.conn.cursor()
            print("成功连接到数据库")
        except Exception as e:
            print(f"连接数据库时出错: {str(e)}")

    def create_tables(self):
        """创建必要的表"""
        try:
            # 创建销售事实表
            self.cursor.execute('''
                CREATE TABLE IF NOT EXISTS sales_fact (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    invoice_no TEXT,
                    stock_code TEXT,
                    quantity INTEGER,
                    invoice_date DATETIME,
                    unit_price REAL,
                    customer_id INTEGER,
                    country_id INTEGER,
                    FOREIGN KEY (country_id) REFERENCES dim_country(id)
                )
            ''')

            # 创建国家维度表
            self.cursor.execute('''
                CREATE TABLE IF NOT EXISTS dim_country (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    country_name TEXT UNIQUE
                )
            ''')

            # 创建商品维度表
            self.cursor.execute('''
                CREATE TABLE IF NOT EXISTS dim_product (
                    stock_code TEXT PRIMARY KEY,
                    description TEXT
                )
            ''')

            self.conn.commit()
            print("成功创建表")
        except Exception as e:
            print(f"创建表时出错: {str(e)}")

    def insert_data(self, df):
        """插入数据到数据库"""
        try:
            # 1. 首先插入国家维度数据
            unique_countries = df['Country'].unique()
            for country in unique_countries:
                self.cursor.execute(
                    'INSERT OR IGNORE INTO dim_country (country_name) VALUES (?)',
                    (country,)
                )

            # 2. 插入商品维度数据
            product_data = df[['StockCode', 'Description']].drop_duplicates()
            product_data = product_data.dropna()
            for _, row in product_data.iterrows():
                self.cursor.execute(
                    'INSERT OR IGNORE INTO dim_product (stock_code, description) VALUES (?, ?)',
                    (row['StockCode'], row['Description'])
                )

            # 3. 插入销售事实数据
            # 获取国家ID映射
            country_mapping = {}
            self.cursor.execute('SELECT id, country_name FROM dim_country')
            for id, name in self.cursor.fetchall():
                country_mapping[name] = id

            # 批量插入销售数据
            for _, row in df.iterrows():
                self.cursor.execute('''
                    INSERT INTO sales_fact 
                    (invoice_no, stock_code, quantity, invoice_date, unit_price, customer_id, country_id)
                    VALUES (?, ?, ?, ?, ?, ?, ?)
                ''', (
                    row['InvoiceNo'],
                    row['StockCode'],
                    row['Quantity'],
                    row['InvoiceDate'],
                    row['UnitPrice'],
                    row['CustomerID'],
                    country_mapping[row['Country']]
                ))

            self.conn.commit()
            print("成功插入数据")
        except Exception as e:
            print(f"插入数据时出错: {str(e)}")
            self.conn.rollback()

    def close(self):
        """关闭数据库连接"""
        if self.conn:
            self.conn.close()
            print("数据库连接已关闭") 

🚀四、技术栈

后端语言:python
开发工具:pycharm
数据库:sqlite3

五、运行的效果图

切片操作:

上卷操作:

 聚类结果分析

生成的图分析:

六、源码获取 

大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻

📣 有源码点击右侧:源码获取说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值