{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":91844,"databundleVersionId":11361821,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### **Introdução e gráficos retirados do notebook do [Jeferson Souza Pazze](https://www.kaggle.com/code/jefersonpazze/eda-baseline-birdclef-2024)**\n<br>\n\n**Outras abordagens de modelagem e EDA:**\n\nhttps://www.kaggle.com/competitions/birdclef-2025/discussion/567507\n\nhttps://www.kaggle.com/competitions/birdclef-2025/discussion/567499\n","metadata":{}},{"cell_type":"markdown","source":"# BirdCLEF 2024 - EDA\nThank you for having a look at my notebook - advice and feedback always welcomed!\n\n📌 Dataset Link: https://www.kaggle.com/competitions/birdclef-2024/data\nExploratory Data Analysis (EDA)\nEDA is a crucial step in understanding and preparing your data for any data analysis or machine learning project. Here's a step-by-step guide on how to perform an EDA for this dataset:\n\n## Overview\n\nIn this competition, you will be predicting default of clients based on internal and external information that are available for each client. Scoring is performed using custom metric that not only evaluates the AUC of predictions but also considers the stability of predictions model across the data range of the test set. To better understand this metric.\n\n## Data Collection:\n\nThis dataset contains a large number of tables as a result of utilizing diverse data sources and the varying levels of data aggregation used while preparing the dataset. Note: All files listed below are found in both .csv and .parquet formats.\n\n## Data Loading:\n\nImport the dataset into your preferred data analysis environment, such as Python with libraries like pandas, numpy, and matplotlib/seaborn for visualization.\n\nInitial Exploration:\n### 1 - Start by examining the basic characteristics of the data:\n\nCheck the first few rows using df.head().<br>\nCheck the data types and missing values using df.info().<br>\nCalculate basic statistics using df.describe().<br><br>\n## Data Cleaning:\n### 2 - Handle missing values, outliers, and duplicates:\n\nUse techniques like imputation for missing values.<br>\nIdentify and deal with outliers appropriately.<br>\nRemove duplicate rows if necessary.<br><br>\n### 3 - Data Visualization:\n\nCreate visualizations to gain insights into the data:<br>\nHistograms and box plots for numerical features.<br>\nBar plots for categorical features.<br>\nCorrelation matrix and scatter plots to understand relationships between variables.<br><br>\n### 4 - Feature Analysis:\n\nExplore relationships between features and the target variable(s) for classification and outlier detection.<br>\nVisualize how different features vary across different subtypes or classes.<br>\nUse box plots, violin plots, or swarm plots to compare feature distributions.<br><br>\n### 5 - Outlier Detection:\n\nIf your dataset contains information related to outlier detection, perform a dedicated EDA for this aspect:<br>\nVisualize outliers using scatter plots or box plots.<br>\nApply statistical methods or machine learning techniques to identify outliers.<br><br>\n### 6 - Dimensionality Reduction (optional):\n\nIf the dataset has many features, consider dimensionality reduction techniques like Principal Component Analysis <br>(PCA) to reduce the number of variables while preserving important information.<br><br>\n### 8 - Summary and Insights:\n\nSummarize your findings from the EDA, including any patterns, trends, or anomalies observed.<br>\nDocument any data preprocessing steps applied.<br><br>\n### 7 - Next Steps:\n\nBased on your EDA findings, plan your next steps, which may include feature engineering, model selection, and further data preprocessing.\nRemember that EDA is an iterative process, and you may need to revisit these steps as you delve deeper into the dataset and develop your machine learning or data analysis models.","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nfrom datetime import datetime\nfrom datetime import time\n\n#Visualização\nimport matplotlib.pyplot as plt\nimport plotly.express as px\nimport seaborn as sns\n\n#Audio\nimport torchaudio\nfrom IPython.display import Audio\n\n'''\nsilero-vad -- biblioteca para reconhecimento de voz humana nos áudios\nlibrosa    -- biblioteca para carregar/manipular arquivos de audio\n'''","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T23:46:21.688136Z","iopub.execute_input":"2025-04-02T23:46:21.688497Z","iopub.status.idle":"2025-04-02T23:46:21.696221Z","shell.execute_reply.started":"2025-04-02T23:46:21.688471Z","shell.execute_reply":"2025-04-02T23:46:21.694860Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"root = '/kaggle/input/birdclef-2025'\ntrainAudios = os.path.join(root, 'train_audio')\ntrainSoundscapes = os.path.join(root, 'train_soundscapes')\ntest_soundscapes = os.path.join(root, 'test_soundscapes')\n\ndf = pd.read_csv(os.path.join(root, 'train.csv'))\nrecording_location = os.path.join(root, 'recording_location.txt')\ntaxonomy = pd.read_csv(os.path.join(root, 'taxonomy.csv'))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T23:20:18.785140Z","iopub.execute_input":"2025-04-02T23:20:18.785798Z","iopub.status.idle":"2025-04-02T23:20:19.040315Z","shell.execute_reply.started":"2025-04-02T23:20:18.785759Z","shell.execute_reply":"2025-04-02T23:20:19.039568Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### train.csv  \n\nUma ampla variedade de metadados é fornecida para os dados de treinamento. Os campos mais relevantes são:  \n\n- **primary_label**: Código da espécie (código eBird para pássaros, ID de táxon do iNaturalist para não-pássaros). Para informações detalhadas sobre a espécie, adicione os códigos às URLs do eBird ou iNaturalist, como [Great Tinamou](https://ebird.org/species/gretin1) ou [Red Snouted Tree Frog](https://www.inaturalist.org/taxa/24322). Nem todas as espécies possuem páginas próprias; alguns links podem falhar.  \n- **secondary_labels**: Lista de espécies que também foram marcadas como presentes na gravação pelo registrador. Pode estar incompleta.  \n- **latitude & longitude**: Coordenadas onde a gravação foi feita. Algumas espécies de pássaros podem ter \"dialetos\" locais, então buscar diversidade geográfica pode ser útil para o treinamento.  \n- **author**: Usuário que forneceu a gravação. Se não houver nome, o autor é desconhecido.  \n- **filename**: Nome do arquivo de áudio associado.  \n- **rating**: Valores de 1 a 5 (1 - baixa qualidade, 5 - alta qualidade), fornecidos pelos usuários do Xeno-canto; 0 indica que não há avaliação disponível. O iNaturalist e o CSA não fornecem classificações de qualidade.  \n- **collection**: Pode ser **XC**, **iNat** ou **CSA**, indicando de qual coleção a gravação veio. Os nomes dos arquivos também fazem referência à coleção e ao ID dentro dela.","metadata":{}},{"cell_type":"code","source":"df['class_name'] = df['primary_label'].map(taxonomy.set_index('primary_label')['class_name'])\ndf.head(3)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T23:26:49.138772Z","iopub.execute_input":"2025-04-02T23:26:49.139097Z","iopub.status.idle":"2025-04-02T23:26:49.179260Z","shell.execute_reply.started":"2025-04-02T23:26:49.139072Z","shell.execute_reply":"2025-04-02T23:26:49.178365Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Visualização e reprodução dos áudios\n\nOs dados de treinamento consistem em gravações curtas de sons individuais de pássaros, anfíbios, mamíferos e insetos, generosamente enviadas por usuários do **xeno-canto.org**, **iNaturalist** e do **Colombian Sound Archive (CSA)** do Instituto Humboldt para Pesquisa de Recursos Biológicos na Colômbia.  \n\nEsses arquivos foram remuestreados para **32 kHz** (quando aplicável) para corresponder ao áudio do conjunto de teste e convertidos para o formato **ogg**.  \n\nOs nomes dos arquivos seguem o padrão: **[coleção][ID_arquivo_na_coleção].ogg**.  \n\nO conjunto de treinamento já contém quase todos os arquivos relevantes. Não há expectativa de benefício em buscar mais arquivos no **xeno-canto.org** ou **iNaturalist**, e a colaboração na redução da carga em seus servidores é apreciada. Caso contrário, siga as regras de scraping desses portais de dados.","metadata":{}},{"cell_type":"code","source":"data, rate = torchaudio.load(os.path.join(trainAudios, df['filename'][28000]))\n\ndisplay(Audio(data[0, :rate*5], rate = rate))\npx.line(y=data[0, :rate*5], title=df.common_name[28000])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T23:26:51.360674Z","iopub.execute_input":"2025-04-02T23:26:51.361008Z","iopub.status.idle":"2025-04-02T23:26:52.457096Z","shell.execute_reply.started":"2025-04-02T23:26:51.360984Z","shell.execute_reply":"2025-04-02T23:26:52.455877Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Visualização da distribuição das espécies ao redor do globo","metadata":{}},{"cell_type":"code","source":"fig = px.scatter_mapbox(df, lat='latitude', lon='longitude', color='primary_label', \n                        hover_name='primary_label', hover_data=['latitude', 'longitude', 'common_name', 'class_name'], \n                        title='Geographical Distribution of Species',\n                        zoom=1, height=600)\n\nfig.update_layout(mapbox_style=\"open-street-map\")\nfig.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T23:26:52.965933Z","iopub.execute_input":"2025-04-02T23:26:52.966295Z","iopub.status.idle":"2025-04-02T23:26:54.115642Z","shell.execute_reply.started":"2025-04-02T23:26:52.966264Z","shell.execute_reply":"2025-04-02T23:26:54.114159Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.groupby('class_name')['collection'].count()/len(df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T23:26:54.180501Z","iopub.execute_input":"2025-04-02T23:26:54.180868Z","iopub.status.idle":"2025-04-02T23:26:54.192982Z","shell.execute_reply.started":"2025-04-02T23:26:54.180842Z","shell.execute_reply":"2025-04-02T23:26:54.191930Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Distribuição das classes no dataset\nplt.figure(figsize=(12, 6))\nsns.countplot(x='class_name', data=df, order=df['class_name'].value_counts().index)\nplt.title('Distribution of Classes')\nplt.xlabel('Class Name')\nplt.ylabel('Count')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T23:39:50.889630Z","iopub.execute_input":"2025-04-02T23:39:50.890008Z","iopub.status.idle":"2025-04-02T23:39:51.071105Z","shell.execute_reply.started":"2025-04-02T23:39:50.889977Z","shell.execute_reply":"2025-04-02T23:39:51.070042Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.loc[(df['secondary_labels'] != \"['']\") & (df['collection'] == 'XC')].head()\n# Apenas os audios do xeno canto possuem secondary_labels, e ainda são a minoria deles","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T21:32:34.785914Z","iopub.execute_input":"2025-04-02T21:32:34.786256Z","iopub.status.idle":"2025-04-02T21:32:34.807396Z","shell.execute_reply.started":"2025-04-02T21:32:34.786221Z","shell.execute_reply":"2025-04-02T21:32:34.805732Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### train_soundscapes/\n\nDados de áudio não rotulados das mesmas localidades de gravação dos soundscapes de teste.  \n\nOs nomes dos arquivos seguem o formato: **[localização]_[data]_[hora_local].ogg**.  \n\nEmbora tenham sido gravados no mesmo local geral, os pontos exatos das gravações dos soundscapes não rotulados **NÃO** coincidem com os locais das gravações do conjunto de teste oculto.","metadata":{}},{"cell_type":"code","source":"# Fazendo um dataframe com os dados sem rótulos fornecidos pela competição\n\nsoundscapes = pd.DataFrame(columns=['file','site', 'date', 'local_time'])\n\nfor f in os.listdir(trainSoundscapes):\n\n    aux = os.path.basename(f).replace('.ogg', '').split('_')\n    site = aux[0]\n    date = datetime.strptime(aux[1], \"%Y%m%d\").strftime(\"%Y/%m/%d\")\n    local_time = time(int(aux[2][:2]), int(aux[2][2:4]), int(aux[2][4:6]))\n\n    new_row = pd.DataFrame([[f, site, date, local_time]], columns=['file', 'site', 'date', 'local_time'])\n    soundscapes = pd.concat([soundscapes, new_row], axis=0, ignore_index=True)\n\nsoundscapes","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T23:30:11.353908Z","iopub.execute_input":"2025-04-02T23:30:11.354219Z","iopub.status.idle":"2025-04-02T23:30:17.993652Z","shell.execute_reply.started":"2025-04-02T23:30:11.354197Z","shell.execute_reply":"2025-04-02T23:30:17.992627Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"soundscapes['site'].value_counts()/len(soundscapes)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T23:40:57.089704Z","iopub.execute_input":"2025-04-02T23:40:57.090142Z","iopub.status.idle":"2025-04-02T23:40:57.103761Z","shell.execute_reply.started":"2025-04-02T23:40:57.090108Z","shell.execute_reply":"2025-04-02T23:40:57.102582Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nfig, axs = plt.subplots(1, 1, figsize=(10,5))\naxs.hist(soundscapes['local_time'].map(lambda x: x.hour), histtype='bar', rwidth=0.8)\naxs.set_title('Distribuição das amostras pelo tempo')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T21:32:42.048524Z","iopub.execute_input":"2025-04-02T21:32:42.048854Z","iopub.status.idle":"2025-04-02T21:32:42.206774Z","shell.execute_reply.started":"2025-04-02T21:32:42.048823Z","shell.execute_reply":"2025-04-02T21:32:42.205828Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Conclusões:\n\n1. Classes desbalanceadas:\n   * Aves: 97%\n   * Amphibia: 2%\n   * Insecta: 0,54%\n   * Mammalia: 0,62%\n2. A maior parte dos dados ocorrem nas américas:\n   * inserir a proporção de ocorrencias por continente\n   * verificar as espécies que ocorrem fora da américa do sul/central\n3. Os dados sem rótulo parecem apresentar distribuições balanceadas dos seus dados","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}