diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..c0143a18e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.git +.gitignore +node_modules +npm-debug.log +Dockerfile* +docker-compose* +README.md +LICENSE +.vscode + diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index be67e01a9..6c096ed5e 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,11 +1,12 @@ ## Project Robyn ## Describe issue -Describe your issue and provide error message +Describe your issue and provide warnings and error messages. -## Provide dummy data & model configuration -Issues are often related to custom input data that is difficult to debug without. If necessary, please modify your data to mask real values and share a dataset that is able to reproduce the issue. Please also share your model configuration. +## Provide reproducible example +Issues are often related to custom input data that is difficult to debug without. If necessary, please modify your data to mask real values and share a dataset that is able to reproduce the issue. Please also share your model configuration and exported JSON files if available. ## Environment & Robyn version -R version (R --version) -Please make sure you're using the latest Robyn version +Make sure you're using the latest Robyn version before you post an issue. +- Check and share Robyn version: `packageVersion("Robyn")` +- R version (Please, check and share: `sessionInfo()` or `R.version$version.string`) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6f4848467..16066037f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,24 +1,18 @@ -# Project Robyn +## Project Robyn Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. Fixes # (issue) -# Type of change +## Type of change +- fix: Bug fix (non-breaking change which fixes an issue) +- feat: New feature (non-breaking change which adds functionality) +- docs: API change with a documentation update +- test: Additional test coverage +- reformat: Code cleanup, recoding or reformating code -- Bug fix (non-breaking change which fixes an issue) -- New feature (non-breaking change which adds functionality) -- Breaking change (fix or feature that would cause existing functionality to not work as expected) -- API change with a documentation update -- Additional test coverage -- Code cleanup or just keeping up with the latest Rustc nightly - -# How Has This Been Tested? - -Checklist: - -- Fork the repo and create your branch from master. -- If you've added code that should be tested, add tests. -- If you've changed APIs, update the documentation. -- Ensure the test suite passes. +## How Has This Been Tested? +- Fork the repo and create your branch from master (latest dev version). +- If you've changed docuemntation, run `devtools::document()`. Should update .Rd files. +- Ensure all tests pass, run `devtools::check()`. Should have no notes, no warning, no errors. - Make sure your code lints. diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml new file mode 100644 index 000000000..fda33906d --- /dev/null +++ b/.github/workflows/python-app.yml @@ -0,0 +1,63 @@ +# This workflow will install Python dependencies, run tests and lint with a single version of Python +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python +# A continuous integration (CI) workflow to build and test Robyn Python project + +name: Robyn Python application + +on: + push: + branches: ['robynpy_release'] + pull_request: + branches: ['robynpy_release'] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + python-version: ['3.10'] + + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + - name: Display Python version + run: python -c "import sys; print(sys.version)" + + - name: updating PATH to enable importing robyn modules + run: | + echo "PYTHONPATH=$PYTHONPATH:$(pwd)/python/src" >> $GITHUB_ENV + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install flake8 pytest pytest-cov + if [ -f python/requirements.txt ]; then pip install -r python/requirements.txt; fi + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics --exclude=./robyn_api/*.py + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics --exclude=./robyn_api/*.py + - name: Test with pytest. Enable this once first set of tests are written + run: | + pytest ./python/tests --doctest-modules --junitxml=junit/test-results.xml --cov=robyn --cov-report=html + - name: 'Upload Unit Test Results' + uses: actions/upload-artifact@v4 + with: + name: robynpy-output-artifact + path: junit/test-results.xml + retention-days: 30 + - name: Upload Coverage Report + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: htmlcov + retention-days: 30 diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index bd12bf9e2..cb1ed1193 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 with: - node-version: '12.x' + node-version: '16.x' - name: Test Build run: | if [ -e yarn.lock ]; then @@ -42,7 +42,7 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 with: - node-version: '12.x' + node-version: '16.x' - uses: webfactory/ssh-agent@v0.5.0 with: ssh-private-key: ${{ secrets.GH_PAGES_DEPLOY }} diff --git a/.gitignore b/.gitignore index 3a4c45330..a0e98a7fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,55 @@ .DS_Store .Rproj.user .Rhistory +.pyvenv/ +.venv/ +robynpy.egg-info/ node_modules/ +RobynApp.Rcheck/00_pkg_src/RobynApp/R/ui.R +RobynApp.Rcheck/00_pkg_src/RobynApp/README.md +RobynApp.Rcheck/00check.log +RobynApp.Rcheck/00install.out +RobynApp.Rcheck/R_check_bin/R +RobynApp.Rcheck/R_check_bin/Rscript +RobynApp.Rcheck/RobynApp/DESCRIPTION +RobynApp.Rcheck/RobynApp/help/aliases.rds +RobynApp.Rcheck/RobynApp/help/AnIndex +RobynApp.Rcheck/RobynApp/help/figures/logo.png +RobynApp.Rcheck/RobynApp/help/paths.rds +RobynApp.Rcheck/RobynApp/help/RobynApp.rdb +RobynApp.Rcheck/RobynApp/help/RobynApp.rdx +RobynApp.Rcheck/RobynApp/html/00Index.html +RobynApp.Rcheck/RobynApp/html/R.css +RobynApp.Rcheck/RobynApp/INDEX +RobynApp.Rcheck/RobynApp/LICENSE +RobynApp.Rcheck/RobynApp/Meta/features.rds +RobynApp.Rcheck/RobynApp/Meta/hsearch.rds +RobynApp.Rcheck/RobynApp/Meta/links.rds +RobynApp.Rcheck/RobynApp/Meta/nsInfo.rds +RobynApp.Rcheck/RobynApp/Meta/package.rds +RobynApp.Rcheck/RobynApp/Meta/Rd.rds +RobynApp.Rcheck/RobynApp/NAMESPACE +RobynApp.Rcheck/RobynApp/R/RobynApp +RobynApp.Rcheck/RobynApp/R/RobynApp.rdb +RobynApp.Rcheck/RobynApp/R/RobynApp.rdx +RobynApp_1.0.0.tar.gz +Robyn_Fork.Rproj +python/src/tutorials/demo.py +python/.venv +python/**/.venv +python/dist +python/**/__pycache__ +python/.vscode +python/src/robynpy.egg-info* +python/oldportedcode +python/src/tutorials/mytestenv +*.log +python/src/tutorials/test_modeling.py +python/src/tutorials/data/* +python/src/tutorials/test_modeling.py +python/src/tutorials/data/R/* +python/src/tutorials/data/* +*.pkl +python/src/robyn/_deprecate/* +python/src/robyn/tutorials/output/* +python/src/robyn/debug/* \ No newline at end of file diff --git a/.idea/Robyn.iml b/.idea/Robyn.iml new file mode 100644 index 000000000..1bf2ff19d --- /dev/null +++ b/.idea/Robyn.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..7c4836fbe --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..2c7d5d4a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 000000000..6cfbd16ba --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,181 @@ + + + +<<<<<<< HEAD + + + +======= + +>>>>>>> c3b1cf78deb17292292938490f977d88487a4c93 + + + + + + +<<<<<<< HEAD + + + +======= + + + + + + + + + +>>>>>>> c3b1cf78deb17292292938490f977d88487a4c93 + + + +<<<<<<< HEAD + { + "keyToString": { + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "SHARE_PROJECT_CONFIGURATION_FILES": "true", + "WebServerToolWindowFactoryState": "false", + "last_opened_file_path": "/Users/sinandjevdet/opt/miniconda3/envs/Robyn/R/R", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.stylelint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.stylelint": "", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "yarn", + "settings.editor.selected.configurable": "preferences.fileTypes", + "settings.editor.splitter.proportion": "0.27488583" + } +} +======= + + + + + + +>>>>>>> c3b1cf78deb17292292938490f977d88487a4c93 + + + + + +<<<<<<< HEAD + + + + + +======= +>>>>>>> c3b1cf78deb17292292938490f977d88487a4c93 + + + + + 1657811393298 + +======= + 1644832127727 + + + 1644849354057 + + + + + +<<<<<<< HEAD + + + + + file://$PROJECT_DIR$/util/robyn_v02.py + 172 + + + file://$PROJECT_DIR$/util/robyn_v02.py + 161 + + + file://$PROJECT_DIR$/util/robyn_v02.py + 310 + + + + + + + +======= + + + + \ No newline at end of file diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index 4535c362a..000000000 --- a/CHANGELOG +++ /dev/null @@ -1,28 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -{\*\expandedcolortbl;;} -\margl1440\margr1440\vieww10800\viewh8400\viewkind0 -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f0\fs24 \cf0 16.5.2 (September 18, 2018)\ -\ -### React DOM\ -\ -* Fixed a recent ` diff --git a/website/docs/variable-transformations.mdx b/website/docs/variable-transformations.mdx deleted file mode 100644 index fcf2f99ef..000000000 --- a/website/docs/variable-transformations.mdx +++ /dev/null @@ -1,68 +0,0 @@ ---- -id: variable-transformations -title: Variable Transformations ---- - -import useBaseUrl from '@docusaurus/useBaseUrl'; - -There are two main variable transformations in the code: - -## 1. Adstock -## 2. Diminishing returns - ---- - -## Adstock - -This technique is very useful for the better and more accurate representation of -the real carryover effect of marketing campaigns. Moreover, it helps to improve -the understanding of decay effects and how this can be used in campaign -planning. It reflects the theory that the effects of advertising can lag and -decay following initial exposure. In other words, not all effects of advertising -are felt immediately—memory builds and people sometimes delay action—and this -awareness diminishes as time passes. - -There are two adstock techniques you may choose from the code: - -1. Geometric: Traditionally the exponential decay function is used and - controlled by theta, the decay parameter. For example, an ad-stock of theta = - 0.75 means that 75% of the impressions in Period 1 were brought to Period 2. - Mathematically the traditional exponential adstock decay effect is defined - as: - -Geometric Formula - - - -2. Weibull: Weibull survival function (Weibull distribution) provides much more - flexibility in the shape and scale of the distribution. The formula is - defined as: Weibull Formula - ---- - -## Diminishing returns - -The theory of diminishing returns holds that each additional unit of advertising -increases the response, but at a declining rate. This key marketing principle is -reflected in marketing mix models as a variable transformation. - -Diminishing returns1 - -The nonlinear response to a media variable on the dependent variable can be -modelled using a variety of functions. For example, we can use a simple -logarithm transformation (taking the log of the units of advertising log(x) ), -or a power transformation (x^alpha). In the case of a power transformation, the -modeler tests the different variables (different levels of parameter x) for the -highest significance of the variable in the model and the highest significance -of the equation overall. However, the most common approach is to use the -flexible S-curve transformation: - -Diminishing returns1 - -The variations of the parameters give modelers full flexibility on the look of -the S-curve, specifically the shape and the inflection points: - -Diminishing returns1 diff --git a/website/docs/welcome.mdx b/website/docs/welcome.mdx new file mode 100644 index 000000000..639d64d0d --- /dev/null +++ b/website/docs/welcome.mdx @@ -0,0 +1,16 @@ +--- +id: welcome +title: Welcome to Robyn +--- +### What is Robyn? +Robyn is an experimental, AI/ML-powered and open sourced Marketing Mix Modeling (MMM) package from Meta Marketing Science. The automation is enabled through various techniques like the multi-objective evolutionary algorithm for hyperparameter optimisation, time-series decomposition for trend & season, Ridge regression for model fitting & gradient-based optimizer for budget allocation. Robyn is built for granular datasets with many independent variables and therefore especially suitable for digital and direct response advertisers with rich data sources. + +### Why did we build this? + +#### Our mission +- **Democratise modeling knowledge**: We believe that **transparency** in measurement will build **trust** ultimately. We want to empower **business of all sizes** by transforming marketing practices grounded in data and science. +- **Inspire the industry through innovation**: We believe in advancing the industry by pushing boundaries of marketing science and collaborating with the like-minded. +- **Reduce human bias**: We believe in promising future of **responsible & privacy-friendly AI/ML** implementation to boost the efficiency of modeling, reduce human bias in the process and ultimately enable better decision making. +- **Build a strong open source marketing science community**: We believe in the power of open source that will further drive innovation in the industry and build strong bonds between practitioners. + +--- diff --git a/website/docs/window.mdx b/website/docs/window.mdx deleted file mode 100644 index 378a14223..000000000 --- a/website/docs/window.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: window -title: Modeling window ---- - -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Modeling window - ---- - MMM models are built based on past data. Thus, one of the main requirements when building an MMM model is to be able to select the right dates from the historical data history that represent well both, the current business and the marketing investment situation. The advantage of a rolling window is that you may still use the full data history (E.g. 2 years) on your data for trend, seasonality and holiday effects to be modeled, while at the same time, defining a specific range (E.g. 6 months) for media, organic and contextual variables that better represents your current business and marketing scenario. You may specify a window_start and window_end dates within the robyn_inputs() function to define a modeling period as a subset of the total available data for media and other variables. - -``` - InputCollect <- robyn_inputs( -... - ,window_start = "2016-11-23" - ,window_end = "2018-08-22" -... - ) -``` ---- - -- **`window_start`** A character. Set the start date of the modelling period. The window start will determine the start date of the data period within your dataset you will be using to specifically regress the effects of media, organic and context variables on your dependent variable. We recommend using a full “dt_input” dataset with a minimum of 1 year of history, as it will be used in full for the model calculation of trend, seasonality and holidays effects. Whereas the window period will determine how much of the full data set will be used for media, organic and context variables. E.g. Uploading and using 2 years of data in “dt_input” but determining window_start and window_end as the last 6 months which reflect better the current business and/or marketing investment reality for budget decision making. -- **`window_end`** A character. Set the end date of the modelling period. Recommended to have a ratio of (independent variable : parameters) data points of 1:10. The window end will determine the end date of the data period within your dataset you will be using to specifically regress the effects of media, organic and context variables on your dependent variable. We recommend using a full “dt_input” dataset with a minimum of 1 year of history, as it will be used in full for the model calculation of trend, seasonality and holidays effects. Whereas the window period will determine how much of the full data set will be used for media, organic and context variables. E.g. Uploading and using 2 years of data in “dt_input” but determining window_start and window_end as the last 6 months which reflect better the current business and/or marketing investment reality for budget decision making. - ---- - -You may look at the example below with most of 2017 and 2018 as the window that will be taken into consideration for media, organic and contextual variables modeling. - -pareto chart 2 - ---- diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 5767dfc79..0d616dcbf 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -1,5 +1,5 @@ /** - * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) Meta Platforms, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. @@ -9,8 +9,7 @@ module.exports = { title: 'Robyn', - tagline: - 'Robyn is an automated Marketing Mix Modeling (MMM) code. It aims to reduce human bias by means of ridge regression and evolutionary algorithms, enables actionable decision making providing a budget allocator and diminishing returns curves and allows ground-truth calibration to account for causation', + tagline: 'Our mission is to democratise modeling knowledge, inspire the industry through innovation, reduce human bias in the modeling process & build a strong open source marketing science community.', url: 'https://facebookexperimental.github.io', baseUrl: '/Robyn/', onBrokenLinks: 'throw', @@ -18,6 +17,14 @@ module.exports = { organizationName: 'facebookexperimental', // Usually your GitHub org/user name. projectName: 'Robyn', // Usually your repo name. themeConfig: { + announcementBar: { + id: 'support_ukraine', + content: + 'Support Ukraine 🇺🇦 Help Provide Humanitarian Aid to Ukraine.', + backgroundColor: '#20232a', + textColor: '#fff', + isCloseable: false, + }, navbar: { title: 'Robyn', logo: { @@ -26,13 +33,23 @@ module.exports = { }, items: [ { - to: 'docs/quick-start/', - label: 'Docs', + to: 'docs/welcome/', + label: 'Documentation', + position: 'left', + }, + { + to: 'docs/installation/', + label: 'Getting Started', position: 'left', }, { - to: 'docs/about', - label: 'About', + to: 'docs/case-studies', + label: 'Case Studies', + position: 'left', + }, + { + to: 'docs/resources', + label: 'Resources', position: 'left', }, // Please keep GitHub link to the right for consistency. @@ -61,6 +78,10 @@ module.exports = { label: 'Case study: Central Group', href: 'https://www.facebook.com/business/success/central-retail-corporation', }, + { + label: 'Case study: Bark', + href: 'https://www.facebook.com/business/measurement/case-studies/bark', + }, ], }, { @@ -97,15 +118,7 @@ module.exports = { href: 'https://opensource.facebook.com', }, // Please do not remove the credits, help to publicize Docusaurus :) - copyright: `Copyright © ${new Date().getFullYear()} Facebook, Inc. Built with Docusaurus.`, - }, - googleAnalytics: { - trackingID: 'G-TMZK4YFDGL', - anonymizeIP: true, - }, - gtag: { - trackingID: 'G-TMZK4YFDGL', - anonymizeIP: true, + copyright: `Copyright © ${new Date().getFullYear()} Meta Platforms, Inc. Built with Docusaurus.`, }, }, presets: [ @@ -114,9 +127,18 @@ module.exports = { { docs: { sidebarPath: require.resolve('./sidebars.js'), - // Please change this to your repo. - editUrl: 'https://github.com/facebookexperimental/Robyn', + editUrl: 'https://github.com/facebookexperimental/Robyn/edit/main/website', }, + + googleAnalytics: { + trackingID: 'G-TMZK4YFDGL', + anonymizeIP: true, + }, + gtag: { + trackingID: 'G-TMZK4YFDGL', + anonymizeIP: true, + }, + theme: { customCss: require.resolve('./src/css/custom.css'), }, diff --git a/website/package.json b/website/package.json index d82f2e84c..35f74874d 100644 --- a/website/package.json +++ b/website/package.json @@ -34,7 +34,7 @@ "eslint-plugin-react": "^7.20.0", "eslint-plugin-react-hooks": "^4.0.4", "prettier": "^2.0.2", - "stylelint": "^13.2.1" + "stylelint": "^15.10.1" }, "browserslist": { "production": [ diff --git a/website/sidebars.js b/website/sidebars.js index 50ae00b04..cdd6d9c46 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -1,5 +1,5 @@ /** - * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) Meta Platforms, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. @@ -8,21 +8,20 @@ */ module.exports = { - someSidebar: { - 'How-to guide': ['quick-start', 'demo-R-script', 'step-by-step-videos'], - 'Robyn at a glance':['robyn-at-a-glance', 'example-plots'], - Features: [ - 'ridge-regression', - 'variable-transformations', - 'facebook-prophet', - 'automated-hyperparameter-selection-optimization', - 'calibration', - 'outputs-diagnostics', - 'window', - 'refresh', - 'organic-media' - ], - 'Getting help and contributing':['contributing'], - 'About Robyn': ['about'], - }, + someSidebar:[ + 'welcome', + { + type: 'category', + label: 'Getting Started', + collapsed: false, + items: [ + 'installation', + 'analysts-guide-to-MMM', + 'features', + 'robyn-api' + ], + }, + 'case-studies', + 'resources' + ] }; diff --git a/website/src/css/custom.css b/website/src/css/custom.css index b6f2e244d..34bde79a1 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -1,5 +1,5 @@ /** - * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) Meta Platforms, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. diff --git a/website/src/pages/index.js b/website/src/pages/index.js index 11bd6cb93..b3d809702 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -1,5 +1,5 @@ /** - * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) Meta Platforms, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. @@ -17,66 +17,58 @@ import styles from './styles.module.css'; const features = [ { - title: <>Reduces human bias, + title: 'Reduces human bias', imageUrl: 'img/take_control.svg', description: ( - <> - - + ), }, { - title: <>Aligns with the ground-truth, + title: 'Aligns with the ground-truth', imageUrl: 'img/calibrate.svg', description: ( - <> - - + ), }, { - title: <>Enables actionable decision making, + title: 'Enables actionable decision making', imageUrl: 'img/focus_on_what_matters.svg', description: ( - <> - - + ), }, { - title: <>Private by Design, + title: 'Private by Design', imageUrl: 'img/security.svg', description: ( - <> - - + ), }, ]; @@ -91,7 +83,7 @@ function Feature({ imageUrl, title, description }) { )}

{title}

-

{description}

+
{description}
); } @@ -107,23 +99,15 @@ function Home() {

{siteConfig.title}

-

Robyn is an automated Marketing Mix Modeling (MMM) open source code.

+

Robyn is an experimental, AI/ML-powered and open sourced Marketing Mix Modeling (MMM) package from Meta Marketing Science.

- Install Robyn - - - Get Started + Getting Started
@@ -133,7 +117,7 @@ function Home() {
-

Open Source and Automated Marketing Mix Modeling

+

A New Generation of Marketing Mix Modeling

{siteConfig.tagline}

@@ -141,9 +125,9 @@ function Home() { width="100%" height="400" src="https://www.youtube.com/embed/8SyKRpsXn44" - frameborder="0" + frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" - allowfullscreen + allowFullScreen />
@@ -165,23 +149,6 @@ function Home() {
)} -
-
-
-

Robyn Code Walkthrough Video

-

Please watch this walkthrough video to understand better how the code works

-