Python 数据分析实战:POS 数据与地理位置数据的清洗合并
“喂,小王啊,跟你说个事,最近咱们得好好捋捋 POS 数据和地理位置信息这块儿。你知道的,现在数据就是金钱,把这些数据用好了,能给咱们带来不少好处。”
作为一名数据分析师,经常会遇到各种各样的数据处理需求,其中 POS 数据与地理位置数据的结合分析,在零售、餐饮、物流等行业有着广泛的应用。今天咱们就来聊聊,如何利用 Python 中的 pandas 和 geopandas 库,对 POS 数据和地理位置数据进行清洗、合并,为后续的分析挖掘打下坚实的基础。
一、 场景引入与数据准备
假设我们是一家连锁餐饮企业的数据分析师, 手头上有两份数据:
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 ... ... ... ... 门店地理位置数据 (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 进行数据分析,挖掘数据背后的价值。