Stata 中的交易百分比总数
Transaction percentage total count in Stata
这是一个Stata格式的销售交易数据集。每行是
的销售额
- 特定产品
- 在特定的一周内
- 在特定商店
- 在特定城市
某些产品在给定城市的所有星期内都没有在所有商店销售。对于所有产品,我想在特定的一周以百分比的形式计算它们在该城市的市场可用性。例如,如果产品 A 在第 1 周在城市所有不同商店的 一半 中售出(可用商店的数量每周都在变化),则新列将指示市场可用性所有这些观察(计数)的 50%。对于不同的示例,在第 1 周的以下示例数据集中,我想要的变量 market_availability 将如下所示(暂时忽略 unit_sold 列):
week store SKU city units_sold mkt_avail
1 200059 01182007 C 5 1
1 200060 01182007 C 4 1
1 200061 01182007 C 4 1
1 200060 01182090 C 6 0.66
1 200059 01182090 C 4 0.66
1 200061 01182888 C 1 0.33
2 200059 01182007 K 4 1
2 200060 01182007 K 1 1
2 200061 01182007 K 4 1
2 200059 01182090 K 8 0.66
2 200060 01182090 K 9 0.66
2 200061 01182888 K 4 0.33
这是 Stata table:
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组合会出现多次;但我们不想在计算我们的份额时考虑重复观察,因为我们已经知道某个特定项目当时可用。
我首先按周和城市标记独特的观察结果
egen tag = tag(week city)
我也试试
egen tag1 = tag(store SKU)
现在,我是否应该尝试将它们配对在一起?
从逻辑上讲,我想我首先需要总结城市/周/商店/SKU 的不同计数;然后我需要计算 city/week 中的商店数量(如果 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
你的策略看起来不错。您可以通过两种方式标记不同的(不是 "unique")观察一次,然后通过除以总数来计算分数。这一切都可以在没有任何文件编排的情况下完成。这里的假设是没有观测值记录零销售额。但如果有,则将 if units_sold
添加到 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 上下文中 distinct 和 unique 的术语,更重要的是对该领域技术的回顾,请参阅 this paper。
这是一个Stata格式的销售交易数据集。每行是
的销售额- 特定产品
- 在特定的一周内
- 在特定商店
- 在特定城市
某些产品在给定城市的所有星期内都没有在所有商店销售。对于所有产品,我想在特定的一周以百分比的形式计算它们在该城市的市场可用性。例如,如果产品 A 在第 1 周在城市所有不同商店的 一半 中售出(可用商店的数量每周都在变化),则新列将指示市场可用性所有这些观察(计数)的 50%。对于不同的示例,在第 1 周的以下示例数据集中,我想要的变量 market_availability 将如下所示(暂时忽略 unit_sold 列):
week store SKU city units_sold mkt_avail
1 200059 01182007 C 5 1
1 200060 01182007 C 4 1
1 200061 01182007 C 4 1
1 200060 01182090 C 6 0.66
1 200059 01182090 C 4 0.66
1 200061 01182888 C 1 0.33
2 200059 01182007 K 4 1
2 200060 01182007 K 1 1
2 200061 01182007 K 4 1
2 200059 01182090 K 8 0.66
2 200060 01182090 K 9 0.66
2 200061 01182888 K 4 0.33
这是 Stata table:
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组合会出现多次;但我们不想在计算我们的份额时考虑重复观察,因为我们已经知道某个特定项目当时可用。
我首先按周和城市标记独特的观察结果
egen tag = tag(week city)
我也试试
egen tag1 = tag(store SKU)
现在,我是否应该尝试将它们配对在一起?
从逻辑上讲,我想我首先需要总结城市/周/商店/SKU 的不同计数;然后我需要计算 city/week 中的商店数量(如果 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
你的策略看起来不错。您可以通过两种方式标记不同的(不是 "unique")观察一次,然后通过除以总数来计算分数。这一切都可以在没有任何文件编排的情况下完成。这里的假设是没有观测值记录零销售额。但如果有,则将 if units_sold
添加到 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 上下文中 distinct 和 unique 的术语,更重要的是对该领域技术的回顾,请参阅 this paper。