数据分析——基础环境和工具

数据分析学习及实用技巧 —— LF《数据分析集训营》

本学习笔记内容来源于网络视频课,多为拼凑内容,但也很实用;
涵盖了职业分析、Excel、notebook & numpy & pandas & matplotlib的常规使用,仅为数据分析入门要求,如果想深入了解,可自阅官方文档;

职业解析

  • 导数据 做报表
  • 需求理解 动态分析
  • 预测

sql、excel、python + 业务理解,数据分析思维很重要;

数据分析岗位要求:

  • 做什么:
    • 了解公司核心业务:针对公司的数据流,从数据仓库、数据库中提取、监测数据;
    • 检测业务健康度:指标体系搭建、报表检测、办公自动化;
    • 精细化运营:用户分析、埋点、日志数据、BI平台、搭建BI平台;
    • 基于数据的新业务:支撑核心业务增长、新业务线、行业分析报告、数据探索;
    • 对外提供付费数据服务;
  • 需要什么:
    • 理解业务的能力;
    • 搭建指标体系:报表监测,Excel,SQL,Python;
    • 运营能力:埋点设计,统计学分析方法,数据分析报告,整理日志数据(SQL自己查);
    • BI平台的使用和接入:神策、PowerBI;或者搭建自己的BI平台(这是数据产品经理的工作,但是我们是这部分业务的需求方);
    • 支撑新业务:数据挖掘、智能服务、推荐算法;搭建新的指标体系;
    • 行业分析报告的撰写和解读 、数据探索;

技术栈和能力解读:

  • 数据业务思维 对标 运营岗;
  • 数据处理能力 sql+Excel+BI工具+Python
  • 数据分析 统计学+数据分析报告+可视化 用数据说话
  • 预测 机器学习
  • 其他: R(不需要了)、SAS、SPSS(拖拽的图表)、Matlab(也不需要);

Tips:

  • 小基础:SQL
  • 生产力:Excel
  • BI工具:超智能
  • 拉差距:Python

具体岗位职责:

  • 做表格、做报表、数据分析报告、问题分析和跟踪、重点业务客户跟踪;
  • 产品运营相关数据分析整理,建立分析模型(指 BI的使用 和 机器学习);Tableau;
  • 智能营销、风控,主要是预测场景;
  • 数学、统计学、计算机相关;

前景:

  • 擅长与人打交道:业务方向,高级数据分析 业务专家
  • IT型:数据平台 数据质量 大数据工程师
  • 喜欢数据:机器学习算法 数据挖掘 算法 解决方案专家

理解业务、学习技术、领域深耕(用户增长、风控、推荐、金融量化)、数据科学;

数据分析思维、统计学、Excel、SQL、Python、业务理解、PBI、Tableau、数据分析报告;

可以兼职做一些数据分析的工作;

一名好的数据分析师:

  • 搭建好的指标体系,选择好的指标,生成好的报表;
  • 直观的传达信息:可视化;
  • 正确且高效的传达信息;
  • 真实的统计,统计所传达的真相;

好的指标:

  • 王者为例:
    • 作战指标:场次 胜率 输出 生存 KDA
    • 信誉指标:信誉分 被举报次数 举报成功次数
    • 等级指标:VIP等级、经验等级
    • 社交指标:好友数 点赞数

思维训练:

  • 看别人的报告、图表,所表达的信息;
  • 看指标:行业的指标、指标体系;
  • 利用统计学:查看数据分布,适当选择可视化方法;

Excel入门基础

  • 数据格式 单元格格式【开始】
  • 函数:汇总 统计 文本处理 时间计算 查找和匹配 【公式】
  • 可视化【插入】
  • 数据透视表

Power Query:使用PowerBI,而不用Excel;

基础、数据条件格式、快捷键

  • F2: 切换单元格的编辑和选择模型
  • alt+enter:单元格中换行
  • 行列操作 可以自动调节 单元格行高、宽
  • 设置单元格格式 可以调整文字排列角度

数据格式:

  • 文本;数字;其他;自定义;

选择特定的数据类型 主要是为了匹配使用相应的函数

Excel的自定义格式:

##"次"

[>=75][蓝色]##"次";[<75][红色]##"次" // 这种根据条件改变了数字值的颜色;使用条件格式 可以设置单元格的颜色(颜色进度条);


[&gt;=60][蓝色]##&quot;分&quot;;[&lt;60][红色]##&quot;分&quot;####;0000(自动补位)

  • 自定义格式的结构
方式1

四个部分代码结构,中间用 ; 号间隔:
格式: 正数格式;负数格式;零格式;文本格式
示例:

两部分代码结构:
第一部分用于正数和零,第二部分用于负数
00.00;[红色]"-"00;

一部分代码结构:
用于所有数字

要跳过某一代码部分,需要为其指定一个结束分号;


方式2

特定条件,如
大于条件值;小于条件值;等于条件值;文本
示例:
[红色][<=100];[蓝色][>100]


方式3

特定条件
条件值1;条件值2;同时不满足条件值1,2;文本


使用方法:
使用 TEXT(value, format txt)
示例:
TEXT(1234.4567, "00.00") 显示为 1234.46


这里会用到一些符号标记:
- G/通用格式 // 这是默认的格式

- # // 代表数字
- ##.## // 保留两位小数

- ##.00 // 保留两位小数 不够则补0
- 0 // 也代表数字,不过 0000 对应的数值如果只要3位 就会在前 补一个0(这个0并无意义)

- "" // 使用双引号标记显示的字符串 仅仅是额外显示 不会影响被保留的单位

- ? // 为无意义的零在小数点两边添加空格,以便使小数点对其
- ??.???

- , // 显示千位分隔符或者将数字除以千倍显示
- #,# // 千位分隔符
- #, // 除以千倍
- #,, // 除以千千倍

- . // 小数点 如果外加双引号则为字符
- 0.# 

- % // 百分比
- #% // 以百分比显示数字

- / // 显示后面一个字符 实际会被转成双引号的形式
- "" // 显示双引号里的字符

- * // 重复下一次字符 直到充满列宽,用于文本重复显示

条件格式

  • 数据条;色阶;显示规则;

单元格样式

清除功能

排序和筛选

  • 自定义排序,可以按照
    • 单元格值 的排序
    • 单元格颜色 的排序
    • 字体颜色 的排序
    • 条件格式图标 的排序

查找和选择

  • 查找指定内容的单元格后,在查找弹出内容 全选
  • 再针对指定的内容 进行替换

填充柄、冻结窗格、数据格式的变换

审阅:保护工作表、工作簿,即添加密码、进行操作限制;

只开放部分区域:可以 使用审阅中的“允许编辑区域”

填充柄:

  • 放在单元格的右下角,变成➕号,然后拖动;
  • 填充方式是可选的(右键拖动):可复制、可填充等差 等比 日期序列等;

添加自定义选项序列

  • 文件 选项 高级 编辑自定义列表;

多个不连续单元格填入同数据

  • Ctrl 逐个选中
  • Ctrl + Enter补全

文本记忆输入:

  • 右键 从下拉列表中选择,会把所编辑单元格之上的所有数据使用下拉选择输入;
  • 相当于进行了有效性验证

数据验证:

  • 单元格只能输入要求的数据;
  • 选择验证区域,选择 数据 -》数据验证 功能,进行验证条件设置;可以把已存在的无效数据圈出来;

数据可以从外部导入;(更确切的说是引入)

单列数据 可以 使用 数据中的分列功能 进行按照特定分隔符的拆分;

汇总的快捷方式:Alt + =

视图 冻结单元格:当数据行列较多时,方便查看;

定位条件 替换 排序等常用操作

填充空值:

  • 查找 选择、定位条件、空值(或其他);

分类汇总:

  • 数据 分类汇总;

查找 选择、定位条件、可见单元格

选择性粘贴:

  • 对粘贴的数据 进行额外的操作
  • 可以转置,将行转列

隔一行差一行

  • 插入辅助列:
    • 有数据的部分 填入等差数列 首项1
    • 无数据的部分 填入等差数列 首项2
  • 排序即可

快速填充、智能填充(Ctrl + e)

数据分列:

  • 右侧需要有一个空列

Python编程环境

Anaconda和镜像

Anaconda / Miniconda

  • python环境管理工具,支持conda命令安装所需包;
  • 选择Python3 64位版本, Miniconda3 Windows 64-bit;
  • Mac下载 MacOS pkg即可;

打开Anaconda Prompt终端:(或者cd到conda目录 conda activate base

接下来可以 做一些 conda的配置;

Anaconda 镜像使用帮助

  • Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。
  • Anaconda 安装包可以到 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下载。
  • TUNA 还提供了 Anaconda 仓库与第三方源(conda-forge、msys2、pytorch等,查看完整列表)的镜像,各系统都可以通过修改用户目录下的 .condarc 文件。Windows 用户无法直接创建名为 .condarc 的文件,可先执行 conda config --set show_channel_urls yes 生成该文件之后再修改。

注:由于更新过快难以同步,我们不同步pytorch-nightly, pytorch-nightly-cpu, ignite-nightly这三个包。

channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  • 即可添加 Anaconda Python 免费仓库。
  • 运行 conda clean -i 清除索引缓存,保证用的是镜像站提供的索引。
  • 运行 conda create -n myenv numpy 测试一下吧。

主要是配置国内的安装源 如清华源;(某些包如果这个源没有,就需要更换其他源,或者使用pip安装)

conda install jupyter
pip install pyecharts # pyecharts只能使用pip安装

环境变量:

  • 打开命令提示符,可执行的指令包括:内部命令、外部命令、可运行程序、批处理文件;
  • 我们之所以能够执行python启动python环境,是因为我们配置了环境变量;
  • 环境变量相当于执行命令时,优先检索的路径;

用户变量 和 系统变量:

  • 一般配置到系统变量 PATH中;
  • 主目录、script、lib、bin;
  • 相关的指令包括: conda、python、jupyter notebook;
  • which python 查看指定终端命令 环境变量的路径

conda的基本使用:

Conda:查看
    conda list
    conda env list
    conda update conda

Conda:创建
    conda create -n your_env_name python=X.X
    python --version
    source activate your_env_name(虚拟环境名称) / activate your_env_name(虚拟环境名称) / conda activate base
    conda install -n your_env_name [package]即可安装package到your_env_name中
    
Conda:切换
    deactivate env_name,也可以使用`activate root`切回root环境
    Linux下使用 source deactivate 

Conda:更新
    conda update conda
    conda update --force conda

移除环境
   使用命令conda remove -n your_env_name(虚拟环境名称) --all, 即可删除。

删除环境中的某个包。
   使用命令conda remove --name $your_env_name  $package_name 即可。

设置国内镜像
    如果需要安装很多packages,你会发现conda下载的速度经常很慢,因为Anaconda.org的服务器在国外。所幸的是,清华TUNA镜像源有Anaconda仓库的镜像,我们将其加入conda的配置即可:
# 添加Anaconda的TUNA镜像
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    # TUNA的help中镜像地址加有引号,需要去掉
 
    # 设置搜索时显示通道地址
    conda config --set show_channel_urls yes

示例:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ 
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ 
conda config --set show_channel_urls yes

notebook操作

单元格选中状态(编辑状态)

  • a 上边加一个
  • b 下边加一个
  • c copy
  • v 粘贴
  • dd 删除单元格
  • x 剪切单元格(往往用来替代删除)
  • z 撤销单元格操作(注意撤销的是对单元格的操作)
  • m 切换到markdown
  • y 切换回code
  • 编辑状态 切换到 选中状态:esc
  • shift+enter / ctrl + enter 运行单元格
  • shift + tab 查看函数 类似问号?的方式查看函数文档
  • func?
  • help(len)

魔发指令:

  • %run 运行外部python脚本(一般可以把软件工具包 写成这样一个单独的脚本)
  • %time 记录一行运行时间
%time func
  • %%time 记录多行运行时间
%%time
func1
func2
  • %timeit 循环多次取均值
%timeit func
  • %%timeit 循环多次取均值
%%timeit
func1
func2
  • %who 查看当前Python变量
  • %whos 更详细

值得注意IN OUT 的单元格序号 说明单元格的操作是有顺序的;

  • In[45] 可以返回 单元格In序号为45的输出
  • Out[44] 可以返回 单元格Out序号为44的输出
  • _ 最近一次输出
  • _44 等价于 Out[44]

多个cell运行独立 但是资源共享;Ipython内核:基于python内核,做了数学上的优化;

Python数据处理之 numpy、pandas、matplotlib

numpy、pandas、matplotlib + seaborn、pyecharts

numpy

矩阵运算

import numpy as np
import matplotlib.pyplot as plt

arr = np.array([])
arr.sum()
np.arange(1,10,2) # 一组等差序列
np.random.randn(n) # 一组随机数 服从正态分布(均值0 方差1)

plt.hist(data) # 直方图展示

np.random.randint(起始数, 终止数,(行,列))

arr.reshape((4,5))

# 从0 到 2π 之间 拆出100个数,等差数列
x = np.linespace(0, 2*np.pi, 100)
y = np.sin(x)


pandas

二维表格处理:分析 和清晰

  • series
  • DataFrame
import pandas as pd

pd.Series(['a','b','c']) # 默认 显示索引 0 1 2

names = pd.Series(['a','b','c'], index=['x','y','z']) # 指定 显示索引为 x y z
ages = pd.Series(['1','2','3'], index=['x','y','z'])

# 共用索引 即可组成表格
pd.DataFrame(data={
  'names':names,
  'ages':ages
})

# 也可以传入数组(ndarray也可)进行构建
pd.DataFrame([[1,2],[1,2],[1,2]], columns=['date','score'], index=["A","B","C"])

# 其他构造方法
df = pd.DataFrame()
df['date'] = [1,3,5]
df['score'] = [2,4,6] 

# 从一个字典构造
pd.DataFrame.from_dict({'a':[],'b':[]}) # 默认列索引
pd.DataFrame.from_dict({'a':[],'b':[]}, orient="index") # 可以改变朝向 变成行索引

修改索引 :

# 把列设置为索引
df.set_index('date') # 未修改原数据
df.set_index('date', inplace=True) # 替换原数据

# 把索引设置为列
df.reset_index()
df.reset_index(inplace=True)

# 修改 索引和列名
df.rename(index={"A":"a","B":"b","C":"c"}, columns={'X':'x','Y':'y'}, inplace=True)

文件读取和写入:

pd.read_excel('./xxx1.xlsx')
pd.read_excel('./xxx1.xlsx', sheet_name=0) # 第一个sheet的索引为0
pd.read_excel('./xxx1.xlsx', index_col=0) # 将第0列设定为 行索引
pd.read_excel('./xxx1.xlsx', header=0) # 将第0行设定为 列索引(多行就传入数组)


df.to_excel('./xxx2.xlsx', index=False)

数据的读取和筛选:


data_list = [[1,2,3]],[4,5,6],[7,8,9]

data = pd.DataFrame(data=data_list, index=['r1','r2','r3'], columns=['c1','c2','c3'])

# 读取n列
data['c1'] # 单列 seriex
data[['c1','c2']] # 多列 dataframe

# 读取n行
data.loc['r1'] # 单行
data.loc[['r1','r2']] # 多行

data.head(10) # 查看前10行 默认为5

# 筛选
data[df['c1'] > 1]


data.shape
data.describe()
data.info()


data['c1'].value_counts() # 数值频次统计

# 运算
df['sum'] = df['c1'] + df['c2'] + df['c3']

# 聚合运算
df.sum(axis=0) # 列向 每一列求和 series
df.mean(axis=1) # 行向 每一行求和 series

# 数据映射:通过map方法 对数据列进行映射
def map_func(x):
  if x >0 :
    return 'A'
  else:
    return 'B'

df['c1'].map(map_func) # map是对Series的

df.apply(map_func) # apply是对Dataframe的
df.apply(map_func, axis=0) # axis=0(每次给一列,可以对该列的每行访问)
df.apply(map_func, axis=1) # apply通过设置axis=1(每次给一行,可以对该行的列访问)

df.sort_values(by='c1', ascending=False) # 排序
df.drop_duplicates(subset=["name", "songer"], keep="first", inplace=True) # 按列去重

# pandas 其他常用方法:
    mean(axis=0, skipna=False) # DataFrame 经计算返回的是 Series对象 默认按列进行计算
    sum(axis)
    sort_index(axis, ascending) # 对 列/行 索引进行排序
    sort_values(by, axis, ascending) # 对 列/行 值进行排序


# 空值处理
df.fillna(value=0, inplace=True) # 全部填充
df.loc[2, 'c2'] = 0 # 单独赋值 索引为2的行 列名为c2的列
    df.loc[‘a’,’one’] # 更推荐的方式 和ndarray类似
    df.loc[['a’,’c'],:]


# 空值检验
df.isnull()
df.isnull().sum() # 每列空值个数
df.isnull().sum().mean() # 每列空值占比


# 处理缺失数据的方法:
    dropna() #默认 一行只要有一个缺失值 整行就都会被删掉
    dropna(how=all) # how的默认值是any 设置为all之后 那么需要整行都是缺失值 才会被删掉;
    dropna(axis=1) # 按列轴 进行 缺失值处理
    fillna()
    isnull()
    notnull()

pandas 时间相关:

# pandas 对时间对象的处理
# 时间序列类型:
#     时间戳
#     时期
#     间隔
# Python标准库处理时间对象:datetime time
    import datetime
    datetime.datetime.strptime(2021-06-21,%Y-%m-%d')
# 灵活处理时间对象:dateutil库(pandas依赖该库)
    dateutil.parser.parse('2021/06/21)
    dateutil.parser.parse('06/21/2021')
# 成组处理时间对象:
    pd.to_datetime(['2021/06/21','2021/06/22']) 
# 生成时间范围:
    dt = pd.date_range(start, end, freq='1h20min') # 默认频率是天(D day)、月(M month)、半个月(SM semi-month)小时(H hour)、周日(W week)、周一(W-MON)、工作日(B business)、分钟(T min)、秒(S second)、年(A year);
    pd.date_range(start, period)
    dt[0].to_pydatetime()


# pandas 时间序列
#     以时间对象作为索引的 Series 或 DataFrame
#     datetime对象作为索引时 是存储在 DatetimeIndex对象中的
# 时间序列特殊功能:
#     传入 年 年月 作为切片方式
#     传入日期范围作为切片方式
#     丰富的函数支持:
        resample() # 重新采样
        sr.truncate(before,after) # 类似切片
sr = pd.Series(np.arange(100), index=pd.date_range('2020-01-01', period=100))
sr['2020-03'] # 整个三月
sr['2020-03':'2020-4'] # 切片 支持不完整的日期
sr.resample('W').sum() # 会算出来 每一周数据的和
sr.resample('M').mean() # 每个月数据的平均值

使用实例:

# 时间类型装换
pd.to_datetime(df['日期'])
df.info()

df.set_index('日期')

# 2016年3月的所有数据(DataFrame)
df.loc['2016-3'] # 由于是datetime类型 这里索引行 会自动识别


# 路径简要操作
if not os.path.exists('./test'):
  os.makedirs('./test')

for item in os.listdir('./test')
  file_path = os.path.join('./test', item)
  print(file_path)

for root, dirs, filenames in os.walk('./test')
  print('逐层路径 遍历目录!!')
  for filename in filenames:
    print(os.path.join(root, filename))


# 汇总:
# 级联汇总:纵向(字段同)
pd.concat(df1, df2)
# 合并汇总:横向(关联索引同)

matplotlib

数据可视化功能:

  • plt.plot() 折线图
  • plt.bar() 柱状图
  • plt.pie() 饼状图
  • plt.scatter() 散点图
# 引入方式
import matplotlib.pyplot as plt
# from matplotlib import pyplot as plt # 同
%matplotlib inline


# 多条线:  
plt.plot(x, y, color='red', linewidth=3, linestyle='--') # -- 虚线
plt.plot(x, y, color='red', linewidth=3, linestyle='-') # - 实线
plt.show() # 渲染(单元末尾可选)


plt.bar(x,y)
plt.bar(x,y, color=np.random.random((4,3))) # 4个 3元组 值为0~1之间的小数
plt.show() # 渲染(单元末尾可选)


plt.scatter(x, y)
plt.scatter(x, y, s=z) # s指 size 表示散点大小
plt.show() # 渲染(单元末尾可选)



# 图例、标题和说明
plt.title('Title')
plt.xlabel('X')
plt.ylabel('Y')

plt.plot(x, y, label='L1') # 图例信息
plt.legend() # 图例展示
plt.legend(loc='upper right') # 指定位置 右上角【upper lower right left】


# 中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块的问题
# 可以打印 查看 plt.rcParams

pandas中的便捷绘图:

df.plot(kind='line') # 线状图
df.plot(kind='bar') # 柱状图
df.plot(kind='hist') # 直方图
df.plot(kind='bie') # 饼图
df.plot(kind='box') # 箱体图
df.plot(kind='area') # 面积图
# series 也有类似的绘图功能

df.T.plot()

绘制多图:子画布

figure
  axes:1  axes:2
  axes:3  axes:4

# 绘制多图
plt.figure(figsize=(12, 8)) # 调整画板大小

ax1 = subplot(221) # 2行2列的画布 在子图序号1上进行绘制
ax1.plot(x, y)

ax2= subplot(222) 
ax2.plot(x, y)

ax3= subplot(223) 
ax3.plot(x, y)

ax4= subplot(224) 
ax4.plot(x, y)

Over!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值