From 0c48e73c83e88e9478d6865289b87f73ca25fd5a Mon Sep 17 00:00:00 2001 From: sodascience Date: Mon, 29 Apr 2024 07:40:25 +0000 Subject: [PATCH] Update website from https://github.com/sodascience/website_source/commit/aa2095be9f0bef059f527260c2c25ddcdc060374 --- categories/index.html | 18 +- ...04f6f4cb5c8_145073_1110x0_resize_box_3.png | Bin 0 -> 82216 bytes ...c8_145073_1110x0_resize_q100_h2_box_3.webp | Bin 0 -> 38552 bytes ...a04f6f4cb5c8_145073_460x0_resize_box_3.png | Bin 0 -> 23778 bytes ...5c8_145073_460x0_resize_q100_h2_box_3.webp | Bin 0 -> 12628 bytes ...5c8_145073_545x0_resize_q100_h2_box_3.webp | Bin 0 -> 15918 bytes ...5c8_145073_600x0_resize_q100_h2_box_3.webp | Bin 0 -> 18600 bytes ...a04f6f4cb5c8_145073_650x0_resize_box_3.png | Bin 0 -> 38566 bytes ...5c8_145073_700x0_resize_q100_h2_box_3.webp | Bin 0 -> 21608 bytes index.json | 16 +- index.xml | 11 +- sitemap.xml | 11 +- tags/index.html | 18 +- .../index.html | 702 ++++++++++++++++++ tutorials/index.html | 78 +- tutorials/index.xml | 11 +- tutorials/page/2/index.html | 106 ++- 17 files changed, 898 insertions(+), 73 deletions(-) create mode 100644 images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_1110x0_resize_box_3.png create mode 100644 images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_1110x0_resize_q100_h2_box_3.webp create mode 100644 images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_460x0_resize_box_3.png create mode 100644 images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_460x0_resize_q100_h2_box_3.webp create mode 100644 images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_545x0_resize_q100_h2_box_3.webp create mode 100644 images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_600x0_resize_q100_h2_box_3.webp create mode 100644 images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_650x0_resize_box_3.png create mode 100644 images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_700x0_resize_q100_h2_box_3.webp create mode 100644 tutorials/generating-synthetic-data-with-metasyn/index.html diff --git a/categories/index.html b/categories/index.html index 9538828..fed95e0 100644 --- a/categories/index.html +++ b/categories/index.html @@ -414,11 +414,11 @@

Categories

- - - - - How to manage your IP address in python + + + + + Generating synthetic data in a safe way with metasyn @@ -429,12 +429,12 @@

Categories

-
February 27, 2024
+
April 26, 2024
-

How to manage your IP address in python

-

Author: Flavio Hafner. Post photo from Glenn Carstens-Peters on Unsplash

- read more +

Generating synthetic data in a safe way with metasyn

+

Doing open, reproducible science means doing your best to openly share research data and analysis code.

+ read more
diff --git a/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_1110x0_resize_box_3.png b/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_1110x0_resize_box_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9837dcd5fa292a31950f3c7c2612ad86a8550cab GIT binary patch literal 82216 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 S$daRgKLweW&&#Du1OE$-8QB{E literal 0 HcmV?d00001 diff --git a/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_1110x0_resize_q100_h2_box_3.webp b/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_1110x0_resize_q100_h2_box_3.webp new file mode 100644 index 0000000000000000000000000000000000000000..c8d2ac0eef90d44eae175ce3f0f9abf4181db611 GIT binary patch literal 38552 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 J@UUOw!kj?otBi&dF}Ol5 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 literal 0 HcmV?d00001 diff --git a/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_460x0_resize_box_3.png b/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_460x0_resize_box_3.png new file mode 100644 index 0000000000000000000000000000000000000000..c739bb5dcbb21ea320b19fd547b17f421455bb53 GIT binary patch literal 23778 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 CpvT<+ literal 0 HcmV?d00001 diff --git a/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_545x0_resize_q100_h2_box_3.webp b/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_545x0_resize_q100_h2_box_3.webp new file mode 100644 index 0000000000000000000000000000000000000000..230fe0452b6ea851866bee86ed26e45b3eca3962 GIT binary patch literal 15918 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 Q05JdhT{XA=`@RqW0IAP2bN~PV literal 0 HcmV?d00001 diff --git a/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_600x0_resize_q100_h2_box_3.webp b/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_600x0_resize_q100_h2_box_3.webp new file mode 100644 index 0000000000000000000000000000000000000000..ceaf38e0e3660c3cd1e5a37aa6ef3dfd1b1f726a GIT binary patch literal 18600 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 literal 0 HcmV?d00001 diff --git a/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_650x0_resize_box_3.png b/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_650x0_resize_box_3.png new file mode 100644 index 0000000000000000000000000000000000000000..7b39bdd68e1d36e67934b59b9bacd9a95e89ae71 GIT binary patch literal 38566 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 literal 0 HcmV?d00001 diff --git a/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_700x0_resize_q100_h2_box_3.webp b/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_700x0_resize_q100_h2_box_3.webp new file mode 100644 index 0000000000000000000000000000000000000000..2ca554955ab1036a61cf5f1776f987d68539b325 GIT binary patch literal 21608 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 literal 0 HcmV?d00001 diff --git a/index.json b/index.json index 7452b5a..19329ad 100644 --- a/index.json +++ b/index.json @@ -224,4 +224,18 @@ -[{"categories":null,"contents":"About the workshop The workshop will teach how to work efficiently with data from CBS (Statistics Netherlands), using its remote access environment. It is designed for people getting acces to the remote environment for the first time, or people who want to improve the efficiency and reproducibility of their workflows. Topics covered include project organization, principles for writing legible programs (in R, but people using other languages are encouraged to join as well; the principles apply to all languages), and to retrieve, store and configure data pipelines in a reproducible and understandable way.\nThere will be a 2 hour plenary session and a 1 hour consultation session, where specific questions will be adressed in small groups. Questions can be sent in advanced in the registration process.\nAdditional information When Friday, 19th April 2024, from 13.30h to 16.30h Where Utrecht University, Administration building, room “Van Lier \u0026amp; Eggink”. Registration You can register here, and consult additional info, here. It is free of charge for ODISSEI organization members. Instructors Erik-Jan van Kesteren, Assistant Professor at Utrecht University. Erik-Jan\u0026rsquo;s website Materials A link with all workshop materials can be found here. ","date":"April 19, 2024","image":null,"permalink":"/workshops/post-7/","title":"[UPCOMING] Efficient and reproducible research with CBS microdata"},{"categories":null,"contents":"Author: Flavio Hafner. Post photo from Glenn Carstens-Peters on Unsplash\nThis post is the first of a series of blogposts arising from a collaboration between the eScience Center and the ODISSEI Social Data Science Team. You can also find this text at the eScience Center page.\nResearch often relies on accessing novel data, for instance by collecting them from the internet through web scraping. If you have ever tried this, you may have run into your IP address being blocked by the website you scrape. Websites do this with a good reason — to protect themselves against malicious acts, such as denial-of-service attacks or large-scale scraping by parties with ill intent. This makes sense from the websites’ perspective, but prevents you from answering your research question.\nBut this problem can be solved. In this tutorial, we show how you as a researcher can use IP rotation to circumvent certain scraping protections with the sirup package, which works on Linux operating systems.\nBefore we jump into it, it is important to highlight that web scraping and IP rotation need to respect the law and should only be a last resort. For instance, before you scrape data from a website, you should ask the data owner whether they are willing to make them available to you through a data sharing agreement. If you nevertheless decide to scrape the data, you should get approval from the ethical review board at your university. Moreover, do only scrape data that are publicly available on the web and do not send excessive number of requests to the website in a given time.\nFor rotating the IP address, we will use a VPN service. Here you can read more about what a VPN service is — in short, the service has a bunch of remote servers, and connecting your computer to one of these servers changes your IP address.\nWhat you need 1. OpenVPN OpenVPN is a system that allows you to create secure VPN connections. You can install it by following these instructions.\n2. Root access to your computer Because internet connections are an important security concern, OpenVPN requires root access — this is the equivalent to administrator rights on a Windows computer. If you have root access, you can for instance run the following command on your terminal:\nsudo ls -lh # will ask you for your root password Installing and setting up sirup You can install sirup as follows:\npython -m pip install sirup To use the package and change your IP address, you need an account with a VPN service provider that offers OpenVPN configuration files for your account. At the time of writing, for instance ProtonVPN and Surfshark offer this option — note that these services are not for free. We will use ProtonVPN in this tutorial.\nAfter creating an account, you need to download two sets of files.\nFirst, you download credentials that identify your Proton account when using OpenVPN. On the ProtonVPN website, click on “Account” and then you see something like this:\nFigure 1. Credentials that identify your Proton account when using OpenVPN\rCopy and paste the username and the password into a .txt file that looks like this:\nusername password Then, save the file as “proton_credentials.txt”. Remember where it is stored — we will need it later.\nA first warning on security. Storing account credentials like this makes it easy for you to use the sirup package. But it also increases the risk that unauthorized persons get a hold on these credentials. Thus, be careful to store the credentials in a safe place on your laptop and do not share them with anyone.\nSecond, to use OpenVPN we need configuration files, whose names end with .ovpn. The files allow OpenVPN to connect to a server from the VPN service provider. In ProtonVPN, go to the \u0026ldquo;Download\u0026rdquo; section of your account. Select the options as follows:\nFigure 2. Options to download .ovpn configuration files\rAnd download the configuration file(s) you want to use. Store the downloaded files on your computer, and remember the location.\nNow you are ready!\nUsing sirup We start by defining the path to the proton_credentials.txt file. When you execute the code below, you will be asked to enter the root password, which is necessary to make the connection.\nimport getpass auth_file = \u0026#34;proton_credentials.txt\u0026#34; pwd = getpass.getpass(\u0026#34;Please enter your root password:\u0026#34;) A second warning on security. The code above stores your root password during the python session without encrypting it. This is OK to do on your laptop — if someone gets access to your python session, your security has already been compromised — but not recommended on a shared computer such as a cluster or a cloud service.\nChanging the IP address with sirup Now you can use the VPNConnector to change your IP address. We will use the \u0026quot;my_config_file.ovpn\u0026quot; configuration file.\nfrom sirup.VPNConnector import VPNConnector config_file = \u0026#34;my_config_file.ovpn\u0026#34; The code below first connects to the server associated with \u0026quot;my_config_file.ovpn\u0026quot; and then disconnects.\nconnector = VPNConnector(auth_file, config_file) # Let\u0026#39;s see the current IP address when no VPN tunnel is active print(connector.base_ip) connector.connect(pwd=pwd) # Now the IP address should differ print(connector.current_ip) connector.disconnect(pwd=pwd) # Now current_ip should be the same as base_ip above print(connector.current_ip) Rotating the IP address with sirup Instead of connecting to a single server, you can also rotate across many different servers — which means you rotate your IP address across a set of potential addresses. Doing so is useful for larger scraping jobs because it will spread your requests across more servers.\nTo do this, you need to download multiple configuration files as described above. Store all of the .ovpn configuration files together in a separate directory. Let\u0026rsquo;s say you store them in the \u0026quot;/path/to/config/files/\u0026quot; directory. You need to define this path in your python script:\nconfig_path = \u0026#34;/path/to/config/files/\u0026#34; The following code connects to two different servers before disconnecting again:\nfrom sirup.IPRotator import IPRotator rotator = IPRotator(auth_file=my_auth_file, config_location=config_path, seed=seed) # this will ask for the root password print(rotator.connector.base_ip) rotator.connect() print(rotator.connector.current_ip) rotator.rotate() print(rotator.connector.current_ip) rotator.disconnect() print(rotator.connector.current_ip) Conclusion This tutorial has walked you through the steps to manage your IP address in python, using the sirup package. We hope it makes your scraping workflows easier!\nsirup is an open-source package developed by the Netherlands eScience Center. If you use the tool, you can cite this zenodo repository with the DOI: https://doi.org/10.5281/zenodo.10261949.\nThe source code of the package is here, where you can contribute to it, build on it and submit issues.\nThanks to Patrick Bos, Peter Kalverla, Kody Moodley and Carlos Gonzalez Poses for comments.\n","date":"February 27, 2024","image":"http://odissei-soda.nl/images/tutorial-8/sirup_hu5459c0360c2b0cb7a147d2df0eb350ca_814836_650x0_resize_q100_box.jpg","permalink":"/tutorials/post-8/","title":"How to manage your IP address in python"},{"categories":null,"contents":"Due to exceptional circumstances, the workshop Cluster Computing for Social Scientists with R has been postponed. We will update this page as soon as a new date is determined.\nAbout the workshop In this course, you will learn the basics of supercomputing. The day starts with an introduction to supercomputer architecture, including a hands-on session focused on running jobs on a supercomputer.\nThe second half of the programme focuses on translating your R workflow from a GUI (Rstudio) workflow on your desktop to a scripting/batch environment on the supercomputer. Topics covered here include: efficient programming, parallel computing, and using the SLURM job manager to send your job/analysis to the supercomputer.\nIn this course you will:\nDo practical exercises to learn how to effectively use the Lisa national computing cluster and the national supercomputer, and how to complete your tasks with minimal effort in the shortest possible time. Experience how to achieve high performance with R by using SURF\u0026rsquo;s supercomputing facilities. Additional information When The new date of the workshop is to be defined. Where SURF Amsterdam, exact place to be defined. Registration We will post a link when registration opens again. Instructors Erik-Jan van Kesteren, Assistant Professor at Utrecht University. There will be another instructor from SURF, to be confirmed. Erik-Jan\u0026rsquo;s website Materials Course materials, including slides and code, are open and can be accessed here. ","date":"February 26, 2024","image":"http://odissei-soda.nl/images/workshops/Supercomputing_hubeda2984481e4d3f13fb836f8a1151c6_83157_650x0_resize_box_3.png","permalink":"/workshops/post-6/","title":"[POSTPONED] Supercomputing for social scientists with R"},{"categories":null,"contents":"By now, it\u0026rsquo;s no surprise to anybody the astonishing results large language models produce. Models such as GPT-4, Bard, Bert or RoBERTa have sparked intense research and media attention, as well as changed many people\u0026rsquo;s workflows. However, these models have issues. A common critique is that they function as black boxes: users do not know much about their training data or modelling choices. Besides, training them usually requires gigantic datasets and processing power. Therefore, there is value in alternative models that can be trained by researchers, having full control over the input data and internal process. In this tutorial, we explain how to train a natural language processing model using fastText: a lightweight, easy-to-implement and efficient word embedding model that has shown good performance in various natural language tasks over the years.\nFirst, a bit about word-embedding models. Word-embeddings models are one type of natural language processing models. By producing real number vector representations of words, they offer a powerful way to capture the semantic meaning of words in large datasets, which is why they are widely used in diverse research applications. Indeed, their uses are numerous: semantic similarity, text generation, document representation, author recognition, knowledge graph construction, sentiment analysis, or bias detection (Caliskan et al., 2017).\nInstallation To install Fasttext, we recommend checking the fasttext-wheel PyPI module. To verify the installation succeeded, you have to importat the package in a Python script.\n\u0026gt;\u0026gt;\u0026gt; import fasttext If there are no error messages, you have succeeded and we can move to the training part.\nTraining the model Training data To train fastText, you need a corpus: a large collection of text. The required size of these corpora varies depending on the research purpose: from several thousand to billions of words. Some research benefits from smaller, well-curated corpora; other research benefits from large unstructured corpora. However, while the exact size needed is hard to determine, do keep in mind that the text in the training data has to relate to your research question! If you want to use word embeddings for studying doctors\u0026rsquo; notes, you need doctors\u0026rsquo; notes - and not legal medical texts. If you want to study niche cultural sub-groups, you need data from these groups - and not necessarily a corpus of random Internet interactions. The corpus is an integral part of your research! Generally, the larger the research-related corpus you can get, the better.\nIn this tutorial we use a freely available corpus of Science-Fiction texts downloaded from Kaggle. Preferably, the text you feed to fastText should have each sentence on a new line.\nHyperparameters We will train an unsupervised fastText model, which means that lot of implementation decisions need to be made. If you don\u0026rsquo;t have specific methodological reasons and/or you lack the time or computing power for a proper grid search, we suggest you go with the default parameter options - which are optimized for many research contexts -, but switching the \u0026lsquo;dim\u0026rsquo; parameter to 300. Empirical research has shown that a dimensionality of 300 leads to optimal performance in most settings, even if that will increase computational resources and training time. If you can afford spending the time thinking about hyperparameters, you could tune the training model (CBOW or SkipGram), learning rate, dimensionality of the vector, context widow size, and more. You can see here the full list of tuning parameters available.\nFitting model We fit the model with the following command:\n\u0026gt;\u0026gt;\u0026gt; model = fasttext.train_unsupervised(\u0026#39;internet_archive_scifi_v3.txt\u0026#39;, dim = 300) Then, you can save the trained model, so that you do not have to train it again. For this, you need to feed the save_model() method a path to which to save the file. Make sure to add \u0026lsquo;.bin\u0026rsquo; to save the model as a .bin file.\n\u0026gt;\u0026gt;\u0026gt; model.save_model(\u0026#39;scifi_fasttext_model.bin\u0026#39;) Re-opening a saved model is done with the load_model() method:\n\u0026gt;\u0026gt;\u0026gt; model = fasttext.load_model(\u0026#39;scifi_fasttext_model.bin\u0026#39;) Using word embeddings Now we have trained the model, we have the word embeddings ready to be used. And, luckily, fastText comes with some nice functions to work with word embeddings! Here we highlight two of possible uses of word embeddings: obtaining most similar words, and analogies - but remember there are more possible uses. We start by simply retrieving the word embeddings. This can be done with any of the two following commands.\n\u0026gt;\u0026gt;\u0026gt; model.get_word_vector(\u0026#39;villain\u0026#39;) \u0026gt;\u0026gt;\u0026gt; model[\u0026#39;villain\u0026#39;] array([ 0.01417591, -0.06866349, 0.09390495, -0.04146367, 0.10481305, -0.2541916 , 0.26757774, -0.04365376, -0.02336818, 0.07684527, -0.05139925, 0.14692445, 0.07103274, 0.23373744, -0.28555775, .............................................................. -0.14082788, 0.27454248, 0.02602287, 0.03754443, 0.18067479, 0.20172128, 0.02454677, 0.04874028, -0.17860755, -0.01387627, 0.02247835, 0.05518318, 0.04844297, -0.2925061 , -0.05710272], dtype=float32) Since fastText does not only train an embedding for the full word, but also so for the ngrams in each word as well, subwords and their embeddings can be accessed as follows:\n\u0026gt;\u0026gt;\u0026gt; ngrams, hashes = model.get_subwords(\u0026#39;villain\u0026#39;) \u0026gt;\u0026gt;\u0026gt; \u0026gt;\u0026gt;\u0026gt; for ngram, hash in zip(ngrams, hashes): \u0026gt;\u0026gt;\u0026gt; print(ngram, model.get_input_vector(hash)) Note: using the get_subwords() method returns two lists, one with the ngrams of type string, the other with hashes. These hashes are not the same as embeddings, but rather are the identifier that fastText uses to store and retrieve embeddings. Therefore, to get the (sub-)word embedding using a hash, the get_input_vector() method has to be used.\nFurthermore, vectors can be created for full sentences as well:\n\u0026gt;\u0026gt;\u0026gt; model.get_sentence_vector(\u0026#39;the villain defeated the hero, tyrrany reigned throughout the galaxy for a thousand eons.\u0026#39;) array([-2.73631997e-02, 7.83981197e-03, -1.97590180e-02, -1.42770987e-02, 6.88663125e-03, -1.63909234e-02, 5.72902411e-02, 1.44126266e-02, -1.64726824e-02, 8.55281111e-03, -5.33024594e-02, 4.74718548e-02, ................................................................. 3.30820642e-02, 7.64035881e-02, 7.33195152e-03, 4.60342802e-02, 4.94049815e-03, 2.52075139e-02, -2.30138078e-02, -3.56832631e-02, -2.22732662e-03, -1.84207838e-02, 2.37668958e-03, -1.00214258e-02], dtype=float32) Most similar words A nice usecase of fastText is to retrieve similar words. For instance, you can retrieve the set of 10 words with the most similar meaning (i.e., most similar word vector) to a target word using a nearest neighbours algorithm based on the cosine distance.\n\u0026gt;\u0026gt;\u0026gt; model.get_nearest_neighbors(\u0026#39;villain\u0026#39;) [(0.9379335641860962, \u0026#39;villainy\u0026#39;), (0.9019550681114197, \u0026#39;villain,\u0026#39;), (0.890184223651886, \u0026#39;villain.\u0026#39;), (0.8709720969200134, \u0026#39;villains\u0026#39;), (0.8297745585441589, \u0026#39;villains.\u0026#39;), (0.8225630521774292, \u0026#39;villainous\u0026#39;), (0.8214142918586731, \u0026#39;villains,\u0026#39;), (0.6485553979873657, \u0026#39;Villains\u0026#39;), (0.6020095944404602, \u0026#39;heroine\u0026#39;), (0.5941146612167358, \u0026#39;villa,\u0026#39;)] Interestingly, this also works for words not in the model corpus, including misspelled words!\n\u0026gt;\u0026gt;\u0026gt; model.get_nearest_neighbors(\u0026#39;vilain\u0026#39;) [(0.6722341179847717, \u0026#39;villain\u0026#39;), (0.619519829750061, \u0026#39;villain.\u0026#39;), (0.6137816309928894, \u0026#39;lain\u0026#39;), (0.6128077507019043, \u0026#39;villainous\u0026#39;), (0.609745979309082, \u0026#39;villainy\u0026#39;), (0.6089878678321838, \u0026#39;Glain\u0026#39;), (0.5980470180511475, \u0026#39;slain\u0026#39;), (0.5925296545028687, \u0026#39;villain,\u0026#39;), (0.5779100060462952, \u0026#39;villains\u0026#39;), (0.5764451622962952, \u0026#39;chaplain\u0026#39;)] Analogies Another nice use for fastText is creating analogies. Since the word embedding vectors are created in relation to every other word in the corpus, these relations should be preserved in the vector space so that analogies can be created. For analogies, a triplet of words is required according to the formula \u0026lsquo;A is to B as C is to [output]\u0026rsquo;. For example, if we take the formula \u0026lsquo;Men is to Father as [output] is to Mother\u0026rsquo;, we get the expected answer of Women.\n\u0026gt;\u0026gt;\u0026gt; model.get_analogies(\u0026#39;men\u0026#39;, \u0026#39;father\u0026#39;, \u0026#39;mother\u0026#39;) [(0.6985629200935364, \u0026#39;women\u0026#39;), (0.6015384793281555, \u0026#39;all\u0026#39;), (0.5977899432182312, \u0026#39;man\u0026#39;), (0.5835891366004944, \u0026#39;out\u0026#39;), (0.5830296874046326, \u0026#39;now\u0026#39;), (0.5767865180969238, \u0026#39;one\u0026#39;), (0.5711579322814941, \u0026#39;in\u0026#39;), (0.5671708583831787, \u0026#39;wingmen\u0026#39;), (0.567089855670929, \u0026#39;women\u0026#34;\u0026#39;), (0.5663136839866638, \u0026#39;were\u0026#39;)] However, since the model that we have created was done using uncleaned data from a relatively small corpus, our output is not perfect. For example, with the following analogy triplets, the correct answer of bad comes fourth, after villainy, villain. and villain, showing that for a better model, we should do some additional cleaning of our data (e.g., removing punctuation).\n\u0026gt;\u0026gt;\u0026gt; model.get_analogies(\u0026#39;good\u0026#39;, \u0026#39;hero\u0026#39;, \u0026#39;villain\u0026#39;) [(0.5228292942047119, \u0026#39;villainy\u0026#39;), (0.5205934047698975, \u0026#39;villain.\u0026#39;), (0.5122538208961487, \u0026#39;villain,\u0026#39;), (0.5047158598899841, \u0026#39;bad\u0026#39;), (0.483129620552063, \u0026#39;villains.\u0026#39;), (0.4676515460014343, \u0026#39;good\u0026#34;\u0026#39;), (0.4662466049194336, \u0026#39;vill\u0026#39;), (0.46115875244140625, \u0026#39;villains\u0026#39;), (0.4569159746170044, \u0026#34;good\u0026#39;\u0026#34;), (0.4529685974121094, \u0026#39;excellent.\u0026#34;\u0026#39;)] Conclusion In this blogpost we have shown how to train a lightweight, efficient natural language processing model using fastText. After installing it, we have shown how to use some of the fastText functions to train the model, retrieve word embeddings, and usem them for different questions. While this was a toy example, we hope you found it inspiring for your own research! And remember, if you have a research idea that entails using natural language models and are stuck or do not know how to start - you can contact us!\nBonus: Tips to improve your model performance Depending on your research, various tweaks can be made to your data to improve fastText performance. For example, if multi-word phrases (e.g., Social Data Science) play some key aspect in your analyses, you might want to change these word phrases in the data with a dash or underscore (e.g., Social_Data_Science) so that these phrases are trained as a single token, not as a sum of the tokens Social, Data, and Science.\nAs shown with the good-hero-villain analogy, removing punctuation and other types of non-alphabetic characters can help remove learning representations for unwanted tokens. For this, stemming (removing word stems) and lemmatization (converting all words to their base form) can also be useful. Similarly, two other ways to deal with unwanted tokens are to remove stop-words from your data, and to play around with the minCount parameter (i.e, the minimum number of times a word needs to occur in the data to have a token be trained) when training your model.\nMost importantly, try to gather as much knowledge about the domain of your research. This tip can seem obvious, but having a proper understanding of the topic you are researching is the most important skill to have when it comes to language models. Let\u0026rsquo;s take the Sci-Fi corpus we used as an example: the 10th nearest neigbor of the word villain was villa. If you don\u0026rsquo;t really understand what either of those words mean, you would not know that these results seem fishy (since the model we created has low internal quality, it relies very much on the trained n-grams. Since both words contain the n-gram \u0026lsquo;villa\u0026rsquo;, they are rated as being close in the vector space). Therefore, make sure to understand the domain to the best of your abilities and scrutinize your findings to get reliable results.\n","date":"January 22, 2024","image":"http://odissei-soda.nl/images/tutorial-6/logo-color_hu1abe885bd00d0c3db0943f497a717f5c_29206_650x0_resize_box_3.png","permalink":"/tutorials/post-6/","title":"Training a fastText model from scratch using Python"},{"categories":null,"contents":"In this tutorial we present Geoflow, a newly created tool designed to visualize international flows in an interactive way. The tool is free and open-source, and can be accessed here. It is designed to visualize any international flows like, for instance, cash or migration flows. Since it\u0026rsquo;s easier to understand its capabilities by using them, we\u0026rsquo;ll start showing a couple of examples of what Geoflow can do. After that, we briefly explain how to upload your own dataset and visualize it using the tool.\nWhat Geoflow can do For these examples, we use the included demo dataset showing investments in fossil companies across countries. Figure 1 shows the top 10 investments in fossil fuel companies from China. The visualization is straightforward: the arrows indicate in which countries these investments are located. By placing the cursor on top of Bermudas, its arrow gets highlighted, showing the flow strength (weight), as well as the inflow and outflow country. Figure 2 is a barplot that shows to which countries most investments go to: in this case, it is mainly Singapore, followed by the Netherlands.\nFigure 1. Map of top 10 investments in fossil fuel companies from China\rFigure 2. Barplot of 10 investments in fossil fuel companies from China\rIn general, in the tool we can select the source and target countries for which we want to see the flows. There is also an option to select source or target for a country, which is useful when we want to focus on one country: for example, selecting all flows into the Netherlands or from the Netherlands. Besides, we can select the number of flows to visualize in the upper part. Lastly, we can select whether we want to visualize the inflow or the outflow. This last option changes the colouring of the countries (colouring either the inflow or outflow countries), and it also changes the barplot visualization.\nFigure 3. Some configuration options for the visualization\rHow to use Geoflow for your visualizations It is very straightforward to use Geoflow for your own visualizations. You only need to upload a .csv dataset to the app with the following columns:\nSource: the source of the flow, written in ISO2 format. Target: the target of the flow, also in ISO2 format Weight: strength of the flow (e.g., the number of migrants, or the financial revenue) Additionally, you can add:\nYear: If year is present, a new visualization on the bottom right panel shows a time series for the flows. You can see it in Figure 4 below. Other columns: They will be interpreted as categorical variables. This allows you to split the flows into categories, as shown in Figure 5 It is a requirement that the data format is .csv and the name of the variables are source, target, weight and (if included) year, so note you might have to reformat your data to use the tool.\nFigure 4. How the time series plot look like, with Germany highlighted\rFigure 5. Map of China top 10 fossil fuel investments, showing only investments in Manufacturing\rConclusion In this tutorial we have shown you how to use Geoflow for your own visualizations. We have shown what the Geoflow capabilities are, and how to upload your data to use it. We hope you\u0026rsquo;ve find it inspiring!\nGeoflow is open-source and has been developed by Peter Kok, Javier García Bernardo and mbabic332. If you use the tool, you can cite this Zenodo repo, with a DOI. If you wish to expand on Geoflow, you can check the source code here, and contribute or build on it. The tool is written using JavaScript.\n","date":"December 11, 2023","image":"http://odissei-soda.nl/images/tutorial-7/geoflow-miniature_hu6dbb4503ac6d6ce6a020e99dbb85449c_282734_650x0_resize_box_3.png","permalink":"/tutorials/post-7/","title":"Visualizing international flows with Geoflow visualizer"},{"categories":null,"contents":"In October 2023, we hosted a workshop about data visualization.\nAbout the workshop A key aspect of data science is turning data into a story that anyone can understand at a glance. In this Data Visualization Bootcamp, you will learn how to represent data in visual formats like pictures, charts and graphs.\nIn this workshop you will:\nlearn the most important principles of data visualization,\nlearn how to use data visualization libraries in Python (with Bokeh and Pyodide),\ndevelop your own Panel/hvPlot/Bokeh dashboard to interactively visualize data.\nPlenary instruction is combined with hands-on practice with your own datasets in small groups. The workshop will cover how interactive visualizations and dashboarding in Python/Bokeh differs from RShiny. You will learn how to run Bokeh Apps in the browser via Pyodide (no server required).\nBy the end of the workshop, you will be able to create powerful storytelling visuals with your own research data.\nAdditional information When Friday, 20 October 2023. It was also taught in 2021 and 2022. Where Data Science Center, University of Amsterdam. Registration Registration is no longer possible. Instructors Javier Garcia-Bernardo, Assistant Professor at Utrecht University. Javier\u0026rsquo;s website. Materials Course materials, including slides and code, are open and can be accessed here. ","date":"October 20, 2023","image":"http://odissei-soda.nl/images/workshops/data-visualization_hu3d03a01dcc18bc5be0e67db3d8d209a6_1348270_650x0_resize_q100_box.jpg","permalink":"/workshops/post-3/","title":"Data Visualization Bootcamp"},{"categories":null,"contents":"One common issue we encounter in helping researchers work with the housing register data of Statistics Netherlands is its transactional nature: each row in the housing register table contains data on when someone registered and deregistered at an address (more info in Dutch here).\nIn this post, we show how to use this transactional data to perform one of the most common transformations we see: what part of a certain time interval (e.g, the entire year 2021 or January 1999) did the people I’m interested in live in the Netherlands? To solve this issue, we will use time interval objects, as implemented in the package {lubridate} which is part of the {tidyverse} since version 2.0.0.\nlibrary(tidyverse) The data Obviously, we cannot share actual Statistics Netherlands microdata here, so we first generate some tables that capture the gist of the data structure. First, let’s generate some basic person identifiers and some info about each person:\nCode (person_df \u0026lt;- tibble( person_id = factor(c(\u0026#34;A10232\u0026#34;, \u0026#34;A39211\u0026#34;, \u0026#34;A28183\u0026#34;, \u0026#34;A10124\u0026#34;)), firstname = c(\u0026#34;Aron\u0026#34;, \u0026#34;Beth\u0026#34;, \u0026#34;Carol\u0026#34;, \u0026#34;Dave\u0026#34;), income_avg = c(14001, 45304, 110123, 43078) )) # A tibble: 4 × 3 person_id firstname income_avg \u0026lt;fct\u0026gt; \u0026lt;chr\u0026gt; \u0026lt;dbl\u0026gt; 1 A10232 Aron 14001 2 A39211 Beth 45304 3 A28183 Carol 110123 4 A10124 Dave 43078 Then, we create a small example of housing transaction register data. In this data, for any period where a person is not registered to a house, they are assumed to live abroad (because everyone in the Netherlands is required to be registered at an address).\nCode (house_df \u0026lt;- tibble( person_id = factor(c(\u0026#34;A10232\u0026#34;, \u0026#34;A10232\u0026#34;, \u0026#34;A10232\u0026#34;, \u0026#34;A39211\u0026#34;, \u0026#34;A39211\u0026#34;, \u0026#34;A28183\u0026#34;, \u0026#34;A28183\u0026#34;, \u0026#34;A10124\u0026#34;)), house_id = factor(c(\u0026#34;H1200E\u0026#34;, \u0026#34;H1243D\u0026#34;, \u0026#34;H3432B\u0026#34;, \u0026#34;HA7382\u0026#34;, \u0026#34;H53621\u0026#34;, \u0026#34;HC39EF\u0026#34;, \u0026#34;HA3A01\u0026#34;, \u0026#34;H222BA\u0026#34;)), start_date = ymd(c(\u0026#34;20200101\u0026#34;, \u0026#34;20200112\u0026#34;, \u0026#34;20211120\u0026#34;, \u0026#34;19800101\u0026#34;, \u0026#34;19900101\u0026#34;, \u0026#34;20170303\u0026#34;, \u0026#34;20190202\u0026#34;, \u0026#34;19931023\u0026#34;)), end_date = ymd(c(\u0026#34;20200112\u0026#34;, \u0026#34;20211120\u0026#34;, \u0026#34;20230720\u0026#34;, \u0026#34;19891231\u0026#34;, \u0026#34;20170102\u0026#34;, \u0026#34;20180720\u0026#34;, \u0026#34;20230720\u0026#34;, \u0026#34;20230720\u0026#34;)) )) # A tibble: 8 × 4 person_id house_id start_date end_date \u0026lt;fct\u0026gt; \u0026lt;fct\u0026gt; \u0026lt;date\u0026gt; \u0026lt;date\u0026gt; 1 A10232 H1200E 2020-01-01 2020-01-12 2 A10232 H1243D 2020-01-12 2021-11-20 3 A10232 H3432B 2021-11-20 2023-07-20 4 A39211 HA7382 1980-01-01 1989-12-31 5 A39211 H53621 1990-01-01 2017-01-02 6 A28183 HC39EF 2017-03-03 2018-07-20 7 A28183 HA3A01 2019-02-02 2023-07-20 8 A10124 H222BA 1993-10-23 2023-07-20 Interval objects! Notice how each transaction in the housing data has a start and end date, indicating when someone registered and deregistered at an address. A natural representation of this information is as a single object: a time interval. The package {lubridate} has support for specific interval objects, and several operations on intervals:\ncomputing the length of an interval with int_length() computing whether two intervals overlap with int_overlap() and much more\u0026hellip; as you can see here So let’s transform these start and end columns into a single interval column!\nhouse_df \u0026lt;- house_df |\u0026gt; mutate( # create the interval int = interval(start_date, end_date), # drop the start/end columns .keep = \u0026#34;unused\u0026#34; ) house_df # A tibble: 8 × 3 person_id house_id int \u0026lt;fct\u0026gt; \u0026lt;fct\u0026gt; \u0026lt;Interval\u0026gt; 1 A10232 H1200E 2020-01-01 UTC--2020-01-12 UTC 2 A10232 H1243D 2020-01-12 UTC--2021-11-20 UTC 3 A10232 H3432B 2021-11-20 UTC--2023-07-20 UTC 4 A39211 HA7382 1980-01-01 UTC--1989-12-31 UTC 5 A39211 H53621 1990-01-01 UTC--2017-01-02 UTC 6 A28183 HC39EF 2017-03-03 UTC--2018-07-20 UTC 7 A28183 HA3A01 2019-02-02 UTC--2023-07-20 UTC 8 A10124 H222BA 1993-10-23 UTC--2023-07-20 UTC We will want to compare this interval with a reference interval to compute the proportion of time that a person lived in the Netherlands within the reference interval. Therefore, we quickly define a new interval operation which truncates an interval to a reference interval. Don’t worry too much about it for now, we will use it later. Do notice that we’re always using the int_*() functions defined by {lubridate} to interact with the interval objects.\n# utility function to truncate an interval object to limits (also vectorized so it works in mutate()) int_truncate \u0026lt;- function(int, int_limits) { int_start(int) \u0026lt;- pmax(int_start(int), int_start(int_limits)) int_end(int) \u0026lt;- pmin(int_end(int), int_end(int_limits)) return(int) } Computing the proportion in the Netherlands The next step is to define a function that computes for each person a proportion overlap for a reference interval. By creating a function, it will be easy later to do the same operation for different intervals (e.g., different reference years) to work with the rich nature of the Statistics Netherlands microdata. To compute this table, we make extensive use of the {tidyverse}, with verbs like filter(), mutate(), and summarize(). If you want to know more about these, take a look at the {dplyr} documentation (but of course you can also use your own flavour of data processing, such as {data.table} or base R).\n# function to compute overlap proportion per person proportion_tab \u0026lt;- function(housing_data, reference_interval) { # start with the housing data housing_data |\u0026gt; # only retain overlapping rows, this makes the following # operations more efficient by only computing what we need filter(int_overlaps(int, reference_interval)) |\u0026gt; # then, actually compute the overlap of the intervals mutate( # use our earlier truncate function int_tr = int_truncate(int, reference_interval), # then, it\u0026#39;s simple to compute the overlap proportion prop = int_length(int_tr) / int_length(reference_interval) ) |\u0026gt; # combine different intervals per person summarize(prop_in_nl = sum(prop), .by = person_id) } Now we’ve defined this function, let’s try it out for a specific year such as 2017!\nint_2017 \u0026lt;- interval(ymd(\u0026#34;20170101\u0026#34;), ymd(\u0026#34;20171231\u0026#34;)) prop_2017 \u0026lt;- proportion_tab(house_df, int_2017) prop_2017 # A tibble: 3 × 2 person_id prop_in_nl \u0026lt;fct\u0026gt; \u0026lt;dbl\u0026gt; 1 A39211 0.00275 2 A28183 0.832 3 A10124 1 Now we’ve computed this proportion, notice that we only have three people. This means that the other person was living abroad in that time, with a proportion in the Netherlands of 0. To nicely display this information, we can join the proportion table with the original person dataset and replace the NA values in the proportion column with 0.\nleft_join(person_df, prop_2017, by = \u0026#34;person_id\u0026#34;) |\u0026gt; mutate(prop_in_nl = replace_na(prop_in_nl, 0)) # A tibble: 4 × 4 person_id firstname income_avg prop_in_nl \u0026lt;fct\u0026gt; \u0026lt;chr\u0026gt; \u0026lt;dbl\u0026gt; \u0026lt;dbl\u0026gt; 1 A10232 Aron 14001 0 2 A39211 Beth 45304 0.00275 3 A28183 Carol 110123 0.832 4 A10124 Dave 43078 1 Success! We now have a dataset for each person with the proportion of time they lived in the Netherlands in 2017. If you look at the original housing dataset, you may see the following patterns reflected in the proportion:\nAron indeed did not live in the Netherlands at this time. Beth moved away on January 2nd, 2017. Carol moved into the Netherlands on March 3rd, 2017 and remained there until 2018 Dave lived in the Netherlands this entire time. Conclusion In this post, we used interval objects and operations from the {lubridate} package to wrangle transactional housing data into a proportion of time spent living in the Netherlands. The advantage of using this package and its functions is that any particularities with timezones, date comparison, and leap years are automatically dealt with so that we could focus on the end result rather than the details.\nIf you are doing similar work and you have a different method, let us know! In addition, if you have further questions about working with Statistics Netherlands microdata or other complex or large social science datasets, do not hesitate to contact us on our website: https://odissei-soda.nl.\nBonus appendix: multiple time intervals Because we created a function that takes in the transaction data and a reference interval, we can do the same thing for multiple time intervals (e.g., years) and combine the data together in one wide or long dataset. This is one way to do this:\nlibrary(glue) # for easy string manipulation # initialize an empty dataframe with all our columns nl_prop \u0026lt;- tibble(person_id = factor(), prop_in_nl = double(), yr = integer()) # then loop over the years of interest for (yr in 2017L:2022L) { # construct reference interval for this year ref_int \u0026lt;- interval(ymd(glue(\u0026#34;{yr}0101\u0026#34;)), ymd(glue(\u0026#34;{yr}1231\u0026#34;))) # compute the proportion table for this year nl_prop_yr \u0026lt;- proportion_tab(house_df, ref_int) |\u0026gt; mutate(yr = yr) # append this year to the dataframe nl_prop \u0026lt;- bind_rows(nl_prop, nl_prop_yr) } # we can pivot it to a wide format nl_prop_wide \u0026lt;- nl_prop |\u0026gt; pivot_wider( names_from = yr, names_prefix = \u0026#34;nl_prop_\u0026#34;, values_from = prop_in_nl ) # and join it with the original person data, replacing NAs with 0 again person_df |\u0026gt; left_join(nl_prop_wide, by = \u0026#34;person_id\u0026#34;) |\u0026gt; mutate(across(starts_with(\u0026#34;nl_prop_\u0026#34;), \\(p) replace_na(p, 0))) # A tibble: 4 × 9 person_id firstname income_avg nl_prop_2017 nl_prop_2018 nl_prop_2019 \u0026lt;fct\u0026gt; \u0026lt;chr\u0026gt; \u0026lt;dbl\u0026gt; \u0026lt;dbl\u0026gt; \u0026lt;dbl\u0026gt; \u0026lt;dbl\u0026gt; 1 A10232 Aron 14001 0 0 0 2 A39211 Beth 45304 0.00275 0 0 3 A28183 Carol 110123 0.832 0.549 0.912 4 A10124 Dave 43078 1 1 1 # ℹ 3 more variables: nl_prop_2020 \u0026lt;dbl\u0026gt;, nl_prop_2021 \u0026lt;dbl\u0026gt;, # nl_prop_2022 \u0026lt;dbl\u0026gt; ","date":"September 29, 2023","image":"http://odissei-soda.nl/images/tutorial-5/lubridate_1_hu9ab8adf199cf1b31e00f5b6813db3886_430902_650x0_resize_box_3.png","permalink":"/tutorials/post-5/","title":"Wrangling interval data using lubridate"},{"categories":null,"contents":"These days, our online presence leaves traces of our behavior everywhere. There is data of what we do and say in platforms such as WhatsApp, Instagram, online stores, and many others. Of course, this so-called ‘digital trace data’ is of interest for social scientists: new, rich, enormous datasets that can be used to describe and understand our social world. However, this data is commonly owned by private companies. How can social scientists access and make sense of this data?\nIn this tutorial, we use data donation and the Port software to get access to WhatsApp group-chat data in a way that completely preserves privacy of research participants. Our goal is to show a small peek of what can be achieved with these methods. If you have an idea for your own research that entails collecting digital trace data, don’t hesitate to contact us! We can help you think about data acquisition, analysis and more.\nWith data donation, it is possible to collect data about any online platform: under the General Data Protection Regulation (EU law), companies are required to provide their data to any citizen that requests it. This data is available in so-called Data Download Packages (DDP’s), which are rather cumbersome to work with and contain personal information. Therefore, the Port software processes these DDP’s so that the data is in a format ready for analysis, while completely guaranteeing privacy of the respondents. The only thing research participants have to do is request their DDP’s, see which information they are sharing and consent to sharing it.\nSince we do not dive in with a lot of detail, we refer to Port\u0026rsquo;s github for more details on how to get started with your own project. There you can find a full guide to install and use Port, examples of past studies done with it, a tutorial for creating your own data donation workflow, and more. You can also read more about data donation in general here and here.\nAn application with WhatsApp data In this example, we extract some basic information from WhatsApp group chats, such as how many messages links, locations, and pictures were shared, as well as which person in the group the participant responded most to.\nNote that this is the only information we want to collect from the participants of the study, not the whole group chat file!\nThe first step in creating a DDP processing script is to obtain an example DDP and examine it. This example DDP can be, for example, your own DDP requested from WhatsApp. Usually, platforms provide a (compressed) folder with many different files; i.e., data in a format that is not ready to use. Once uncompressed, a WhatsApp group chat file could look like this:\n[16/03/2022, 15:10:17] Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more. [16/03/2022, 15:20:25] person1: Hi shiva! [16/03/2022, 15:25:38] person2: Hi 👋 [16/03/2022, 15:26:48] person3: Hoi! [16/03/2022, 18:39:29] person2: https://youtu.be/KBmUTY6mK_E [16/03/2022, 18:35:51] person1: ‎Location: https://maps.google.com/?q=52.089451,5.108469 [20/03/2022, 20:08:51] person4: I’m about to generate some very random messages so that I can make some screenshots for the explanation to participants [24/03/2022, 20:19:38] person1: @user3 if you remove your Profile picture for a moment I will redo the screenshots 😁 [26/03/2022, 18:52:15] person2: Well done Utrecht 😁 [14/07/2020, 22:05:54] person4: 👍Bedankt As part of a collaboration with data donation researchers using Port, we wrote a Python script1 to convert this into the information we need. The main script is available here; in short, it does the following:\nseparate the header and the message itself parse the date and time information in each message remove unneeded information such as alert notifications anonymize usernames convert the extracted information to a nice data frame format to show the participant for consent One big problem we had to overcome is that messages and alert notifications cannot be identified in the same way (i.e., using the same regular expression) on every device. Through trial-and-error, we tailored the steps to work with every operating system, language, and device required for this study. Indeed, if you design a study like this, it is very important to try out your script on many different DDPs from different people and devices. That way you will make sure you have covered possible variation in DPPs before actually starting data collection. This is a process that can take quite a while, so keep this in mind when you want to run a data donation study!\nThe end result In Figure 1 you can see a (fictitious) snippet of the dataset obtained. This is how a dataset in which you combine donations from different users would look like. As can be seen, we have moved from a rather untidy text file to a tidy, directly analysable dataset, where each row corresponds to an user in a given data donation package, and the rest of the columns give information about that user. Particularly, the dataset displays the following information: data donation package id (ddp_id), an anonymized user name (user_name), number of words sent on the groupchat by the user (nwords), date of first and last messages sent on the groupchat by the user (date_first_mess, date_last_mess), number of urls, files and locations sent on the groupchat by the user (respectively, nurls, nfiles, nlocations), and the (other) user that has replied more to that user (replies_from), as well as the user that that user has replied to the most (replies_to).\nTable 1. Snippet of fictitious dataset\nddp_id user_name nwords date_first_mess date_last_mess nurls nfiles nlocations replies_from replies_to 1 User1_1 121 10/08/2023 27/08/2023 0 15 0 User1_2 User1_4 1 User1_2 17 11/08/2023 28/08/2023 3 1 2 User1_1 User1_1 1 User1_3 44 10/08/2023 28/08/2023 9 6 3 User1_2 User1_1 1 User1_4 50 12/08/2023 29/08/2023 0 3 1 User1_3 User1_1 2 User2_1 123 01/05/2022 01/11/2022 2 0 1 User2_2 User2_2 2 User2_2 250 01/05/2022 02/11/2022 0 32 3 User2_3 User2_1 2 User2_3 176 08/07/2022 04/12/2022 6 0 5 User2_2 User2_3 3 User3_1 12 05/06/2023 26/07/2023 12 2 0 User3_1 User3_2 3 User3_2 16 06/06/2023 26/07/2023 17 2 0 User3_2 User3_1 In Figure 2 you can see a screenshot of how the Port software would display the data to be shared (number of words or messages, date stamps…) and ask for consent to the research subjects. As you see, the Port software guarantees that research subjects are aware of what information they are sharing and consent to it. The rest of the DDPs, including sensitive data, is analyzed locally and does not leave the respondents\u0026rsquo; devices.\nFigure 2. How the Port software displays the data to be shared and asks for consent\rConclusion The aim of this post was to illustrate how to use data donation with the software Port to extract online platform data. We illustrated all of this with the extraction of group-chat information from WhatsApp data. The main challenge of this project was to write a robust script that transforms this data into a nice, readily usable format while maintaining privacy. If you want to implement something similar but do not know how or where to start, let us know and we can help!\nThis script uses a deprecated version of Port, but large part of the script can be reused;\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"September 8, 2023","image":"http://odissei-soda.nl/images/tutorial-4/whatsapp_header_hu3d03a01dcc18bc5be0e67db3d8d209a6_1708177_650x0_resize_q100_box.jpg","permalink":"/tutorials/post-4/","title":"Collecting online platforms data for science: an example using WhatsApp"},{"categories":null,"contents":"In June 2023, we hosted a workshop about Network Science.\nAbout the workshop How can networks at Statistics Netherlands (CBS) help us understand and predict social systems? In this workshop, we provide participants with the conceptual and practical skills necessary to use network science tools to answer social, economic and biological questions.\nThis workshop introduces concepts and tools in network science. The objective of the course is that participants acquire hands-on knowledge on how to analyze CBS network data. Participants will be able to understand when a network approach is useful, work with networks efficiently, and create network variables.\nThe course has a hands-on focus, with lectures accompanied by programming practicals (in Python) to apply the knowledge on real networks.\nAdditional information When Thursday June 22, 202. (It was also taught it in 2022, together with Eszter Boyani). Where Summer Institute in Computational Social Science, Erasmus University Rotterdam. Registration Registration is no longer possible. Instructors Javier Garcia-Bernardo, Assistant Professor at Utrecht University. Javier\u0026rsquo;s website. Materials Course materials, including slides and code, are open and can be accessed here. ","date":"June 22, 2023","image":"http://odissei-soda.nl/images/workshops/network-science_hu3d03a01dcc18bc5be0e67db3d8d209a6_668913_650x0_resize_q100_box.jpg","permalink":"/workshops/post-2/","title":"Network science"},{"categories":null,"contents":"In May 2023, we hosted a workshop in Causal Impact Assesment focusing on policy interventions.\nAbout the workshop How do we assess whether a school policy intervention has had the desired effect on student performance? How do we estimate the impact a natural disaster has had on the inhabitants of affected regions? How can we determine whether a change in the maximum speed on highways has led to fewer accidents? These types of questions are at the core of many social scientific research problems. While questions with this structure are seemingly simple, their causal effects are notoriously hard to estimate, because often the researchers cannot perform a randomized controlled experiment.\nThe workshop offers hands-on training on several basic and advanced methods (e.g., difference-in-difference, interrupted time series and synthetic control) that can be applied when assessing causal impact. There is a focus on both the assumptions underlying the methods, and how to put them into practice.\nAdditional information When May, 2023. It is likely to be held again in 2024. Where Utrecht University. Registration Registration is no longer possible. Instructors Erik-Jan van Kesteren, Assistant Professor at Utrecht University (Erik-Jan\u0026rsquo;s website) \u0026amp; Oisín Ryan Assistant Professor at UMC (Oisín\u0026rsquo;s website). Materials Course materials, including slides and code, are open and can be accessed here. ","date":"May 26, 2023","image":"http://odissei-soda.nl/images/workshops/causal-inference_hu6a86fe0f271ec969b45a77f81a48f6ab_152168_650x0_resize_box_3.png","permalink":"/workshops/post-1/","title":"Causal Impact Assesment"},{"categories":null,"contents":"ArtScraper is a Python library to download images and metadata for artworks available on WikiArt and Google Arts \u0026amp; Culture.\nInstallation pip install https://github.com/sodascience/artscraper.git Downloading images from WikiArt To download data from WikiArt it is necessary to obtain free API keys.\nOnce you have the API keys, you can simply run the code below to download the images and metadata of the three artworks of Aleksandra Ekster.\n# artworks to scrape some_links = [ \u0026#34;https://www.wikiart.org/en/aleksandra-ekster/women-s-costume-1918\u0026#34;, \u0026#34;https://www.wikiart.org/en/aleksandra-ekster/still-life-1913\u0026#34;, \u0026#34;https://www.wikiart.org/en/aleksandra-ekster/view-of-paris-1912\u0026#34; ] # download images and metadata to the folder \u0026#34;data\u0026#34; with WikiArtScraper(output_dir=\u0026#34;data\u0026#34;) as scraper: for url in some_links: scraper.load_link(url) scraper.save_metadata() scraper.save_image() Downloading images from Google Art \u0026amp; Culture To download data from Google Art \u0026amp; Culture you need to download Firefox and geckodriver. The installation instructions can be found in our GitHub repository.\nOnce you have Firefox and geckodriver, you can simply run the code below to download artworks. You are not allowed to share or publish the images. Use them only for research.\n# artworks to scrape some_links = [ \u0026#34;https://artsandculture.google.com/asset/helena-hunter-fairytales/dwFMypq0ZSiq6w\u0026#34;, \u0026#34;https://artsandculture.google.com/asset/erina-takahashi-and-isaac-hernandez-in-fantastic-beings-laurent-liotardo/MQEhgoWpWJUd_w\u0026#34;, \u0026#34;https://artsandculture.google.com/asset/rinaldo-roberto-masotti/swG7r2rgfvPOFQ\u0026#34; ] # If you are on Windows, you can download geckodriver, place it in your directory, # and use the argument geckodriver_path=\u0026#34;geckodriver.exe\u0026#34; with GoogleArtScraper(\u0026#34;data\u0026#34;) as scraper: for url in some_links: scraper.load_link(url) scraper.save_metadata() scraper.save_image() You can find more examples here\nDo you want to know more about this library? Check our GitHub repository\nAre you using it for academic work? Please cite our package:\nSchram, Raoul, Garcia-Bernardo, Javier, van Kesteren, Erik-Jan, de Bruin, Jonathan, \u0026amp; Stamkou, Eftychia. (2022). ArtScraper: A Python library to scrape online artworks (0.1.1). Zenodo. https://doi.org/10.5281/zenodo.7129975 ","date":"October 4, 2022","image":"http://odissei-soda.nl/images/tutorial-2/nantenbo_header_hu48d98726654ff846597d2fe25a58192f_52421_650x0_resize_q100_box.jpg","permalink":"/tutorials/post-2/","title":"ArtScraper: A Python library to scrape online artworks"},{"categories":null,"contents":"With the increasing popularity of open science practices, it is now more and more common to openly share code along with more traditional scientific objects such as papers. But what are the best ways to create an understandable, openly accessible, findable, citable, and stable archive of your code? In this post, we look at what you need to do to prepare your code folder and then how to upload it to Zenodo.\nPrepare your code folder To make code available, you will be uploading it to the internet as a single folder. The code you will upload will be openly accessible, and it will stay that way indefinitely. Therefore, it is necessary that you prepare your code folder (also called a “repository”) for publication. This requires time and effort, and for every project the requirements are different. Think about the following checklist:\nMust-haves Make a logical, understandable folder structure. For example, for a research project with data processing, visualization, and analysis I like the following structure: my_project/\u0026lt;br/\u0026gt; ├─ raw_data/\u0026lt;br/\u0026gt; │ ├─ questionnaire_data.csv\u0026lt;br/\u0026gt; ├─ processed_data/\u0026lt;br/\u0026gt; │ ├─ questionnaire_processed.rds\u0026lt;br/\u0026gt; │ ├─ analysis_object.rds\u0026lt;br/\u0026gt; ├─ img/\u0026lt;br/\u0026gt; │ ├─ plot.png\u0026lt;br/\u0026gt; ├─ 01_load_and_process_data.R\u0026lt;br/\u0026gt; ├─ 02_create_visualisations.R\u0026lt;br/\u0026gt; ├─ 03_main_analysis.R\u0026lt;br/\u0026gt; ├─ 04_output_results.R\u0026lt;br/\u0026gt; ├─ my_project.Rproj\u0026lt;br/\u0026gt; ├─ readme.md Make sure no privacy-sensitive information is leaked. Remove non-shareable data objects (raw and processed!), passwords hardcoded in your scripts, comments containing private information, and so on. Create a legible readme file in the folder that describes what the code does, where to find which parts of the code, and what needs to be done to run the code. You can choose how elaborate to make this! It could be a simple text file, a word document, a pdf, or a markdown document with images describing the structure. It is best if someone who does not know the project can understand the entire folder based on the readme – this includes yourself in a few years from now! Strong recommendations Reformat the code so that it is portable and easily reproducible. This means that when someone else downloads the folder, they do not need to change the code to run it. For example this means that you do not read data with absolute paths (e.g., C:/my_name/Documents/PhD/projects/project_title/raw_data/questionnaire_data.csv) on your computer, but only to relative paths on the project (e.g., raw_data/questionnaire_data.csv). For example, if you use the R programming language it is good practice to use an RStudio project. Format your code so that it is legible by others. Write informative comments, split up your scripts in logical chunks, and use a consistent style (for R I like the tidyverse style) Nice to have Record the software packages that you used to run the projects, including their versions. If a package gets updated, your code may no longer run! Your package manager may already do this, e.g., for python you can use pip freeze \u0026gt; requirements.txt. In R, you can use the renv package for this. If you have privacy-sensitive data, it may still be possible to create a synthetic or fake version of this data for others to run the code on. This ensures maximum reproducibility. Compressing the code folder The last step before uploading the code repository to Zenodo is to compress the folder. This can be done in Windows 11 by right-clicking the folder and pressing “compress to zip file”. It’s a good idea to go into the compressed folder afterwards, and checking if everything is there and also removing any unnecessary files (such as .Rhistory files for R).\nFigure 1: Zipping the code folder.\rAfter compressing, your code repository is now ready to be uploaded!\nUploading to Zenodo Zenodo is a website where you can upload any kind of research object: papers, code, datasets, questionnaires, presentations, and much more. After uploading, Zenodo will create a page containing your research object and metadata about the object, such as publication date, author, and keywords. In the figure below you can see an example of a code repository uploaded to Zenodo.\nFigure 2: A code repository uploaded to the Zenodo website. See https://zenodo.org/record/6504837\rOne of the key features of Zenodo is that you can get a Digital Object Identifier (DOI) for the objects you upload, making your research objects persistent and easy to find and cite. For example, in APA style I could cite the code as follows:\nvan Kesteren, Erik-Jan. (2022). My project (v1.2). Zenodo. https://doi.org/10.5281/zenodo.6504837\nZenodo itself is fully open source, hosted by CERN, and funded by the European Commission. These are exactly the kinds of conditions which make it likely to last for a long time! Hence, it is an excellent choice for uploading our code. So let’s get started!\nCreate an account To upload anything to Zenodo, you need an account. If you already have an ORCID or a GitHub account, then you can link these immediately to your Zenodo login. I do recommend doing so as it will make it easy to link these services and use them together.\nFigure 3: Zenodo sign-up page. See https://zenodo.org/signup/\rStart a new upload When you click the “upload” button, you will get a page where you can upload your files, determine the type of the upload, and create metadata for the research object. Now zip your prepared code folder and drag it to the upload window!\nFigure 4: Uploading a zipped folder to the Zenodo website.\rFill out the metadata One of the first options you need to specify is the “upload type”. For code repositories, you can choose the “software” option. The remaining metadata is relatively simple to fill out (such as author and institution). However, one category to pay attention to is the license: by default the CC-BY-4.0 license is selected. For a short overview of what this means, see the creative commons website: https://creativecommons.org/licenses/by/4.0/. You can opt for a different license by including a file called LICENSE in your repository.\nFigure 5: Selecting the \u0026lsquo;software\u0026rsquo; option for upload type.\rPublish! The last step is to click “publish”. Your research code is now findable, citable, understandable, reproducible, and archived until the end of times! You can now show it to all your colleagues and easily cite it in your manuscript. If you get feedback and you want to change your code, you can also upload a new version of the same project on the Zenodo website.\nConclusion In this post, I described a checklist for preparing your code folder for publication with a focus on understandability, and I have described one way in which you can upload your prepared code repository to an open access archive. Zenodo is an easy, dependable and well-built option, but of course there are many alternatives, such as hosting it on your own website, using the Open Science Framework, GitHub, or using a publisher’s website; each has its own advantages and disadvantages.\n","date":"September 5, 2022","image":"http://odissei-soda.nl/images/tutorial-1/tutorial1_header_hu650f89d19acf6379f59d4eaf3a39c00b_29682_650x0_resize_box_3.png","permalink":"/tutorials/post-1/","title":"How to share your research code"},{"categories":null,"contents":"In May 2022, we hosted a workshop about efficient programming for accessing CBS microdata.\nAbout the workshop What to do when your CBS microdata analysis takes too many computational resources to run on the remote access environment? In this workshop we covered solutions to this problem. It will be an accessible introduction to a variety of ways in which you can programme more efficiently when using microdata in your research. Furthermore, it will discuss when you should and should not move your project to the ODISSEI Secure Supercomputer.\nThe introduction will include some live coding, exploring different options for project organisation, speeding up code, benchmarking, profiling, and reducing memory requirements. During his talk, Van Kesteren will also touch upon topics such as \u0026ldquo;embarassingly parallel\u0026rdquo;, scientific programming, data pipelines, open source, and open science. Although the presentation will center around data analysis with R, these principles also hold for other languages, such as Python or Julia.\nAdditional information When May 16th, 2022. Where Registration Registration is no longer possible. Instructors Erik-Jan van Kesteren, Assistant Professor at Utrecht University (Erik-Jan\u0026rsquo;s website). Materials Course materials, including slides and code, are open and can be accessed here. ","date":"May 16, 2022","image":"http://odissei-soda.nl/images/workshops/cbs_hub238c02f97a123a553dda5ed269ec1f4_33026_650x0_resize_q100_box.jpg","permalink":"/workshops/post-4/","title":"Efficient programming with CBS microdata"},{"categories":null,"contents":"In September 2022, we hosted a workshop about synthetic data.\nAbout the workshop Open data is one of the pillars of open science. However, there are often barriers in the way of making research data openly available, relating to consent, privacy, or organisational boundaries. In such cases, synthetic data is an excellent solution: the real data is kept secret, but a \u0026ldquo;fake\u0026rdquo; version of the data is available. The promise of the synthetic dataset is that others can then investigate the data structure, rerun scripts, use the data in educational materials, or even run a completely different analysis on their own.\nBut how do you generate synthetic data? In this session, we will introduce the field of synthetic data generation and apply several tools to generate synthetic versions of datasets, with various level of utility and privacy. We will be paying extra attention to practical issues such as missing values, data types, and disclosure control. Participants can either use a provided example dataset or they can bring their own data!\nAdditional information When September 2022. Where Open Science Festival. Registration Registration is no longer possible. Instructors Erik-Jan van Kesteren, Assistant Professor at Utrecht University (Erik-Jan\u0026rsquo;s website), Raoul Schram, Research Engineer at Utrecht University (Raoul\u0026rsquo;s website) \u0026amp; Thom Volker, PhD Candidate at Utrecht Universit (Thom\u0026rsquo;s website). Materials Course materials, including slides and code, are open and can be accessed here. ","date":"January 9, 2022","image":"http://odissei-soda.nl/images/workshops/syntheticdata_hu8a3495d7a8e26162d9e6ccba84eefed3_12080_650x0_resize_box_3.png","permalink":"/workshops/post-5/","title":"How to create synthetic data"},{"categories":null,"contents":"During your time as a fellow:\nyou will spend between 3-5 months full-time* working on a social science research project. you can propose your own project, based on your interests. you are a member of the SoDa team at the Methodology \u0026amp; Statistics department of Utrecht University. you will get a salary during this time, paid for by the team. one of the senior team members will be your mentor. To apply, you have to submit a short proposal for your project, together with a substantive supervisor. We are looking for projects in the social sciences for which a computational or data-related problem needs to be solved.\nThe next submission deadline is 31 May 2024\n* part-time possible, but the project should be your main priority.\n","date":"January 1, 1","image":"http://odissei-soda.nl/images/workshops/syntheticdata_hu8a3495d7a8e26162d9e6ccba84eefed3_12080_650x0_resize_box_3.png","permalink":"/fellowship/","title":"Fellowship"},{"categories":null,"contents":"","date":"January 1, 1","image":"http://odissei-soda.nl/images/workshops/syntheticdata_hu8a3495d7a8e26162d9e6ccba84eefed3_12080_650x0_resize_box_3.png","permalink":"/principles/","title":"Principles"},{"categories":null,"contents":"","date":"January 1, 1","image":"http://odissei-soda.nl/images/workshops/syntheticdata_hu8a3495d7a8e26162d9e6ccba84eefed3_12080_650x0_resize_box_3.png","permalink":"/projects/","title":"Projects"},{"categories":null,"contents":"","date":"January 1, 1","image":"http://odissei-soda.nl/images/workshops/syntheticdata_hu8a3495d7a8e26162d9e6ccba84eefed3_12080_650x0_resize_box_3.png","permalink":"/team/","title":"The SoDa Team"}] \ No newline at end of file + + + + + + + + + + + + + + +[{"categories":null,"contents":"Doing open, reproducible science means doing your best to openly share research data and analysis code. With these open materials, others can check and understand your research, use it to prepare their own analysis, find examples for teaching, and more. However, sometimes datasets contain sensititive or confidential information, which makes it difficult — if not impossible — to share. In this case, producing and sharing a synthetic version of the data might be a solution. In this post, we show how to do this in an auditable, transparent way with the software package metasyn.\nMetasyn is a Python package that helps you to generate synthetic data, with two ideas in mind. First, it is easy to use and understand. Second, and most importantly, it is privacy-friendly. Unlike most other synthetic data generation tools, metasyn strictly limits the statistical information in its data generation model to adhere to the highest privacy standards and only generates data that is similar on an individual column level. This makes it a great tool for initial exploration, code development, and sharing of datasets while maintining very high privacy levels - but it is not suitable for in-depth statistical analysis.\nWith metasyn, you fit a model to a dataset and synthesize data similar to the original based on that model. You can then export the synthetic data and the model used to generate it, in easy-to-read format. As a result, metasyn allows data owners to safely share synthetic datasets based on their source data, as well as the model used to generate it, without worrying about leaking any private information from the original dataset.\nLet\u0026rsquo;s say you want to use metasyn to collaborate on a sensitive dataset with others. In this tutorial, we will show you everything you need to know to get started.\nStep 1: Setup The first step is installing metasyn. The easiest way to do so is by installing it through pip. This can be done by typing the following command in your terminal:\npip install metasyn Then, in a Python environment, you can import metasyn (and Polars, which will be used to load the dataset):\nimport polars as pl from metasyn import MetaFrame, demo_file Step 2: Creating a DataFrame Before we can pass a dataset into metasyn, we need to convert it to a Polars DataFrame. In doing so, we can indicate which columns contain categorical values. We can also tell polars to find columns that may contain dates or timestamps. Metasyn can later use this information to generate categorical or date-like values where appropriate. For more information on how to use Polars, check out the Polars documentation.\nFor this tutorial, we will use the Titanic dataset, which comes preloaded with metasyn (its file path can be accessed using the demo_file function). We will specify the data types of the Sex and Embarked columns as categorical, and we will also try to parse dates in the DataFrame.\n# Get the CSV file path for the Titanic dataset csv_path = demo_file(\u0026#34;titanic\u0026#34;) # Replace this with your file path if needed # Create a Polars DataFrame df = pl.read_csv( source=csv_path, dtypes={\u0026#34;Sex\u0026#34;: pl.Categorical, \u0026#34;Embarked\u0026#34;: pl.Categorical}, try_parse_dates=True, ) Step 3: Generating a MetaFrame Now that we have created a DataFrame, we can easily generate a MetaFrame for it. Metasyn can later use this MetaFrame to generate synthetic data that aligns with the original dataset.\nA MetaFrame is a simple model that captures the essentials of each variable in the original dataset (e.g., variable names, types, data types, the percentage of missing values, and distribution), without containing any actual data entries.\nA MetaFrame can be created by simply calling MetaFrame.fit_dataframe(), passing in the DataFrame as a parameter.\n# Generate and fit a MetaFrame to the DataFrame mf = MetaFrame.fit_dataframe(df) Step 4: Generating synthetic data With our MetaFrame in place, we can use it to generate synthetic data. To do so, we can call synthesize on our MetaFrame, and pass in the amount of rows of data that we want to generate. This will return a DataFrame with synthetic data, that is similar to our original dataset.\n# generate synthetic data syn_df = mf.synthesize(5) That\u0026rsquo;s it! You can now read, analyze, modify, use and share this DataFrame as you would with any other \u0026ndash; knowing that it is rather unlikely to leak private information (though if you need actual formal privacy guarantees, look at our disclosure control plugin).\nStep 5: Exporting the MetaFrame Let\u0026rsquo;s say we want to go one step further, and also share the an auditable representation of the MetaFrame alongside our synthetic data. We can easily do so by exporting it to a JSON file.\nThese exported files follow the Generative Metadata Format (GMF). This is a format that was designed to be easy-to-read and understand.\nOther users can then import this file to generate synthetic data similar to the original dataset, without ever having access to the original data. In addition, due to these files being easy to read, others can easily understand and evaluate how the synthetic data is generated.\nTo export the MetaFrame, we can call the export method on an existing MetaFrame (in this case, mf), passing in the file path of where we want to save the JSON file.\n# Serialize and export the MetaFrame mf.export(\u0026#34;exported_metaframe.json\u0026#34;) To load the MetaFrame from the exported JSON file, we can use the MetaFrame.from_json() class method, passing in the file path as a parameter:\n# Create a MetaFrame based on a GMF (.json) file mf = MetaFrame.from_json(file_path) Conclusion You now know how to use metasyn to generate synthetic data from a dataset. Both the synthetic data and the model (MetaFrame) used to generate it can be shared safely, while maintaining a high level of privacy.\nEnjoy using metasyn!\nFor more information on how to use metasyn, check out the documentation or the GitHub repository.\n","date":"April 26, 2024","image":"http://odissei-soda.nl/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_650x0_resize_box_3.png","permalink":"/tutorials/generating-synthetic-data-with-metasyn/","title":"Generating synthetic data in a safe way with metasyn"},{"categories":null,"contents":"About the workshop The workshop will teach how to work efficiently with data from CBS (Statistics Netherlands), using its remote access environment. It is designed for people getting acces to the remote environment for the first time, or people who want to improve the efficiency and reproducibility of their workflows. Topics covered include project organization, principles for writing legible programs (in R, but people using other languages are encouraged to join as well; the principles apply to all languages), and to retrieve, store and configure data pipelines in a reproducible and understandable way.\nThere will be a 2 hour plenary session and a 1 hour consultation session, where specific questions will be adressed in small groups. Questions can be sent in advanced in the registration process.\nAdditional information When Friday, 19th April 2024, from 13.30h to 16.30h Where Utrecht University, Administration building, room “Van Lier \u0026amp; Eggink”. Registration You can register here, and consult additional info, here. It is free of charge for ODISSEI organization members. Instructors Erik-Jan van Kesteren, Assistant Professor at Utrecht University. Erik-Jan\u0026rsquo;s website Materials A link with all workshop materials can be found here. ","date":"April 19, 2024","image":"http://odissei-soda.nl/images/metasyn-tutorial/metasyn_hu815f2b6e5313f67d740aa04f6f4cb5c8_145073_650x0_resize_box_3.png","permalink":"/workshops/post-7/","title":"[UPCOMING] Efficient and reproducible research with CBS microdata"},{"categories":null,"contents":"Author: Flavio Hafner. Post photo from Glenn Carstens-Peters on Unsplash\nThis post is the first of a series of blogposts arising from a collaboration between the eScience Center and the ODISSEI Social Data Science Team. You can also find this text at the eScience Center page.\nResearch often relies on accessing novel data, for instance by collecting them from the internet through web scraping. If you have ever tried this, you may have run into your IP address being blocked by the website you scrape. Websites do this with a good reason — to protect themselves against malicious acts, such as denial-of-service attacks or large-scale scraping by parties with ill intent. This makes sense from the websites’ perspective, but prevents you from answering your research question.\nBut this problem can be solved. In this tutorial, we show how you as a researcher can use IP rotation to circumvent certain scraping protections with the sirup package, which works on Linux operating systems.\nBefore we jump into it, it is important to highlight that web scraping and IP rotation need to respect the law and should only be a last resort. For instance, before you scrape data from a website, you should ask the data owner whether they are willing to make them available to you through a data sharing agreement. If you nevertheless decide to scrape the data, you should get approval from the ethical review board at your university. Moreover, do only scrape data that are publicly available on the web and do not send excessive number of requests to the website in a given time.\nFor rotating the IP address, we will use a VPN service. Here you can read more about what a VPN service is — in short, the service has a bunch of remote servers, and connecting your computer to one of these servers changes your IP address.\nWhat you need 1. OpenVPN OpenVPN is a system that allows you to create secure VPN connections. You can install it by following these instructions.\n2. Root access to your computer Because internet connections are an important security concern, OpenVPN requires root access — this is the equivalent to administrator rights on a Windows computer. If you have root access, you can for instance run the following command on your terminal:\nsudo ls -lh # will ask you for your root password Installing and setting up sirup You can install sirup as follows:\npython -m pip install sirup To use the package and change your IP address, you need an account with a VPN service provider that offers OpenVPN configuration files for your account. At the time of writing, for instance ProtonVPN and Surfshark offer this option — note that these services are not for free. We will use ProtonVPN in this tutorial.\nAfter creating an account, you need to download two sets of files.\nFirst, you download credentials that identify your Proton account when using OpenVPN. On the ProtonVPN website, click on “Account” and then you see something like this:\nFigure 1. Credentials that identify your Proton account when using OpenVPN\rCopy and paste the username and the password into a .txt file that looks like this:\nusername password Then, save the file as “proton_credentials.txt”. Remember where it is stored — we will need it later.\nA first warning on security. Storing account credentials like this makes it easy for you to use the sirup package. But it also increases the risk that unauthorized persons get a hold on these credentials. Thus, be careful to store the credentials in a safe place on your laptop and do not share them with anyone.\nSecond, to use OpenVPN we need configuration files, whose names end with .ovpn. The files allow OpenVPN to connect to a server from the VPN service provider. In ProtonVPN, go to the \u0026ldquo;Download\u0026rdquo; section of your account. Select the options as follows:\nFigure 2. Options to download .ovpn configuration files\rAnd download the configuration file(s) you want to use. Store the downloaded files on your computer, and remember the location.\nNow you are ready!\nUsing sirup We start by defining the path to the proton_credentials.txt file. When you execute the code below, you will be asked to enter the root password, which is necessary to make the connection.\nimport getpass auth_file = \u0026#34;proton_credentials.txt\u0026#34; pwd = getpass.getpass(\u0026#34;Please enter your root password:\u0026#34;) A second warning on security. The code above stores your root password during the python session without encrypting it. This is OK to do on your laptop — if someone gets access to your python session, your security has already been compromised — but not recommended on a shared computer such as a cluster or a cloud service.\nChanging the IP address with sirup Now you can use the VPNConnector to change your IP address. We will use the \u0026quot;my_config_file.ovpn\u0026quot; configuration file.\nfrom sirup.VPNConnector import VPNConnector config_file = \u0026#34;my_config_file.ovpn\u0026#34; The code below first connects to the server associated with \u0026quot;my_config_file.ovpn\u0026quot; and then disconnects.\nconnector = VPNConnector(auth_file, config_file) # Let\u0026#39;s see the current IP address when no VPN tunnel is active print(connector.base_ip) connector.connect(pwd=pwd) # Now the IP address should differ print(connector.current_ip) connector.disconnect(pwd=pwd) # Now current_ip should be the same as base_ip above print(connector.current_ip) Rotating the IP address with sirup Instead of connecting to a single server, you can also rotate across many different servers — which means you rotate your IP address across a set of potential addresses. Doing so is useful for larger scraping jobs because it will spread your requests across more servers.\nTo do this, you need to download multiple configuration files as described above. Store all of the .ovpn configuration files together in a separate directory. Let\u0026rsquo;s say you store them in the \u0026quot;/path/to/config/files/\u0026quot; directory. You need to define this path in your python script:\nconfig_path = \u0026#34;/path/to/config/files/\u0026#34; The following code connects to two different servers before disconnecting again:\nfrom sirup.IPRotator import IPRotator rotator = IPRotator(auth_file=my_auth_file, config_location=config_path, seed=seed) # this will ask for the root password print(rotator.connector.base_ip) rotator.connect() print(rotator.connector.current_ip) rotator.rotate() print(rotator.connector.current_ip) rotator.disconnect() print(rotator.connector.current_ip) Conclusion This tutorial has walked you through the steps to manage your IP address in python, using the sirup package. We hope it makes your scraping workflows easier!\nsirup is an open-source package developed by the Netherlands eScience Center. If you use the tool, you can cite this zenodo repository with the DOI: https://doi.org/10.5281/zenodo.10261949.\nThe source code of the package is here, where you can contribute to it, build on it and submit issues.\nThanks to Patrick Bos, Peter Kalverla, Kody Moodley and Carlos Gonzalez Poses for comments.\n","date":"February 27, 2024","image":"http://odissei-soda.nl/images/tutorial-8/sirup_hu5459c0360c2b0cb7a147d2df0eb350ca_814836_650x0_resize_q100_box.jpg","permalink":"/tutorials/post-8/","title":"How to manage your IP address in python"},{"categories":null,"contents":"Due to exceptional circumstances, the workshop Cluster Computing for Social Scientists with R has been postponed. We will update this page as soon as a new date is determined.\nAbout the workshop In this course, you will learn the basics of supercomputing. The day starts with an introduction to supercomputer architecture, including a hands-on session focused on running jobs on a supercomputer.\nThe second half of the programme focuses on translating your R workflow from a GUI (Rstudio) workflow on your desktop to a scripting/batch environment on the supercomputer. Topics covered here include: efficient programming, parallel computing, and using the SLURM job manager to send your job/analysis to the supercomputer.\nIn this course you will:\nDo practical exercises to learn how to effectively use the Lisa national computing cluster and the national supercomputer, and how to complete your tasks with minimal effort in the shortest possible time. Experience how to achieve high performance with R by using SURF\u0026rsquo;s supercomputing facilities. Additional information When The new date of the workshop is to be defined. Where SURF Amsterdam, exact place to be defined. Registration We will post a link when registration opens again. Instructors Erik-Jan van Kesteren, Assistant Professor at Utrecht University. There will be another instructor from SURF, to be confirmed. Erik-Jan\u0026rsquo;s website Materials Course materials, including slides and code, are open and can be accessed here. ","date":"February 26, 2024","image":"http://odissei-soda.nl/images/workshops/Supercomputing_hubeda2984481e4d3f13fb836f8a1151c6_83157_650x0_resize_box_3.png","permalink":"/workshops/post-6/","title":"[POSTPONED] Supercomputing for social scientists with R"},{"categories":null,"contents":"By now, it\u0026rsquo;s no surprise to anybody the astonishing results large language models produce. Models such as GPT-4, Bard, Bert or RoBERTa have sparked intense research and media attention, as well as changed many people\u0026rsquo;s workflows. However, these models have issues. A common critique is that they function as black boxes: users do not know much about their training data or modelling choices. Besides, training them usually requires gigantic datasets and processing power. Therefore, there is value in alternative models that can be trained by researchers, having full control over the input data and internal process. In this tutorial, we explain how to train a natural language processing model using fastText: a lightweight, easy-to-implement and efficient word embedding model that has shown good performance in various natural language tasks over the years.\nFirst, a bit about word-embedding models. Word-embeddings models are one type of natural language processing models. By producing real number vector representations of words, they offer a powerful way to capture the semantic meaning of words in large datasets, which is why they are widely used in diverse research applications. Indeed, their uses are numerous: semantic similarity, text generation, document representation, author recognition, knowledge graph construction, sentiment analysis, or bias detection (Caliskan et al., 2017).\nInstallation To install Fasttext, we recommend checking the fasttext-wheel PyPI module. To verify the installation succeeded, you have to importat the package in a Python script.\n\u0026gt;\u0026gt;\u0026gt; import fasttext If there are no error messages, you have succeeded and we can move to the training part.\nTraining the model Training data To train fastText, you need a corpus: a large collection of text. The required size of these corpora varies depending on the research purpose: from several thousand to billions of words. Some research benefits from smaller, well-curated corpora; other research benefits from large unstructured corpora. However, while the exact size needed is hard to determine, do keep in mind that the text in the training data has to relate to your research question! If you want to use word embeddings for studying doctors\u0026rsquo; notes, you need doctors\u0026rsquo; notes - and not legal medical texts. If you want to study niche cultural sub-groups, you need data from these groups - and not necessarily a corpus of random Internet interactions. The corpus is an integral part of your research! Generally, the larger the research-related corpus you can get, the better.\nIn this tutorial we use a freely available corpus of Science-Fiction texts downloaded from Kaggle. Preferably, the text you feed to fastText should have each sentence on a new line.\nHyperparameters We will train an unsupervised fastText model, which means that lot of implementation decisions need to be made. If you don\u0026rsquo;t have specific methodological reasons and/or you lack the time or computing power for a proper grid search, we suggest you go with the default parameter options - which are optimized for many research contexts -, but switching the \u0026lsquo;dim\u0026rsquo; parameter to 300. Empirical research has shown that a dimensionality of 300 leads to optimal performance in most settings, even if that will increase computational resources and training time. If you can afford spending the time thinking about hyperparameters, you could tune the training model (CBOW or SkipGram), learning rate, dimensionality of the vector, context widow size, and more. You can see here the full list of tuning parameters available.\nFitting model We fit the model with the following command:\n\u0026gt;\u0026gt;\u0026gt; model = fasttext.train_unsupervised(\u0026#39;internet_archive_scifi_v3.txt\u0026#39;, dim = 300) Then, you can save the trained model, so that you do not have to train it again. For this, you need to feed the save_model() method a path to which to save the file. Make sure to add \u0026lsquo;.bin\u0026rsquo; to save the model as a .bin file.\n\u0026gt;\u0026gt;\u0026gt; model.save_model(\u0026#39;scifi_fasttext_model.bin\u0026#39;) Re-opening a saved model is done with the load_model() method:\n\u0026gt;\u0026gt;\u0026gt; model = fasttext.load_model(\u0026#39;scifi_fasttext_model.bin\u0026#39;) Using word embeddings Now we have trained the model, we have the word embeddings ready to be used. And, luckily, fastText comes with some nice functions to work with word embeddings! Here we highlight two of possible uses of word embeddings: obtaining most similar words, and analogies - but remember there are more possible uses. We start by simply retrieving the word embeddings. This can be done with any of the two following commands.\n\u0026gt;\u0026gt;\u0026gt; model.get_word_vector(\u0026#39;villain\u0026#39;) \u0026gt;\u0026gt;\u0026gt; model[\u0026#39;villain\u0026#39;] array([ 0.01417591, -0.06866349, 0.09390495, -0.04146367, 0.10481305, -0.2541916 , 0.26757774, -0.04365376, -0.02336818, 0.07684527, -0.05139925, 0.14692445, 0.07103274, 0.23373744, -0.28555775, .............................................................. -0.14082788, 0.27454248, 0.02602287, 0.03754443, 0.18067479, 0.20172128, 0.02454677, 0.04874028, -0.17860755, -0.01387627, 0.02247835, 0.05518318, 0.04844297, -0.2925061 , -0.05710272], dtype=float32) Since fastText does not only train an embedding for the full word, but also so for the ngrams in each word as well, subwords and their embeddings can be accessed as follows:\n\u0026gt;\u0026gt;\u0026gt; ngrams, hashes = model.get_subwords(\u0026#39;villain\u0026#39;) \u0026gt;\u0026gt;\u0026gt; \u0026gt;\u0026gt;\u0026gt; for ngram, hash in zip(ngrams, hashes): \u0026gt;\u0026gt;\u0026gt; print(ngram, model.get_input_vector(hash)) Note: using the get_subwords() method returns two lists, one with the ngrams of type string, the other with hashes. These hashes are not the same as embeddings, but rather are the identifier that fastText uses to store and retrieve embeddings. Therefore, to get the (sub-)word embedding using a hash, the get_input_vector() method has to be used.\nFurthermore, vectors can be created for full sentences as well:\n\u0026gt;\u0026gt;\u0026gt; model.get_sentence_vector(\u0026#39;the villain defeated the hero, tyrrany reigned throughout the galaxy for a thousand eons.\u0026#39;) array([-2.73631997e-02, 7.83981197e-03, -1.97590180e-02, -1.42770987e-02, 6.88663125e-03, -1.63909234e-02, 5.72902411e-02, 1.44126266e-02, -1.64726824e-02, 8.55281111e-03, -5.33024594e-02, 4.74718548e-02, ................................................................. 3.30820642e-02, 7.64035881e-02, 7.33195152e-03, 4.60342802e-02, 4.94049815e-03, 2.52075139e-02, -2.30138078e-02, -3.56832631e-02, -2.22732662e-03, -1.84207838e-02, 2.37668958e-03, -1.00214258e-02], dtype=float32) Most similar words A nice usecase of fastText is to retrieve similar words. For instance, you can retrieve the set of 10 words with the most similar meaning (i.e., most similar word vector) to a target word using a nearest neighbours algorithm based on the cosine distance.\n\u0026gt;\u0026gt;\u0026gt; model.get_nearest_neighbors(\u0026#39;villain\u0026#39;) [(0.9379335641860962, \u0026#39;villainy\u0026#39;), (0.9019550681114197, \u0026#39;villain,\u0026#39;), (0.890184223651886, \u0026#39;villain.\u0026#39;), (0.8709720969200134, \u0026#39;villains\u0026#39;), (0.8297745585441589, \u0026#39;villains.\u0026#39;), (0.8225630521774292, \u0026#39;villainous\u0026#39;), (0.8214142918586731, \u0026#39;villains,\u0026#39;), (0.6485553979873657, \u0026#39;Villains\u0026#39;), (0.6020095944404602, \u0026#39;heroine\u0026#39;), (0.5941146612167358, \u0026#39;villa,\u0026#39;)] Interestingly, this also works for words not in the model corpus, including misspelled words!\n\u0026gt;\u0026gt;\u0026gt; model.get_nearest_neighbors(\u0026#39;vilain\u0026#39;) [(0.6722341179847717, \u0026#39;villain\u0026#39;), (0.619519829750061, \u0026#39;villain.\u0026#39;), (0.6137816309928894, \u0026#39;lain\u0026#39;), (0.6128077507019043, \u0026#39;villainous\u0026#39;), (0.609745979309082, \u0026#39;villainy\u0026#39;), (0.6089878678321838, \u0026#39;Glain\u0026#39;), (0.5980470180511475, \u0026#39;slain\u0026#39;), (0.5925296545028687, \u0026#39;villain,\u0026#39;), (0.5779100060462952, \u0026#39;villains\u0026#39;), (0.5764451622962952, \u0026#39;chaplain\u0026#39;)] Analogies Another nice use for fastText is creating analogies. Since the word embedding vectors are created in relation to every other word in the corpus, these relations should be preserved in the vector space so that analogies can be created. For analogies, a triplet of words is required according to the formula \u0026lsquo;A is to B as C is to [output]\u0026rsquo;. For example, if we take the formula \u0026lsquo;Men is to Father as [output] is to Mother\u0026rsquo;, we get the expected answer of Women.\n\u0026gt;\u0026gt;\u0026gt; model.get_analogies(\u0026#39;men\u0026#39;, \u0026#39;father\u0026#39;, \u0026#39;mother\u0026#39;) [(0.6985629200935364, \u0026#39;women\u0026#39;), (0.6015384793281555, \u0026#39;all\u0026#39;), (0.5977899432182312, \u0026#39;man\u0026#39;), (0.5835891366004944, \u0026#39;out\u0026#39;), (0.5830296874046326, \u0026#39;now\u0026#39;), (0.5767865180969238, \u0026#39;one\u0026#39;), (0.5711579322814941, \u0026#39;in\u0026#39;), (0.5671708583831787, \u0026#39;wingmen\u0026#39;), (0.567089855670929, \u0026#39;women\u0026#34;\u0026#39;), (0.5663136839866638, \u0026#39;were\u0026#39;)] However, since the model that we have created was done using uncleaned data from a relatively small corpus, our output is not perfect. For example, with the following analogy triplets, the correct answer of bad comes fourth, after villainy, villain. and villain, showing that for a better model, we should do some additional cleaning of our data (e.g., removing punctuation).\n\u0026gt;\u0026gt;\u0026gt; model.get_analogies(\u0026#39;good\u0026#39;, \u0026#39;hero\u0026#39;, \u0026#39;villain\u0026#39;) [(0.5228292942047119, \u0026#39;villainy\u0026#39;), (0.5205934047698975, \u0026#39;villain.\u0026#39;), (0.5122538208961487, \u0026#39;villain,\u0026#39;), (0.5047158598899841, \u0026#39;bad\u0026#39;), (0.483129620552063, \u0026#39;villains.\u0026#39;), (0.4676515460014343, \u0026#39;good\u0026#34;\u0026#39;), (0.4662466049194336, \u0026#39;vill\u0026#39;), (0.46115875244140625, \u0026#39;villains\u0026#39;), (0.4569159746170044, \u0026#34;good\u0026#39;\u0026#34;), (0.4529685974121094, \u0026#39;excellent.\u0026#34;\u0026#39;)] Conclusion In this blogpost we have shown how to train a lightweight, efficient natural language processing model using fastText. After installing it, we have shown how to use some of the fastText functions to train the model, retrieve word embeddings, and usem them for different questions. While this was a toy example, we hope you found it inspiring for your own research! And remember, if you have a research idea that entails using natural language models and are stuck or do not know how to start - you can contact us!\nBonus: Tips to improve your model performance Depending on your research, various tweaks can be made to your data to improve fastText performance. For example, if multi-word phrases (e.g., Social Data Science) play some key aspect in your analyses, you might want to change these word phrases in the data with a dash or underscore (e.g., Social_Data_Science) so that these phrases are trained as a single token, not as a sum of the tokens Social, Data, and Science.\nAs shown with the good-hero-villain analogy, removing punctuation and other types of non-alphabetic characters can help remove learning representations for unwanted tokens. For this, stemming (removing word stems) and lemmatization (converting all words to their base form) can also be useful. Similarly, two other ways to deal with unwanted tokens are to remove stop-words from your data, and to play around with the minCount parameter (i.e, the minimum number of times a word needs to occur in the data to have a token be trained) when training your model.\nMost importantly, try to gather as much knowledge about the domain of your research. This tip can seem obvious, but having a proper understanding of the topic you are researching is the most important skill to have when it comes to language models. Let\u0026rsquo;s take the Sci-Fi corpus we used as an example: the 10th nearest neigbor of the word villain was villa. If you don\u0026rsquo;t really understand what either of those words mean, you would not know that these results seem fishy (since the model we created has low internal quality, it relies very much on the trained n-grams. Since both words contain the n-gram \u0026lsquo;villa\u0026rsquo;, they are rated as being close in the vector space). Therefore, make sure to understand the domain to the best of your abilities and scrutinize your findings to get reliable results.\n","date":"January 22, 2024","image":"http://odissei-soda.nl/images/tutorial-6/logo-color_hu1abe885bd00d0c3db0943f497a717f5c_29206_650x0_resize_box_3.png","permalink":"/tutorials/post-6/","title":"Training a fastText model from scratch using Python"},{"categories":null,"contents":"In this tutorial we present Geoflow, a newly created tool designed to visualize international flows in an interactive way. The tool is free and open-source, and can be accessed here. It is designed to visualize any international flows like, for instance, cash or migration flows. Since it\u0026rsquo;s easier to understand its capabilities by using them, we\u0026rsquo;ll start showing a couple of examples of what Geoflow can do. After that, we briefly explain how to upload your own dataset and visualize it using the tool.\nWhat Geoflow can do For these examples, we use the included demo dataset showing investments in fossil companies across countries. Figure 1 shows the top 10 investments in fossil fuel companies from China. The visualization is straightforward: the arrows indicate in which countries these investments are located. By placing the cursor on top of Bermudas, its arrow gets highlighted, showing the flow strength (weight), as well as the inflow and outflow country. Figure 2 is a barplot that shows to which countries most investments go to: in this case, it is mainly Singapore, followed by the Netherlands.\nFigure 1. Map of top 10 investments in fossil fuel companies from China\rFigure 2. Barplot of 10 investments in fossil fuel companies from China\rIn general, in the tool we can select the source and target countries for which we want to see the flows. There is also an option to select source or target for a country, which is useful when we want to focus on one country: for example, selecting all flows into the Netherlands or from the Netherlands. Besides, we can select the number of flows to visualize in the upper part. Lastly, we can select whether we want to visualize the inflow or the outflow. This last option changes the colouring of the countries (colouring either the inflow or outflow countries), and it also changes the barplot visualization.\nFigure 3. Some configuration options for the visualization\rHow to use Geoflow for your visualizations It is very straightforward to use Geoflow for your own visualizations. You only need to upload a .csv dataset to the app with the following columns:\nSource: the source of the flow, written in ISO2 format. Target: the target of the flow, also in ISO2 format Weight: strength of the flow (e.g., the number of migrants, or the financial revenue) Additionally, you can add:\nYear: If year is present, a new visualization on the bottom right panel shows a time series for the flows. You can see it in Figure 4 below. Other columns: They will be interpreted as categorical variables. This allows you to split the flows into categories, as shown in Figure 5 It is a requirement that the data format is .csv and the name of the variables are source, target, weight and (if included) year, so note you might have to reformat your data to use the tool.\nFigure 4. How the time series plot look like, with Germany highlighted\rFigure 5. Map of China top 10 fossil fuel investments, showing only investments in Manufacturing\rConclusion In this tutorial we have shown you how to use Geoflow for your own visualizations. We have shown what the Geoflow capabilities are, and how to upload your data to use it. We hope you\u0026rsquo;ve find it inspiring!\nGeoflow is open-source and has been developed by Peter Kok, Javier García Bernardo and mbabic332. If you use the tool, you can cite this Zenodo repo, with a DOI. If you wish to expand on Geoflow, you can check the source code here, and contribute or build on it. The tool is written using JavaScript.\n","date":"December 11, 2023","image":"http://odissei-soda.nl/images/tutorial-7/geoflow-miniature_hu6dbb4503ac6d6ce6a020e99dbb85449c_282734_650x0_resize_box_3.png","permalink":"/tutorials/post-7/","title":"Visualizing international flows with Geoflow visualizer"},{"categories":null,"contents":"In October 2023, we hosted a workshop about data visualization.\nAbout the workshop A key aspect of data science is turning data into a story that anyone can understand at a glance. In this Data Visualization Bootcamp, you will learn how to represent data in visual formats like pictures, charts and graphs.\nIn this workshop you will:\nlearn the most important principles of data visualization,\nlearn how to use data visualization libraries in Python (with Bokeh and Pyodide),\ndevelop your own Panel/hvPlot/Bokeh dashboard to interactively visualize data.\nPlenary instruction is combined with hands-on practice with your own datasets in small groups. The workshop will cover how interactive visualizations and dashboarding in Python/Bokeh differs from RShiny. You will learn how to run Bokeh Apps in the browser via Pyodide (no server required).\nBy the end of the workshop, you will be able to create powerful storytelling visuals with your own research data.\nAdditional information When Friday, 20 October 2023. It was also taught in 2021 and 2022. Where Data Science Center, University of Amsterdam. Registration Registration is no longer possible. Instructors Javier Garcia-Bernardo, Assistant Professor at Utrecht University. Javier\u0026rsquo;s website. Materials Course materials, including slides and code, are open and can be accessed here. ","date":"October 20, 2023","image":"http://odissei-soda.nl/images/workshops/data-visualization_hu3d03a01dcc18bc5be0e67db3d8d209a6_1348270_650x0_resize_q100_box.jpg","permalink":"/workshops/post-3/","title":"Data Visualization Bootcamp"},{"categories":null,"contents":"One common issue we encounter in helping researchers work with the housing register data of Statistics Netherlands is its transactional nature: each row in the housing register table contains data on when someone registered and deregistered at an address (more info in Dutch here).\nIn this post, we show how to use this transactional data to perform one of the most common transformations we see: what part of a certain time interval (e.g, the entire year 2021 or January 1999) did the people I’m interested in live in the Netherlands? To solve this issue, we will use time interval objects, as implemented in the package {lubridate} which is part of the {tidyverse} since version 2.0.0.\nlibrary(tidyverse) The data Obviously, we cannot share actual Statistics Netherlands microdata here, so we first generate some tables that capture the gist of the data structure. First, let’s generate some basic person identifiers and some info about each person:\nCode (person_df \u0026lt;- tibble( person_id = factor(c(\u0026#34;A10232\u0026#34;, \u0026#34;A39211\u0026#34;, \u0026#34;A28183\u0026#34;, \u0026#34;A10124\u0026#34;)), firstname = c(\u0026#34;Aron\u0026#34;, \u0026#34;Beth\u0026#34;, \u0026#34;Carol\u0026#34;, \u0026#34;Dave\u0026#34;), income_avg = c(14001, 45304, 110123, 43078) )) # A tibble: 4 × 3 person_id firstname income_avg \u0026lt;fct\u0026gt; \u0026lt;chr\u0026gt; \u0026lt;dbl\u0026gt; 1 A10232 Aron 14001 2 A39211 Beth 45304 3 A28183 Carol 110123 4 A10124 Dave 43078 Then, we create a small example of housing transaction register data. In this data, for any period where a person is not registered to a house, they are assumed to live abroad (because everyone in the Netherlands is required to be registered at an address).\nCode (house_df \u0026lt;- tibble( person_id = factor(c(\u0026#34;A10232\u0026#34;, \u0026#34;A10232\u0026#34;, \u0026#34;A10232\u0026#34;, \u0026#34;A39211\u0026#34;, \u0026#34;A39211\u0026#34;, \u0026#34;A28183\u0026#34;, \u0026#34;A28183\u0026#34;, \u0026#34;A10124\u0026#34;)), house_id = factor(c(\u0026#34;H1200E\u0026#34;, \u0026#34;H1243D\u0026#34;, \u0026#34;H3432B\u0026#34;, \u0026#34;HA7382\u0026#34;, \u0026#34;H53621\u0026#34;, \u0026#34;HC39EF\u0026#34;, \u0026#34;HA3A01\u0026#34;, \u0026#34;H222BA\u0026#34;)), start_date = ymd(c(\u0026#34;20200101\u0026#34;, \u0026#34;20200112\u0026#34;, \u0026#34;20211120\u0026#34;, \u0026#34;19800101\u0026#34;, \u0026#34;19900101\u0026#34;, \u0026#34;20170303\u0026#34;, \u0026#34;20190202\u0026#34;, \u0026#34;19931023\u0026#34;)), end_date = ymd(c(\u0026#34;20200112\u0026#34;, \u0026#34;20211120\u0026#34;, \u0026#34;20230720\u0026#34;, \u0026#34;19891231\u0026#34;, \u0026#34;20170102\u0026#34;, \u0026#34;20180720\u0026#34;, \u0026#34;20230720\u0026#34;, \u0026#34;20230720\u0026#34;)) )) # A tibble: 8 × 4 person_id house_id start_date end_date \u0026lt;fct\u0026gt; \u0026lt;fct\u0026gt; \u0026lt;date\u0026gt; \u0026lt;date\u0026gt; 1 A10232 H1200E 2020-01-01 2020-01-12 2 A10232 H1243D 2020-01-12 2021-11-20 3 A10232 H3432B 2021-11-20 2023-07-20 4 A39211 HA7382 1980-01-01 1989-12-31 5 A39211 H53621 1990-01-01 2017-01-02 6 A28183 HC39EF 2017-03-03 2018-07-20 7 A28183 HA3A01 2019-02-02 2023-07-20 8 A10124 H222BA 1993-10-23 2023-07-20 Interval objects! Notice how each transaction in the housing data has a start and end date, indicating when someone registered and deregistered at an address. A natural representation of this information is as a single object: a time interval. The package {lubridate} has support for specific interval objects, and several operations on intervals:\ncomputing the length of an interval with int_length() computing whether two intervals overlap with int_overlap() and much more\u0026hellip; as you can see here So let’s transform these start and end columns into a single interval column!\nhouse_df \u0026lt;- house_df |\u0026gt; mutate( # create the interval int = interval(start_date, end_date), # drop the start/end columns .keep = \u0026#34;unused\u0026#34; ) house_df # A tibble: 8 × 3 person_id house_id int \u0026lt;fct\u0026gt; \u0026lt;fct\u0026gt; \u0026lt;Interval\u0026gt; 1 A10232 H1200E 2020-01-01 UTC--2020-01-12 UTC 2 A10232 H1243D 2020-01-12 UTC--2021-11-20 UTC 3 A10232 H3432B 2021-11-20 UTC--2023-07-20 UTC 4 A39211 HA7382 1980-01-01 UTC--1989-12-31 UTC 5 A39211 H53621 1990-01-01 UTC--2017-01-02 UTC 6 A28183 HC39EF 2017-03-03 UTC--2018-07-20 UTC 7 A28183 HA3A01 2019-02-02 UTC--2023-07-20 UTC 8 A10124 H222BA 1993-10-23 UTC--2023-07-20 UTC We will want to compare this interval with a reference interval to compute the proportion of time that a person lived in the Netherlands within the reference interval. Therefore, we quickly define a new interval operation which truncates an interval to a reference interval. Don’t worry too much about it for now, we will use it later. Do notice that we’re always using the int_*() functions defined by {lubridate} to interact with the interval objects.\n# utility function to truncate an interval object to limits (also vectorized so it works in mutate()) int_truncate \u0026lt;- function(int, int_limits) { int_start(int) \u0026lt;- pmax(int_start(int), int_start(int_limits)) int_end(int) \u0026lt;- pmin(int_end(int), int_end(int_limits)) return(int) } Computing the proportion in the Netherlands The next step is to define a function that computes for each person a proportion overlap for a reference interval. By creating a function, it will be easy later to do the same operation for different intervals (e.g., different reference years) to work with the rich nature of the Statistics Netherlands microdata. To compute this table, we make extensive use of the {tidyverse}, with verbs like filter(), mutate(), and summarize(). If you want to know more about these, take a look at the {dplyr} documentation (but of course you can also use your own flavour of data processing, such as {data.table} or base R).\n# function to compute overlap proportion per person proportion_tab \u0026lt;- function(housing_data, reference_interval) { # start with the housing data housing_data |\u0026gt; # only retain overlapping rows, this makes the following # operations more efficient by only computing what we need filter(int_overlaps(int, reference_interval)) |\u0026gt; # then, actually compute the overlap of the intervals mutate( # use our earlier truncate function int_tr = int_truncate(int, reference_interval), # then, it\u0026#39;s simple to compute the overlap proportion prop = int_length(int_tr) / int_length(reference_interval) ) |\u0026gt; # combine different intervals per person summarize(prop_in_nl = sum(prop), .by = person_id) } Now we’ve defined this function, let’s try it out for a specific year such as 2017!\nint_2017 \u0026lt;- interval(ymd(\u0026#34;20170101\u0026#34;), ymd(\u0026#34;20171231\u0026#34;)) prop_2017 \u0026lt;- proportion_tab(house_df, int_2017) prop_2017 # A tibble: 3 × 2 person_id prop_in_nl \u0026lt;fct\u0026gt; \u0026lt;dbl\u0026gt; 1 A39211 0.00275 2 A28183 0.832 3 A10124 1 Now we’ve computed this proportion, notice that we only have three people. This means that the other person was living abroad in that time, with a proportion in the Netherlands of 0. To nicely display this information, we can join the proportion table with the original person dataset and replace the NA values in the proportion column with 0.\nleft_join(person_df, prop_2017, by = \u0026#34;person_id\u0026#34;) |\u0026gt; mutate(prop_in_nl = replace_na(prop_in_nl, 0)) # A tibble: 4 × 4 person_id firstname income_avg prop_in_nl \u0026lt;fct\u0026gt; \u0026lt;chr\u0026gt; \u0026lt;dbl\u0026gt; \u0026lt;dbl\u0026gt; 1 A10232 Aron 14001 0 2 A39211 Beth 45304 0.00275 3 A28183 Carol 110123 0.832 4 A10124 Dave 43078 1 Success! We now have a dataset for each person with the proportion of time they lived in the Netherlands in 2017. If you look at the original housing dataset, you may see the following patterns reflected in the proportion:\nAron indeed did not live in the Netherlands at this time. Beth moved away on January 2nd, 2017. Carol moved into the Netherlands on March 3rd, 2017 and remained there until 2018 Dave lived in the Netherlands this entire time. Conclusion In this post, we used interval objects and operations from the {lubridate} package to wrangle transactional housing data into a proportion of time spent living in the Netherlands. The advantage of using this package and its functions is that any particularities with timezones, date comparison, and leap years are automatically dealt with so that we could focus on the end result rather than the details.\nIf you are doing similar work and you have a different method, let us know! In addition, if you have further questions about working with Statistics Netherlands microdata or other complex or large social science datasets, do not hesitate to contact us on our website: https://odissei-soda.nl.\nBonus appendix: multiple time intervals Because we created a function that takes in the transaction data and a reference interval, we can do the same thing for multiple time intervals (e.g., years) and combine the data together in one wide or long dataset. This is one way to do this:\nlibrary(glue) # for easy string manipulation # initialize an empty dataframe with all our columns nl_prop \u0026lt;- tibble(person_id = factor(), prop_in_nl = double(), yr = integer()) # then loop over the years of interest for (yr in 2017L:2022L) { # construct reference interval for this year ref_int \u0026lt;- interval(ymd(glue(\u0026#34;{yr}0101\u0026#34;)), ymd(glue(\u0026#34;{yr}1231\u0026#34;))) # compute the proportion table for this year nl_prop_yr \u0026lt;- proportion_tab(house_df, ref_int) |\u0026gt; mutate(yr = yr) # append this year to the dataframe nl_prop \u0026lt;- bind_rows(nl_prop, nl_prop_yr) } # we can pivot it to a wide format nl_prop_wide \u0026lt;- nl_prop |\u0026gt; pivot_wider( names_from = yr, names_prefix = \u0026#34;nl_prop_\u0026#34;, values_from = prop_in_nl ) # and join it with the original person data, replacing NAs with 0 again person_df |\u0026gt; left_join(nl_prop_wide, by = \u0026#34;person_id\u0026#34;) |\u0026gt; mutate(across(starts_with(\u0026#34;nl_prop_\u0026#34;), \\(p) replace_na(p, 0))) # A tibble: 4 × 9 person_id firstname income_avg nl_prop_2017 nl_prop_2018 nl_prop_2019 \u0026lt;fct\u0026gt; \u0026lt;chr\u0026gt; \u0026lt;dbl\u0026gt; \u0026lt;dbl\u0026gt; \u0026lt;dbl\u0026gt; \u0026lt;dbl\u0026gt; 1 A10232 Aron 14001 0 0 0 2 A39211 Beth 45304 0.00275 0 0 3 A28183 Carol 110123 0.832 0.549 0.912 4 A10124 Dave 43078 1 1 1 # ℹ 3 more variables: nl_prop_2020 \u0026lt;dbl\u0026gt;, nl_prop_2021 \u0026lt;dbl\u0026gt;, # nl_prop_2022 \u0026lt;dbl\u0026gt; ","date":"September 29, 2023","image":"http://odissei-soda.nl/images/tutorial-5/lubridate_1_hu9ab8adf199cf1b31e00f5b6813db3886_430902_650x0_resize_box_3.png","permalink":"/tutorials/post-5/","title":"Wrangling interval data using lubridate"},{"categories":null,"contents":"These days, our online presence leaves traces of our behavior everywhere. There is data of what we do and say in platforms such as WhatsApp, Instagram, online stores, and many others. Of course, this so-called ‘digital trace data’ is of interest for social scientists: new, rich, enormous datasets that can be used to describe and understand our social world. However, this data is commonly owned by private companies. How can social scientists access and make sense of this data?\nIn this tutorial, we use data donation and the Port software to get access to WhatsApp group-chat data in a way that completely preserves privacy of research participants. Our goal is to show a small peek of what can be achieved with these methods. If you have an idea for your own research that entails collecting digital trace data, don’t hesitate to contact us! We can help you think about data acquisition, analysis and more.\nWith data donation, it is possible to collect data about any online platform: under the General Data Protection Regulation (EU law), companies are required to provide their data to any citizen that requests it. This data is available in so-called Data Download Packages (DDP’s), which are rather cumbersome to work with and contain personal information. Therefore, the Port software processes these DDP’s so that the data is in a format ready for analysis, while completely guaranteeing privacy of the respondents. The only thing research participants have to do is request their DDP’s, see which information they are sharing and consent to sharing it.\nSince we do not dive in with a lot of detail, we refer to Port\u0026rsquo;s github for more details on how to get started with your own project. There you can find a full guide to install and use Port, examples of past studies done with it, a tutorial for creating your own data donation workflow, and more. You can also read more about data donation in general here and here.\nAn application with WhatsApp data In this example, we extract some basic information from WhatsApp group chats, such as how many messages links, locations, and pictures were shared, as well as which person in the group the participant responded most to.\nNote that this is the only information we want to collect from the participants of the study, not the whole group chat file!\nThe first step in creating a DDP processing script is to obtain an example DDP and examine it. This example DDP can be, for example, your own DDP requested from WhatsApp. Usually, platforms provide a (compressed) folder with many different files; i.e., data in a format that is not ready to use. Once uncompressed, a WhatsApp group chat file could look like this:\n[16/03/2022, 15:10:17] Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more. [16/03/2022, 15:20:25] person1: Hi shiva! [16/03/2022, 15:25:38] person2: Hi 👋 [16/03/2022, 15:26:48] person3: Hoi! [16/03/2022, 18:39:29] person2: https://youtu.be/KBmUTY6mK_E [16/03/2022, 18:35:51] person1: ‎Location: https://maps.google.com/?q=52.089451,5.108469 [20/03/2022, 20:08:51] person4: I’m about to generate some very random messages so that I can make some screenshots for the explanation to participants [24/03/2022, 20:19:38] person1: @user3 if you remove your Profile picture for a moment I will redo the screenshots 😁 [26/03/2022, 18:52:15] person2: Well done Utrecht 😁 [14/07/2020, 22:05:54] person4: 👍Bedankt As part of a collaboration with data donation researchers using Port, we wrote a Python script1 to convert this into the information we need. The main script is available here; in short, it does the following:\nseparate the header and the message itself parse the date and time information in each message remove unneeded information such as alert notifications anonymize usernames convert the extracted information to a nice data frame format to show the participant for consent One big problem we had to overcome is that messages and alert notifications cannot be identified in the same way (i.e., using the same regular expression) on every device. Through trial-and-error, we tailored the steps to work with every operating system, language, and device required for this study. Indeed, if you design a study like this, it is very important to try out your script on many different DDPs from different people and devices. That way you will make sure you have covered possible variation in DPPs before actually starting data collection. This is a process that can take quite a while, so keep this in mind when you want to run a data donation study!\nThe end result In Figure 1 you can see a (fictitious) snippet of the dataset obtained. This is how a dataset in which you combine donations from different users would look like. As can be seen, we have moved from a rather untidy text file to a tidy, directly analysable dataset, where each row corresponds to an user in a given data donation package, and the rest of the columns give information about that user. Particularly, the dataset displays the following information: data donation package id (ddp_id), an anonymized user name (user_name), number of words sent on the groupchat by the user (nwords), date of first and last messages sent on the groupchat by the user (date_first_mess, date_last_mess), number of urls, files and locations sent on the groupchat by the user (respectively, nurls, nfiles, nlocations), and the (other) user that has replied more to that user (replies_from), as well as the user that that user has replied to the most (replies_to).\nTable 1. Snippet of fictitious dataset\nddp_id user_name nwords date_first_mess date_last_mess nurls nfiles nlocations replies_from replies_to 1 User1_1 121 10/08/2023 27/08/2023 0 15 0 User1_2 User1_4 1 User1_2 17 11/08/2023 28/08/2023 3 1 2 User1_1 User1_1 1 User1_3 44 10/08/2023 28/08/2023 9 6 3 User1_2 User1_1 1 User1_4 50 12/08/2023 29/08/2023 0 3 1 User1_3 User1_1 2 User2_1 123 01/05/2022 01/11/2022 2 0 1 User2_2 User2_2 2 User2_2 250 01/05/2022 02/11/2022 0 32 3 User2_3 User2_1 2 User2_3 176 08/07/2022 04/12/2022 6 0 5 User2_2 User2_3 3 User3_1 12 05/06/2023 26/07/2023 12 2 0 User3_1 User3_2 3 User3_2 16 06/06/2023 26/07/2023 17 2 0 User3_2 User3_1 In Figure 2 you can see a screenshot of how the Port software would display the data to be shared (number of words or messages, date stamps…) and ask for consent to the research subjects. As you see, the Port software guarantees that research subjects are aware of what information they are sharing and consent to it. The rest of the DDPs, including sensitive data, is analyzed locally and does not leave the respondents\u0026rsquo; devices.\nFigure 2. How the Port software displays the data to be shared and asks for consent\rConclusion The aim of this post was to illustrate how to use data donation with the software Port to extract online platform data. We illustrated all of this with the extraction of group-chat information from WhatsApp data. The main challenge of this project was to write a robust script that transforms this data into a nice, readily usable format while maintaining privacy. If you want to implement something similar but do not know how or where to start, let us know and we can help!\nThis script uses a deprecated version of Port, but large part of the script can be reused;\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"September 8, 2023","image":"http://odissei-soda.nl/images/tutorial-4/whatsapp_header_hu3d03a01dcc18bc5be0e67db3d8d209a6_1708177_650x0_resize_q100_box.jpg","permalink":"/tutorials/post-4/","title":"Collecting online platforms data for science: an example using WhatsApp"},{"categories":null,"contents":"In June 2023, we hosted a workshop about Network Science.\nAbout the workshop How can networks at Statistics Netherlands (CBS) help us understand and predict social systems? In this workshop, we provide participants with the conceptual and practical skills necessary to use network science tools to answer social, economic and biological questions.\nThis workshop introduces concepts and tools in network science. The objective of the course is that participants acquire hands-on knowledge on how to analyze CBS network data. Participants will be able to understand when a network approach is useful, work with networks efficiently, and create network variables.\nThe course has a hands-on focus, with lectures accompanied by programming practicals (in Python) to apply the knowledge on real networks.\nAdditional information When Thursday June 22, 202. (It was also taught it in 2022, together with Eszter Boyani). Where Summer Institute in Computational Social Science, Erasmus University Rotterdam. Registration Registration is no longer possible. Instructors Javier Garcia-Bernardo, Assistant Professor at Utrecht University. Javier\u0026rsquo;s website. Materials Course materials, including slides and code, are open and can be accessed here. ","date":"June 22, 2023","image":"http://odissei-soda.nl/images/workshops/network-science_hu3d03a01dcc18bc5be0e67db3d8d209a6_668913_650x0_resize_q100_box.jpg","permalink":"/workshops/post-2/","title":"Network science"},{"categories":null,"contents":"In May 2023, we hosted a workshop in Causal Impact Assesment focusing on policy interventions.\nAbout the workshop How do we assess whether a school policy intervention has had the desired effect on student performance? How do we estimate the impact a natural disaster has had on the inhabitants of affected regions? How can we determine whether a change in the maximum speed on highways has led to fewer accidents? These types of questions are at the core of many social scientific research problems. While questions with this structure are seemingly simple, their causal effects are notoriously hard to estimate, because often the researchers cannot perform a randomized controlled experiment.\nThe workshop offers hands-on training on several basic and advanced methods (e.g., difference-in-difference, interrupted time series and synthetic control) that can be applied when assessing causal impact. There is a focus on both the assumptions underlying the methods, and how to put them into practice.\nAdditional information When May, 2023. It is likely to be held again in 2024. Where Utrecht University. Registration Registration is no longer possible. Instructors Erik-Jan van Kesteren, Assistant Professor at Utrecht University (Erik-Jan\u0026rsquo;s website) \u0026amp; Oisín Ryan Assistant Professor at UMC (Oisín\u0026rsquo;s website). Materials Course materials, including slides and code, are open and can be accessed here. ","date":"May 26, 2023","image":"http://odissei-soda.nl/images/workshops/causal-inference_hu6a86fe0f271ec969b45a77f81a48f6ab_152168_650x0_resize_box_3.png","permalink":"/workshops/post-1/","title":"Causal Impact Assesment"},{"categories":null,"contents":"ArtScraper is a Python library to download images and metadata for artworks available on WikiArt and Google Arts \u0026amp; Culture.\nInstallation pip install https://github.com/sodascience/artscraper.git Downloading images from WikiArt To download data from WikiArt it is necessary to obtain free API keys.\nOnce you have the API keys, you can simply run the code below to download the images and metadata of the three artworks of Aleksandra Ekster.\n# artworks to scrape some_links = [ \u0026#34;https://www.wikiart.org/en/aleksandra-ekster/women-s-costume-1918\u0026#34;, \u0026#34;https://www.wikiart.org/en/aleksandra-ekster/still-life-1913\u0026#34;, \u0026#34;https://www.wikiart.org/en/aleksandra-ekster/view-of-paris-1912\u0026#34; ] # download images and metadata to the folder \u0026#34;data\u0026#34; with WikiArtScraper(output_dir=\u0026#34;data\u0026#34;) as scraper: for url in some_links: scraper.load_link(url) scraper.save_metadata() scraper.save_image() Downloading images from Google Art \u0026amp; Culture To download data from Google Art \u0026amp; Culture you need to download Firefox and geckodriver. The installation instructions can be found in our GitHub repository.\nOnce you have Firefox and geckodriver, you can simply run the code below to download artworks. You are not allowed to share or publish the images. Use them only for research.\n# artworks to scrape some_links = [ \u0026#34;https://artsandculture.google.com/asset/helena-hunter-fairytales/dwFMypq0ZSiq6w\u0026#34;, \u0026#34;https://artsandculture.google.com/asset/erina-takahashi-and-isaac-hernandez-in-fantastic-beings-laurent-liotardo/MQEhgoWpWJUd_w\u0026#34;, \u0026#34;https://artsandculture.google.com/asset/rinaldo-roberto-masotti/swG7r2rgfvPOFQ\u0026#34; ] # If you are on Windows, you can download geckodriver, place it in your directory, # and use the argument geckodriver_path=\u0026#34;geckodriver.exe\u0026#34; with GoogleArtScraper(\u0026#34;data\u0026#34;) as scraper: for url in some_links: scraper.load_link(url) scraper.save_metadata() scraper.save_image() You can find more examples here\nDo you want to know more about this library? Check our GitHub repository\nAre you using it for academic work? Please cite our package:\nSchram, Raoul, Garcia-Bernardo, Javier, van Kesteren, Erik-Jan, de Bruin, Jonathan, \u0026amp; Stamkou, Eftychia. (2022). ArtScraper: A Python library to scrape online artworks (0.1.1). Zenodo. https://doi.org/10.5281/zenodo.7129975 ","date":"October 4, 2022","image":"http://odissei-soda.nl/images/tutorial-2/nantenbo_header_hu48d98726654ff846597d2fe25a58192f_52421_650x0_resize_q100_box.jpg","permalink":"/tutorials/post-2/","title":"ArtScraper: A Python library to scrape online artworks"},{"categories":null,"contents":"With the increasing popularity of open science practices, it is now more and more common to openly share code along with more traditional scientific objects such as papers. But what are the best ways to create an understandable, openly accessible, findable, citable, and stable archive of your code? In this post, we look at what you need to do to prepare your code folder and then how to upload it to Zenodo.\nPrepare your code folder To make code available, you will be uploading it to the internet as a single folder. The code you will upload will be openly accessible, and it will stay that way indefinitely. Therefore, it is necessary that you prepare your code folder (also called a “repository”) for publication. This requires time and effort, and for every project the requirements are different. Think about the following checklist:\nMust-haves Make a logical, understandable folder structure. For example, for a research project with data processing, visualization, and analysis I like the following structure: my_project/\u0026lt;br/\u0026gt; ├─ raw_data/\u0026lt;br/\u0026gt; │ ├─ questionnaire_data.csv\u0026lt;br/\u0026gt; ├─ processed_data/\u0026lt;br/\u0026gt; │ ├─ questionnaire_processed.rds\u0026lt;br/\u0026gt; │ ├─ analysis_object.rds\u0026lt;br/\u0026gt; ├─ img/\u0026lt;br/\u0026gt; │ ├─ plot.png\u0026lt;br/\u0026gt; ├─ 01_load_and_process_data.R\u0026lt;br/\u0026gt; ├─ 02_create_visualisations.R\u0026lt;br/\u0026gt; ├─ 03_main_analysis.R\u0026lt;br/\u0026gt; ├─ 04_output_results.R\u0026lt;br/\u0026gt; ├─ my_project.Rproj\u0026lt;br/\u0026gt; ├─ readme.md Make sure no privacy-sensitive information is leaked. Remove non-shareable data objects (raw and processed!), passwords hardcoded in your scripts, comments containing private information, and so on. Create a legible readme file in the folder that describes what the code does, where to find which parts of the code, and what needs to be done to run the code. You can choose how elaborate to make this! It could be a simple text file, a word document, a pdf, or a markdown document with images describing the structure. It is best if someone who does not know the project can understand the entire folder based on the readme – this includes yourself in a few years from now! Strong recommendations Reformat the code so that it is portable and easily reproducible. This means that when someone else downloads the folder, they do not need to change the code to run it. For example this means that you do not read data with absolute paths (e.g., C:/my_name/Documents/PhD/projects/project_title/raw_data/questionnaire_data.csv) on your computer, but only to relative paths on the project (e.g., raw_data/questionnaire_data.csv). For example, if you use the R programming language it is good practice to use an RStudio project. Format your code so that it is legible by others. Write informative comments, split up your scripts in logical chunks, and use a consistent style (for R I like the tidyverse style) Nice to have Record the software packages that you used to run the projects, including their versions. If a package gets updated, your code may no longer run! Your package manager may already do this, e.g., for python you can use pip freeze \u0026gt; requirements.txt. In R, you can use the renv package for this. If you have privacy-sensitive data, it may still be possible to create a synthetic or fake version of this data for others to run the code on. This ensures maximum reproducibility. Compressing the code folder The last step before uploading the code repository to Zenodo is to compress the folder. This can be done in Windows 11 by right-clicking the folder and pressing “compress to zip file”. It’s a good idea to go into the compressed folder afterwards, and checking if everything is there and also removing any unnecessary files (such as .Rhistory files for R).\nFigure 1: Zipping the code folder.\rAfter compressing, your code repository is now ready to be uploaded!\nUploading to Zenodo Zenodo is a website where you can upload any kind of research object: papers, code, datasets, questionnaires, presentations, and much more. After uploading, Zenodo will create a page containing your research object and metadata about the object, such as publication date, author, and keywords. In the figure below you can see an example of a code repository uploaded to Zenodo.\nFigure 2: A code repository uploaded to the Zenodo website. See https://zenodo.org/record/6504837\rOne of the key features of Zenodo is that you can get a Digital Object Identifier (DOI) for the objects you upload, making your research objects persistent and easy to find and cite. For example, in APA style I could cite the code as follows:\nvan Kesteren, Erik-Jan. (2022). My project (v1.2). Zenodo. https://doi.org/10.5281/zenodo.6504837\nZenodo itself is fully open source, hosted by CERN, and funded by the European Commission. These are exactly the kinds of conditions which make it likely to last for a long time! Hence, it is an excellent choice for uploading our code. So let’s get started!\nCreate an account To upload anything to Zenodo, you need an account. If you already have an ORCID or a GitHub account, then you can link these immediately to your Zenodo login. I do recommend doing so as it will make it easy to link these services and use them together.\nFigure 3: Zenodo sign-up page. See https://zenodo.org/signup/\rStart a new upload When you click the “upload” button, you will get a page where you can upload your files, determine the type of the upload, and create metadata for the research object. Now zip your prepared code folder and drag it to the upload window!\nFigure 4: Uploading a zipped folder to the Zenodo website.\rFill out the metadata One of the first options you need to specify is the “upload type”. For code repositories, you can choose the “software” option. The remaining metadata is relatively simple to fill out (such as author and institution). However, one category to pay attention to is the license: by default the CC-BY-4.0 license is selected. For a short overview of what this means, see the creative commons website: https://creativecommons.org/licenses/by/4.0/. You can opt for a different license by including a file called LICENSE in your repository.\nFigure 5: Selecting the \u0026lsquo;software\u0026rsquo; option for upload type.\rPublish! The last step is to click “publish”. Your research code is now findable, citable, understandable, reproducible, and archived until the end of times! You can now show it to all your colleagues and easily cite it in your manuscript. If you get feedback and you want to change your code, you can also upload a new version of the same project on the Zenodo website.\nConclusion In this post, I described a checklist for preparing your code folder for publication with a focus on understandability, and I have described one way in which you can upload your prepared code repository to an open access archive. Zenodo is an easy, dependable and well-built option, but of course there are many alternatives, such as hosting it on your own website, using the Open Science Framework, GitHub, or using a publisher’s website; each has its own advantages and disadvantages.\n","date":"September 5, 2022","image":"http://odissei-soda.nl/images/tutorial-1/tutorial1_header_hu650f89d19acf6379f59d4eaf3a39c00b_29682_650x0_resize_box_3.png","permalink":"/tutorials/post-1/","title":"How to share your research code"},{"categories":null,"contents":"In May 2022, we hosted a workshop about efficient programming for accessing CBS microdata.\nAbout the workshop What to do when your CBS microdata analysis takes too many computational resources to run on the remote access environment? In this workshop we covered solutions to this problem. It will be an accessible introduction to a variety of ways in which you can programme more efficiently when using microdata in your research. Furthermore, it will discuss when you should and should not move your project to the ODISSEI Secure Supercomputer.\nThe introduction will include some live coding, exploring different options for project organisation, speeding up code, benchmarking, profiling, and reducing memory requirements. During his talk, Van Kesteren will also touch upon topics such as \u0026ldquo;embarassingly parallel\u0026rdquo;, scientific programming, data pipelines, open source, and open science. Although the presentation will center around data analysis with R, these principles also hold for other languages, such as Python or Julia.\nAdditional information When May 16th, 2022. Where Registration Registration is no longer possible. Instructors Erik-Jan van Kesteren, Assistant Professor at Utrecht University (Erik-Jan\u0026rsquo;s website). Materials Course materials, including slides and code, are open and can be accessed here. ","date":"May 16, 2022","image":"http://odissei-soda.nl/images/workshops/cbs_hub238c02f97a123a553dda5ed269ec1f4_33026_650x0_resize_q100_box.jpg","permalink":"/workshops/post-4/","title":"Efficient programming with CBS microdata"},{"categories":null,"contents":"In September 2022, we hosted a workshop about synthetic data.\nAbout the workshop Open data is one of the pillars of open science. However, there are often barriers in the way of making research data openly available, relating to consent, privacy, or organisational boundaries. In such cases, synthetic data is an excellent solution: the real data is kept secret, but a \u0026ldquo;fake\u0026rdquo; version of the data is available. The promise of the synthetic dataset is that others can then investigate the data structure, rerun scripts, use the data in educational materials, or even run a completely different analysis on their own.\nBut how do you generate synthetic data? In this session, we will introduce the field of synthetic data generation and apply several tools to generate synthetic versions of datasets, with various level of utility and privacy. We will be paying extra attention to practical issues such as missing values, data types, and disclosure control. Participants can either use a provided example dataset or they can bring their own data!\nAdditional information When September 2022. Where Open Science Festival. Registration Registration is no longer possible. Instructors Erik-Jan van Kesteren, Assistant Professor at Utrecht University (Erik-Jan\u0026rsquo;s website), Raoul Schram, Research Engineer at Utrecht University (Raoul\u0026rsquo;s website) \u0026amp; Thom Volker, PhD Candidate at Utrecht Universit (Thom\u0026rsquo;s website). Materials Course materials, including slides and code, are open and can be accessed here. ","date":"January 9, 2022","image":"http://odissei-soda.nl/images/workshops/syntheticdata_hu8a3495d7a8e26162d9e6ccba84eefed3_12080_650x0_resize_box_3.png","permalink":"/workshops/post-5/","title":"How to create synthetic data"},{"categories":null,"contents":"During your time as a fellow:\nyou will spend between 3-5 months full-time* working on a social science research project. you can propose your own project, based on your interests. you are a member of the SoDa team at the Methodology \u0026amp; Statistics department of Utrecht University. you will get a salary during this time, paid for by the team. one of the senior team members will be your mentor. To apply, you have to submit a short proposal for your project, together with a substantive supervisor. We are looking for projects in the social sciences for which a computational or data-related problem needs to be solved.\nThe next submission deadline is 31 May 2024\n* part-time possible, but the project should be your main priority.\n","date":"January 1, 1","image":"http://odissei-soda.nl/images/workshops/syntheticdata_hu8a3495d7a8e26162d9e6ccba84eefed3_12080_650x0_resize_box_3.png","permalink":"/fellowship/","title":"Fellowship"},{"categories":null,"contents":"","date":"January 1, 1","image":"http://odissei-soda.nl/images/workshops/syntheticdata_hu8a3495d7a8e26162d9e6ccba84eefed3_12080_650x0_resize_box_3.png","permalink":"/principles/","title":"Principles"},{"categories":null,"contents":"","date":"January 1, 1","image":"http://odissei-soda.nl/images/workshops/syntheticdata_hu8a3495d7a8e26162d9e6ccba84eefed3_12080_650x0_resize_box_3.png","permalink":"/projects/","title":"Projects"},{"categories":null,"contents":"","date":"January 1, 1","image":"http://odissei-soda.nl/images/workshops/syntheticdata_hu8a3495d7a8e26162d9e6ccba84eefed3_12080_650x0_resize_box_3.png","permalink":"/team/","title":"The SoDa Team"}] \ No newline at end of file diff --git a/index.xml b/index.xml index 6ec5c73..977f751 100644 --- a/index.xml +++ b/index.xml @@ -6,7 +6,16 @@ Recent content on SoDa Hugo -- gohugo.io en-US - Fri, 19 Apr 2024 00:00:00 +0000 + Fri, 26 Apr 2024 00:00:00 +0000 + + Generating synthetic data in a safe way with metasyn + http://odissei-soda.nl/tutorials/generating-synthetic-data-with-metasyn/ + Fri, 26 Apr 2024 00:00:00 +0000 + + http://odissei-soda.nl/tutorials/generating-synthetic-data-with-metasyn/ + Doing open, reproducible science means doing your best to openly share research data and analysis code. + + [UPCOMING] Efficient and reproducible research with CBS microdata http://odissei-soda.nl/workshops/post-7/ diff --git a/sitemap.xml b/sitemap.xml index 601e10b..b71bc92 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -3,7 +3,13 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml"> http://odissei-soda.nl/ - 2024-04-19T00:00:00+00:00 + 2024-04-26T00:00:00+00:00 + + http://odissei-soda.nl/tutorials/generating-synthetic-data-with-metasyn/ + 2024-04-26T00:00:00+00:00 + + http://odissei-soda.nl/tutorials/ + 2024-04-26T00:00:00+00:00 http://odissei-soda.nl/workshops/post-7/ 2024-04-19T00:00:00+00:00 @@ -13,9 +19,6 @@ http://odissei-soda.nl/tutorials/post-8/ 2024-02-27T00:00:00+00:00 - - http://odissei-soda.nl/tutorials/ - 2024-02-27T00:00:00+00:00 http://odissei-soda.nl/workshops/post-6/ 2024-02-26T00:00:00+00:00 diff --git a/tags/index.html b/tags/index.html index 1de68d6..7cab3d7 100644 --- a/tags/index.html +++ b/tags/index.html @@ -414,11 +414,11 @@

Tags

- - - - - How to manage your IP address in python + + + + + Generating synthetic data in a safe way with metasyn @@ -429,12 +429,12 @@

Tags

-
February 27, 2024
+
April 26, 2024
-

How to manage your IP address in python

-

Author: Flavio Hafner. Post photo from Glenn Carstens-Peters on Unsplash

- read more +

Generating synthetic data in a safe way with metasyn

+

Doing open, reproducible science means doing your best to openly share research data and analysis code.

+ read more
diff --git a/tutorials/generating-synthetic-data-with-metasyn/index.html b/tutorials/generating-synthetic-data-with-metasyn/index.html new file mode 100644 index 0000000..f8fc53d --- /dev/null +++ b/tutorials/generating-synthetic-data-with-metasyn/index.html @@ -0,0 +1,702 @@ + + + + + + +Generating synthetic data in a safe way with metasyn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Generating synthetic data in a safe way with metasyn + + + + + + + + + + April 26, 2024 | 5 + +

Generating synthetic data in a safe way with metasyn

+ +

Doing open, reproducible science means doing your best to openly share research data and analysis code. With these open materials, others can check and understand your research, use it to prepare their own analysis, find examples for teaching, and more. However, sometimes datasets contain sensititive or confidential information, which makes it difficult — if not impossible — to share. In this case, producing and sharing a synthetic version of the data might be a solution. In this post, we show how to do this in an auditable, transparent way with the software package metasyn.

+

Metasyn is a Python package that helps you to generate synthetic data, with two ideas in mind. First, it is easy to use and understand. Second, and most importantly, it is privacy-friendly. Unlike most other synthetic data generation tools, metasyn strictly limits the statistical information in its data generation model to adhere to the highest privacy standards and only generates data that is similar on an individual column level. This makes it a great tool for initial exploration, code development, and sharing of datasets while maintining very high privacy levels - but it is not suitable for in-depth statistical analysis.

+

With metasyn, you fit a model to a dataset and synthesize data similar to the original based on that model. You can then export the synthetic data and the model used to generate it, in easy-to-read format. As a result, metasyn allows data owners to safely share synthetic datasets based on their source data, as well as the model used to generate it, without worrying about leaking any private information from the original dataset.

+

Let’s say you want to use metasyn to collaborate on a sensitive dataset with others. In this tutorial, we will show you everything you need to know to get started.

+

Step 1: Setup

+

The first step is installing metasyn. The easiest way to do so is by installing it through pip. This can be done by typing the following command in your terminal:

+
pip install metasyn
+

Then, in a Python environment, you can import metasyn (and Polars, which will be used to load the dataset):

+
import polars as pl
+from metasyn import MetaFrame, demo_file
+

Step 2: Creating a DataFrame

+

Before we can pass a dataset into metasyn, we need to convert it to a Polars DataFrame. In doing so, we can indicate which columns contain categorical values. We can also tell polars to find columns that may contain dates or timestamps. Metasyn can later use this information to generate categorical or date-like values where appropriate. For more information on how to use Polars, check out the Polars documentation.

+

For this tutorial, we will use the Titanic dataset, which comes preloaded with metasyn (its file path can be accessed using the demo_file function). We will specify the data types of the Sex and Embarked columns as categorical, and we will also try to parse dates in the DataFrame.

+
# Get the CSV file path for the Titanic dataset
+csv_path = demo_file("titanic") # Replace this with your file path if needed
+
+# Create a Polars DataFrame
+df = pl.read_csv(
+    source=csv_path,
+    dtypes={"Sex": pl.Categorical, "Embarked": pl.Categorical},
+    try_parse_dates=True,
+)
+

Step 3: Generating a MetaFrame

+

Now that we have created a DataFrame, we can easily generate a MetaFrame for it. Metasyn can later use this MetaFrame to generate synthetic data that aligns with the original dataset.

+
+

A MetaFrame is a simple model that captures the essentials of each variable in the original dataset (e.g., variable names, types, data types, the percentage of missing values, and distribution), without containing any actual data entries.

+
+

A MetaFrame can be created by simply calling MetaFrame.fit_dataframe(), passing in the DataFrame as a parameter.

+
# Generate and fit a MetaFrame to the DataFrame 
+mf = MetaFrame.fit_dataframe(df)
+

Step 4: Generating synthetic data

+

With our MetaFrame in place, we can use it to generate synthetic data. To do so, we can call synthesize on our MetaFrame, and pass in the amount of rows of data that we want to generate. This will return a DataFrame with synthetic data, that is similar to our original dataset.

+
# generate synthetic data
+syn_df = mf.synthesize(5)
+

That’s it! You can now read, analyze, modify, use and share this DataFrame as you would with any other – knowing that it is rather unlikely to leak private information (though if you need actual formal privacy guarantees, look at our disclosure control plugin).

+

Step 5: Exporting the MetaFrame

+

Let’s say we want to go one step further, and also share the an auditable representation of the MetaFrame alongside our synthetic data. We can easily do so by exporting it to a JSON file.

+

These exported files follow the Generative Metadata Format (GMF). This is a format that was designed to be easy-to-read and understand.

+

Other users can then import this file to generate synthetic data similar to the original dataset, without ever having access to the original data. In addition, due to these files being easy to read, others can easily understand and evaluate how the synthetic data is generated.

+

To export the MetaFrame, we can call the export method on an existing MetaFrame (in this case, mf), passing in the file path of where we want to save the JSON file.

+
# Serialize and export the MetaFrame
+mf.export("exported_metaframe.json")
+

To load the MetaFrame from the exported JSON file, we can use the MetaFrame.from_json() class method, passing in the file path as a parameter:

+
# Create a MetaFrame based on a GMF (.json) file
+mf = MetaFrame.from_json(file_path)
+

Conclusion

+

You now know how to use metasyn to generate synthetic data from a dataset. Both the synthetic data and the model (MetaFrame) used to generate it can be shared safely, while maintaining a high level of privacy.

+

Enjoy using metasyn!

+

For more information on how to use metasyn, check out the documentation or the GitHub repository.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/index.html b/tutorials/index.html index f4b87cd..78d779e 100644 --- a/tutorials/index.html +++ b/tutorials/index.html @@ -416,11 +416,11 @@

Tutorials

- - - - - How to manage your IP address in python + + + + + Generating synthetic data in a safe way with metasyn @@ -431,12 +431,12 @@

Tutorials

-
February 27, 2024
+
April 26, 2024
-

How to manage your IP address in python

-

Author: Flavio Hafner. Post photo from Glenn Carstens-Peters on Unsplash

- read more +

Generating synthetic data in a safe way with metasyn

+

Doing open, reproducible science means doing your best to openly share research data and analysis code.

+ read more
@@ -512,7 +512,7 @@

+Generating synthetic data in a safe way with metasyn @@ -524,12 +524,12 @@

-
February 27, 2024
+
April 26, 2024
-

How to manage your IP address in python

-

Author: Flavio Hafner. Post photo from Glenn Carstens-Peters on Unsplash

- read more +

Generating synthetic data in a safe way with metasyn

+

Doing open, reproducible science means doing your best to openly share research data and analysis code.

+ read more @@ -600,7 +600,7 @@

+How to manage your IP address in python @@ -612,12 +612,12 @@

-
January 22, 2024
+
February 27, 2024
-

Training a fastText model from scratch using Python

-

By now, it’s no surprise to anybody the astonishing results large language models produce.

- read more +

How to manage your IP address in python

+

Author: Flavio Hafner. Post photo from Glenn Carstens-Peters on Unsplash

+ read more @@ -688,7 +688,7 @@

+Training a fastText model from scratch using Python @@ -700,12 +700,12 @@

-
December 11, 2023
+
January 22, 2024
-

Visualizing international flows with Geoflow visualizer

-

In this tutorial we present Geoflow, a newly created tool designed to visualize international flows in an interactive way.

- read more +

Training a fastText model from scratch using Python

+

By now, it’s no surprise to anybody the astonishing results large language models produce.

+ read more @@ -776,7 +776,7 @@

+Visualizing international flows with Geoflow visualizer @@ -788,12 +788,12 @@

-
September 29, 2023
+
December 11, 2023
-

Wrangling interval data using lubridate

-

One common issue we encounter in helping researchers work with the housing register data of Statistics Netherlands is its transactional nature: each row in the housing register table contains data on when someone registered and deregistered at an address (more info in Dutch here).

- read more +

Visualizing international flows with Geoflow visualizer

+

In this tutorial we present Geoflow, a newly created tool designed to visualize international flows in an interactive way.

+ read more @@ -864,7 +864,7 @@

+Wrangling interval data using lubridate @@ -876,12 +876,12 @@

-
September 8, 2023
+
September 29, 2023
-

Collecting online platforms data for science: an example using WhatsApp

-

These days, our online presence leaves traces of our behavior everywhere.

- read more +

Wrangling interval data using lubridate

+

One common issue we encounter in helping researchers work with the housing register data of Statistics Netherlands is its transactional nature: each row in the housing register table contains data on when someone registered and deregistered at an address (more info in Dutch here).

+ read more @@ -952,7 +952,7 @@

+Collecting online platforms data for science: an example using WhatsApp @@ -964,12 +964,12 @@

-
October 4, 2022
+
September 8, 2023
-

ArtScraper: A Python library to scrape online artworks

-

ArtScraper is a Python library to download images and metadata for artworks available on WikiArt and Google Arts & Culture.

- read more +

Collecting online platforms data for science: an example using WhatsApp

+

These days, our online presence leaves traces of our behavior everywhere.

+ read more diff --git a/tutorials/index.xml b/tutorials/index.xml index e33d888..4ced538 100644 --- a/tutorials/index.xml +++ b/tutorials/index.xml @@ -6,7 +6,16 @@ Recent content in Tutorials on SoDa Hugo -- gohugo.io en-US - Tue, 27 Feb 2024 00:00:00 +0000 + Fri, 26 Apr 2024 00:00:00 +0000 + + Generating synthetic data in a safe way with metasyn + http://odissei-soda.nl/tutorials/generating-synthetic-data-with-metasyn/ + Fri, 26 Apr 2024 00:00:00 +0000 + + http://odissei-soda.nl/tutorials/generating-synthetic-data-with-metasyn/ + Doing open, reproducible science means doing your best to openly share research data and analysis code. + + How to manage your IP address in python http://odissei-soda.nl/tutorials/post-8/ diff --git a/tutorials/page/2/index.html b/tutorials/page/2/index.html index c1f71cf..42bb749 100644 --- a/tutorials/page/2/index.html +++ b/tutorials/page/2/index.html @@ -416,11 +416,11 @@

Tutorials

- - - - - How to manage your IP address in python + + + + + Generating synthetic data in a safe way with metasyn @@ -431,12 +431,12 @@

Tutorials

-
February 27, 2024
+
April 26, 2024
-

How to manage your IP address in python

-

Author: Flavio Hafner. Post photo from Glenn Carstens-Peters on Unsplash

- read more +

Generating synthetic data in a safe way with metasyn

+

Doing open, reproducible science means doing your best to openly share research data and analysis code.

+ read more
@@ -491,6 +491,94 @@

+ + + + + + + + +
+
+ +
October 4, 2022
+
+ +

ArtScraper: A Python library to scrape online artworks

+

ArtScraper is a Python library to download images and metadata for artworks available on WikiArt and Google Arts & Culture.

+ read more +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +