All data science is really is the process of collecting and operating on sets of data. Usually in data science, you're running statistical algorithms on data sets. The way I see it, machine learning IS the application of data science and data science is basically a branch from software engineering, and in most cases is more simple. Most data scientists use Python or Node for ease of operation. These languages, being as high level as they are, make it very easy to manipulate, curate, and operate on data. So when I say machine learning is the application of data science, i mean that when you write a machine learning algorithm, you are writing an application which uses statistical algorithms to operate on datasets (which is what data science is).
Edit: As for a tutorial, all I can give is a high level explanation of how i collect data, what i collect, how i format it, and how i operate on it.
Take my discord chatbot, Scarlett, for example, which you've seen. Before i can write a bot that can have discussions I must collect necessary information that would essentially teach that bot how to converse. There's a general idea in data science that powerful data exists in the "wild" (our every day application use, real world conversations, and things that people use such as applications and websites.) In order to collect data I leave the bot in a channel and it watches for new messages coming it. When a message comes in, I operate on the incoming data before I store it and format it in a generic way that i know it could be used not only for one task but many. So my data is stored like this:
{
_id: "some unique id"
content: "The contents of the message",
parent: "The message that came before this one if any",
comment_id: "The id of the data supplied by the input application if any",
source: "Where the data came from",
tag: "Just something i use to add sub-categories onto a source",
author: "Who created the data (if available)"
}
This data format is not the final format to go into my training model. It is a generic data format that has a bit more information than i actually need, because i see the information as valuable and reusable. When I go to actually feed this information to my bot, i transform the data into the appropriate training format:
{"comment": "The parent comment", "response": "The reply to the comment"}
This is the only necessary data that i need in order to get my bot doing what i want it to. I can also apply filters based on the extra information that i stored in the database. For example, if I wanted a bot that learned information only on data that came from my discord philosophy channel, I would use this as my query when selecting data to convert to a training model:
{"tag": "philosophy", "source": "discord-collector"}
or if I wanted to train the bot only on comments that only you have made in my discord server (to train the bot to talk more like you) I would use this query instead:
{"tag": "lobby", "source": "discord-collector", "author": "<Phen's Discord UUID>"}
When i operate on the data itself, I feed the training model to the AI, which tells it "this is the input, and this is the response i expect". So when you introduce new input to that bot, it will use the input it knows of to generate a likely result to the input comment. The formatting of the data, acting on it, running the training model, all of that is data science.