珞珈航海号!组队数据分析2021

Hands-on data analysis

动手学数据分析 | 之前也多多少少接触数据分析,工作目标也逐渐向这个方向靠拢,但是一直不得其门而入。“敲完一堆代码后却不知道有什么作用" 估计也是大部分自学数分人的心声。有这么一个组队学习的机会还挺难得,希望经过这轮项目的历练,增进对数据分析流程的认识与理解。

珞珈航海号,扬帆启程咯~

Task 01 载入数据及数据观察

  1. pandas.read_csv可以使用chunksize分块处理大型csv文件,避免服务器内存吃不消

  2. 将表头改为中文,可以在读取数据时,将名称列表赋值给names
    df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)

  3. 观察数据时分析的第一步,看看数据的整体结构及样例,知道有什么样的素材才能进行下一步
    df.info()
    df.shape
    df.head(10) df.tail
    统计缺失 df.isnull.sum()
    描述性统计 df.describe()

  4. 保存数据
    df.to_csv('filename.csv') # pay attention to the coding.

  5. pandas基础
    处理dataframe数据的方法: 筛选行, 筛选列, 某个单元格数据
    与python处理excel中的cell, row, column有相似之处

reset_index() 重置索引,在获得新的index,原来的index变成数据列,保留下来。不想保留原先的索引,则使用drop=True.

  1. titanic dataset insight

在这个处理后的数据集中, 船上人的年龄都好年轻, 75%的都在38岁以下.


将数据根据年龄\票价排序, 为什么老人都穷苦. 哦不,结合看来, 还是有一定经济实力的
image

Task 02 数据分析的流程学习

  1. 数据清洗
    一般数据不干净,指数据中存在缺失值\重复值\异常点等,清洗过后变成想要的格式.
    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()

    :grin::fortune_cookie: Save the cleaned data

  2. 数据特征处理
    特征可以分为两类,数值型特征(离散型\连续性)和文本型特征(类别型文本特征)

    数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

    • 数据分箱操作
      :wink: 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)

  3. 数据重构
    [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

  4. 数据可视化

浙ICP备19012682号