利用百度Echart【scatter】进行数据分析

2018-09-13  本文已影响110人  purewater2014
最近在做一个投票活动,由于活动参与量较大,部分淘宝商家已经做起了刷票生意【据说生意还很不错~~】。所以防刷是很重要的一部分。

之前已经在技术层面已经做好了防刷,但人工刷票,确实防不胜防啊!
今天呢,从数据分析的角度,通过投票记录,来筛选异常投票情况,从而找出刷票教练。

思路整理:
1.计算每小时(可细化到每分钟),每个教练的得票数;
2.利用Echarts【scatter-aqi-color】,进行数据可视化;
3.找出异常点,找出异常教练;

具体步骤:

1. 导出每小时的教练得票数

select sum(vote) as vote,uid,date_format(from_unixtime(create_time), '%H') as date from t_vote_log where from_unixtime(create_time) between '2018-09-10' and '2018-09-12' group by uid,date;

2. 格式化数据【支持Echarts-scatter-aqi-color】

php代码:
   $file = './0913votelog.log';  // 导出日志log
    $fileout = './0913votelognew.log';  // 生成新的文件
    if (file_exists($fileout)) {
        unlink($fileout);  // 初始化,如果已经导出过,先删除旧文件
    }
    $f = fopen($file, 'r') or exit('file not exit');
    $f2 = fopen($fileout, 'w') or exit('file open error');
    fwrite($f2, 'var VOTEDATA = [');  
    while (!feof($f)) {
        $line = fgets($f);
        $attr = preg_split('/[\n\t\r\s+]/i', $line);
        $vote = $attr[0];$cid = $attr[1];$time = $attr[2];
        if ($vote && $cid && $time && is_numeric($cid)) {
            $format = "[{$time},{$vote},{$cid}],";
            fwrite($f2, $format . PHP_EOL);
        }
    }
    $end = rtrim($format, ',') . ']';
    fwrite($f2, $end);
    echo 'success';

数据格式如下:


image.png

3.使用Echart进行数据可视化【在官网下载-demo代码scatter-aqi-color】

a.首先导入数据

<script type="text/javascript" src="file:///Users/eric/Downloads/0913votelognew.log"></script>

b.配置

注意:数据的第一列是x轴,第二列是y轴数据。

var dataBJ = VOTEDATA;
// 根据具体数据格式配置:
var schema = [
    {name: 'date', index: 0, text: '时间'},
    {name: 'vote', index: 1, text: '票数'},
    {name: 'userId', index: 2, text: '用户id'}
];

tooltip: {
        padding: 10,
        backgroundColor: '#222',
        borderColor: '#777',
        borderWidth: 1,
        formatter: function (obj) {
            var value = obj.value;
            return '<div style="border-bottom: 1px solid rgba(255,255,255,.3); font-size: 18px;padding-bottom: 7px;margin-bottom: 7px">'
                + obj.seriesName + '时间:' + value[0]
                + '</div>'
                + schema[1].text + ':' + value[1] + '<br>'
                + schema[2].text + ':' + value[2] + '<br>';
        }
    },

xAxis: {
        type: 'value',
        name: '日期',
        nameGap: 16,
        nameTextStyle: {
            color: '#fff',
            fontSize: 10
        },
        max: 24,  // 横坐标按照24小时
        splitLine: {
            show: false
        },
        axisLine: {
            lineStyle: {
                color: '#eee'
            }
        }
    },
    yAxis: {
        type: 'value',
        name: '票数',
        nameLocation: 'end',
        nameGap: 20,
        nameTextStyle: {
            color: '#fff',
            fontSize: 16
        },
        axisLine: {
            lineStyle: {
                color: '#eee'
            }
        },
        splitLine: {
            show: false
        }
    },
// 右边筛选配置
visualMap: [
        {
            left: 'right',
            top: '10%',
            dimension: 2,
            min: 0,
            max: 1000,
            itemWidth: 30,
            itemHeight: 120,
            calculable: true,
            precision: 0.1,
            text: ['圆形大小:票数'],
            textGap: 30,
            textStyle: {
                color: '#fff'
            },
            inRange: {
                symbolSize: [1, 7]   // 圆圈大小
            },
            outOfRange: {
                symbolSize: [1, 7],
                color: ['rgba(255,255,255,.2)']
            },
            controller: {
                inRange: {
                    color: ['#c23531']
                },
                outOfRange: {
                    color: ['#444']
                }
            }
        },
        {
            left: 'right',
            bottom: '5%',
            dimension: 6,
            min: 1,
            max: 24,
            itemHeight: 120,
            calculable: true,
            precision: 0.1,
            text: ['明暗:时间'],
            textGap: 30,
            textStyle: {
                color: '#fff'
            },
            inRange: {
                colorLightness: [1, 0.5]   
            },
            outOfRange: {
                color: ['rgba(255,255,255,.2)']
            },
            controller: {
                inRange: {
                    color: ['#c23531']
                },
                outOfRange: {
                    color: ['#444']
                }
            }
        }
    ],

最后如图:


image.png

总结:本来想利用深度学习,利用knn分类,找出异常点。但根据实际业务,无需做如此复杂的计算。通过这次的实践,主要锻炼数据思维以及分析能力,最后的结果也是喜人的。
根据运营的反馈,找出来的90%的异常点用户均属于刷票用户。

上一篇 下一篇

猜你喜欢

热点阅读