解读此表
但是上面的用法做不到随心所欲的指定任意两组进行比较,所有还有下一种方法
处理好了分组信息,再自定义比较元素
自定义函数进行比较
热土和火山图都是傻瓜式的,只要的前面得出的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))
}
}