数据分析项目——北京二手房价数据分析
整个项目的代码和数据集获取:
https://github.com/Proberen/Data-analysis___Beijing__Houseprice
1 读取数据
在本阶段需要导入数据集中的数据,并且对数据进行初步观察,为了方便后续的操作,对数据集中的中文字段进行修改。
1.1 导入数据
使用pandas的.read_csv方法读取数据集bj.csv,编码方式为gbk
data = pd.read_csv('./数据集/bj.csv', encoding='gbk')
1.2 列重命名
data = data.rename(columns={'简介': 'Introduction',
'小区': 'Quarters',
'户型': 'HouseType',
'面积': 'Area',
'关注人数': 'PeopleNumber',
'观看次数': 'WatchNumber',
'发布时间': 'ReleaseTime',
'房价': 'TotalPrice',
'单价/平': 'Price',
'城区': 'Dist',
'经纬度': 'Lotitude'})
处理后的数据:
2 数据预处理
2.1 统一数据格式
观察数据,可以发现在字段Area、PeopleNumber、WatchNumber、Price中存在影响分析的中文,例如单位、额外的解释等。
# 定义筛选中文字符的函数
def delete(cword):
num = float(re.sub(r'[\u4e00-\u9fff]*\/*[\u4e00-\u9fff]','',cword))
return num
在字段ReleaseTime中,单位包括月、天、年,因此在删除中文前需要将数据的单位统一转换为天。
# 定义筛选发布日期的函数
def reltime(data):
days = re.findall(r'\d+天',data)
months = re.findall(r'\d+个月',data)
years = re.findall(r'\d+一年',data)
if days:
return int(re.sub(r'天','',days[0]))
elif months:
return 30*int(re.sub(r'个月','',months[0]))
else:
return 365
筛选:
# 进行筛选
data['Area']=data['Area'].apply(delete)
data['PeopleNumber']=data['PeopleNumber'].apply(delete)
data['WatchNumber']=data['WatchNumber'].apply(delete)
data['Price']=data['Price'].apply(delete)
data['ReleaseTime']=data['ReleaseTime'].apply(reltime)
处理后的数据:
2.2 数据列的拆分
# 获取经纬度列
Lotitude = data['Lotitude']
# 初始化经度列、纬度列
Longitude = np.array(np.arange(len(Lotitude)),dtype=str)
Latitude = np.array(np.arange(len(Lotitude)),dtype=str)
# 分割数据并插入
for i in Lotitude.index:
Longitude[i] = Lotitude[i].split(',',1)[0]
Latitude[i] = Lotitude[i].split(',',1)[-1]
# 添加列
data['Longitude'] = Longitude
data['Latitude'] = Latitude
处理后的数据:
2.3 处理缺失值
数据集由于客观原因可能会存在缺失值,因此在对数据进行预处理时需要对数据集进行缺失值的检测和处理
# 统计缺失值的数量
data.isnull().sum()
结果:
可以看出本数据集中不存在缺失值,因此不需要进行下一步的处理
2.4 处理重复值
数据集在获取的时候可能会存在重复获取的情况,因此需要对数据进行重复值的检测和处理
# 删除重复行
data.drop_duplicates(inplace = True)
# 重置index
data.reset_index(inplace = True,drop = True)
在对数据进行预处理后,数据集共22152条数据,共13个字段,在数据进行重复值处理、缺失值处理后该数据集不存在缺失值,各字段的字符类型和描述如下图所示: