create_synthetic_data

 library(spect)
 #> Loading required package: futile.logger
 #> Loading required package: dplyr
 #> 
 #> Attaching package: 'dplyr'
 #> The following objects are masked from 'package:stats':
 #> 
 #> filter, lag
 #> The following objects are masked from 'package:base':
 #> 
 #> intersect, setdiff, setequal, union

It can be useful to have a data set with a known distribution for testing modeling approaches. It’s also useful to be able to clearly conceptualize that data set. spect can generate synthetic time-to-event data for this purpose without relying on a potentially unknown external data set.

Creating synthetic data

The create_synthetic_data() function will produce a single, relational data set where each row represents a fictional subscriber to a theoretical streaming service. spect can be used to model the time to the cancellation of the service. If no parameters are passed, then all defaults are invoked. The resulting data set contains two modeling variables:

It also contains the following columns:

 
 set.seed(42)
 
data <- create_synthetic_data()
 #> INFO [2025年04月06日 20:25:29] Creating 250 income samples from normal distribution of median 50000, variance 10000 
 #> and watchtimes samples from uniform distribution with min: 0 and max: 6
 head(data)
 #> incomes watchtimes total_months cancel_event_detected
 #> 1 63709.58 0.8190312 20.29985 1
 #> 2 44353.02 1.0628185 22.69428 1
 #> 3 53631.28 3.1173627 30.35482 1
 #> 4 56328.63 4.8667247 44.05215 1
 #> 5 54042.68 0.6921721 21.07483 1
 #> 6 48938.75 5.3605307 48.00000 0
 #> baseline_time_to_cancel perturbed_baseline
 #> 1 20.29985 20.29985
 #> 2 22.69428 22.69428
 #> 3 30.35482 30.35482
 #> 4 44.05215 44.05215
 #> 5 21.07483 21.07483
 #> 6 49.84141 49.84141

Modifying the distribution

Since a distribution that matches exactly to a formula may not be adequate for testing a model, some optional parameters are provided to perturb the cancellation event distribution in a structured way. In particular, the user can specify the minimum, median, and variance of the income distribution and the minimum and maximum watchtimes.

Additionally, it’s possible to set a censorship percentage within a given minimum and maximum amount, adjust the length of the study (i.e. - the maximum total months). Finally, the perturbation_shift argument adds some random noise to the total_months column of the data, which helps to prevent instant overfitting.

 
data <- create_synthetic_data(sample_size = 500
 , minimum_income = 10000
 , median_income = 40000
 , income_variance = 10000
 , min_watchhours = 2
 , max_watchhours = 10
 , censor_percentage = .2
 , min_censor_amount = 3
 , max_censor_amount = 3
 , study_time_in_months = 60
 , perturbation_shift = 5
 )
 #> INFO [2025年04月06日 20:25:29] Creating 500 income samples from normal distribution of median 40000, variance 10000 
 #> and watchtimes samples from uniform distribution with min: 2 and max: 10
 
 head(data)
 #> incomes watchtimes total_months cancel_event_detected
 #> 1 50291.41 9.919725 60.00000 0
 #> 2 49147.75 5.507949 55.75277 1
 #> 3 39975.44 7.599226 60.00000 0
 #> 4 41360.10 9.112616 60.00000 0
 #> 5 32798.46 8.673276 60.00000 0
 #> 6 38018.76 7.875372 60.00000 0
 #> baseline_time_to_cancel perturbed_baseline
 #> 1 119.37180 114.97561
 #> 2 51.42273 55.75277
 #> 3 79.75069 78.24010
 #> 4 104.90375 104.02173
 #> 5 97.94587 102.55733
 #> 6 84.21960 84.53033

It may also be useful to visualize the data distributions. plotSynData() handles this straightforwardly. Here, it’s easy to see the impact of the perturbation and censorship by comparing the "cancel_months" graph to the "final_cancel_months" graph. Also, note that incomes are roughly normally distribution, while watchtimes are roughly uniformly distributed.

 plot_synthetic_data(data)

AltStyle によって変換されたページ (->オリジナル) /