From 76cc0bf7630b6204f0712eca27ea77ea5cafd9b0 Mon Sep 17 00:00:00 2001 From: rhinophant Date: Fri, 11 Apr 2025 22:20:55 -0400 Subject: [PATCH] build auto data analyst with Gemini and CrewAI agents --- setup_crewai_agents_google_colab.ipynb | 1934 ++++++++++++++++++++++++ 1 file changed, 1934 insertions(+) create mode 100644 setup_crewai_agents_google_colab.ipynb diff --git a/setup_crewai_agents_google_colab.ipynb b/setup_crewai_agents_google_colab.ipynb new file mode 100644 index 0000000..6a8549e --- /dev/null +++ b/setup_crewai_agents_google_colab.ipynb @@ -0,0 +1,1934 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "authorship_tag": "ABX9TyMVql60VlNv2DbwP4b69lc6", + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Analyst agents to auto-explore datasets" + ], + "metadata": { + "id": "LV3nP_sr3jMC" + } + }, + { + "cell_type": "markdown", + "source": [ + "**Motivation**\n", + "\n", + "Data analysts live by joins. Combining multiple tables – customer details, sales figures, inventory levels – is fundamental to uncovering deeper business insights. But this process is fragile. The final analysis is only as strong as its weakest data link.\n", + "\n", + "Introduce just one dataset with quality issues into your sequence of joins, and the entire result becomes suspect. The more tables you bring into the mix, the higher the odds that at least one of them is flawed. Suddenly, that five-table join feels much riskier than a simple two-table lookup. This compounding risk underscores a crucial, often time-consuming step: rigorous data quality assessment before merging.\n", + "\n", + "So, how do we typically combat this risk? Before diving into complex joins or modeling, the diligent data analyst performs crucial exploratory data analysis (EDA) and quality checks on each input dataset. This isn't just a single step, but a well-trodden path involving several standard procedures.\n", + "\n" + ], + "metadata": { + "id": "9P93UoEe4OzO" + } + }, + { + "cell_type": "markdown", + "source": [ + "![assets_task_01jrkv6b8qf61bmc0ng2x7eeyx_img_0 (1).webp](data:image/webp;base64,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)" + ], + "metadata": { + "id": "WShWG64Du6tF" + } + }, + { + "cell_type": "code", + "source": [ + "!pip install summarytools langchain-google-genai crewai -q" + ], + "metadata": { + "id": "O4_y09ytn-aK" + }, + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "**Establishing a Data Understanding Baseline**\n", + "\n", + "Before complex analysis, understanding each input dataset is crucial. While experienced analysts develop diverse techniques, a common baseline approach guides most initial data quality checks and exploration. This foundational process typically involves:\n", + "\n", + "1. Missing Values: Calculating the count and percentage of nulls per variable.\n", + "2. Continuous Distributions: Examining key statistics (mean, median, min, max, std dev) and outliers, often visualized with histograms.\n", + "3. Categorical Frequencies: Identifying unique values, their counts, and potential anomalies in categorical fields.\n", + "4. Trend analysis: Tracking key metrics over time (if applicable) to spot patterns or shifts.\n", + "5. etc.\n", + "\n", + "The example belows demonstrates using \"summarytools\" package in Python to summarize the famous titanic dataset." + ], + "metadata": { + "id": "69rF3egFtNAu" + } + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "Tptn3IAGl513", + "outputId": "982aa408-d78a-45e7-8a60-fdc2c0a0753b" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Data Frame Summary
titanic
Dimensions: 891 x 12
Duplicates: 0
NoVariableStats / ValuesFreqs / (% of Valid)GraphMissing
1PassengerId
[int64]
Mean (sd) : 446.0 (257.4)
min < med < max:
1.0 < 446.0 < 891.0
IQR (CV) : 445.0 (1.7)
891 distinct values0
(0.0%)
2Survived
[int64]
1. 0
2. 1
549 (61.6%)
342 (38.4%)
0
(0.0%)
3Pclass
[int64]
1. 3
2. 1
3. 2
491 (55.1%)
216 (24.2%)
184 (20.7%)
0
(0.0%)
4Name
[object]
1. Dooley, Mr. Patrick
2. Braund, Mr. Owen Harris
3. Cumings, Mrs. John Bradley (Fl
4. Heikkinen, Miss. Laina
5. Futrelle, Mrs. Jacques Heath (
6. Allen, Mr. William Henry
7. Moran, Mr. James
8. McCarthy, Mr. Timothy J
9. Palsson, Master. Gosta Leonard
10. Johnson, Mrs. Oscar W (Elisabe
11. other
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
881 (98.9%)
0
(0.0%)
5Sex
[object]
1. male
2. female
577 (64.8%)
314 (35.2%)
0
(0.0%)
6Age
[float64]
Mean (sd) : 29.7 (14.5)
min < med < max:
0.4 < 28.0 < 80.0
IQR (CV) : 17.9 (2.0)
88 distinct values177
(19.9%)
7SibSp
[int64]
1. 0
2. 1
3. 2
4. 4
5. 3
6. 8
7. 5
608 (68.2%)
209 (23.5%)
28 (3.1%)
18 (2.0%)
16 (1.8%)
7 (0.8%)
5 (0.6%)
0
(0.0%)
8Parch
[int64]
1. 0
2. 1
3. 2
4. 5
5. 3
6. 4
7. 6
678 (76.1%)
118 (13.2%)
80 (9.0%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
1 (0.1%)
0
(0.0%)
9Ticket
[object]
1. 347082
2. 1601
3. CA. 2343
4. 3101295
5. CA 2144
6. 347088
7. 382652
8. S.O.C. 14879
9. 113760
10. 19950
11. other
7 (0.8%)
7 (0.8%)
7 (0.8%)
6 (0.7%)
6 (0.7%)
6 (0.7%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
4 (0.4%)
834 (93.6%)
0
(0.0%)
10Fare
[float64]
Mean (sd) : 32.2 (49.7)
min < med < max:
0.0 < 14.5 < 512.3
IQR (CV) : 23.1 (0.6)
248 distinct values0
(0.0%)
11Cabin
[object]
1. nan
2. G6
3. C23 C25 C27
4. B96 B98
5. F2
6. D
7. E101
8. C22 C26
9. F33
10. C83
11. other
687 (77.1%)
4 (0.4%)
4 (0.4%)
4 (0.4%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
2 (0.2%)
175 (19.6%)
687
(77.1%)
12Embarked
[object]
1. S
2. C
3. Q
4. nan
644 (72.3%)
168 (18.9%)
77 (8.6%)
2 (0.2%)
2
(0.2%)
\n" + ] + }, + "metadata": {}, + "execution_count": 18 + } + ], + "source": [ + "import pandas as pd # load example dataset\n", + "from summarytools import dfSummary\n", + "titanic = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')\n", + "df_summary_info = dfSummary(titanic)\n", + "df_summary_info" + ] + }, + { + "cell_type": "markdown", + "source": [ + "We are removing the image tags that visualize categorical variable distributions (under the \"graph\" column) from the dataset summary. This step ensures the remaining results can be saved purely as text in a .txt file, making it suitable for processing by an LLM." + ], + "metadata": { + "id": "Yeu-WyXsvq7H" + } + }, + { + "cell_type": "code", + "source": [ + "print(\"Original Text:\")\n", + "print(df_summary_info.to_string())\n", + "\n", + "import re\n", + "\n", + "def remove_img_texts(html_text: str) -> str:\n", + " \"\"\"\n", + " Removes any text between tags (including the tags)\n", + " from the given text.\n", + " \"\"\"\n", + " # This pattern matches an tag with any attributes, followed by any content until a tag.\n", + " pattern = re.compile(r']*>.*?', re.DOTALL | re.IGNORECASE)\n", + " cleaned_text = pattern.sub('', html_text)\n", + " return cleaned_text\n", + "\n", + "# Example usage:\n", + "result = remove_img_texts(df_summary_info.to_string())\n", + "print(\"\\nCleaned Text:\")\n", + "print(result)\n", + "\n", + "# Optionally, save the cleaned text to a text file.\n", + "with open(\"df_summary_text.txt\", \"w\") as f:\n", + " f.write(result)\n", + "\n", + "# TODO: apply custom instructions on each row of text. instruct-fine tune, error rate analysis with custom dashboards or just version control of prompts and results like latitude" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Z4rjQE548hZ7", + "outputId": "8df3d7e5-4a7b-4c83-8ca4-8b0a73a3ffea" + }, + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Original Text:\n", + "No Variable Stats / Values Freqs / (% of Valid) Graph Missing\n", + "1 PassengerId
[int64] Mean (sd) : 446.0 (257.4)
min < med < max:
1.0 < 446.0 < 891.0
IQR (CV) : 445.0 (1.7) 891 distinct values 0
(0.0%)\n", + "2 Survived
[int64] 1. 0
2. 1 549 (61.6%)
342 (38.4%) 0
(0.0%)\n", + "3 Pclass
[int64] 1. 3
2. 1
3. 2 491 (55.1%)
216 (24.2%)
184 (20.7%) 0
(0.0%)\n", + "4 Name
[object] 1. Dooley, Mr. Patrick
2. Braund, Mr. Owen Harris
3. Cumings, Mrs. John Bradley (Fl
4. Heikkinen, Miss. Laina
5. Futrelle, Mrs. Jacques Heath (
6. Allen, Mr. William Henry
7. Moran, Mr. James
8. McCarthy, Mr. Timothy J
9. Palsson, Master. Gosta Leonard
10. Johnson, Mrs. Oscar W (Elisabe
11. other 1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
881 (98.9%) 0
(0.0%)\n", + "5 Sex
[object] 1. male
2. female 577 (64.8%)
314 (35.2%) 0
(0.0%)\n", + "6 Age
[float64] Mean (sd) : 29.7 (14.5)
min < med < max:
0.4 < 28.0 < 80.0
IQR (CV) : 17.9 (2.0) 88 distinct values 177
(19.9%)\n", + "7 SibSp
[int64] 1. 0
2. 1
3. 2
4. 4
5. 3
6. 8
7. 5 608 (68.2%)
209 (23.5%)
28 (3.1%)
18 (2.0%)
16 (1.8%)
7 (0.8%)
5 (0.6%) 0
(0.0%)\n", + "8 Parch
[int64] 1. 0
2. 1
3. 2
4. 5
5. 3
6. 4
7. 6 678 (76.1%)
118 (13.2%)
80 (9.0%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
1 (0.1%) 0
(0.0%)\n", + "9 Ticket
[object] 1. 347082
2. 1601
3. CA. 2343
4. 3101295
5. CA 2144
6. 347088
7. 382652
8. S.O.C. 14879
9. 113760
10. 19950
11. other 7 (0.8%)
7 (0.8%)
7 (0.8%)
6 (0.7%)
6 (0.7%)
6 (0.7%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
4 (0.4%)
834 (93.6%) 0
(0.0%)\n", + "10 Fare
[float64] Mean (sd) : 32.2 (49.7)
min < med < max:
0.0 < 14.5 < 512.3
IQR (CV) : 23.1 (0.6) 248 distinct values 0
(0.0%)\n", + "11 Cabin
[object] 1. nan
2. G6
3. C23 C25 C27
4. B96 B98
5. F2
6. D
7. E101
8. C22 C26
9. F33
10. C83
11. other 687 (77.1%)
4 (0.4%)
4 (0.4%)
4 (0.4%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
2 (0.2%)
175 (19.6%) 687
(77.1%)\n", + "12 Embarked
[object] 1. S
2. C
3. Q
4. nan 644 (72.3%)
168 (18.9%)
77 (8.6%)
2 (0.2%) 2
(0.2%)\n", + "\n", + "\n", + "Cleaned Text:\n", + "No Variable Stats / Values Freqs / (% of Valid) Graph Missing\n", + "1 PassengerId
[int64] Mean (sd) : 446.0 (257.4)
min < med < max:
1.0 < 446.0 < 891.0
IQR (CV) : 445.0 (1.7) 891 distinct values 0
(0.0%)\n", + "2 Survived
[int64] 1. 0
2. 1 549 (61.6%)
342 (38.4%) 0
(0.0%)\n", + "3 Pclass
[int64] 1. 3
2. 1
3. 2 491 (55.1%)
216 (24.2%)
184 (20.7%) 0
(0.0%)\n", + "4 Name
[object] 1. Dooley, Mr. Patrick
2. Braund, Mr. Owen Harris
3. Cumings, Mrs. John Bradley (Fl
4. Heikkinen, Miss. Laina
5. Futrelle, Mrs. Jacques Heath (
6. Allen, Mr. William Henry
7. Moran, Mr. James
8. McCarthy, Mr. Timothy J
9. Palsson, Master. Gosta Leonard
10. Johnson, Mrs. Oscar W (Elisabe
11. other 1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
881 (98.9%) 0
(0.0%)\n", + "5 Sex
[object] 1. male
2. female 577 (64.8%)
314 (35.2%) 0
(0.0%)\n", + "6 Age
[float64] Mean (sd) : 29.7 (14.5)
min < med < max:
0.4 < 28.0 < 80.0
IQR (CV) : 17.9 (2.0) 88 distinct values 177
(19.9%)\n", + "7 SibSp
[int64] 1. 0
2. 1
3. 2
4. 4
5. 3
6. 8
7. 5 608 (68.2%)
209 (23.5%)
28 (3.1%)
18 (2.0%)
16 (1.8%)
7 (0.8%)
5 (0.6%) 0
(0.0%)\n", + "8 Parch
[int64] 1. 0
2. 1
3. 2
4. 5
5. 3
6. 4
7. 6 678 (76.1%)
118 (13.2%)
80 (9.0%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
1 (0.1%) 0
(0.0%)\n", + "9 Ticket
[object] 1. 347082
2. 1601
3. CA. 2343
4. 3101295
5. CA 2144
6. 347088
7. 382652
8. S.O.C. 14879
9. 113760
10. 19950
11. other 7 (0.8%)
7 (0.8%)
7 (0.8%)
6 (0.7%)
6 (0.7%)
6 (0.7%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
4 (0.4%)
834 (93.6%) 0
(0.0%)\n", + "10 Fare
[float64] Mean (sd) : 32.2 (49.7)
min < med < max:
0.0 < 14.5 < 512.3
IQR (CV) : 23.1 (0.6) 248 distinct values 0
(0.0%)\n", + "11 Cabin
[object] 1. nan
2. G6
3. C23 C25 C27
4. B96 B98
5. F2
6. D
7. E101
8. C22 C26
9. F33
10. C83
11. other 687 (77.1%)
4 (0.4%)
4 (0.4%)
4 (0.4%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
2 (0.2%)
175 (19.6%) 687
(77.1%)\n", + "12 Embarked
[object] 1. S
2. C
3. Q
4. nan 644 (72.3%)
168 (18.9%)
77 (8.6%)
2 (0.2%) 2
(0.2%)\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Agent to mimic data analyst and other roles" + ], + "metadata": { + "id": "pzocdLs5xUUQ" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Input the Gemini API from Google AI Studio" + ], + "metadata": { + "id": "1nYi2X0Jxe9s" + } + }, + { + "cell_type": "code", + "source": [ + "api_key = input(\"Please enter your API key: \")\n", + "os.environ[\"GEMINI_API_KEY\"] = api_key\n", + "print(\"API key has been set.\")" + ], + "metadata": { + "id": "wKwptGcfxo6e" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import os\n", + "import pandas as pd\n", + "from crewai import Agent, Task, Crew, Process\n", + "from langchain_google_genai import ChatGoogleGenerativeAI\n", + "from summarytools import dfSummary\n", + "from crewai import Agent, Task, Crew, LLM\n", + "\n", + "llm = LLM(model=\"gemini/gemini-2.0-flash\")\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# 2) Load the Titanic dataset and generate a text summary using summarytools.\n", + "#\n", + "# The dfSummary() output (a pandas Styler) is converted to plain text with .to_string().\n", + "# -----------------------------------------------------------------------------\n", + "titanic = pd.read_csv(\"https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv\")\n", + "df_summary_info = dfSummary(titanic).to_string()\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# 3) Create AI team agents in a CrewAI style.\n", + "#\n", + "# Each agent is provided with a role, goal, and backstory. They use Gemini Pro via llm.\n", + "# -----------------------------------------------------------------------------\n", + "data_quality_agent = Agent(\n", + " role=\"Data Quality Analyst\",\n", + " goal=\"Identify columns with data quality issues such as those with more than 20% missing values.\",\n", + " backstory=\"An experienced data analyst who excels at detecting data quality issues and anomalies in datasets.\",\n", + " verbose=True,\n", + " allow_delegation=False,\n", + " llm=llm\n", + ")\n", + "\n", + "statistical_agent = Agent(\n", + " role=\"Statistical Analyst\",\n", + " goal=\"Examine numeric columns for potential outliers where maximum values greatly exceed the mean.\",\n", + " backstory=\"A meticulous statistician with expertise in numeric data distributions and anomaly detection.\",\n", + " verbose=True,\n", + " allow_delegation=False,\n", + " llm=llm\n", + ")\n", + "\n", + "insight_agent = Agent(\n", + " role=\"Predictive Modeling Advisor\",\n", + " goal=\"Recommend which columns appear most informative for predictive modeling.\",\n", + " backstory=\"A seasoned machine learning consultant skilled in feature engineering and predictive analysis.\",\n", + " verbose=True,\n", + " allow_delegation=True,\n", + " llm=llm\n", + ")\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# 4) Create tasks for each agent by embedding the dataset summary (as text).\n", + "#\n", + "# Note: We now include an 'expected_output' field as required by the Task model.\n", + "# -----------------------------------------------------------------------------\n", + "task1 = Task(\n", + " description=f\"\"\"Data Quality Task:\n", + "Examine the dataset summary below and identify columns with significant data quality issues or concerns.\n", + "Focus primarily on those columns with more than 20% missing values, and consider columns with unusual uniqueness metrics.\n", + "Provide detailed insights including the percentage of missing data and any recommendations for cleaning.\n", + "Dataset Summary:\n", + "{df_summary_info}\"\"\",\n", + " expected_output=\"A detailed list of column names with significant missing data issues along with insights and recommendations for data cleaning.\",\n", + " agent=data_quality_agent\n", + ")\n", + "\n", + "\n", + "task2 = Task(\n", + " description=f\"\"\"Statistical Analysis Task:\n", + "Review the dataset summary below and identify any numeric columns that exhibit potential outlier behavior.\n", + "Specifically, look for columns where the maximum value far exceeds the mean (e.g., max > 3 × mean) and any unusual spread in the data.\n", + "Include a brief explanation of why each identified column may be problematic. Provide any recommendations for further investigation.\n", + "Dataset Summary:\n", + "{df_summary_info}\"\"\",\n", + " expected_output=\"A detailed list of numeric columns with potential outlier issues, including a brief explanation for each.\",\n", + " agent=statistical_agent\n", + ")\n", + "\n", + "\n", + "task3 = Task(\n", + " description=f\"\"\"Predictive Modeling Insight Task:\n", + "Based on the dataset summary below, recommend which columns might be most informative for building a predictive model.\n", + "Dataset Summary:\n", + "{df_summary_info}\"\"\",\n", + " expected_output=\"A list of column names that are likely to be most informative for predictive modeling.\",\n", + " agent=insight_agent\n", + ")\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# 5) Assemble the Crew and execute the tasks sequentially.\n", + "#\n", + "# The Crew (ManagerAgent) runs the tasks one by one.\n", + "# -----------------------------------------------------------------------------\n", + "crew = Crew(\n", + " agents=[data_quality_agent, statistical_agent, insight_agent],\n", + " tasks=[task1, task2, task3],\n", + " verbose=True,\n", + " process=Process.sequential,\n", + ")\n", + "\n", + "crew_output = crew.kickoff()\n", + "\n", + "print(\"\\nCrew Output:\")\n", + "print(crew_output)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "UDmAXJ6EhaCQ", + "outputId": "17e8af85-c294-41e1-a7bc-d220b0e60ac7" + }, + "execution_count": 17, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[36m╭─\u001b[0m\u001b[36m───────────────────────────────────────────\u001b[0m\u001b[36m Crew Execution Started \u001b[0m\u001b[36m────────────────────────────────────────────\u001b[0m\u001b[36m─╮\u001b[0m\n", + "\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n", + "\u001b[36m│\u001b[0m \u001b[1;36mCrew Execution Started\u001b[0m \u001b[36m│\u001b[0m\n", + "\u001b[36m│\u001b[0m \u001b[37mName: \u001b[0m\u001b[36mcrew\u001b[0m \u001b[36m│\u001b[0m\n", + "\u001b[36m│\u001b[0m \u001b[37mID: \u001b[0m\u001b[36mfb25122b-a197-4be3-98e2-7187488389ea\u001b[0m \u001b[36m│\u001b[0m\n", + "\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n", + "\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n", + "\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" + ], + "text/html": [ + "
╭──────────────────────────────────────────── Crew Execution Started ─────────────────────────────────────────────╮\n",
+              "                                                                                                                 \n",
+              "  Crew Execution Started                                                                                         \n",
+              "  Name: crew                                                                                                     \n",
+              "  ID: fb25122b-a197-4be3-98e2-7187488389ea                                                                       \n",
+              "                                                                                                                 \n",
+              "                                                                                                                 \n",
+              "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "└── \u001b[1;33m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "└── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "       Status: Executing Task...\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "└── \u001b[1;33m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "└── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "       Status: Executing Task...\n",
+              "    └── 🤖 Agent: Data Quality Analyst\n",
+              "            Status: In Progress\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mData Quality Analyst\u001b[00m\n", + "\u001b[95m## Task:\u001b[00m \u001b[92mData Quality Task:\n", + "Examine the dataset summary below and identify columns with significant data quality issues or concerns.\n", + "Focus primarily on those columns with more than 20% missing values, and consider columns with unusual uniqueness metrics.\n", + "Provide detailed insights including the percentage of missing data and any recommendations for cleaning.\n", + "Dataset Summary:\n", + "No Variable Stats / Values Freqs / (% of Valid) Graph Missing\n", + "1 PassengerId
[int64] Mean (sd) : 446.0 (257.4)
min < med < max:
1.0 < 446.0 < 891.0
IQR (CV) : 445.0 (1.7) 891 distinct values 0
(0.0%)\n", + "2 Survived
[int64] 1. 0
2. 1 549 (61.6%)
342 (38.4%) 0
(0.0%)\n", + "3 Pclass
[int64] 1. 3
2. 1
3. 2 491 (55.1%)
216 (24.2%)
184 (20.7%) 0
(0.0%)\n", + "4 Name
[object] 1. Dooley, Mr. Patrick
2. Braund, Mr. Owen Harris
3. Cumings, Mrs. John Bradley (Fl
4. Heikkinen, Miss. Laina
5. Futrelle, Mrs. Jacques Heath (
6. Allen, Mr. William Henry
7. Moran, Mr. James
8. McCarthy, Mr. Timothy J
9. Palsson, Master. Gosta Leonard
10. Johnson, Mrs. Oscar W (Elisabe
11. other 1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
881 (98.9%) 0
(0.0%)\n", + "5 Sex
[object] 1. male
2. female 577 (64.8%)
314 (35.2%) 0
(0.0%)\n", + "6 Age
[float64] Mean (sd) : 29.7 (14.5)
min < med < max:
0.4 < 28.0 < 80.0
IQR (CV) : 17.9 (2.0) 88 distinct values 177
(19.9%)\n", + "7 SibSp
[int64] 1. 0
2. 1
3. 2
4. 4
5. 3
6. 8
7. 5 608 (68.2%)
209 (23.5%)
28 (3.1%)
18 (2.0%)
16 (1.8%)
7 (0.8%)
5 (0.6%) 0
(0.0%)\n", + "8 Parch
[int64] 1. 0
2. 1
3. 2
4. 5
5. 3
6. 4
7. 6 678 (76.1%)
118 (13.2%)
80 (9.0%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
1 (0.1%) 0
(0.0%)\n", + "9 Ticket
[object] 1. 347082
2. 1601
3. CA. 2343
4. 3101295
5. CA 2144
6. 347088
7. 382652
8. S.O.C. 14879
9. 113760
10. 19950
11. other 7 (0.8%)
7 (0.8%)
7 (0.8%)
6 (0.7%)
6 (0.7%)
6 (0.7%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
4 (0.4%)
834 (93.6%) 0
(0.0%)\n", + "10 Fare
[float64] Mean (sd) : 32.2 (49.7)
min < med < max:
0.0 < 14.5 < 512.3
IQR (CV) : 23.1 (0.6) 248 distinct values 0
(0.0%)\n", + "11 Cabin
[object] 1. nan
2. G6
3. C23 C25 C27
4. B96 B98
5. F2
6. D
7. E101
8. C22 C26
9. F33
10. C83
11. other 687 (77.1%)
4 (0.4%)
4 (0.4%)
4 (0.4%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
2 (0.2%)
175 (19.6%) 687
(77.1%)\n", + "12 Embarked
[object] 1. S
2. C
3. Q
4. nan 644 (72.3%)
168 (18.9%)
77 (8.6%)
2 (0.2%) 2
(0.2%)\n", + "\u001b[00m\n", + "\n", + "\n", + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mData Quality Analyst\u001b[00m\n", + "\u001b[95m## Final Answer:\u001b[00m \u001b[92m\n", + "**Detailed Data Quality Assessment:**\n", + "\n", + "1. **Age:**\n", + "\n", + " * **Missing Data:** 177 missing values, which is approximately 19.9% of the dataset.\n", + " * **Data Quality Issue:** While just below the 20% threshold, a significant number of 'Age' values are missing. This could introduce bias if not handled properly.\n", + " * **Recommendation:**\n", + "\n", + " * **Imputation:** Consider imputing missing 'Age' values using methods such as mean, median, or more advanced techniques like regression imputation based on other features (e.g., 'Pclass', 'Sex', 'SibSp', 'Parch').\n", + " * **Model-Based Imputation:** Use machine learning models to predict missing ages based on other features.\n", + " * **Consideration:** Be mindful of introducing bias during imputation; evaluate the impact of different imputation methods on downstream analyses.\n", + "\n", + "2. **Cabin:**\n", + "\n", + " * **Missing Data:** 687 missing values, which is a substantial 77.1% of the dataset.\n", + " * **Data Quality Issue:** The high percentage of missing 'Cabin' values makes this column unreliable for direct analysis without careful handling.\n", + " * **Recommendation:**\n", + "\n", + " * **Imputation with Caution:** Due to the high missingness, imputing cabin values might not be appropriate. Consider creating a new binary feature indicating whether a cabin is known ('Cabin_Known') or unknown ('Cabin_Unknown'). This preserves the information about whether the cabin was recorded.\n", + " * **Alternative Feature Engineering:** If cabin information is crucial, explore extracting relevant information from the existing 'Cabin' values before creating the 'Cabin_Known' feature, such as the deck level (e.g., first letter of the cabin).\n", + " * **Consider Deletion:** If cabin information proves unrecoverable or irrelevant to the analysis goals, consider removing the column.\n", + "\n", + "3. **Embarked:**\n", + "\n", + " * **Missing Data:** 2 missing values, representing 0.2% of the dataset.\n", + " * **Data Quality Issue:** Very few missing values, but still needs to be addressed.\n", + " * **Recommendation:**\n", + "\n", + " * **Imputation:** Given the small number of missing values, impute using the mode (most frequent value). From the summary, 'S' appears to be the most frequent.\n", + " * **Investigation:** If possible, investigate the records with missing 'Embarked' values to determine if there is a logical basis for imputation.\n", + "\n", + "**Summary of Recommendations:**\n", + "\n", + "* Address the missing 'Age' values through appropriate imputation techniques.\n", + "* Handle the 'Cabin' column by creating a new binary feature to indicate the presence or absence of cabin information or by extracting useful information from existing cabin values.\n", + "* Impute the missing 'Embarked' values using the mode.\n", + "\n", + "These steps will help improve the data quality and reliability for subsequent analysis and modeling.\u001b[00m\n", + "\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "└── \u001b[1;33m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "└── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "       Status: Executing Task...\n",
+              "    └── 🤖 Agent: Data Quality Analyst\n",
+              "            Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "└── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + " \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "└── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "       Assigned to: Data Quality Analyst\n",
+              "       Status: ✅ Completed\n",
+              "    └── 🤖 Agent: Data Quality Analyst\n",
+              "            Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[32m╭─\u001b[0m\u001b[32m───────────────────────────────────────────────\u001b[0m\u001b[32m Task Completion \u001b[0m\u001b[32m───────────────────────────────────────────────\u001b[0m\u001b[32m─╮\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[1;32mTask Completed\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[37mName: \u001b[0m\u001b[32m1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[37mAgent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" + ], + "text/html": [ + "
╭──────────────────────────────────────────────── Task Completion ────────────────────────────────────────────────╮\n",
+              "                                                                                                                 \n",
+              "  Task Completed                                                                                                 \n",
+              "  Name: 1a1b12c0-5c13-40bc-87fb-2111b26a0890                                                                     \n",
+              "  Agent: Data Quality Analyst                                                                                    \n",
+              "                                                                                                                 \n",
+              "                                                                                                                 \n",
+              "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;33m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "       Status: Executing Task...\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;33m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "       Status: Executing Task...\n",
+              "    └── 🤖 Agent: Statistical Analyst\n",
+              "            Status: In Progress\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mStatistical Analyst\u001b[00m\n", + "\u001b[95m## Task:\u001b[00m \u001b[92mStatistical Analysis Task:\n", + "Review the dataset summary below and identify any numeric columns that exhibit potential outlier behavior.\n", + "Specifically, look for columns where the maximum value far exceeds the mean (e.g., max > 3 × mean) and any unusual spread in the data.\n", + "Include a brief explanation of why each identified column may be problematic. Provide any recommendations for further investigation.\n", + "Dataset Summary:\n", + "No Variable Stats / Values Freqs / (% of Valid) Graph Missing\n", + "1 PassengerId
[int64] Mean (sd) : 446.0 (257.4)
min < med < max:
1.0 < 446.0 < 891.0
IQR (CV) : 445.0 (1.7) 891 distinct values 0
(0.0%)\n", + "2 Survived
[int64] 1. 0
2. 1 549 (61.6%)
342 (38.4%) 0
(0.0%)\n", + "3 Pclass
[int64] 1. 3
2. 1
3. 2 491 (55.1%)
216 (24.2%)
184 (20.7%) 0
(0.0%)\n", + "4 Name
[object] 1. Dooley, Mr. Patrick
2. Braund, Mr. Owen Harris
3. Cumings, Mrs. John Bradley (Fl
4. Heikkinen, Miss. Laina
5. Futrelle, Mrs. Jacques Heath (
6. Allen, Mr. William Henry
7. Moran, Mr. James
8. McCarthy, Mr. Timothy J
9. Palsson, Master. Gosta Leonard
10. Johnson, Mrs. Oscar W (Elisabe
11. other 1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
881 (98.9%) 0
(0.0%)\n", + "5 Sex
[object] 1. male
2. female 577 (64.8%)
314 (35.2%) 0
(0.0%)\n", + "6 Age
[float64] Mean (sd) : 29.7 (14.5)
min < med < max:
0.4 < 28.0 < 80.0
IQR (CV) : 17.9 (2.0) 88 distinct values 177
(19.9%)\n", + "7 SibSp
[int64] 1. 0
2. 1
3. 2
4. 4
5. 3
6. 8
7. 5 608 (68.2%)
209 (23.5%)
28 (3.1%)
18 (2.0%)
16 (1.8%)
7 (0.8%)
5 (0.6%) 0
(0.0%)\n", + "8 Parch
[int64] 1. 0
2. 1
3. 2
4. 5
5. 3
6. 4
7. 6 678 (76.1%)
118 (13.2%)
80 (9.0%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
1 (0.1%) 0
(0.0%)\n", + "9 Ticket
[object] 1. 347082
2. 1601
3. CA. 2343
4. 3101295
5. CA 2144
6. 347088
7. 382652
8. S.O.C. 14879
9. 113760
10. 19950
11. other 7 (0.8%)
7 (0.8%)
7 (0.8%)
6 (0.7%)
6 (0.7%)
6 (0.7%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
4 (0.4%)
834 (93.6%) 0
(0.0%)\n", + "10 Fare
[float64] Mean (sd) : 32.2 (49.7)
min < med < max:
0.0 < 14.5 < 512.3
IQR (CV) : 23.1 (0.6) 248 distinct values 0
(0.0%)\n", + "11 Cabin
[object] 1. nan
2. G6
3. C23 C25 C27
4. B96 B98
5. F2
6. D
7. E101
8. C22 C26
9. F33
10. C83
11. other 687 (77.1%)
4 (0.4%)
4 (0.4%)
4 (0.4%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
2 (0.2%)
175 (19.6%) 687
(77.1%)\n", + "12 Embarked
[object] 1. S
2. C
3. Q
4. nan 644 (72.3%)
168 (18.9%)
77 (8.6%)
2 (0.2%) 2
(0.2%)\n", + "\u001b[00m\n", + "\n", + "\n", + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mStatistical Analyst\u001b[00m\n", + "\u001b[95m## Final Answer:\u001b[00m \u001b[92m\n", + "Based on the provided dataset summary, the following numeric columns exhibit potential outlier behavior:\n", + "\n", + "1. **Fare:**\n", + "\n", + " * **Issue:** The maximum fare (512.3) is significantly greater than three times the mean fare (32.2 \\* 3 = 96.6). This suggests the presence of passengers who paid considerably more than the average fare, potentially indicating outliers.\n", + " * **Explanation:** This large difference between the max and the mean, coupled with the standard deviation (49.7) being larger than the mean (32.2) shows a right-skewed distribution.\n", + " * **Recommendation:** Further investigate the distribution of 'Fare' using histograms and box plots to visually confirm the presence of outliers. Consider transformations (e.g., log transformation) to reduce the impact of these outliers, or explore capping or flooring 'Fare' values at certain percentiles if appropriate for the analysis goals.\n", + "\n", + "2. **Age:**\n", + "\n", + " * **Issue:** The maximum age (80.0) is more than three times the mean age(29.7 * 3 = 89.1), but not significantly, but still worth considering.\n", + " * **Explanation:** The presence of older passengers could be considered outliers depending on the context. Furthermore the 177 missing values must be accounted for before further analysis.\n", + " * **Recommendation:** Depending on the analysis context, these could be legitimate values. Impute the missing values before outlier treatment.\n", + "\n", + "**Additional Considerations:**\n", + "\n", + "* **SibSp and Parch:** While not exceeding the 3x mean threshold, the presence of families with a large number of siblings/spouses or parents/children might warrant further inspection depending on the specific research question. The maximum values for these columns are relatively low, so they are less likely to be problematic outliers.\n", + "* **PassengerId:** This is an index column and not relevant for outlier analysis.\n", + "* **Survived and Pclass:** These are categorical variables encoded as integers and should not be treated as continuous numeric variables for outlier detection.\n", + "\n", + "These recommendations will allow for a more thorough examination of potential outliers in the dataset's numeric columns.\u001b[00m\n", + "\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;33m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "       Status: Executing Task...\n",
+              "    └── 🤖 Agent: Statistical Analyst\n",
+              "            Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;32m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + " \u001b[37m Assigned to: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "       Assigned to: Statistical Analyst\n",
+              "       Status: ✅ Completed\n",
+              "    └── 🤖 Agent: Statistical Analyst\n",
+              "            Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[32m╭─\u001b[0m\u001b[32m───────────────────────────────────────────────\u001b[0m\u001b[32m Task Completion \u001b[0m\u001b[32m───────────────────────────────────────────────\u001b[0m\u001b[32m─╮\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[1;32mTask Completed\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[37mName: \u001b[0m\u001b[32m8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[37mAgent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" + ], + "text/html": [ + "
╭──────────────────────────────────────────────── Task Completion ────────────────────────────────────────────────╮\n",
+              "                                                                                                                 \n",
+              "  Task Completed                                                                                                 \n",
+              "  Name: 8eedb141-4888-4153-adab-2eefd60cf4ad                                                                     \n",
+              "  Agent: Statistical Analyst                                                                                     \n",
+              "                                                                                                                 \n",
+              "                                                                                                                 \n",
+              "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;33m📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "├── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "│      Assigned to: Statistical Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Statistical Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\n",
+              "       Status: Executing Task...\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;33m📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "├── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "│      Assigned to: Statistical Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Statistical Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\n",
+              "       Status: Executing Task...\n",
+              "    └── 🤖 Agent: Predictive Modeling Advisor\n",
+              "            Status: In Progress\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mPredictive Modeling Advisor\u001b[00m\n", + "\u001b[95m## Task:\u001b[00m \u001b[92mPredictive Modeling Insight Task:\n", + "Based on the dataset summary below, recommend which columns might be most informative for building a predictive model.\n", + "Dataset Summary:\n", + "No Variable Stats / Values Freqs / (% of Valid) Graph Missing\n", + "1 PassengerId
[int64] Mean (sd) : 446.0 (257.4)
min < med < max:
1.0 < 446.0 < 891.0
IQR (CV) : 445.0 (1.7) 891 distinct values 0
(0.0%)\n", + "2 Survived
[int64] 1. 0
2. 1 549 (61.6%)
342 (38.4%) 0
(0.0%)\n", + "3 Pclass
[int64] 1. 3
2. 1
3. 2 491 (55.1%)
216 (24.2%)
184 (20.7%) 0
(0.0%)\n", + "4 Name
[object] 1. Dooley, Mr. Patrick
2. Braund, Mr. Owen Harris
3. Cumings, Mrs. John Bradley (Fl
4. Heikkinen, Miss. Laina
5. Futrelle, Mrs. Jacques Heath (
6. Allen, Mr. William Henry
7. Moran, Mr. James
8. McCarthy, Mr. Timothy J
9. Palsson, Master. Gosta Leonard
10. Johnson, Mrs. Oscar W (Elisabe
11. other 1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
1 (0.1%)
881 (98.9%) 0
(0.0%)\n", + "5 Sex
[object] 1. male
2. female 577 (64.8%)
314 (35.2%) 0
(0.0%)\n", + "6 Age
[float64] Mean (sd) : 29.7 (14.5)
min < med < max:
0.4 < 28.0 < 80.0
IQR (CV) : 17.9 (2.0) 88 distinct values 177
(19.9%)\n", + "7 SibSp
[int64] 1. 0
2. 1
3. 2
4. 4
5. 3
6. 8
7. 5 608 (68.2%)
209 (23.5%)
28 (3.1%)
18 (2.0%)
16 (1.8%)
7 (0.8%)
5 (0.6%) 0
(0.0%)\n", + "8 Parch
[int64] 1. 0
2. 1
3. 2
4. 5
5. 3
6. 4
7. 6 678 (76.1%)
118 (13.2%)
80 (9.0%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
1 (0.1%) 0
(0.0%)\n", + "9 Ticket
[object] 1. 347082
2. 1601
3. CA. 2343
4. 3101295
5. CA 2144
6. 347088
7. 382652
8. S.O.C. 14879
9. 113760
10. 19950
11. other 7 (0.8%)
7 (0.8%)
7 (0.8%)
6 (0.7%)
6 (0.7%)
6 (0.7%)
5 (0.6%)
5 (0.6%)
4 (0.4%)
4 (0.4%)
834 (93.6%) 0
(0.0%)\n", + "10 Fare
[float64] Mean (sd) : 32.2 (49.7)
min < med < max:
0.0 < 14.5 < 512.3
IQR (CV) : 23.1 (0.6) 248 distinct values 0
(0.0%)\n", + "11 Cabin
[object] 1. nan
2. G6
3. C23 C25 C27
4. B96 B98
5. F2
6. D
7. E101
8. C22 C26
9. F33
10. C83
11. other 687 (77.1%)
4 (0.4%)
4 (0.4%)
4 (0.4%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
3 (0.3%)
2 (0.2%)
175 (19.6%) 687
(77.1%)\n", + "12 Embarked
[object] 1. S
2. C
3. Q
4. nan 644 (72.3%)
168 (18.9%)
77 (8.6%)
2 (0.2%) 2
(0.2%)\n", + "\u001b[00m\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + "\u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n" + ], + "text/html": [ + "
🤖 Agent: Predictive Modeling Advisor\n",
+              "    Status: In Progress\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;33m📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n", + " ├── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + " │ \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "├── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "│      Assigned to: Statistical Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Statistical Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\n",
+              "       Status: Executing Task...\n",
+              "    ├── 🤖 Agent: Predictive Modeling Advisor\n",
+              "    │       Status: In Progress\n",
+              "    └── 🤖 Agent: Data Quality Analyst\n",
+              "            Status: In Progress\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mData Quality Analyst\u001b[00m\n", + "\u001b[95m## Task:\u001b[00m \u001b[92mBased on the data quality assessment I have, the columns 'Age', 'Cabin', and 'Embarked' have missing values. 'Age' has about 20% missing, 'Cabin' has 77% missing, and 'Embarked' has very few. I plan to impute 'Age' using mean/median/regression, create a 'Cabin_Known' binary feature for 'Cabin', and impute 'Embarked' using the mode. Do you agree with this approach? Are there any alternative strategies or potential pitfalls I should be aware of before moving forward with these columns in predictive modeling?\u001b[00m\n", + "\n", + "\n", + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mData Quality Analyst\u001b[00m\n", + "\u001b[95m## Final Answer:\u001b[00m \u001b[92m\n", + "Your proposed strategies are a good starting point. Refine your approach to 'Age' by exploring different imputation techniques (including regression with caution, and considering a missingness indicator). Your approach to 'Cabin' is excellent. Your approach to 'Embarked' is appropriate given the small number of missing values. Remember to perform a thorough missing data analysis, document your steps, and evaluate your model carefully using appropriate cross-validation techniques and being mindful of data leakage to the test set. Consider algorithms that handle missing values natively.\u001b[00m\n", + "\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;33m📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n", + " ├── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + " │ \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "├── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "│      Assigned to: Statistical Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Statistical Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\n",
+              "       Status: Executing Task...\n",
+              "    ├── 🤖 Agent: Predictive Modeling Advisor\n",
+              "    │       Status: In Progress\n",
+              "    └── 🤖 Agent: Data Quality Analyst\n",
+              "            Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "\n", + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mPredictive Modeling Advisor\u001b[00m\n", + "\u001b[95m## Thought:\u001b[00m \u001b[92mOkay, I need to recommend columns that might be most informative for building a predictive model, and I have some context about data quality and potential outliers to consider.\n", + "First, I'll ask the Data Quality Analyst to confirm my assessment of how to handle the missing values, as that could impact the utility of those columns. Then, I'll ask the Statistical Analyst to provide insight into which of the columns with potential outliers might be most useful for predictive modeling, even with the outliers.\u001b[00m\n", + "\u001b[95m## Using tool:\u001b[00m \u001b[92mAsk question to coworker\u001b[00m\n", + "\u001b[95m## Tool Input:\u001b[00m \u001b[92m\n", + "\"{\\\"question\\\": \\\"Based on the data quality assessment I have, the columns 'Age', 'Cabin', and 'Embarked' have missing values. 'Age' has about 20% missing, 'Cabin' has 77% missing, and 'Embarked' has very few. I plan to impute 'Age' using mean/median/regression, create a 'Cabin_Known' binary feature for 'Cabin', and impute 'Embarked' using the mode. Do you agree with this approach? Are there any alternative strategies or potential pitfalls I should be aware of before moving forward with these columns in predictive modeling?\\\", \\\"context\\\": \\\"Dataset contains missing values in columns 'Age', 'Cabin' and 'Embarked'. Need to know if the imputation strategy is appropriate and if not, what would be the correct one\\\", \\\"coworker\\\": \\\"Data Quality Analyst\\\"}\"\u001b[00m\n", + "\u001b[95m## Tool Output:\u001b[00m \u001b[92m\n", + "Your proposed strategies are a good starting point. Refine your approach to 'Age' by exploring different imputation techniques (including regression with caution, and considering a missingness indicator). Your approach to 'Cabin' is excellent. Your approach to 'Embarked' is appropriate given the small number of missing values. Remember to perform a thorough missing data analysis, document your steps, and evaluate your model carefully using appropriate cross-validation techniques and being mindful of data leakage to the test set. Consider algorithms that handle missing values natively.\u001b[00m\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "\u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;34m🧠 \u001b[0m\u001b[34mThinking...\u001b[0m\n" + ], + "text/html": [ + "
🤖 Agent: Data Quality Analyst\n",
+              "    Status: ✅ Completed\n",
+              "└── 🧠 Thinking...\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "\u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🤖 Agent: Data Quality Analyst\n",
+              "    Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "\u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🤖 Agent: Data Quality Analyst\n",
+              "    Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;33m📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n", + " ├── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + " │ \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n", + " ├── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + " │ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "├── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "│      Assigned to: Statistical Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Statistical Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\n",
+              "       Status: Executing Task...\n",
+              "    ├── 🤖 Agent: Predictive Modeling Advisor\n",
+              "    │       Status: In Progress\n",
+              "    ├── 🤖 Agent: Data Quality Analyst\n",
+              "    │       Status: ✅ Completed\n",
+              "    └── 🤖 Agent: Statistical Analyst\n",
+              "            Status: In Progress\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mStatistical Analyst\u001b[00m\n", + "\u001b[95m## Task:\u001b[00m \u001b[92mBased on the dataset summary, 'Fare' and 'Age' exhibit potential outlier behavior, where the maximum values are significantly larger than the mean. I plan to investigate the distributions and potentially apply transformations (e.g., log transform) or capping/flooring. Do you think these columns, even with potential outliers, are likely to be informative for predicting 'Survived'? Are there any other columns that I should examine for potential non-linear relationships or interactions with other features that might be relevant for predictive modeling?\u001b[00m\n", + "\n", + "\n", + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mStatistical Analyst\u001b[00m\n", + "\u001b[95m## Final Answer:\u001b[00m \u001b[92m\n", + "Yes, even with potential outliers, both 'Fare' and 'Age' are likely to be informative for predicting 'Survived.' Here's why:\n", + "\n", + "* **Fare:** Ticket fare is often correlated with socio-economic status, which historically has a strong relationship with survival rates on the Titanic. Higher fares typically meant a higher class cabin located on upper decks, which had better access to lifeboats. Even with extreme values, the 'Fare' column likely captures important information about a passenger's social standing and priority during the evacuation. The outliers themselves might be informative; extremely high fares could represent first-class passengers who received preferential treatment.\n", + "\n", + "* **Age:** Age can also be a significant factor. Survival rates often differ between age groups, with children and the elderly sometimes receiving priority (though this might vary based on the specific event). Outliers in 'Age' (very old passengers) could represent a vulnerable group. Conversely, very young passengers may have been prioritized. Furthermore, even if age doesn't have a perfectly linear relationship with survival, it can still be a useful predictor when modeled appropriately (e.g., using splines or binning).\n", + "\n", + "Recommendations for handling 'Fare' and 'Age':\n", + "\n", + "1. **Explore the Distributions:** Visualize the distributions using histograms, box plots, and quantile plots to understand the extent and nature of the outliers. Look for skewness and potential multi-modality (multiple peaks).\n", + "\n", + "2. **Outlier Treatment:** Consider the following approaches:\n", + "\n", + " * **Transformation:** A log transformation can help reduce the impact of extreme values and make the distribution more symmetrical. However, be cautious about applying log transformation to zero values (you may need to add a small constant).\n", + " * **Winsorizing/Capping:** Limit extreme values to a certain percentile (e.g., 95th or 99th). This reduces the influence of outliers without completely removing them.\n", + " * **Binning:** Group ages into categories (e.g., children, young adults, adults, seniors). This can capture non-linear relationships.\n", + " * **No Treatment:** Depending on the modeling algorithm (tree-based models are relatively robust to outliers) and the extent of the outliers' influence on model performance, you might choose to leave them as is.\n", + "\n", + "3. **Interaction Effects:** Explore potential interactions between 'Fare' and 'Age' with other features:\n", + "\n", + " * **Fare and Pclass:** The combination of fare and passenger class ('Pclass') can provide a more nuanced view of socio-economic status. For example, a high fare in a lower class might indicate a special circumstance or a larger group.\n", + " * **Age and Sex:** Survival patterns might differ significantly between male and female passengers within specific age groups. This interaction is almost certainly important.\n", + " * **Age and SibSp/Parch:** The number of siblings/spouses ('SibSp') and parents/children ('Parch') traveling with a passenger might influence survival chances, especially for children and the elderly. Traveling with family might mean higher priority for assistance or, conversely, more difficulty in evacuating.\n", + "\n", + "Other Columns to Examine for Non-Linear Relationships and Interactions:\n", + "\n", + "* **Pclass:** Passenger class is inherently categorical, but its relationship with 'Survived' may not be linear. Consider creating dummy variables or using an ordinal encoding (if you believe there's a natural ordering). Interact 'Pclass' with 'Sex' and 'Age'.\n", + "\n", + "* **SibSp and Parch:** These represent family size. Instead of treating them as continuous variables, consider creating a 'FamilySize' feature (SibSp + Parch + 1). You could also create a binary feature indicating whether a passenger was traveling alone. The relationship between family size and survival may not be linear (e.g., larger families might face more challenges).\n", + "\n", + "* **Embarked:** The port of embarkation might be correlated with survival due to class distribution or lifeboat availability. Create dummy variables for this feature. Interactions with 'Pclass' are likely here.\n", + "\n", + "* **Name:** While seemingly irrelevant, the 'Name' column can be used to extract titles (e.g., \"Mr.,\" \"Mrs.,\" \"Dr.,\" \"Master\"). These titles can be indicative of social status or age (e.g., \"Master\" typically refers to young boys). Create a new feature 'Title' and explore its relationship with 'Survived,' potentially interacting it with 'Sex' and 'Age'.\n", + "\n", + "* **Cabin:** If the 'Cabin' column has sufficient data, the cabin location could be correlated with survival rates. Extract the cabin deck (e.g., 'A', 'B', 'C') and treat it as a categorical variable. Many values are missing, so handle with care (missing could be a meaningful category).\n", + "\n", + "In summary, 'Fare' and 'Age' are likely valuable predictors despite the presence of outliers. Carefully explore their distributions, consider appropriate transformations or capping methods, and investigate potential interaction effects with other features, particularly 'Pclass,' 'Sex,' and family size variables. Also, scrutinize other categorical or quasi-categorical columns like 'Pclass', 'Embarked', 'SibSp', 'Parch' and derive features from 'Name' and 'Cabin' to potentially improve predictive power. Always validate your choices using appropriate evaluation metrics and cross-validation to avoid overfitting.\u001b[00m\n", + "\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;33m📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n", + " ├── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + " │ \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n", + " ├── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + " │ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "├── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "│      Assigned to: Statistical Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Statistical Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\n",
+              "       Status: Executing Task...\n",
+              "    ├── 🤖 Agent: Predictive Modeling Advisor\n",
+              "    │       Status: In Progress\n",
+              "    ├── 🤖 Agent: Data Quality Analyst\n",
+              "    │       Status: ✅ Completed\n",
+              "    └── 🤖 Agent: Statistical Analyst\n",
+              "            Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "\n", + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mPredictive Modeling Advisor\u001b[00m\n", + "\u001b[95m## Thought:\u001b[00m \u001b[92mThought: Now that the Data Quality Analyst has confirmed my assessment, I can ask the Statistical Analyst to help determine the most useful columns for the predictive model, given the potential outlier issues.\u001b[00m\n", + "\u001b[95m## Using tool:\u001b[00m \u001b[92mAsk question to coworker\u001b[00m\n", + "\u001b[95m## Tool Input:\u001b[00m \u001b[92m\n", + "\"{\\\"question\\\": \\\"Based on the dataset summary, 'Fare' and 'Age' exhibit potential outlier behavior, where the maximum values are significantly larger than the mean. I plan to investigate the distributions and potentially apply transformations (e.g., log transform) or capping/flooring. Do you think these columns, even with potential outliers, are likely to be informative for predicting 'Survived'? Are there any other columns that I should examine for potential non-linear relationships or interactions with other features that might be relevant for predictive modeling?\\\", \\\"context\\\": \\\"Dataset has potential outlier issues in 'Fare' and 'Age' columns. Need to know if they are useful for prediction and if there are any other interaction effects to consider.\\\", \\\"coworker\\\": \\\"Statistical Analyst\\\"}\"\u001b[00m\n", + "\u001b[95m## Tool Output:\u001b[00m \u001b[92m\n", + "Yes, even with potential outliers, both 'Fare' and 'Age' are likely to be informative for predicting 'Survived.' Here's why:\n", + "\n", + "* **Fare:** Ticket fare is often correlated with socio-economic status, which historically has a strong relationship with survival rates on the Titanic. Higher fares typically meant a higher class cabin located on upper decks, which had better access to lifeboats. Even with extreme values, the 'Fare' column likely captures important information about a passenger's social standing and priority during the evacuation. The outliers themselves might be informative; extremely high fares could represent first-class passengers who received preferential treatment.\n", + "\n", + "* **Age:** Age can also be a significant factor. Survival rates often differ between age groups, with children and the elderly sometimes receiving priority (though this might vary based on the specific event). Outliers in 'Age' (very old passengers) could represent a vulnerable group. Conversely, very young passengers may have been prioritized. Furthermore, even if age doesn't have a perfectly linear relationship with survival, it can still be a useful predictor when modeled appropriately (e.g., using splines or binning).\n", + "\n", + "Recommendations for handling 'Fare' and 'Age':\n", + "\n", + "1. **Explore the Distributions:** Visualize the distributions using histograms, box plots, and quantile plots to understand the extent and nature of the outliers. Look for skewness and potential multi-modality (multiple peaks).\n", + "\n", + "2. **Outlier Treatment:** Consider the following approaches:\n", + "\n", + " * **Transformation:** A log transformation can help reduce the impact of extreme values and make the distribution more symmetrical. However, be cautious about applying log transformation to zero values (you may need to add a small constant).\n", + " * **Winsorizing/Capping:** Limit extreme values to a certain percentile (e.g., 95th or 99th). This reduces the influence of outliers without completely removing them.\n", + " * **Binning:** Group ages into categories (e.g., children, young adults, adults, seniors). This can capture non-linear relationships.\n", + " * **No Treatment:** Depending on the modeling algorithm (tree-based models are relatively robust to outliers) and the extent of the outliers' influence on model performance, you might choose to leave them as is.\n", + "\n", + "3. **Interaction Effects:** Explore potential interactions between 'Fare' and 'Age' with other features:\n", + "\n", + " * **Fare and Pclass:** The combination of fare and passenger class ('Pclass') can provide a more nuanced view of socio-economic status. For example, a high fare in a lower class might indicate a special circumstance or a larger group.\n", + " * **Age and Sex:** Survival patterns might differ significantly between male and female passengers within specific age groups. This interaction is almost certainly important.\n", + " * **Age and SibSp/Parch:** The number of siblings/spouses ('SibSp') and parents/children ('Parch') traveling with a passenger might influence survival chances, especially for children and the elderly. Traveling with family might mean higher priority for assistance or, conversely, more difficulty in evacuating.\n", + "\n", + "Other Columns to Examine for Non-Linear Relationships and Interactions:\n", + "\n", + "* **Pclass:** Passenger class is inherently categorical, but its relationship with 'Survived' may not be linear. Consider creating dummy variables or using an ordinal encoding (if you believe there's a natural ordering). Interact 'Pclass' with 'Sex' and 'Age'.\n", + "\n", + "* **SibSp and Parch:** These represent family size. Instead of treating them as continuous variables, consider creating a 'FamilySize' feature (SibSp + Parch + 1). You could also create a binary feature indicating whether a passenger was traveling alone. The relationship between family size and survival may not be linear (e.g., larger families might face more challenges).\n", + "\n", + "* **Embarked:** The port of embarkation might be correlated with survival due to class distribution or lifeboat availability. Create dummy variables for this feature. Interactions with 'Pclass' are likely here.\n", + "\n", + "* **Name:** While seemingly irrelevant, the 'Name' column can be used to extract titles (e.g., \"Mr.,\" \"Mrs.,\" \"Dr.,\" \"Master\"). These titles can be indicative of social status or age (e.g., \"Master\" typically refers to young boys). Create a new feature 'Title' and explore its relationship with 'Survived,' potentially interacting it with 'Sex' and 'Age'.\n", + "\n", + "* **Cabin:** If the 'Cabin' column has sufficient data, the cabin location could be correlated with survival rates. Extract the cabin deck (e.g., 'A', 'B', 'C') and treat it as a categorical variable. Many values are missing, so handle with care (missing could be a meaningful category).\n", + "\n", + "In summary, 'Fare' and 'Age' are likely valuable predictors despite the presence of outliers. Carefully explore their distributions, consider appropriate transformations or capping methods, and investigate potential interaction effects with other features, particularly 'Pclass,' 'Sex,' and family size variables. Also, scrutinize other categorical or quasi-categorical columns like 'Pclass', 'Embarked', 'SibSp', 'Parch' and derive features from 'Name' and 'Cabin' to potentially improve predictive power. Always validate your choices using appropriate evaluation metrics and cross-validation to avoid overfitting.\u001b[00m\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "\u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;34m🧠 \u001b[0m\u001b[34mThinking...\u001b[0m\n" + ], + "text/html": [ + "
🤖 Agent: Statistical Analyst\n",
+              "    Status: ✅ Completed\n",
+              "└── 🧠 Thinking...\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "\u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🤖 Agent: Statistical Analyst\n",
+              "    Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "\n", + "\u001b[1m\u001b[95m# Agent:\u001b[00m \u001b[1m\u001b[92mPredictive Modeling Advisor\u001b[00m\n", + "\u001b[95m## Final Answer:\u001b[00m \u001b[92m\n", + "['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked', 'Name', 'Cabin']\u001b[00m\n", + "\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;33m📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[2;33mExecuting Task...\u001b[0m\n", + " ├── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + " │ \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n", + " ├── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + " │ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "├── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "│      Assigned to: Statistical Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Statistical Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\n",
+              "       Status: Executing Task...\n",
+              "    ├── 🤖 Agent: Predictive Modeling Advisor\n",
+              "    │       Status: In Progress\n",
+              "    ├── 🤖 Agent: Data Quality Analyst\n",
+              "    │       Status: ✅ Completed\n",
+              "    └── 🤖 Agent: Predictive Modeling Advisor\n",
+              "            Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1;36m🚀 Crew: \u001b[0m\u001b[1;36mcrew\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "├── \u001b[1;32m📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\u001b[0m\n", + "│ \u001b[37m Assigned to: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "│ └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mStatistical Analyst\u001b[0m\n", + "│ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + "└── \u001b[1;32m📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\u001b[0m\n", + " \u001b[37m Assigned to: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + " ├── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + " │ \u001b[37m Status: \u001b[0m\u001b[1;32mIn Progress\u001b[0m\n", + " ├── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mData Quality Analyst\u001b[0m\n", + " │ \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n", + " └── \u001b[1;32m🤖 Agent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m\n", + " \u001b[37m Status: \u001b[0m\u001b[1;32m✅ Completed\u001b[0m\n" + ], + "text/html": [ + "
🚀 Crew: crew\n",
+              "├── 📋 Task: 1a1b12c0-5c13-40bc-87fb-2111b26a0890\n",
+              "│      Assigned to: Data Quality Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Data Quality Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "├── 📋 Task: 8eedb141-4888-4153-adab-2eefd60cf4ad\n",
+              "│      Assigned to: Statistical Analyst\n",
+              "│      Status: ✅ Completed\n",
+              "│   └── 🤖 Agent: Statistical Analyst\n",
+              "│           Status: ✅ Completed\n",
+              "└── 📋 Task: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\n",
+              "       Assigned to: Predictive Modeling Advisor\n",
+              "       Status: ✅ Completed\n",
+              "    ├── 🤖 Agent: Predictive Modeling Advisor\n",
+              "    │       Status: In Progress\n",
+              "    ├── 🤖 Agent: Data Quality Analyst\n",
+              "    │       Status: ✅ Completed\n",
+              "    └── 🤖 Agent: Predictive Modeling Advisor\n",
+              "            Status: ✅ Completed\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[32m╭─\u001b[0m\u001b[32m───────────────────────────────────────────────\u001b[0m\u001b[32m Task Completion \u001b[0m\u001b[32m───────────────────────────────────────────────\u001b[0m\u001b[32m─╮\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[1;32mTask Completed\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[37mName: \u001b[0m\u001b[32maeb9dae7-a36c-4e1f-a4f7-968f7e6e0145\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[37mAgent: \u001b[0m\u001b[32mPredictive Modeling Advisor\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" + ], + "text/html": [ + "
╭──────────────────────────────────────────────── Task Completion ────────────────────────────────────────────────╮\n",
+              "                                                                                                                 \n",
+              "  Task Completed                                                                                                 \n",
+              "  Name: aeb9dae7-a36c-4e1f-a4f7-968f7e6e0145                                                                     \n",
+              "  Agent: Predictive Modeling Advisor                                                                             \n",
+              "                                                                                                                 \n",
+              "                                                                                                                 \n",
+              "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[32m╭─\u001b[0m\u001b[32m───────────────────────────────────────────────\u001b[0m\u001b[32m Crew Completion \u001b[0m\u001b[32m───────────────────────────────────────────────\u001b[0m\u001b[32m─╮\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[1;32mCrew Execution Completed\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[37mName: \u001b[0m\u001b[32mcrew\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[37mID: \u001b[0m\u001b[32mfb25122b-a197-4be3-98e2-7187488389ea\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n", + "\u001b[32m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" + ], + "text/html": [ + "
╭──────────────────────────────────────────────── Crew Completion ────────────────────────────────────────────────╮\n",
+              "                                                                                                                 \n",
+              "  Crew Execution Completed                                                                                       \n",
+              "  Name: crew                                                                                                     \n",
+              "  ID: fb25122b-a197-4be3-98e2-7187488389ea                                                                       \n",
+              "                                                                                                                 \n",
+              "                                                                                                                 \n",
+              "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "
\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Crew Output:\n", + "['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked', 'Name', 'Cabin']\n" + ] + } + ] + } + ] +} \ No newline at end of file