Выполнение анализа метеорологических данных

Анализ данных — это практика работы с данными для сбора полезной информации, которую затем можно использовать для принятия обоснованных решений. Простой пример анализа данных: всякий раз, когда мы принимаем какое-либо решение в нашей повседневной жизни, мы думаем о том, что произошло в прошлый раз или что произойдет, если мы выберем это конкретное решение. Это не что иное, как анализ нашего прошлого или будущего и принятие решений на его основе.

Метеорологические данные наблюдений — данные, состоящие из физических параметров, которые измеряются непосредственно приборами и включают температуру, точку росы, направление ветра, скорость ветра, облачный покров, слой(я) облаков, высоту потолка, видимость, Текущая погода и количество осадков.

Цель:

Основная цель — выполнить очистку данных, выполнить анализ для проверки влияния глобального потепления на температуру и влажность и, наконец, сделать вывод.

Набор данных:

Набор данных можно получить на Kaggle. В наборе данных есть почасовая температура, зарегистрированная за последние 10 лет, начиная с 01.04.2006 00:00:00.000 +0200 до 09.09.2016 23:00:00.000 +0200. Он соответствует Финляндии, стране в Северной Европе.

URL-адрес источника: https://www.kaggle.com/muthuj7/weather-dataset

Подготовка и очистка набора данных

  1. Библиотеки:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

2. Загрузка набора данных:

data = pd.read_csv('weatherHistory.csv')
data.head()

Размеры фрейма данных можно получить с помощью data.shape() следующим образом.

data.shape
Output:
(96453, 12)

Общее количество строк и столбцов в наборе данных составляет 96453 и 12 соответственно.

Функция data.info() используется для получения краткой сводки фрейма данных. Это удобно при проведении исследовательского анализа данных.

data.info()
Output:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 96453 entries, 0 to 96452
Data columns (total 12 columns):
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 0   Formatted Date            96453 non-null  object 
 1   Summary                   96453 non-null  object 
 2   Precip Type               95936 non-null  object 
 3   Temperature (C)           96453 non-null  float64
 4   Apparent Temperature (C)  96453 non-null  float64
 5   Humidity                  96453 non-null  float64
 6   Wind Speed (km/h)         96453 non-null  float64
 7   Wind Bearing (degrees)    96453 non-null  float64
 8   Visibility (km)           96453 non-null  float64
 9   Loud Cover                96453 non-null  float64
 10  Pressure (millibars)      96453 non-null  float64
 11  Daily Summary             96453 non-null  object 
dtypes: float64(8), object(4)
memory usage: 8.8+ MB

Статистические данные фрейма данных можно получить с помощью функции describe().

Проверка любого отсутствующего значения

data.isnull().sum()
Output:
Formatted Date                0
Summary                       0
Precip Type                 517
Temperature (C)               0
Apparent Temperature (C)      0
Humidity                      0
Wind Speed (km/h)             0
Wind Bearing (degrees)        0
Visibility (km)               0
Loud Cover                    0
Pressure (millibars)          0
Daily Summary                 0
dtype: int64

В «Тип преципа» пропущено 517 значений. Уникальные значения столбца получаются с помощью функции unique().

data['Loud Cover'].unique()
Output:
array([0.])

Мы можем удалить ненужные столбцы, которые не добавляют ценности анализу, с помощью функции drop(). Мы опустим параметр «Громкая обложка», так как он имеет единственное уникальное значение 0 и бесполезен для анализа.

data = data.drop([‘Loud Cover’], axis = 1)

Корреляция всех столбцов во фрейме данных:

Матрицы корреляции – важный инструмент исследовательского анализа данных. Тепловые карты корреляции содержат ту же информацию в визуально привлекательном виде. Мы можем отобразить парную корреляцию, используя функцию corr(), которая создает матрицу корреляции между всеми функциями в наборе данных.

plt.figure(figsize=(10,8))
sns.heatmap(data= data.corr(), annot=True, cmap = 'Blues')
plt.title("Correlation of all columns in the dataframe")
plt.show()

Измените функцию «Форматированная дата» со строки на дату и время, используя функцию datetime().

data[‘Formatted Date’] = pd.to_datetime(data[‘Formatted Date’],
utc=True)

Мы можем установить«Форматированную дату» в качестве индекса, используя функцию set_index(), которая устанавливает индекс DataFrame (метки строк), используя один или несколько существующих столбцов.

data.nunique()
Output:
Formatted Date              96429
Summary                        27
Precip Type                     2
Temperature (C)              7574
Apparent Temperature (C)     8984
Humidity                       90
Wind Speed (km/h)            2484
Wind Bearing (degrees)        360
Visibility (km)               949
Pressure (millibars)         4979
Daily Summary                 214
dtype: int64

Загрузка данных «Форматированная дата»:

data = data.set_index(“Formatted Date”)
data

На изображении выше мы видим, что «Форматированная дата» изменена на формат даты и времени и установлена ​​​​как индекс набора данных. Обновленный набор данных содержит 96453 строки и 11 столбцов.

Мы должны преобразовать почасовые данные в месячные. Для нашей гипотезы требуется только кажущаяся температура и влажность. Итак, мы рассмотрим эти два столбца и выполним функцию resample():

df_column = ['Apparent Temperature (C)', 'Humidity']
df_monthly_mean = data[df_column].resample("MS").mean()
df_monthly_mean.head()

Исследовательский анализ данных

Исследовательский анализ данных — это подход к анализу наборов данных для обобщения их основных характеристик, часто с использованием статистических графиков и других методов визуализации данных.

Нахождение линейной зависимости между кажущейся температурой (°C) и влажностью:

sns.set_style("darkgrid")
sns.regplot(data=df_monthly_mean, x="Apparent Temperature (C)", y="Humidity", color="r")
plt.title("Relation between Apparent Temperature (C) and Humidity")
plt.show()

Наблюдение: линейная зависимость с отрицательным наклоном.

Изменение кажущейся температуры (°C) и влажности во времени:

plt.figure(figsize=(14,6))
sns.lineplot(data = df_monthly_mean)
plt.xlabel('Year')
plt.title("Variation of Apparent Temperature (°C) and Humidity with time")
plt.show()

Корреляция кажущейся температуры (°C) и влажности:

plt.figure(figsize=(4,4))
plt.title("Correlation between Apparent Temperature (°C) & Humidity")
sns.heatmap(data= df_monthly_mean.corr(), annot=True, cmap = 'Blues')
plt.savefig('plot7.png', dpi=300, bbox_inches='tight')
plt.show()

Корреляция кажущейся температуры (°C) и влажности с использованием функции парного графика:

sns.pairplot(df_monthly_mean, kind='scatter')
plt.show()

Теперь мы будем использовать 2D Scatter Plot (FacetGrid) для представления каждого типа сводки:

Объект FacetGrid принимает фрейм данных в качестве входных данных и имена переменных, которые будут формировать измерения строки, столбца или оттенка сетки. Переменные должны быть категориальными, и данные на каждом уровне переменной будут использоваться для аспекта вдоль этой оси.

sns.set_style("darkgrid")
sns.FacetGrid(data, hue="Summary", height=10).map(plt.scatter, "Apparent Temperature (C)", "Humidity").add_legend()
plt.title("2D Scatter Plot with Color Coding for each Summary type")
plt.show()

Наблюдение: в Финляндии в основном ясная или переменная облачность/дождь. Всего несколько дней бывает небольшой дождь или сухо или опасно ветрено и переменная облачность.

Университетский анализ

Одномерный анализ, пожалуй, самая простая форма статистического анализа. Как и другие формы статистики, она может быть логической или описательной. Ключевым фактом является то, что задействована только одна переменная.

В одномерном анализе мы используем гистограммы для анализа и визуализации частотного распределения. Построение гистограмм в pandas очень простое и понятное.

Однофакторный анализ кажущейся температуры (°C):

sns.set_style("white")
sns.FacetGrid(data, hue="Summary", height=10).map(sns.histplot, "Apparent Temperature (C)").add_legend()
plt.title("Univeriate Analysis of Weather Conditions with Apparent Temperature")
plt.savefig('plot4.png', dpi=300, bbox_inches='tight')
plt.show()

Одномерный анализ влажности:

sns.set_style("white")
sns.FacetGrid(data, hue="Summary",height=10).map(sns.histplot, "Humidity").add_legend()
plt.title("Univariate Analysis of Weather Conditions with Humidity")
plt.show()

Нанесение кажущейся температуры (°C) и влажности за все месяцы:

TEMP_DATA = df_monthly_mean.iloc[:,0]
HUM_DATA = df_monthly_mean.iloc[:,1]
def label_color(month):
    if month == 1:
        return 'January','violet'
    elif month == 2:
        return 'February','indigo'
    elif month == 3:
        return 'March','blue'
    elif month == 4:
        return 'April','green'
    elif month == 5:
        return 'May','yellow'
    elif month == 6:
        return 'June','orange'
    elif month == 7:
        return 'July','red'
    elif month == 8:
        return 'August','black'
    elif month == 9:
        return 'September','brown'
    elif month == 10:
        return 'October','magenta'
    elif month == 11:
        return 'November','grey'
    else:
        return 'December','pink'
def plot_month(month, data):
    label, color = label_color(month)
    mdata = data[data.index.month == month]
    sns.lineplot(data=mdata,label=label,color=color,marker='o')
    
def sns_plot(title, data):
    plt.figure(figsize=(14,8))
    plt.title(title)
    plt.xlabel('YEAR')
    for i in range(1,13):
        plot_month(i,data)
    plt.show()

Видимая температура (°C) через 10 лет:

Влажность через 10 лет:

Нанесение на график кажущейся температуры (°C) и влажности для каждого месяца:

def sns_month_plot(month):
    plt.figure(figsize=(10,5))
    label = label_color(month)[0]
    plt.title('Apparent Temperature Vs Humidity for {}'.format(label))
    plt.xlabel('YEAR')
    data = df_monthly_mean[df_monthly_mean.index.month == month]
    sns.lineplot(data=data, marker='o')
    name="month"+str(month)+".png"  
    plt.show()
    print('-'*80)

Наконец, мы построим графики изменения видимой температуры (°C) и влажности с января по декабрь (годы 2006–2016):

for month in range(1,13):
    sns_month_plot(month)

Январь:

Февраль:

Март:

Апрель:

Май:

Июнь:

Июль:

Август:

Сентябрь:

Октябрь:

Ноябрь:

Декабрь:

Заключение

Приведенный выше анализ данных показывает, что кажущаяся температура (°C), как и ожидалось, менялась вверх и вниз, но влажность оставалась неизменной в течение 10 лет. Такие взлеты и падения указывают на усиление глобального потепления.

Исходный код (GitHub) будет загружен в ближайшее время.

Спасибо.

Соединять

GitHub: https://github.com/abhinandankatoch

LinkedIn: https://www.linkedin.com/in/abhinandankatoch/