R语言GEO数据挖掘:步骤三:进行基因差异分析

Python013

R语言GEO数据挖掘:步骤三:进行基因差异分析,第1张

用limma包,这里注意,limma包是对基因芯片表达矩阵的分析,不能对逆转录RNAseq表达矩阵进行分析(因为数据特征不同),RNAseq需要用另一种方法

解读此表

但是上面的用法做不到随心所欲的指定任意两组进行比较,所有还有下一种方法

处理好了分组信息,再自定义比较元素

自定义函数进行比较

热土和火山图都是傻瓜式的,只要的前面得出的deg数据(也就是基因差异表达数据)是正确的

参考: http://mp.weixin.qq.com/s?__biz=MzIxNjA2ODUzNg==&mid=2651440274&idx=1&sn=7c5b8062891110c191f2463c3f1060c8&chksm=8c73dc45bb04555346d33c0e91449b7603468d09d5b3b945140451e9c259a5995b55f070527d&mpshare=1&scene=24&srcid=040751THZgbr42wORjuPnmR0&sharer_sharetime=1586226101529&sharer_shareid=e7cab4ddb0b83013d3591b3744cb904b#rd

数据: https://tianchi.aliyun.com/dataset/dataDetail?dataId=46

查看数据集缺失值情况:

变量time和user_geohash都包含缺失值,其中time包含1个缺失值,user_geohash包含550130个缺失值。

因为user_geohash地理信息在数据收集过程中做过加密转换,所以选择不对缺失值进行处理。

将time列分裂为date和hour列,并转换数据类型:

PV(访问量):即Page View,指网站页面的浏览量或点击量,页面被刷新一次就计算一次。

UV(独立访客):即Unique Visitor,访问网站的一台电脑客户端为一个访客。

1)日访问量分析

2)日访客分析

结果如图所示,pv和uv访问量在双十二期间达到峰值。使用最高uv除以总人数,可得出双十二期间淘宝用户的日活跃率最高为67.5%。

3)小时访问量分析

1、2、3、4分别代表点击、收藏、加购物车和支付。从上图中可以看到点击的次数远高于其他三种行为,以至于其他三种行为的趋势看不出来,所以下图中去掉了行为1的曲线。

从整体上看,四种行为的波动情况基本一致,并且在晚上7点-10点间pv访问量最高。

同时,从下图中也可以看到,行为3(加购物车)的pv总量高于行为2(收藏),行为2又高于行为4(支付)。

1)活跃用户每天购买次数情况分析

淘宝用户消费次数普通在10次以下,因此需要重点关注消费次数在10次以上的用户。

2)活跃用户每天人均消费次数

每天消费总次数 / 每天消费总人数

可以看到每天的平均消费次数一般都在1.2次左右,双十二期间达到最高值,约为1.4。

3)付费率

每日消费总人数 / 每日总活跃人数(每日有操作行为的人数)

用户付费率在6%左右,平均低于6%,双十二期间超过16%。

4)同一时间段用户消费次数分布

大多数用户消费次数为1次,平均消费次数为2.359,75%用户消费次数在3次以下。

复购率 = 有复购行为的用户数 / 有购买行为的用户总数

复购:两天以上有购买行为,但一天内购买两次或以上只算一次购买行为

将数据按日期排序,可以看到数据集的时间跨度为从2014-11-18到2014-12-18之间,正好一个月的时间:

先按date和user_id去重,然后按user_id计数,大于1时即为复购行为:

一个月之内的复购率为46.7%,多数用户在一个月内的购买次数为1-5次。

反映用户行为状态从起点(点击)到终点(支付)各阶段的转化率情况。

将数据按商品(item_category)和用户行为分组,然后计算各行为的次数。

用户点击后,大约有4.013%的概率会加入购物车,而加入购物车后大约有35.135%的概率会支付。

Geohash的最简单的解释就是:将一个经纬度信息,转换成一个可以排序,可以比较的字符串编码

import java.io.File

import java.io.FileInputStream

import java.util.BitSet

import java.util.HashMap

public class Geohash {

private static int numbits = 6 * 5

final static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8',

'9', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p',

'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }

final static HashMap<Character, Integer>lookup = new HashMap<Character, Integer>()

static {

int i = 0

for (char c : digits)

lookup.put(c, i++)

}

public static void main(String[] args) throws Exception{

System.out.println(new Geohash().encode(45, 125))

}

public double[] decode(String geohash) {

StringBuilder buffer = new StringBuilder()

for (char c : geohash.toCharArray()) {

int i = lookup.get(c) + 32

buffer.append( Integer.toString(i, 2).substring(1) )

}

BitSet lonset = new BitSet()

BitSet latset = new BitSet()

//even bits

int j =0

for (int i=0i<numbits*2i+=2) {

boolean isSet = false

if ( i <buffer.length() )

isSet = buffer.charAt(i) == '1'

lonset.set(j++, isSet)

}

//odd bits

j=0

for (int i=1i<numbits*2i+=2) {

boolean isSet = false

if ( i <buffer.length() )

isSet = buffer.charAt(i) == '1'

latset.set(j++, isSet)

}

double lon = decode(lonset, -180, 180)

double lat = decode(latset, -90, 90)

return new double[] {lat, lon}

}

private double decode(BitSet bs, double floor, double ceiling) {

double mid = 0

for (int i=0i<bs.length()i++) {

mid = (floor + ceiling) / 2

if (bs.get(i))

floor = mid

else

ceiling = mid

}

return mid

}

public String encode(double lat, double lon) {

BitSet latbits = getBits(lat, -90, 90)

BitSet lonbits = getBits(lon, -180, 180)

StringBuilder buffer = new StringBuilder()

for (int i = 0i <numbitsi++) {

buffer.append( (lonbits.get(i))?'1':'0')

buffer.append( (latbits.get(i))?'1':'0')

}

return base32(Long.parseLong(buffer.toString(), 2))

}

private BitSet getBits(double lat, double floor, double ceiling) {

BitSet buffer = new BitSet(numbits)

for (int i = 0i <numbitsi++) {

double mid = (floor + ceiling) / 2

if (lat >= mid) {

buffer.set(i)

floor = mid

} else {

ceiling = mid

}

}

return buffer

}

public static String base32(long i) {

char[] buf = new char[65]

int charPos = 64

boolean negative = (i <0)

if (!negative)

i = -i

while (i <= -32) {

buf[charPos--] = digits[(int) (-(i % 32))]

i /= 32

}

buf[charPos] = digits[(int) (-i)]

if (negative)

buf[--charPos] = '-'

return new String(buf, charPos, (65 - charPos))

}

}

import java.io.File

import java.io.FileInputStream

import java.util.BitSet

import java.util.HashMap

public class Geohash {

private static int numbits = 6 * 5

final static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8',

'9', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p',

'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }

final static HashMap<Character, Integer>lookup = new HashMap<Character, Integer>()

static {

int i = 0

for (char c : digits)

lookup.put(c, i++)

}

public static void main(String[] args) throws Exception{

System.out.println(new Geohash().encode(45, 125))

}

public double[] decode(String geohash) {

StringBuilder buffer = new StringBuilder()

for (char c : geohash.toCharArray()) {

int i = lookup.get(c) + 32

buffer.append( Integer.toString(i, 2).substring(1) )

}

BitSet lonset = new BitSet()

BitSet latset = new BitSet()

//even bits

int j =0

for (int i=0i<numbits*2i+=2) {

boolean isSet = false

if ( i <buffer.length() )

isSet = buffer.charAt(i) == '1'

lonset.set(j++, isSet)

}

//odd bits

j=0

for (int i=1i<numbits*2i+=2) {

boolean isSet = false

if ( i <buffer.length() )

isSet = buffer.charAt(i) == '1'

latset.set(j++, isSet)

}

double lon = decode(lonset, -180, 180)

double lat = decode(latset, -90, 90)

return new double[] {lat, lon}

}

private double decode(BitSet bs, double floor, double ceiling) {

double mid = 0

for (int i=0i<bs.length()i++) {

mid = (floor + ceiling) / 2

if (bs.get(i))

floor = mid

else

ceiling = mid

}

return mid

}

public String encode(double lat, double lon) {

BitSet latbits = getBits(lat, -90, 90)

BitSet lonbits = getBits(lon, -180, 180)

StringBuilder buffer = new StringBuilder()

for (int i = 0i <numbitsi++) {

buffer.append( (lonbits.get(i))?'1':'0')

buffer.append( (latbits.get(i))?'1':'0')

}

return base32(Long.parseLong(buffer.toString(), 2))

}

private BitSet getBits(double lat, double floor, double ceiling) {

BitSet buffer = new BitSet(numbits)

for (int i = 0i <numbitsi++) {

double mid = (floor + ceiling) / 2

if (lat >= mid) {

buffer.set(i)

floor = mid

} else {

ceiling = mid

}

}

return buffer

}

public static String base32(long i) {

char[] buf = new char[65]

int charPos = 64

boolean negative = (i <0)

if (!negative)

i = -i

while (i <= -32) {

buf[charPos--] = digits[(int) (-(i % 32))]

i /= 32

}

buf[charPos] = digits[(int) (-i)]

if (negative)

buf[--charPos] = '-'

return new String(buf, charPos, (65 - charPos))

}

}