最近在做一个投票活动,由于活动参与量较大,部分淘宝商家已经做起了刷票生意【据说生意还很不错~~】。所以防刷是很重要的一部分。
之前已经在技术层面已经做好了防刷,但人工刷票,确实防不胜防啊!
今天呢,从数据分析的角度,通过投票记录,来筛选异常投票情况,从而找出刷票教练。
思路整理:
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';
数据格式如下:
3.使用Echart进行数据可视化【在官网下载-demo代码scatter-aqi-color】
a.首先导入数据
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 ''
+ obj.seriesName + '时间:' + value[0]
+ ''
+ schema[1].text + ':' + value[1] + '
'
+ schema[2].text + ':' + value[2] + '
';
}
},
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']
}
}
}
],
最后如图:
总结:本来想利用深度学习,利用knn分类,找出异常点。但根据实际业务,无需做如此复杂的计算。通过这次的实践,主要锻炼数据思维以及分析能力,最后的结果也是喜人的。
根据运营的反馈,找出来的90%的异常点用户均属于刷票用户。