今日学习任务--数据分析与可视化
数据探索性分析,是通过了解数据集,了解变量间的相互关系以及变量与预测值之间的关系,对已有数据在尽量少的先验假设下通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法,有助于后期更好地进行特征工程和建立模型。
数据类型
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
train_data = pd.read_csv('E:/编程/用户新增预测大赛/train.csv')
print(train_data.info())
在导入pandas,numpy库的基础上,新增了两个库,分别用于绘制图形和数据可视化。
通过pd库的df.info()方法查看数据框属性,发现只有udmap字段为类别类型,其余皆为数值类型。
相关性热力图
sns.heatmap(train_data.drop(['udmap'], axis=1).corr().abs(), cmap='YlOrRd')
# 输出图表
plt.show()
x分组下标签均值
# 绘制柱形图
for i in range(1, 9):
sns.barplot(x='x'+str(i), y='target', data=train_data)
plt.show()
使用sus.barplot()函数绘制直方图,以字符串形式指定x/y轴名称,输入数据框 。
由上表知,x5、x4、x3、x7、x1、x2字段更具重要性
从common_ts中提取小时,绘制每小时下标签分布的变化
# 获取指定时间和日期
train_data['common_ts'] = pd.to_datetime(train_data['common_ts'], unit='ms')
# 从common_ts中提取小时
train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
# 绘制每小时下标签分布变化
sns.barplot(x='common_ts_hour', y='target', data=train_data)
plt.show()
*绘制时间-人数关系图
# 获取各小时对应的频数
train_data['hour_freq'] = train_data['common_ts_hour'].map(train_data['common_ts_hour'].value_counts())
# 数据排重
dict_hour_freq = dict(zip(train_data['common_ts_hour'], train_data['hour_freq']))
duration_h = list(dict_hour_freq.keys())
times = list(dict_hour_freq.values())
plt.bar(duration_h, times) # 绘制柱形图
plt.xlabel('duration_h') # x轴设置
plt.ylabel('times') # y轴设置
plt.title('bar chart') # 标题设置
plt.show()
做一个题外的尝试,并尝试plt的绘图函数。zip()将两个列表正序组成键值对,dict()生成字典,list()分离得到键和值的列表。
对udmap进行onehot,统计每个key对应的标签均值,绘制直方图
# 定义onehot函数
def udmap_onethot(d: str) -> np.ndarray:
v = np.zeros(9)
if d == 'unknown':
return v
d = eval(d)
for i in range(1, 10):
if 'key' + str(i) in d:
v[i - 1] = d['key' + str(i)]
return v
# 对udmap进行onehot
train_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))
# 字段统一为key_num格式
train_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
# 连接key_num与target字段
train_data = pd.concat([train_data, train_udmap_df], axis=1)
# 绘制key1~9对应的标签均值直方图:palette参数指定色调
for i in range(1, 10):
sns.barplot(x=''.join(['key', str(i)]), y='target', data=train_data, palette='Blues_d')
plt.show()
由上表知,key1、key2、key3、key6字段更具重要性。
绘制数值类型的字段在标签分组下的箱线图
fields = ['common_ts_hour', 'x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'eid']
for i in fields:
sns.boxplot(x=i, y='target', data=train_data)
plt.show()
uuid字段统计价值不大,且算力不足难以绘制,故略过。common_ts数据过于庞大,仅提取小时信息分析。