以Stata为单位的事务处理百分比总计数

以Stata为单位的事务处理百分比总计数,stata,Stata,这是Stata格式的销售交易数据集。每一排都是一张拍卖的照片 特定产品 在特定的一周内 在特定的商店 在特定的城市 某些产品并不是在某个城市的所有商店都有销售。对于所有产品,我想计算它们在该城市的市场可用性,在给定的一周内,以百分比表示。例如,如果产品A在第1周在城市中所有不同商店的一半中销售(可用商店的数量每周变化),则新列将显示所有这些观察结果的市场可用性为50%(计数)。对于不同的示例,在以下第1周的样本数据集中,我期望的可变市场可用性如下所示(暂时忽略“已售出单位”列): 这是一张S

这是Stata格式的销售交易数据集。每一排都是一张拍卖的照片

  • 特定产品
  • 在特定的一周内
  • 在特定的商店
  • 在特定的城市
某些产品并不是在某个城市的所有商店都有销售。对于所有产品,我想计算它们在该城市的市场可用性,在给定的一周内,以百分比表示。例如,如果产品A在第1周在城市中所有不同商店的一半中销售(可用商店的数量每周变化),则新列将显示所有这些观察结果的市场可用性为50%(计数)。对于不同的示例,在以下第1周的样本数据集中,我期望的可变市场可用性如下所示(暂时忽略“已售出单位”列):

这是一张Stata表格:

clear
set more off
input str5 week str8 store str30 SKU units_sold str1 city
 1 200059 01182007 5 C
 1 200059 01182090 4 C
 1 200060 01182007 4 C
 1 200060 01182090 6 C
 1 200061 01182007 4 C
 1 200061 01182888 1 C
 2 200059 01182007 4 K      
 2 200060 01182007 1 K      
 2 200061 01182007 4 K      
 2 200059 01182090 8 K      
 2 200060 01182090 9 K      
 2 200061 01182888 4 K     
 end
问题在于,在该交易数据集中,由于重复购买,同一周的门店城市SKU组合可能出现多次;但是我们不想考虑在我们的股票的计算中重复的观察,因为我们已经知道当时有一个特定的项目。p> 我首先按周和城市标记独特的观察结果

egen tag = tag(week city) 
我也尝试

egen tag1 = tag(store SKU) 
现在,我应该试着把它们搭配起来吗


从逻辑上讲,我认为我需要首先总结不同的城市/周/商店/SKU计数;然后,如果SKU曾经以这种组合售出,我需要计算城市/周的门店数量。然后把第一个数除以第二个数。有什么想法吗?

我认为这个解决方案不是最好的,但会如您所愿:

save original,replace                                                        // keeping your original dataset
collapse (count)has_sold=units_sold if units_sold>0, by(week store SKU city) // make binary flag for counting 
replace has_sold=1                                                           // force binary flag
save tmp,replace                                                             // preserving current status
bysort week store: keep if _n==1 
egen numStoreWeekly = count(has_sold), by(week)                              // get total number of stores in week regardless city
drop SKU has_sold                                                            // dropping temporary variables
merge m:m week store city using tmp                                          // adding numStoreWeekly to tmp.dta ("merge m:m" was used to assign same numStoreWeekly to same week/store/city combination)
egen numStoreSold = count(has_sold), by(week city SKU)                       // counting stores sold by week city SKU
gen mkt_avail = numStoreSold/numStoreWeekly
drop numStoreSold numStoreWeekly _merge has_sold                             // dropping temporary variables
merge m:m week store city SKU using original                                 // merging back (adding mkt_avail to original.dta )
drop _merge
sort week city SKU store

你的策略看起来不错。您可以通过两种方式标记不同(而不是“唯一”)的观测值,然后通过除以总数计算分数。这一切都可以在没有任何文件编排的情况下完成。这里的假设是没有记录零销售额的观察结果。但是如果有,那么将
if units\u salled
添加到
tag()
计算应该足以忽略它们

. clear

. set more off

. input str5 week str8 store str30 SKU units_sold str1 city

          week      store                             SKU  units_s~d       city
  1.  1 200059 01182007 5 C
  2.  1 200059 01182090 4 C
  3.  1 200060 01182007 4 C
  4.  1 200060 01182090 6 C
  5.  1 200061 01182007 4 C
  6.  1 200061 01182888 1 C
  7.  2 200059 01182007 4 K      
  8.  2 200060 01182007 1 K      
  9.  2 200061 01182007 4 K      
 10.  2 200059 01182090 8 K      
 11.  2 200060 01182090 9 K      
 12.  2 200061 01182888 4 K     
 13.  end

. egen tag = tag(city week store SKU)

. egen stores_selling_product = total(tag), by(city week SKU)

. egen tag2 = tag(city week store)

. egen stores_in_city = total(tag2), by(city week)

. gen fraction = stores_sell/stores_in

. sort week SKU store

. l week store SKU city stores* fraction , sepby(week)

     +------------------------------------------------------------------+
     | week    store        SKU   city   stores~t   stores~y   fraction |
     |------------------------------------------------------------------|
  1. |    1   200059   01182007      C          3          3          1 |
  2. |    1   200060   01182007      C          3          3          1 |
  3. |    1   200061   01182007      C          3          3          1 |
  4. |    1   200059   01182090      C          2          3   .6666667 |
  5. |    1   200060   01182090      C          2          3   .6666667 |
  6. |    1   200061   01182888      C          1          3   .3333333 |
     |------------------------------------------------------------------|
  7. |    2   200059   01182007      K          3          3          1 |
  8. |    2   200060   01182007      K          3          3          1 |
  9. |    2   200061   01182007      K          3          3          1 |
 10. |    2   200059   01182090      K          2          3   .6666667 |
 11. |    2   200060   01182090      K          2          3   .6666667 |
 12. |    2   200061   01182888      K          1          3   .3333333 |
     +------------------------------------------------------------------+

关于Stata上下文中独特和独特的术语,更重要的是对该领域技术的回顾,请参阅

文档中的语法是
merge m:m
,Stata警告不要使用这种
merge
。确实,为什么支持这样的合并是一个谜。@NickCox当然这段代码已经过测试。(OSX,Stata/MP 13.1)感谢您优雅的解决方案。我没有看到对您使用
merge n:n
的评论。如果这样做有效的话,它的语法是没有文档记录的,解释是合适的。@NickCox我按照你的建议在
merge n:n
中添加了注释。我很惊讶Stata接受
n:n
而不是
m:m
。这太棒了,谢谢你,尼克!代码与数据集配合得非常好。感谢关闭!
. clear

. set more off

. input str5 week str8 store str30 SKU units_sold str1 city

          week      store                             SKU  units_s~d       city
  1.  1 200059 01182007 5 C
  2.  1 200059 01182090 4 C
  3.  1 200060 01182007 4 C
  4.  1 200060 01182090 6 C
  5.  1 200061 01182007 4 C
  6.  1 200061 01182888 1 C
  7.  2 200059 01182007 4 K      
  8.  2 200060 01182007 1 K      
  9.  2 200061 01182007 4 K      
 10.  2 200059 01182090 8 K      
 11.  2 200060 01182090 9 K      
 12.  2 200061 01182888 4 K     
 13.  end

. egen tag = tag(city week store SKU)

. egen stores_selling_product = total(tag), by(city week SKU)

. egen tag2 = tag(city week store)

. egen stores_in_city = total(tag2), by(city week)

. gen fraction = stores_sell/stores_in

. sort week SKU store

. l week store SKU city stores* fraction , sepby(week)

     +------------------------------------------------------------------+
     | week    store        SKU   city   stores~t   stores~y   fraction |
     |------------------------------------------------------------------|
  1. |    1   200059   01182007      C          3          3          1 |
  2. |    1   200060   01182007      C          3          3          1 |
  3. |    1   200061   01182007      C          3          3          1 |
  4. |    1   200059   01182090      C          2          3   .6666667 |
  5. |    1   200060   01182090      C          2          3   .6666667 |
  6. |    1   200061   01182888      C          1          3   .3333333 |
     |------------------------------------------------------------------|
  7. |    2   200059   01182007      K          3          3          1 |
  8. |    2   200060   01182007      K          3          3          1 |
  9. |    2   200061   01182007      K          3          3          1 |
 10. |    2   200059   01182090      K          2          3   .6666667 |
 11. |    2   200060   01182090      K          2          3   .6666667 |
 12. |    2   200061   01182888      K          1          3   .3333333 |
     +------------------------------------------------------------------+