外呼调研和随机抽样


  对于经营分析工作来说,外呼调研是获取分析数据的重要手段,因为很多重要的信息是经分系统里没有的,比如用户是否纯新增、用户换号的原因,竞争对手的来源、入网渠道、消费偏好等等。
  外呼调研是项费时费钱的工作。尽管各地移动已经有了一支看似相当大的外呼队伍,但与庞大的移动用户基数相比,依然显得十分渺小,所以外呼调研必须得靠抽样。
  对于抽样外呼来说,抽取多少样本,如何抽样,如何确保外呼的随机性,都是必须关注的问题。任何一个环节出现问题,都可能使得抽样结果缺乏可信性。当然,调查问卷的设计是个更加关键的环节,这个本文暂时先不讨论。
  
  在外呼调研的抽样问题上,个人觉得需要注意以下事项:
  1、根据分析深度确定经济适用的外呼规模
  学过统计的人可能还会记得,统计学上有个大数定律,公式和推算蛮复杂,但结果却是很简单,就是若样本的选取足够随机且样本值的分布不是极端悬殊外,一般只要样本量超过30个就能基本反映整体样本的平均分布情况。
  那么,是否选取30个样本就足够了呢?
  假如分析的目标只是获得一个整体情况,不再深入,那么从经验看,30个样本其实已经基本足够(尽管很多人会将信将疑)。但实际分析不会这么简单,我们往往还要从地区等维度做进一步的分析,这就需要保证最小分析单位的样本数能够达到30个以上。
  举个例子:
  假如针对某月新增用户做外呼调研,总体新增用户200万,其中最小的地区只有10万,占5%,那么为了保证这最小的地区有30个样本,那么成功外呼样本就至少应该在600个以上,否则做地区细分分析时就会出现问题。当然,这种情况下,为了保险起见,我们可能会要求1000个成功样本。
  
  2、确保随机抽样,避免破坏整体分布规律
  为了保证外呼调研的质量,样本的选取一定要做到随机抽样。
  外呼调研的取数往往要靠支撑人员或厂家人员,这些技术人员优势会用简单的SELECT * FROM XX WHERE ROWNUM<N的办法,导致调研出来的结果令人难以置信,这是因为数据库里的数据就算不是顺序的,但并非就代表是随机的。
  另外,有些人喜欢手工指定每个地区、每个品牌提取多少样本。这样做,貌似保证了各地区的样本量,但这样做会导致样本的地区品牌分布与总体不一致,导致无法对总体情况作分析。
  比如最近我分别抽取了联通、移动和电信各一万新增用户做外呼调研,这个结果针对每个运营商是可用的,但却不能用来推算整个移动通信市场的情况,因为三家分布的比例不是1:1:1,这个抽样已经破坏了整体的情况。
  所以,对于既分析地区又分析全省的情况,要将所有整体样本合在一起进行随机抽样,千万别去手工指定每个地区的样本量。
  
  3、超额提供样本数量,确保最终结果的随机性
  外呼调研是交给外呼团队来运作,为了减少返工,往往需要向外呼团队提供3-10倍的样本量。当然,这个倍率取决于调查问卷的复杂性,问卷越复杂,成功的概率就越低,所需的样本数就越高。我所知道的有个比较特殊的外呼调研,成功外呼的比例不足千分之一,提供了十来万号码,最后才有几十个成功外呼。
  理想情况下,外呼团队拿到外呼清单后,应该再做随机化处理,然后抽取号码拨打,在得到足够成功外呼样本后停止外呼。
  但实际中,有时并非如此。
  以我上次提交的外呼调研为例,我分别提交移动、联通和电信各一万的新增用户,采取同一份问卷进行外呼,结果是有两组样本数据非常随机,但另外一组的结果却很让人失望:在大地区上过度集中,小地区上不到30个,导致地区比较的可信度受到影响。
  这事情说明,外呼团队是由各个小队组成的,其水平参差不齐。
  为了解决这问题,建议将外呼团队提供的样本文件就要足够随机,避免对样本进行地区或号码的排序。
  若采取的是我下面写的这个随机抽样程序,可以根据“序号”排序,因为这个序号本身是随机数。
  
  附:一个简单的随机抽样程序
  由于几次帮同事取外呼调研的样本数据,自己也做外呼调研,所以自己就用PL/SQL写了一个简单的随机抽样程序,只要调用这个程序,就能实现随机抽样。
   
  CREATE OR REPLACE PROCEDURE PUB_SAMPLE(p_总体样本表 CHAR,p_样本数 NUMBER) AS  
  /* =============================================================== *
     功能:总体样本数据的随机抽样
     说明:
         1、抽样结果是生成一张在总体样本表基础上首列增加一个“序号”字段后的新表。
         2、抽样表的名字为原表名后加"$"
         3、因为需要动态建表,所以本程序需要CREATE ANY TABLE权限      
   * =============================================================== */
  
    v_SQL        VARCHAR2(2000);
    v_count      NUMBER(10);
    v_随机数     NUMBER(20,6);
   v_总数       NUMBER(10);
  BEGIN 
   -- 检查随机数表是否存在,如果没有则创建
   SELECT COUNT(1) INTO v_count FROM USER_TABLES WHERE TABLE_NAME='PUB_TOOL_RANDOM';
   IF v_count = 0 THEN
     v_SQL :=' CREATE TABLE  PUB_TOOL_RANDOM(随机数 NUMBER(20,6),
                 CONSTRAINT PUB_TOOL_RANDOM PRIMARY KEY(随机数))';
     EXECUTE IMMEDIATE v_SQL;
   ELSE
    EXECUTE IMMEDIATE 'DELETE PUB_TOOL_RANDOM';
    END IF;  
  
    -- 取样本总数
   EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM '||p_总体样本表  INTO v_总数;
    
   -- 生成随机数
   v_count := 0;
   LOOP
     v_随机数 := DBMS_RANDOM.VALUE(1,v_总数);
     IF v_随机数 >= 1 THEN
        v_随机数 := ROUND(v_随机数);
     END IF;  
    
     BEGIN
       EXECUTE IMMEDIATE 'INSERT INTO PUB_TOOL_RANDOM VALUES('||TO_CHAR(v_随机数)||')';
       COMMIT;
       v_count := v_count + 1;    
     EXCEPTION
       WHEN DUP_VAL_ON_INDEX THEN NULL;
     END;
     EXIT WHEN v_count >= p_样本数;
     END LOOP;
                  
   -- 生成抽样结果表
   v_SQL := 'CREATE TABLE #原表$ AS
               SELECT A.*
               FROM
                 (SELECT ROWNUM 序号,T.* FROM #原表 T) A,
                 (SELECT 随机数 FROM PUB_TOOL_RANDOM) B
               WHERE A.序号 = B.随机数';
    v_SQL := REPLACE(v_SQL,'#原表',p_总体样本表);
    EXECUTE IMMEDIATE v_SQL;
    COMMIT;     
  END;