12.1 数据分析案例 NumPy 数据分析案例详解 12.1 数据分析案例:销售数据分析 12.1.1 案例背景 假设我们是一家电商公司,拥有一个包含销售数据的 CSV 文件。该文件包含以下字段: : 订单 ID (字符串) : 产品 ID (字符串) : 客户 ID (字符串) : 订单日期 (字符串,格式如 YYYY-MM-DD) : 购买数量 (整数) : 单价 (浮点数) 我们的目标是利用 NumPy 对这份销售数据进行分析,回答以下问题: 总销售额是多少? 最畅销的产品是什么? 每个月的销售额是多少? 消费最高的客户是谁? 销售额的统计描述(均值、标准差、最大值、最小值等) 12.1.
12.1 数据分析案例:销售数据分析
12.1.1 案例背景
假设我们是一家电商公司,拥有一个包含销售数据的 CSV 文件。该文件包含以下字段:
order_id: 订单 ID (字符串)
product_id: 产品 ID (字符串)
customer_id: 客户 ID (字符串)
order_date: 订单日期 (字符串,格式如 YYYY-MM-DD)
quantity: 购买数量 (整数)
unit_price: 单价 (浮点数)
我们的目标是利用 NumPy 对这份销售数据进行分析,回答以下问题:
总销售额是多少?
最畅销的产品是什么?
每个月的销售额是多少?
消费最高的客户是谁?
销售额的统计描述(均值、标准差、最大值、最小值等)
12.1.2 数据准备
首先,我们需要导入必要的库:
import numpy as np import pandas as pd # 用于读取 CSV 文件 from datetime import datetime
然后,使用 pandas 读取 CSV 文件,并将其转换为 NumPy 数组:
# 假设 CSV 文件名为 sales_data.csv try: df = pd.read_csv('sales_data.csv') except FileNotFoundError: print("Error: sales_data.csv not found. Please make sure the file exists in the same directory.") exit() # 转换为 NumPy 数组 sales_data = df.to_numpy() print(sales_data.shape) # 打印数组的形状,例如 (1000, 6) print(sales_data[0]) # 打印第一行数据,查看数据类型
12.1.3 数据清洗与转换
在进行分析之前,我们需要对数据进行清洗和转换,确保数据的质量和格式正确。
datetime 对象,数量转换为整数,单价转换为浮点数。# 定义数据类型 data_types = [('order_id', 'U20'), ('product_id', 'U20'), ('customer_id', 'U20'), ('order_date', 'datetime64[D]'), ('quantity', 'i4'), ('unit_price', 'f4')] # 使用 astype 指定数据类型 try: sales_data_cleaned = np.array([tuple(x) for x in sales_data], dtype=data_types) except ValueError as e: print(f"Error during data type conversion: {e}") print("Please check the data in your CSV file for inconsistencies.") exit() print(sales_data_cleaned.dtype) # 打印数据类型 print(sales_data_cleaned[0]) # 打印第一行数据,查看数据类型
12.1.4 数据分析与代码实践
现在我们可以使用 NumPy 进行数据分析了。
1. 总销售额
# 计算每笔订单的销售额 sales_amount = sales_data_cleaned['quantity'] * sales_data_cleaned['unit_price'] # 计算总销售额 total_sales = np.sum(sales_amount) print(f"总销售额: ${total_sales:.2f}")
2. 最畅销的产品
# 使用 unique 函数找到所有唯一的产品 ID unique_products = np.unique(sales_data_cleaned['product_id']) # 创建一个空字典来存储每个产品的总销量 product_sales = {} # 遍历每个唯一的产品 ID for product in unique_products: # 找到所有包含当前产品 ID 的行 product_indices = sales_data_cleaned['product_id'] == product # 计算当前产品的总销量 total_quantity = np.sum(sales_data_cleaned['quantity'][product_indices]) # 将产品 ID 和总销量添加到字典中 product_sales[product] = total_quantity # 找到总销量最大的产品 best_selling_product = max(product_sales, key=product_sales.get) print(f"最畅销的产品: {best_selling_product} (销量: {product_sales[best_selling_product]})")
或者,更简洁的方式使用 pandas 的 groupby 和 sort_values:
df['sales_amount'] = df['quantity'] * df['unit_price'] product_sales = df.groupby('product_id')['quantity'].sum().sort_values(ascending=False) best_selling_product = product_sales.index[0] best_selling_quantity = product_sales.iloc[0] print(f"最畅销的产品: {best_selling_product} (销量: {best_selling_quantity})")
3. 每月的销售额
# 提取年份和月份 months = sales_data_cleaned['order_date'].astype('datetime64[M]') # 获取唯一月份 unique_months = np.unique(months) # 创建一个空字典来存储每月销售额 monthly_sales = {} # 遍历每个唯一月份 for month in unique_months: # 找到所有包含当前月份的行 month_indices = months == month # 计算当前月份的总销售额 total_sales = np.sum(sales_amount[month_indices]) # 将月份和总销售额添加到字典中 monthly_sales[month] = total_sales # 打印每月销售额 for month, sales in monthly_sales.items(): print(f"{month}: ${sales:.2f}")
或者,更简洁的方式使用 pandas 的 groupby:
df['order_date'] = pd.to_datetime(df['order_date']) monthly_sales = df.groupby(pd.Grouper(key='order_date', freq='M'))['sales_amount'].sum() for month, sales in monthly_sales.items(): print(f"{month.strftime('%Y-%m')}: ${sales:.2f}")
4. 消费最高的客户
# 使用 unique 函数找到所有唯一的客户 ID unique_customers = np.unique(sales_data_cleaned['customer_id']) # 创建一个空字典来存储每个客户的总消费额 customer_spending = {} # 遍历每个唯一的客户 ID for customer in unique_customers: # 找到所有包含当前客户 ID 的行 customer_indices = sales_data_cleaned['customer_id'] == customer # 计算当前客户的总消费额 total_spending = np.sum(sales_amount[customer_indices]) # 将客户 ID 和总消费额添加到字典中 customer_spending[customer] = total_spending # 找到总消费额最高的客户 top_customer = max(customer_spending, key=customer_spending.get) print(f"消费最高的客户: {top_customer} (消费额: ${customer_spending[top_customer]:.2f})")
或者,更简洁的方式使用 pandas 的 groupby:
customer_spending = df.groupby('customer_id')['sales_amount'].sum().sort_values(ascending=False) top_customer = customer_spending.index[0] top_customer_spending = customer_spending.iloc[0] print(f"消费最高的客户: {top_customer} (消费额: ${top_customer_spending:.2f})")
5. 销售额的统计描述
# 使用 NumPy 的统计函数计算销售额的统计描述 sales_mean = np.mean(sales_amount) sales_std = np.std(sales_amount) sales_max = np.max(sales_amount) sales_min = np.min(sales_amount) sales_median = np.median(sales_amount) sales_percentiles = np.percentile(sales_amount, [25, 50, 75]) # 计算 25%, 50%, 75% 分位数 print(f"销售额均值: ${sales_mean:.2f}") print(f"销售额标准差: ${sales_std:.2f}") print(f"销售额最大值: ${sales_max:.2f}") print(f"销售额最小值: ${sales_min:.2f}") print(f"销售额中位数: ${sales_median:.2f}") print(f"销售额25%分位数: ${sales_percentiles[0]:.2f}") print(f"销售额50%分位数: ${sales_percentiles[1]:.2f}") print(f"销售额75%分位数: ${sales_percentiles[2]:.2f}")
或者,使用 pandas 的 describe 方法:
print(df['sales_amount'].describe())
12.1.5 流程图
使用 Mermaid 绘制流程图,描述整个数据分析过程:
12.1.6 结论
通过本案例,我们演示了如何使用 NumPy 对销售数据进行分析。 NumPy 提供了强大的数组操作和数学函数,可以方便地进行数据清洗、转换和统计分析。 虽然 pandas 在某些方面提供了更简洁的语法,但 NumPy 仍然是数据分析的基础,理解 NumPy 的原理有助于更深入地理解 pandas 和其他数据分析工具。 在实际应用中,我们可以根据具体需求选择合适的工具和方法,灵活地运用 NumPy 和其他库,以实现更高效的数据分析。
12.1.7 扩展
数据可视化: 可以使用 matplotlib 或 seaborn 等库将分析结果可视化,例如绘制每月销售额的折线图,或者绘制产品销量的柱状图。
更复杂的分析: 可以进行更复杂的分析,例如计算客户的复购率,或者预测未来的销售额。
数据源: 可以从不同的数据源读取数据,例如数据库或 API。
A/B测试: 可以使用NumPy来进行A/B测试,例如比较不同营销策略的效果。