初试用R进行数据统计

需要明了的基础概念:

概率:某个事件出现的可能性;
频率分布表:统计与某数值一致的数据的个数、着这属于某数值范围的数据的个数,然后将这些统计值制成一览表;
直方图:图形化的频率分布表;
平均值(期望值):用总和除以数量就是平均值。
总体:所有应当调查的对象;
样本:总体的一部分;
标准差:衡量数据离散程度的值,代表了数据相对于平均值的离散程度,先求所有差值的平方和,然后初一总数-1后的数值;
离散:也叫误差,数据的离散是有规律的,又被称为数据的分布;
正态分布:数据的离散程度称为分布,其中左右对称且只有少数结果极其偏离期望值的分布则称为正态分布。
95%的数据所在范围:距离平均值2个标准差以内;
显著水平:在实施分析或展开调查钱就确定好的一个量,用作判断基准的概率,1%、5%、10%;
零假设:认为样本均值和总体均值之间的差异只是误差,即认为二者之间不存在差异的假设;
备择假设:认为样本均值和总体均值之间差异超出了误差的范围;
概率不足5%:否定零假设
概率大于5%:保留零假设
均值差异检验:把平均值和总体均值与应当值作对比,判断二者是否在误差范围内。

将excel表格breads.csv导入RStudio

> breads <- read.csv("breads.csv")

计算面包重量的平均值

> mean(breads$weight)
[1] 397.1267

计算面包的标准差

> sd (breads$weight)
[1] 10.92062

输出面包的重量分布的直方图

> hist(breads$weight)


调用t.test函数求得概率值(p-value)
mu=400表示总体均值定义为400(克)
t表示离差统计量,df表示自由度

> t.test (breads$weight,mu=400)

    One Sample t-test

data:  breads$weight
t = -1.4411, df = 29, p-value = 0.1603
alternative hypothesis: true mean is not equal to 400
95 percent confidence interval:
 393.0488 401.2045
sample estimates:
mean of x 
 397.1267 

搭建R语言环境

R是一套完整的数据处理、计算和制图软件系统。其功能包括:数据存储和处理系统;数组运算工具(其向量、矩阵运算方面功能尤其强大);完整连贯的统计分析工具;优秀的统计制图功能;简便而强大的编程语言:可操纵数据的输入和输出,可实现分支、循环,用户可自定义功能。
与其说R是一种统计软件,还不如说R是一种数学计算的环境,因为R并不是仅仅提供若干统计程序、使用者只需指定数据库和若干参数便可进行一个统计分析。R的思想是:它可以提供一些集成的统计工具,但更大量的是它提供各种数学计算、统计计算的函数,从而使使用者能灵活机动的进行数据分析,甚至创造出符合需要的新的统计计算方法。
RStudio是一款跨平台的R语言IDE,把常用的窗口都整合在让开发者,不用在命令行和绘图窗口跳来跳去,RStudio全部都在一个窗口,让你更方便的来控制。R语言,一直来都没有一个很好的IDE,RStudio算是给R补充了这一块。

软件安装

  • ubuntu下安装r语言以及rstudio
sudo apt install -y r-base r-base-dev
sudo apt install -y rstudio
  • Windows下安装r语言以及rstudio

使用国内的R程序镜像源:R base
使用官方的rstudio下载页面:RStudio

使用初步

模拟百分之一中奖率的一次抽奖活动

> choujiang <- c("未中奖","中奖") 
> sample(choujiang, 100, prob=c(99,1), replace = TRUE)
  [1] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
  [7] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [13] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [19] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [25] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [31] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [37] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [43] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [49] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [55] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [61] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [67] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [73] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [79] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [85] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [91] "未中奖" "未中奖" "未中奖" "未中奖" "未中奖" "未中奖"
 [97] "未中奖" "未中奖" "未中奖" "未中奖"

查看投掷100次骰子各个面出现的几率

> table(sample(1:6,100,replace = TRUE))

 1  2  3  4  5  6 
13 24 14 18 15 16 

绘制直方图

> hist(sample(1:6,100,replace = TRUE), breaks=0:6)

安装插件

要使用ggplot2插件,需要在联网情况下,在rstudio的命令窗口执行

install.packages("ggplot2")

tips:注意"C:\Program Files\R\R-3.4.1\library"目录要有写权限。

> res <- replicate(10000, mean(sample(1:6,100,replace = TRUE)))
> hist(res)
> library(ggplot2)
> dice <- data.frame(骰子 = res)
> ggplot(dice, aes(x=骰子))+geom_histogram(bindwith = .1,fill="steelblue",color="black",alpha=0.5)+xlab("期望值")+ylab("次数")+ggtitle("掷100次骰子后的期望值")

MySQL的恢复

什么时候需要恢复数据

  • 硬件故障(如磁盘损坏、raid丢失)
  • 人为删除(如误删数据、黑客入侵)
  • 业务回滚(如游戏bug需要回滚)
  • 正常需求(部署镜像库、查看历史某时刻数据)

恢复条件

  • 有效备份
  • 完整日志
  • row格式的binlog(反转SQL)

恢复工具与命令

  • source
  • innodbackupex
  • mysql

案例

恢复某几条误删数据
恢复误删除表、库
将数据库恢复到指定时间点

MySQL示例数据库

MySQL数据库实际上提供了试验用的数据库,类似于MS SQLServer的Advancedworks示例数据库。

tips:数据库文件比较大,下载会比较慢。

#获取
git clone https://github.com/datacharmer/test_db.git
cd test_db
mysql -usujx -p
#导入数据库
mysql> source employees.sql
#数据校验
mysql> source test_employees_md5.sql;
mysql> source test_employees_sha.sql;
#提示OK之后就可以使用了
mysql> select * from departments;e
+---------+--------------------+
| dept_no | dept_name          |
+---------+--------------------+
| d009    | Customer Service   |
| d005    | Development        |
| d002    | Finance            |
| d003    | Human Resources    |
| d001    | Marketing          |
| d004    | Production         |
| d006    | Quality Management |
| d008    | Research           |
| d007    | Sales              |
+---------+--------------------+
9 rows in set (0.00 sec)

mysql> select * from employees order by birth_date desc limit 1,1;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  11157 | 1965-02-01 | Mario      | Cochrane  | M      | 1985-03-30 |
+--------+------------+------------+-----------+--------+------------+
1 row in set (0.25 sec)
mysql> select count(*) from employees;
+----------+
| count(*) |
+----------+
|   300024 |
+----------+
1 row in set (0.11 sec)

MySQL的备份

基本知识

  1. 数据灾备
    应对硬件故障、数据丢失
    应对人为或者程序bug导致的数据误删除
  2. 制作数据库以供服务
    需要将数据库迁移、统计分析等用处;
    需要为线上数据建立一个镜像;

备份内容

  1. 数据
    数据文件或者文本格式数据
  2. 操作日志(binlog)
    数据库变更日志

类型

  1. 冷备份
    关闭数据库服务,完整拷贝数据文件
  2. 热备份
    在不影响数据库读写服务的情况下备份数据库
  3. 物理备份
    以数据页形式拷贝数据文件,速度快
  4. 逻辑备份
    导出为裸数据或者SQL(insert)语句,恢复快
  5. 本地备份
    在数据库服务器本地进行备份
  6. 远程连接数据库进行备份
  7. 全量备份
    备份完整的数据库
  8. 增量备份
    只备份上一次备份发生之后的数据;

备份周期

考虑因素:
+ 数据库的大小
+ 恢复速度要求(快速或者慢速)
+ 备份方式(全量or增量)

常用工具

mysqldump——逻辑备份,单线程,热备
xtrabackup——物理备份,热备
snapshot
mysqldumper
cp

MySQLdump的使用

sujx@x200:~$ mysqldump -help
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help

备份整个数据库

mysqldump -usujx -p12345 sujx > sujx.sql

备份数据库中某个表

mysqldump -usujx -p12345 sujx food > food.sql

备份远程数据库

mysqldump -usujx -p12345 -h192.168.31.25 sujx food > food.bak.sql

xtrabackup的使用

安装
sudo apt install xtrabackup -y
OR
download:http://www.percona.com/downloads/xtrabackup

特点

  • 开源,可以在线备份InnoDB表;
  • 支持限速备份,避免对业务造成影响;
  • 支持流备;
  • 支持增量备份;
  • 支持备份文件压缩与加密;
  • 支持并行备份与恢复,速度快

原理

  • 基于innodb的crash-recovery功能;
  • 备份期间允许用户读写,写请求产生redo日志;
  • 从磁盘上拷贝数据文件;
  • 从InnoDB redo log file实时拷贝走备份期间产生的所有redo日志;
  • 恢复数据的时候,数据文件+redo日志=一致性数据

实用脚本

innobackupex

如何制定备份策略

考虑因素
+ 数据库是不是都是InnoDB引擎表
+ 数据量的大小
+ 数据库本地空间是否充足;
+ 需要多快恢复;