Выполнение анализа метеорологических данных
Анализ данных — это практика работы с данными для сбора полезной информации, которую затем можно использовать для принятия обоснованных решений. Простой пример анализа данных: всякий раз, когда мы принимаем какое-либо решение в нашей повседневной жизни, мы думаем о том, что произошло в прошлый раз или что произойдет, если мы выберем это конкретное решение. Это не что иное, как анализ нашего прошлого или будущего и принятие решений на его основе.
Метеорологические данные наблюдений — данные, состоящие из физических параметров, которые измеряются непосредственно приборами и включают температуру, точку росы, направление ветра, скорость ветра, облачный покров, слой(я) облаков, высоту потолка, видимость, Текущая погода и количество осадков.
Цель:
Основная цель — выполнить очистку данных, выполнить анализ для проверки влияния глобального потепления на температуру и влажность и, наконец, сделать вывод.
Набор данных:
Набор данных можно получить на 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
Подготовка и очистка набора данных
- Библиотеки:
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) будет загружен в ближайшее время.
Спасибо.