Hands-on data analysis
动手学数据分析 | 之前也多多少少接触数据分析,工作目标也逐渐向这个方向靠拢,但是一直不得其门而入。“敲完一堆代码后却不知道有什么作用" 估计也是大部分自学数分人的心声。有这么一个组队学习的机会还挺难得,希望经过这轮项目的历练,增进对数据分析流程的认识与理解。
珞珈航海号,扬帆启程咯~
Task 01 载入数据及数据观察
-
pandas.read_csv可以使用chunksize分块处理大型csv文件,避免服务器内存吃不消
-
将表头改为中文,可以在读取数据时,将名称列表赋值给names
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
-
观察数据时分析的第一步,看看数据的整体结构及样例,知道有什么样的素材才能进行下一步
df.info()
df.shape
df.head(10) df.tail
统计缺失df.isnull.sum()
描述性统计df.describe()
-
保存数据
df.to_csv('filename.csv')
# pay attention to the coding. -
pandas基础
处理dataframe数据的方法: 筛选行, 筛选列, 某个单元格数据
与python处理excel中的cell, row, column有相似之处
reset_index()
重置索引,在获得新的index,原来的index变成数据列,保留下来。不想保留原先的索引,则使用drop=True
.
titanic dataset insight
在这个处理后的数据集中, 船上人的年龄都好年轻, 75%的都在38岁以下.
将数据根据年龄\票价排序, 为什么老人都穷苦. 哦不,结合看来, 还是有一定经济实力的
Task 02 数据分析的流程学习
-
数据清洗
一般数据不干净,指数据中存在缺失值\重复值\异常点等,清洗过后变成想要的格式.
1. 缺失值观察:df.info()
\df.isnull().sum()
;
2. 处理缺失值:
a.将缺失的数值型数值赋值为0,df[df['a'].isnull()] = 0
\df[df['a'] = np.nan] = 0
空缺值的数据类型为float64所以用None一般索引不到,比较的时候最好用np.nan
b.
df.dropna()
\df.fillna(0)
3. 重复值观察:df.duplicated()
是以行为单位判断是否重复, 若是重复行,返回True,反之,返回False. 用df[df.duplicated()]
可以查看重复的数据
4.处理重复值: 一般删除即可df.drop_duplicates()
Save the cleaned data
-
数据特征处理
特征可以分为两类,数值型特征(离散型\连续性)和文本型特征(类别型文本特征)数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
-
数据分箱操作
https://blog.csdn.net/weixin_41907245/article/details/100122289
采用cut(自己确定分段范围)
\qcut(确定划分比例)
#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['age'], 5, labels = [1, 2, 3, 4, 5])
#将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,
df[AgeBand'] = pd.cut(df['age'], [1, 5, 15, 30, 50, 80], labels = [1, 2, 3, 4, 5])
#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df['AgeBand1'] = pd.qcut(df['age'], [0,0.1,0.3,0.5,0.7,0.9], labels = [1, 2, 3, ,4, 5])
-
文本变量变换
a. 查看某一列的数值分布
df['sex'].value_counts()
` df[‘sex’].unique() \ nunique()`b. 将文本变量数值化
#1 replace:df['sex_num'] = df['sex'].replace(['male', 'female'], [1, 2])
#2 map:df['sex_num'] = df['sex'].map({'male': 1, 'female': 2})
#3: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder for feat in ['Cabin', 'Ticket']: lbl = LabelEncoder() label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique()))) df[feat + "_labelEncode"] = df[feat].map(label_dict) df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str)) df.head()
? 何为onehot编码 :https://zhuanlan.zhihu.com/p/37471802
get_dummies() 是pandas实现 one hot encode的一种方式
one-hot的基本思想:将离散型特征的每一种取值都看成一种状态,若你的这一特征中有N个不相同的取值,那么我们就可以将该特征抽象成N种不同的状态,one-hot编码保证了每一个取值只会使得一种状态处于“激活态”,也就是说这N种状态中只有一个状态位值为1,其他状态位都是0。
将
['age']
转换为 one-hot 编码:
OneHotEncoder
x = pd.get_dummies(df['age'], prefix = age)
将生成的矩阵与原数据合并
df = df.concat([df, x], axis = 1)
-
-
数据重构
[pandas的concat]
合并两个df, 使用pd.concat([a, b], axis = 1)
, a\b为两个dataframe
[dataframe的join和append]
join 横向合并 a.join(b) append 纵向合并 a.append(b)
[pandas的merge 和 pandas的append]
df = pd.merge(a, b, left_index=True, right_index=True)
设置left_index和right_index为True,使用索引进行连接, 参考SQL的用法
pandas进行数据重排时用到 stack 和 unstack 两个函数:stack与unstack
-
数据可视化