【数据分析】评估清理数据实战【淘宝母婴购物数据集】

概述

Ali_Mum_Baby 是一个数据集,其中包含 900 多万条儿童信息(生日和性别),这些信息由消费者提供,他们分享这些信息是为了获得更好的推荐或搜索结果。

数据说明

它包含消费者在淘宝或天猫 上提供的 9,000,000 多个儿童的生日和性别

列名 描述
user_id 用户ID (Bigint)。
birthday 儿童生日(例如:20130423)。
gender 儿童性别("0" 表示女性,"1" 表示男性,"2" 表示未知)。

Tianchi_mum_baby_trade_history

本表包含淘宝会员的历史交易信息。

列名 描述
item_id 商品ID (Bigint)。
user_id 用户ID (Bigint)。
cat_id 类别ID (Bigint)。
cat1 根类别ID (Bigint)。
property 相应商品的属性 (String)。
buy_mount 购买数量 (Bigint)。
day 时间戳。

典型研究课题

  • 根据父母的购买行为预测子女的年龄
  • 根据用户子女的信息(年龄、性别等)预测用户会购买何种商品。

具体步骤

  1. **数据准备:**创建一个单独的文件夹来存放数据集和Notebook,保持文件结构的整洁。

  2. 数据读取:

    • 使用 pandas 库的 read_csv 函数读取CSV文件并存储在变量 original_data 中。
    • 使用 head() 函数预览数据的前几行。
    python 复制代码
    import pandas as pd
    
    original_data = pd.read_csv('data/(sample)sam_tianchi_mum_baby_trade_history.csv')
    
    original_data.head()
  3. 数据评估:

    • 使用 info() 方法了解数据的基本信息,包括各列的非空值数量和数据类型

      python 复制代码
      original_data.info()
      
      ## print
      <class 'pandas.core.frame.DataFrame'>
      RangeIndex: 29971 entries, 0 to 29970
      Data columns (total 7 columns):
       #   Column      Non-Null Count  Dtype 
      ---  ------      --------------  ----- 
       0   user_id     29971 non-null  int64 
       1   auction_id  29971 non-null  int64 
       2   cat_id      29971 non-null  int64 
       3   cat1        29971 non-null  int64 
       4   property    29827 non-null  object
       5   buy_mount   29971 non-null  int64 
       6   day         29971 non-null  int64 
      dtypes: int64(6), object(1)
      memory usage: 1.6+ MB
    • 对数据进行初步的结构和内容评估:

      • 整洁度:每列是一个变量,每行是一个观察值。
      • 缺失数据 :使用 isnull() 和布尔索引筛选出缺失值。
      • 重复数据:检查唯一标识符的重复情况。
      • 不一致数据 :使用 value_counts() 方法检查某些列的值是否一致。
      • 无效或错误数据 :使用 describe() 方法检查数值列是否存在异常值。
      python 复制代码
      # 使用 isnull() 检查每个值是否为缺失值
      null_data = original_data.isnull()
      
      null_data.head()
      python 复制代码
      null_counts = original_data.isnull().sum()
      null_counts
  4. 数据清理

    • 缺失值处理

      python 复制代码
      # 处理缺失值
      data = original_data.dropna() # 删除包含缺失值的行
      
      null_counts = data.isnull().sum() # 观察处理后的数据
      null_counts
    • 重复行处理

      python 复制代码
      # 删除重复数据
      data = data.drop_duplicates()
    • 数据类型转换

      python 复制代码
      # 转换数据类型
      data['user_id'] = data['user_id'].astype(str)
      data['auction_id'] = data['auction_id'].astype(str)
      data['cat_id'] = data['cat_id'].astype(str)
      data['cat1'] = data['cat1'].astype(str)
      
      data['day'] = pd.to_datetime(data['day'], format='%Y%m%d')
      
      data.head()
    • 列名规范

      python 复制代码
      # 规范化列名
      data.columns = [col.lower() for col in data.columns]
      
      cleaned_data = data
    • 保存清洗后的数据

      python 复制代码
      # 保存清洗后的数据到新文件
      cleaned_file_path = 'data/cleaned_data.csv'
      cleaned_data.to_csv(cleaned_file_path, index=False)
      python 复制代码
      cleaned_data.info()
      
      ## print
      <class 'pandas.core.frame.DataFrame'>
      Index: 29827 entries, 0 to 29970
      Data columns (total 7 columns):
       #   Column      Non-Null Count  Dtype         
      ---  ------      --------------  -----         
       0   user_id     29827 non-null  object        
       1   auction_id  29827 non-null  object        
       2   cat_id      29827 non-null  object        
       3   cat1        29827 non-null  object        
       4   property    29827 non-null  object        
       5   buy_mount   29827 non-null  int64         
       6   day         29827 non-null  datetime64[ns]
      dtypes: datetime64[ns](1), int64(1), object(5)
      memory usage: 1.8+ MB

获取数据

常见的数据格式

json【JavaScript Object Notation】

json 复制代码
# json 对象
{
	"id" : "1",
	"type": "article",
	"title": "working with JSON data",
	"created": "2099-12-18T14:56:29.000Z"
}

# json 数组
[
	{
	"title": "A Light in the Attic",
	"price": "£51.77"
	},
	{
	"title": "Tipping the Velvet",
	"price": "£53.74"
	}
]

通过python读取和解析json------一键将格式转换为DataFrame

python 复制代码
import numpy as np

df = pd.read_json("./xxx.json")

CSV【Comma-Separated Values】

xml 复制代码
姓名,考试1,考试2,考试3
小陈,85,95,92
小李,91,92,94
小王,86,81,89
小张,79,89,95
小赵,96,91,91
小周,81,89,92
python 复制代码
import pandas as pd
df = pd.read_csv("xxx.csv")
df.head(3)

评估数据

具体分为两个方面:数据结构和数据内容。

数据结构

  1. 每列是一个变量:每列数据应该代表一个独立的变量。
  2. 每行是一个观察值:每行数据应该代表一个独立的观察值。
  3. 每个单元格是一个值:每个单元格应该只有一个值,不包含多个信息。

数据内容

  1. 丢失数据:数据中有空缺值,可能会影响分析结果。
  2. 重复数据:数据中有重复的记录,可能是数据录入错误。
  3. 不一致数据:数据中存在不同表示方式的相同信息,如单位不一致、全称与缩写混用等。
  4. 无效或错误数据:数据不符合逻辑或明显错误,例如负数的身高。

数据清洁和整洁的重要性

提供了一些方法来评估和检测数据集中的问题。以下是段落的总结和关键点:

  1. 数据整洁性 vs. 数据干净度
    • 数据的整洁度(结构性问题)比干净度(内容性问题)更容易被发现和评估。整洁度问题类似于书架是否整齐,而干净度问题则类似于书页是否有污渍。
    • 每列只能表示一个变量,每行是一个观察值,每个单元格是一个值是数据整洁的基本规则。
  2. 使用 DataFrame 的 info 方法
    • info 方法可以提供数据概况信息,包括列名对应的数据类型,有助于快速了解数据结构。
    • 列名可以透露关于数据结构的信息,例如带年份的列名可能违反了每列只能表示一个变量的规则。
  3. 查看数据部分内容
    • 使用 head 或 tail 方法查看数据的开头或结尾部分,或者使用 sample 方法随机查看部分数据。
    • 如果数据列数太多或值太长,可以通过 set_option 方法调整显示上限。
  4. 检测空缺值
    • info 方法可以显示每列非空缺值的数量,通过与行数对比可发现空缺值。
    • isnull 方法可以检查值是否为空缺值,并返回布尔值组成的 Series 或 DataFrame。
    • sum 方法可以对布尔值进行求和,以计算空缺值的数量。
    • 通过条件筛选方法,可以提取出包含空缺值的行。
  5. 检测重复数据
    • duplicated 方法可以检查 Series 或 DataFrame 中的重复值。对 DataFrame 调用时,只有当整行数据完全一样时才会标记为重复。
    • 可以使用 subset 参数指定需要检查重复的多个变量。
  6. 检测不一致数据和无效数据
    • 使用 value_counts 方法查看各个值的个数,帮助发现同一目标的不同表示。
    • 使用 sort_values 方法和 describe 方法可以帮助发现异常值或离谱的数据。
  7. 评估数据的目的是为了采取进一步行动
    • 数据评估的最终目的是为了清洗和改进数据质量。

数据清洗

  1. 检查和处理索引或列名
    • 确保索引或列名有意义。如果索引或列名混乱,应该对它们进行重命名或重新排序,以便理解数据。
  2. 处理结构性问题
    • 确保每列是一个变量,每行是一个观察值,每个单元格是一个值。
    • 如果每列是观察值,每行是变量,需要对行和列进行转置。
    • 如果某列包含了多个变量,需要对列进行拆分,确保每列只包含一种变量。
    • 如果每行包含了多个观察值,需要对行进行拆分,确保每行只包含一个观察值。
    • 结构性问题处理后,数据通常会从宽数据变成长数据,以便后续高效的程序处理。
  3. 处理内容性问题
    • 丢失数据处理
      • 已知实际值:可以手动填充。
      • 丢失值不影响分析:可以忽略丢失值。
      • 关键变量丢失:删除包含空缺值的行。
      • 填充值:使用平均数、中位数、众数等进行填充。
    • 重复数据处理:找到重复数据后删除,避免影响分析结论。
    • 不一致数据处理:统一同一含义的不同表达方式,保留一种表达方式并替换其他表达方式。
    • 无效或错误数据处理
      • 删除无效或错误数据,或替换成其他值(如当前平均值)。
  4. 编程相关的其他处理
    • 数据类型转换
      • 将不适合的数值类型(如手机号)转换为字符串类型。
      • 将适合逻辑判断的字符串类型(如"是"和"否")转换为布尔值(True和False),以便后续分析。

示例处理方式:

  • 结构性问题示例
    • 转置数据:当行和列表示的内容不符合预期时,将其转置。
    • 拆分列:将包含多个变量的列拆分成多个单一变量的列。
    • 拆分行:将包含多个观察值的行拆分成单一观察值的行。
  • 内容性问题示例
    • 丢失数据处理
      • 填充已知值:手动更新表格数据。
      • 忽略丢失值:分析时自动忽略。
      • 删除行:移除包含空缺值的行。
      • 填充值:用统计方法(如平均数)填充空缺值。
    • 删除重复数据:删除发现的重复行。
    • 统一不一致数据:对同一含义的不同表达方式进行统一。
    • 处理无效数据:删除或替换不符合常理的值。
  • 编程相关处理示例
    • 数据类型转换:将手机号从整数类型转换为字符串类型,将"是"和"否"转换为布尔值。

如何使用 pandas 库来清理和重命名 DataFrame 的索引和列名

重命名索引和列名

  1. 使用 rename 方法
    • 重命名索引 :使用 index 参数传入一个字典,键为原索引名,值为新索引名。
    • 重命名列名 :使用 columns 参数传入一个字典,键为原列名,值为新列名。
  2. 两种重命名方法
    • 返回新 DataFrame :默认情况下,rename 方法返回一个修改后的新 DataFrame,但不改变原始 DataFrame。
    • 原地修改 :通过传入 inplace=True 参数,直接修改原始 DataFrame 而不返回新 DataFrame。
  3. 批量重命名
    • 传入字典:适用于少量列或索引的重命名。
    • 传入函数 :适用于批量重命名。可以传入一个函数来操作列名或索引。例如,将所有列名变为大写,可以使用 str.upper 方法。
  4. 字符串操作方法
    • Pandas 提供了许多针对字符串 Series 的操作方法,可以通过 pandas.Series.str 来访问这些方法,如 upperlower 等。

其他索引相关操作

  1. 设置新索引
    • 使用 set_index 方法,通过传入列名来设置新的索引,返回一个新的 DataFrame。
  2. 重设索引
    • 使用 reset_index 方法,将索引重设为初始默认位置索引,并将原索引值变为一列,返回一个新的 DataFrame。
  3. 排序索引和列名
    • 使用 sort_index 方法对索引或列名进行排序。
    • 默认 axis=0 对索引排序,axis=1 对列名排序。
  4. 注意事项
    • 所有这些方法(renameset_indexreset_indexsort_index)默认不会修改原始 DataFrame,而是返回一个新的 DataFrame。
    • 使用 inplace=True 参数可以直接修改原始 DataFrame,但这时方法不会返回新的 DataFrame。

实践示例

以下是一些具体操作示例:

python 复制代码
import pandas as pd

# 创建示例 DataFrame
data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
df = pd.DataFrame(data)

# 重命名列名
df_renamed = df.rename(columns={'A': 'Alpha', 'B': 'Beta'})

# 重命名索引
df_renamed_index = df.rename(index={0: 'first', 1: 'second'})

# 批量重命名列名为大写
df_upper = df.rename(columns=str.upper)

# 设置新索引
df_set_index = df.set_index('A')

# 重设索引
df_reset_index = df_set_index.reset_index()

# 对索引排序
df_sorted_index = df.sort_index()

# 对列名排序
df_sorted_columns = df.sort_index(axis=1)

# 原地修改示例
df.rename(columns={'A': 'Alpha'}, inplace=True)
df.set_index('Alpha', inplace=True)

这些操作可以帮助你更好地管理和清理 DataFrame 的索引和列名。

相关推荐
魔力之心2 分钟前
人工智能与机器学习原理精解【30】
人工智能·机器学习
Hiweir ·8 分钟前
NLP任务之文本分类(情感分析)
人工智能·自然语言处理·分类·huggingface
百里香酚兰25 分钟前
【AI学习笔记】基于Unity+DeepSeek开发的一些BUG记录&解决方案
人工智能·学习·unity·大模型·deepseek
老华带你飞28 分钟前
公寓管理系统|SprinBoot+vue夕阳红公寓管理系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot·课程设计
sp_fyf_20242 小时前
[大语言模型-论文精读] 更大且更可指导的语言模型变得不那么可靠
人工智能·深度学习·神经网络·搜索引擎·语言模型·自然语言处理
毕小宝2 小时前
逻辑回归(下): Sigmoid 函数的发展历史
算法·机器学习·逻辑回归
LHNC2 小时前
2024.9.29 问卷数据分析
数据分析
肖遥Janic2 小时前
Stable Diffusion绘画 | 插件-Deforum:商业LOGO广告视频
人工智能·ai·ai作画·stable diffusion
知识分享小能手2 小时前
mysql学习教程,从入门到精通,SQL 修改表(ALTER TABLE 语句)(29)
大数据·开发语言·数据库·sql·学习·mysql·数据分析
我就是全世界4 小时前
一起了解AI的发展历程和AGI的未来展望
人工智能·agi