WEBKT

Python 数据分析实战:POS 数据与地理位置数据的清洗合并

13 0 0 0

一、 场景引入与数据准备

二、 数据读取与初步观察

三、 数据清洗

1. 数据类型转换

2. 缺失值处理

3. 重复数据处理

四、 数据合并

五、 地理编码与 GeoDataFrame

六、 总结与展望

“喂,小王啊,跟你说个事,最近咱们得好好捋捋 POS 数据和地理位置信息这块儿。你知道的,现在数据就是金钱,把这些数据用好了,能给咱们带来不少好处。”

作为一名数据分析师,经常会遇到各种各样的数据处理需求,其中 POS 数据与地理位置数据的结合分析,在零售、餐饮、物流等行业有着广泛的应用。今天咱们就来聊聊,如何利用 Python 中的 pandas 和 geopandas 库,对 POS 数据和地理位置数据进行清洗、合并,为后续的分析挖掘打下坚实的基础。

一、 场景引入与数据准备

假设我们是一家连锁餐饮企业的数据分析师, 手头上有两份数据:

  1. POS 数据 (pos_data.csv):记录了每个门店的销售数据,包括订单 ID、门店 ID、销售时间、销售金额等。

    订单ID 门店ID 销售时间 销售金额
    1001 S001 2023-10-26 10:00:00 120
    1002 S002 2023-10-26 10:15:00 85
    1003 S001 2023-10-26 10:30:00 200
    ... ... ... ...
  2. 门店地理位置数据 (store_location.csv):记录了每个门店的地理位置信息,包括门店 ID、门店名称、经度、纬度等。

    门店ID 门店名称 经度 纬度
    S001 A店 116.4074 39.9042
    S002 B店 116.4178 39.9145
    S003 C店 116.4282 39.9248
    ... ... ... ...

我们的目标是:将这两份数据根据“门店ID”进行合并,得到一份包含门店销售数据和地理位置信息的完整数据,并进行初步的清洗,为后续的分析做准备。

二、 数据读取与初步观察

首先,我们需要导入 pandas 和 geopandas 库,并读取数据。

import pandas as pd
import geopandas as gpd
# 读取 POS 数据
pos_data = pd.read_csv('pos_data.csv')
# 读取门店地理位置数据
store_location = pd.read_csv('store_location.csv')
# 查看 POS 数据的前几行
print(pos_data.head())
# 查看门店地理位置数据的前几行
print(store_location.head())

通过 head() 方法,我们可以快速查看数据的前几行,对数据的结构和内容有一个初步的了解。 此外,还可以通过 info() 方法查看数据的类型、缺失值等信息,通过describe()查看数据的统计信息。

print(pos_data.info())
print(store_location.info())
print(pos_data.describe())
print(store_location.describe())

三、 数据清洗

数据清洗是数据分析中非常重要的一步,它直接影响到后续分析结果的准确性。常见的数据清洗操作包括:

1. 数据类型转换

通常,POS 数据中的“销售时间”列是字符串类型,我们需要将其转换为 pandas 中的 datetime 类型,方便后续的时间序列分析。

pos_data['销售时间'] = pd.to_datetime(pos_data['销售时间'])
print(pos_data.info())

2. 缺失值处理

在实际数据中,经常会遇到缺失值的情况。我们需要根据具体情况,选择合适的处理方法。

  • 查找缺失值:
# 查看 POS 数据中的缺失值情况
print(pos_data.isnull().sum())
# 查看门店地理位置数据中的缺失值情况
print(store_location.isnull().sum())
  • 处理缺失值:

    • 删除: 如果缺失值的数量较少,且对整体数据影响不大,可以直接删除包含缺失值的行。

      # 删除 pos_data 中包含缺失值的行
      pos_data = pos_data.dropna()
    • 填充: 如果缺失值的数量较多,或者缺失值所在的列比较重要,可以考虑使用填充的方法。

      # 使用平均值填充 pos_data 中“销售金额”列的缺失值
      pos_data['销售金额'] = pos_data['销售金额'].fillna(pos_data['销售金额'].mean())
      # 使用 “未知” 填充 store_location 中“门店名称”列的缺失值
      store_location['门店名称'] = store_location['门店名称'].fillna('未知')

      常用的填充值包括:平均值、中位数、众数、特定值等。

3. 重复数据处理

重复数据可能会导致分析结果出现偏差,需要进行处理。

  • 查找重复值
# 检查 pos_data 中是否存在完全重复的行
print(pos_data.duplicated().sum())
#检查指定列
print(pos_data.duplicated(subset=['订单ID']).sum())
  • 删除重复值:
# 删除 pos_data 中完全重复的行
pos_data = pos_data.drop_duplicates()
# 删除指定列重复项,保留第一个
pos_data = pos_data.drop_duplicates(subset=['订单ID'], keep='first')

四、 数据合并

数据清洗完成后,我们需要将 POS 数据和门店地理位置数据根据“门店ID”进行合并。

# 使用 merge() 方法进行合并,指定连接键为“门店ID”
merged_data = pd.merge(pos_data, store_location, on='门店ID')
# 查看合并后的数据
print(merged_data.head())

pd.merge() 是 pandas 中非常强大的数据合并函数,类似于 SQL 中的 JOIN 操作。on='门店ID' 指定了连接键,表示根据“门店ID”列进行合并。 默认是内连接(inner join),只保留两个数据框中都存在的“门店ID”的行。 还可以通过 how 参数指定连接方式:

  • how='left':左连接,保留左侧数据框(pos_data)中的所有行。
  • how='right':右连接,保留右侧数据框(store_location)中的所有行。
  • how='outer':外连接,保留两个数据框中的所有行。

五、 地理编码与 GeoDataFrame

如果我们的门店地理位置数据中没有经纬度信息,只有地址信息,那么就需要进行地理编码。

地理编码: 将地址信息转换为经纬度坐标的过程。

逆地理编码: 将经纬度坐标转换为地址信息的过程。

我们可以使用 geopandas 提供的 geocode() 函数进行地理编码。 首次使用需要安装geopy。

pip install geopy
from geopy.geocoders import Nominatim
# 创建 Nominatim 地理编码器
geolocator = Nominatim(user_agent='my-geo-app') # user_agent 随便填一个名字
# 假设 store_location 数据中有一个“地址”列
# store_location['地址'] = store_location['门店名称'] + '详细地址'
# 对“地址”列进行地理编码,得到经纬度信息, apply()对每一行执行操作
def get_location(address):
try:
location = geolocator.geocode(address)
if location:
return location.latitude, location.longitude
else:
return None, None
except:
return None,None
# store_location[['纬度', '经度']] = store_location['地址'].apply(get_location).tolist() #如果有地址列
# 如果没有地址,可以尝试字符串拼接

得到经纬度信息后,我们可以将 pandas 的 DataFrame 转换为 geopandas 的 GeoDataFrame,方便后续的空间数据分析。

# 将 merged_data 转换为 GeoDataFrame
geo_data = gpd.GeoDataFrame(merged_data, geometry=gpd.points_from_xy(merged_data.经度, merged_data.纬度))
# 设置坐标参考系(CRS),通常使用 WGS 84 坐标系,对应的 EPSG 代码为 4326
geo_data.crs = 'EPSG:4326'
# 查看 GeoDataFrame
print(geo_data.head())

六、 总结与展望

本文介绍了如何使用 Python 的 pandas 和 geopandas 库对 POS 数据和地理位置数据进行清洗、合并和地理编码。 通过这些操作,我们可以将原本分散的数据整合起来,为后续的空间数据分析、可视化以及更深入的业务洞察打下基础。

“小王啊,你看,通过这些步骤,咱们就把数据给捋顺了。接下来,就可以利用这些数据,分析各个门店的销售情况、客流量分布、周边竞争情况等等,为咱们的经营决策提供支持。数据分析这块儿,大有可为啊!”

后续可进行的操作包括但不限于:

  • 空间可视化: 使用 geopandas 的 plot() 方法,将门店位置在地图上进行可视化。
  • 空间查询: 查询某个区域内的门店信息。
  • 缓冲区分析: 分析门店周边一定范围内的客户分布情况。
  • 核密度估计: 分析门店的聚集程度。
  • 空间关联分析: 分析门店销售额与周边环境因素(如人口密度、竞争对手数量等)的关系。
  • 结合时间序列分析: 分析销售额随时间变化及与地理位置的关系

数据分析是一个不断迭代、不断深入的过程。 希望本文能为你提供一个入门的指引,帮助你更好地利用 Python 进行数据分析,挖掘数据背后的价值。

数据老顽童 POS数据分析geopandaspandas

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/8778